From 8a5925b9bdd16446d1335bb34d7de13c331baf43 Mon Sep 17 00:00:00 2001 From: Kasi Date: Fri, 8 Jun 2018 05:33:57 +0100 Subject: [PATCH 001/447] removed seperate router for /repos/search --- routers/api/v1/api.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index eec55cac673c..466d6b06f565 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -368,13 +368,11 @@ func RegisterRoutes(m *macaron.Macaron) { // Repositories m.Post("/org/:org/repos", reqToken(), bind(api.CreateRepoOption{}), repo.CreateOrgRepo) - m.Group("/repos", func() { - m.Get("/search", repo.Search) - }) - m.Combo("/repositories/:id", reqToken()).Get(repo.GetByID) m.Group("/repos", func() { + m.Get("/search", repo.Search) + m.Post("/migrate", reqToken(), bind(auth.MigrateRepoForm{}), repo.Migrate) m.Group("/:username/:reponame", func() { From 347120d900cd2b62aa7f1be6d44de00afabc192f Mon Sep 17 00:00:00 2001 From: Kasi Date: Fri, 8 Jun 2018 14:26:23 +0100 Subject: [PATCH 002/447] Started on Git-Trees api --- routers/api/v1/api.go | 8 ++++ routers/api/v1/repo/tree.go | 89 +++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 routers/api/v1/repo/tree.go diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 466d6b06f565..d36b1c6d6b86 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -377,6 +377,11 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/:username/:reponame", func() { m.Combo("").Get(repo.Get).Delete(reqToken(), repo.Delete) + + m.Group("/trees", func() { + m.Combo("/:sha", context.RepoRef()).Get(repo.GetTree) + }) + m.Group("/hooks", func() { m.Combo("").Get(repo.ListHooks). Post(bind(api.CreateHookOption{}), repo.CreateHook) @@ -387,6 +392,9 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/tests", context.RepoRef(), repo.TestHook) }) }, reqToken(), reqRepoWriter()) + + + m.Group("/collaborators", func() { m.Get("", repo.ListCollaborators) m.Combo("/:collaborator").Get(repo.IsCollaborator). diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go new file mode 100644 index 000000000000..8ba0e01a53e8 --- /dev/null +++ b/routers/api/v1/repo/tree.go @@ -0,0 +1,89 @@ +package repo + +import ( + "code.gitea.io/gitea/modules/context" + "fmt" + _"code.gitea.io/git" + "code.gitea.io/gitea/modules/setting" + "strings" +) + +type TreeEntry struct { + Path string `json:"path"` + Mode string `json:"mode"` + Type string `json:"type"` + Size int64 `json:"size,omitempty"` + SHA string `json:"sha"` + URL string `json:"url"` +} + +type Tree struct { + SHA string `json:"sha"` + URL string `json:"url"` + Entries []TreeEntry `json:"tree,omitempty"` + Truncated bool `json:"truncated"` +} + +func GetTree(ctx *context.APIContext) { + sha := ctx.Params("sha") + if len(sha) == 0 { + ctx.Error(400, "sha not provided", nil) + return + } + Temp := GetTreeBySHA(ctx, nil, "", sha, ctx.QueryBool("recursive")) + if Temp != nil { + ctx.JSON(200, Temp) + } else { + ctx.Error(400, "sha invalid", nil) + } + +} + +func GetTreeBySHA(ctx *context.APIContext, tree *Tree, CurrentPath string, sha string, recursive bool) *Tree { + GitTree, err := ctx.Repo.GitRepo.GetTree(sha) + if err != nil { + return tree + } + RepoID := strings.TrimRight(setting.AppURL, "/") + "/api/v1/repos/" + ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name + if tree == nil { + tree = new(Tree) + if GitTree != nil { + tree.SHA = GitTree.ID.String() + tree.URL = RepoID + "/trees/" + tree.SHA; + } + } + if GitTree == nil { + return tree + } + Trees, err := GitTree.ListEntries() + if err != nil { + return tree + } + if len(CurrentPath) != 0 { + CurrentPath += "/" + } + for e := range Trees { + if len(tree.Entries) > 1000 { + tree.Truncated = true + break + } + E_URL := RepoID + if Trees[e].IsDir() { + E_URL += "/trees/" + } else { + E_URL += "/blobs/" + } + tree.Entries = append(tree.Entries, TreeEntry{ + CurrentPath + Trees[e].Name(), + fmt.Sprintf("%06x", Trees[e].Mode()), + string(Trees[e].Type), + Trees[e].Size(), + Trees[e].ID.String(), + E_URL + Trees[e].ID.String()}) + + if recursive && Trees[e].IsDir() { + tree = GetTreeBySHA(ctx, tree, CurrentPath + Trees[e].Name(), Trees[e].ID.String(), recursive) + } + } + return tree +} From b7a13d84dccb8323c9ec0e118aae89604a7c15ad Mon Sep 17 00:00:00 2001 From: Kasi Date: Fri, 8 Jun 2018 16:26:09 +0100 Subject: [PATCH 003/447] Added copyright --- routers/api/v1/repo/tree.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go index 8ba0e01a53e8..f39a302fab3c 100644 --- a/routers/api/v1/repo/tree.go +++ b/routers/api/v1/repo/tree.go @@ -1,3 +1,7 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package repo import ( From 487758f8f5b9a8d9feb2b81e2032caacc3b29997 Mon Sep 17 00:00:00 2001 From: Kasi Date: Sat, 9 Jun 2018 16:14:33 +0100 Subject: [PATCH 004/447] Optimized recursive part of GetTree though utilizing git ls-tree -r command --- routers/api/v1/repo/tree.go | 79 ++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go index f39a302fab3c..15437d0f5a8f 100644 --- a/routers/api/v1/repo/tree.go +++ b/routers/api/v1/repo/tree.go @@ -7,9 +7,9 @@ package repo import ( "code.gitea.io/gitea/modules/context" "fmt" - _"code.gitea.io/git" "code.gitea.io/gitea/modules/setting" "strings" + "code.gitea.io/git" ) type TreeEntry struct { @@ -34,59 +34,64 @@ func GetTree(ctx *context.APIContext) { ctx.Error(400, "sha not provided", nil) return } - Temp := GetTreeBySHA(ctx, nil, "", sha, ctx.QueryBool("recursive")) - if Temp != nil { - ctx.JSON(200, Temp) + Tree := GetTreeBySHA(ctx, sha) + if Tree != nil { + ctx.JSON(200, Tree) } else { ctx.Error(400, "sha invalid", nil) } - } -func GetTreeBySHA(ctx *context.APIContext, tree *Tree, CurrentPath string, sha string, recursive bool) *Tree { +func GetTreeBySHA(ctx *context.APIContext, sha string) *Tree { GitTree, err := ctx.Repo.GitRepo.GetTree(sha) - if err != nil { - return tree + if err != nil || GitTree == nil{ + return nil } + tree := new(Tree) RepoID := strings.TrimRight(setting.AppURL, "/") + "/api/v1/repos/" + ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name - if tree == nil { - tree = new(Tree) - if GitTree != nil { - tree.SHA = GitTree.ID.String() - tree.URL = RepoID + "/trees/" + tree.SHA; - } - } - if GitTree == nil { - return tree + tree.SHA = GitTree.ID.String() + tree.URL = RepoID + "/trees/" + tree.SHA + var Entries git.Entries + if ctx.QueryBool("recursive") { + Entries, err = GitTree.ListEntriesRecursive() + } else { + Entries, err = GitTree.ListEntries() } - Trees, err := GitTree.ListEntries() if err != nil { return tree } - if len(CurrentPath) != 0 { - CurrentPath += "/" + RepoIDLen := len(RepoID) + BlobURL := make([]byte, RepoIDLen + 47) + copy(BlobURL[:], RepoID) + copy(BlobURL[RepoIDLen:], "/blobs/") + TreeURL := make([]byte, RepoIDLen + 47) + copy(TreeURL[:], RepoID) + copy(TreeURL[RepoIDLen:], "/trees/") + CopyPos := len(TreeURL) - 40 + + if len(Entries) > 1000 { + tree.Entries = make([]TreeEntry, 1000) + } else { + tree.Entries = make([]TreeEntry, len(Entries)) } - for e := range Trees { - if len(tree.Entries) > 1000 { + for e := range Entries { + if e > 1000 { tree.Truncated = true break } - E_URL := RepoID - if Trees[e].IsDir() { - E_URL += "/trees/" - } else { - E_URL += "/blobs/" - } - tree.Entries = append(tree.Entries, TreeEntry{ - CurrentPath + Trees[e].Name(), - fmt.Sprintf("%06x", Trees[e].Mode()), - string(Trees[e].Type), - Trees[e].Size(), - Trees[e].ID.String(), - E_URL + Trees[e].ID.String()}) - if recursive && Trees[e].IsDir() { - tree = GetTreeBySHA(ctx, tree, CurrentPath + Trees[e].Name(), Trees[e].ID.String(), recursive) + tree.Entries[e].Path = Entries[e].Name() + tree.Entries[e].Mode = fmt.Sprintf("%06x", Entries[e].Mode()) + tree.Entries[e].Type = string(Entries[e].Type) + tree.Entries[e].Size = Entries[e].Size() + tree.Entries[e].SHA = Entries[e].ID.String() + + if Entries[e].IsDir() { + copy(TreeURL[CopyPos:], Entries[e].ID.String()) + tree.Entries[e].URL = string(TreeURL[:]) + } else { + copy(BlobURL[CopyPos:], Entries[e].ID.String()) + tree.Entries[e].URL = string(BlobURL[:]) } } return tree From 3678de006bf52e387e09d9a5f6c5aa1bc030c575 Mon Sep 17 00:00:00 2001 From: Kasi Date: Wed, 13 Jun 2018 11:04:39 +0100 Subject: [PATCH 005/447] Fixed import order, used type from sdk, removed empty lines --- routers/api/v1/api.go | 7 ------- routers/api/v1/repo/tree.go | 30 ++++++++---------------------- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index d36b1c6d6b86..a5ae328ac2b3 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -372,16 +372,12 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/repos", func() { m.Get("/search", repo.Search) - m.Post("/migrate", reqToken(), bind(auth.MigrateRepoForm{}), repo.Migrate) - m.Group("/:username/:reponame", func() { m.Combo("").Get(repo.Get).Delete(reqToken(), repo.Delete) - m.Group("/trees", func() { m.Combo("/:sha", context.RepoRef()).Get(repo.GetTree) }) - m.Group("/hooks", func() { m.Combo("").Get(repo.ListHooks). Post(bind(api.CreateHookOption{}), repo.CreateHook) @@ -392,9 +388,6 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/tests", context.RepoRef(), repo.TestHook) }) }, reqToken(), reqRepoWriter()) - - - m.Group("/collaborators", func() { m.Get("", repo.ListCollaborators) m.Combo("/:collaborator").Get(repo.IsCollaborator). diff --git a/routers/api/v1/repo/tree.go b/routers/api/v1/repo/tree.go index 15437d0f5a8f..627e096d7104 100644 --- a/routers/api/v1/repo/tree.go +++ b/routers/api/v1/repo/tree.go @@ -5,29 +5,15 @@ package repo import ( - "code.gitea.io/gitea/modules/context" "fmt" - "code.gitea.io/gitea/modules/setting" "strings" + + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/context" "code.gitea.io/git" + "code.gitea.io/sdk/gitea" ) -type TreeEntry struct { - Path string `json:"path"` - Mode string `json:"mode"` - Type string `json:"type"` - Size int64 `json:"size,omitempty"` - SHA string `json:"sha"` - URL string `json:"url"` -} - -type Tree struct { - SHA string `json:"sha"` - URL string `json:"url"` - Entries []TreeEntry `json:"tree,omitempty"` - Truncated bool `json:"truncated"` -} - func GetTree(ctx *context.APIContext) { sha := ctx.Params("sha") if len(sha) == 0 { @@ -42,12 +28,12 @@ func GetTree(ctx *context.APIContext) { } } -func GetTreeBySHA(ctx *context.APIContext, sha string) *Tree { +func GetTreeBySHA(ctx *context.APIContext, sha string) *gitea.GitTreeResponse { GitTree, err := ctx.Repo.GitRepo.GetTree(sha) if err != nil || GitTree == nil{ return nil } - tree := new(Tree) + tree := new(gitea.GitTreeResponse) RepoID := strings.TrimRight(setting.AppURL, "/") + "/api/v1/repos/" + ctx.Repo.Repository.Owner.Name + "/" + ctx.Repo.Repository.Name tree.SHA = GitTree.ID.String() tree.URL = RepoID + "/trees/" + tree.SHA @@ -70,9 +56,9 @@ func GetTreeBySHA(ctx *context.APIContext, sha string) *Tree { CopyPos := len(TreeURL) - 40 if len(Entries) > 1000 { - tree.Entries = make([]TreeEntry, 1000) + tree.Entries = make([]gitea.GitTreeEntry, 1000) } else { - tree.Entries = make([]TreeEntry, len(Entries)) + tree.Entries = make([]gitea.GitTreeEntry, len(Entries)) } for e := range Entries { if e > 1000 { From cf3ed1a8dd82855658aaad215c92a3da8aa7b49b Mon Sep 17 00:00:00 2001 From: BNolet Date: Mon, 11 Jun 2018 03:12:38 -0400 Subject: [PATCH 006/447] Fixed spelling + clarity (#4213) Message given when password was too short was incorrectly spelled and was not clear enough. --- options/locale/locale_en-US.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index e510e9954dc7..8cf6111c6de2 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -213,7 +213,7 @@ send_reset_mail = Click here to resend your password reset email reset_password = Reset Your Password invalid_code = Your confirmation code is invalid or has expired. reset_password_helper = Click here to reset your password -password_too_short = Password length cannot be less then %d. +password_too_short = Password length cannot be less than %d characters. non_local_account = Non-local users can not update their password through the Gitea web interface. verify = Verify scratch_code = Scratch code From 53636df53bde0b64be0b875d04710deaf93d781d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 11 Jun 2018 07:13:54 +0000 Subject: [PATCH 007/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index f205decda069..4fae010628cd 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -266,6 +266,8 @@ email_been_used=Ця електронна адреса вже використо openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. enterred_invalid_repo_name=Невірно введено ім'я репозиторію. +enterred_invalid_owner_name=Ім'я нового власника не є дійсним. +enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний користувач не існує. cannot_add_org_to_team=Організацію неможливо додати як учасника команди. From 9587670159502525602df0f104ad6417bb6d684f Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 12 Jun 2018 06:54:30 +0800 Subject: [PATCH 008/447] fix delete comment bug (#4216) --- models/issue_comment.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/models/issue_comment.go b/models/issue_comment.go index a829c80663dc..1c7c57dd0684 100644 --- a/models/issue_comment.go +++ b/models/issue_comment.go @@ -147,6 +147,10 @@ func (c *Comment) AfterLoad(session *xorm.Session) { // AfterDelete is invoked from XORM after the object is deleted. func (c *Comment) AfterDelete() { + if c.ID <= 0 { + return + } + _, err := DeleteAttachmentsByComment(c.ID, true) if err != nil { From f0d33750366e1f04ef990a8dda30c882c7a702b5 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 11 Jun 2018 22:55:33 +0000 Subject: [PATCH 009/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_bg-BG.ini | 1 - options/locale/locale_cs-CZ.ini | 1 - options/locale/locale_de-DE.ini | 1 - options/locale/locale_es-ES.ini | 1 - options/locale/locale_fi-FI.ini | 1 - options/locale/locale_fr-FR.ini | 1 - options/locale/locale_hu-HU.ini | 1 - options/locale/locale_id-ID.ini | 1 - options/locale/locale_it-IT.ini | 1 - options/locale/locale_ja-JP.ini | 1 - options/locale/locale_ko-KR.ini | 1 - options/locale/locale_lt-LT.ini | 1 - options/locale/locale_lv-LV.ini | 1 - options/locale/locale_nl-NL.ini | 1 - options/locale/locale_pl-PL.ini | 1 - options/locale/locale_pt-BR.ini | 2 +- options/locale/locale_ru-RU.ini | 1 - options/locale/locale_sr-SP.ini | 1 - options/locale/locale_sv-SE.ini | 1 - options/locale/locale_tr-TR.ini | 1 - options/locale/locale_uk-UA.ini | 1 - options/locale/locale_zh-CN.ini | 1 - options/locale/locale_zh-HK.ini | 1 - options/locale/locale_zh-TW.ini | 1 - 24 files changed, 1 insertion(+), 24 deletions(-) diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index 810e8d47152d..f0d6b1c0a475 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение reset_password=Нулиране на паролата reset_password_helper=Щракнете тук, за да нулирате паролата си -password_too_short=Размерът на паролата не може да бъде по-малък от %d знака. [mail] activate_account=Моля активирайте Вашия профил diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini index 818611ee2010..1fc7e193d141 100644 --- a/options/locale/locale_cs-CZ.ini +++ b/options/locale/locale_cs-CZ.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Zdravím, %s, máte nepotvrzenou e-mailovou adresu (%s%s resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi reset_password=Nollaa salasanasi reset_password_helper=Klikkaa tästä nollataksesi salasanasi -password_too_short=Salasanan pituus ei voi olla vähemmän kuin %d merkkiä. verify=Vahvista [mail] diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 91961719e110..50e90b96f75b 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -97,7 +97,6 @@ email_not_associate=L'adresse e-mail n'est associée à aucun compte. send_reset_mail=Cliquez ici pour renvoyer le mail de réinitialisation de votre mot de passe reset_password=Réinitialiser le mot de passe reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe -password_too_short=Le mot de passe doit contenir %d caractères minimum. verify=Vérifier scratch_code=Code de secours use_scratch_code=Utiliser un code de secours diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini index b52f8f840d38..7693a43122b4 100644 --- a/options/locale/locale_hu-HU.ini +++ b/options/locale/locale_hu-HU.ini @@ -101,7 +101,6 @@ email_not_associate=Az email cím nincsen hozzárendelve egyetlen fiókhoz sem. send_reset_mail=Kattints ide hogy újraküldd a jelszó visszaállító emailt reset_password=Jelszó visszaállítása reset_password_helper=Kattintson ide, hogy visszaállítsa a jelszavát -password_too_short=A jelszó nem lehet rövidebb, mint %d karakter. verify=Ellenőrzés scratch_code=Kaparós kód use_scratch_code=Kaparós kód használata diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index b6999654fd8e..56f14d771d00 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -97,7 +97,6 @@ email_not_associate=Alamat surel tidak terhubung dengan akun apapun. send_reset_mail=Klik di sini untuk mengirim ulang surel pengaturan ulang kata sandi reset_password=Atur Ulang Kata Sandi Anda reset_password_helper=Klik di sini untuk mengatur ulang kata sandi anda -password_too_short=Panjang kata sandi tidak boleh kurang dari %d. verify=Verifikasi scratch_code=Kode coretan use_scratch_code=Gunakan kode coretan diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 9ea365639b9c..e3b752851b11 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -97,7 +97,6 @@ email_not_associate=L'indirizzo email non è associato ad alcuna conta. send_reset_mail=Clicca qui per inviare nuovamente la tua email di reimpostazione della password reset_password=Reimposta la tua Password reset_password_helper=Clicca qui per reimpostare la password -password_too_short=La lunghezza della password non può essere meno %d caratteri. verify=Verifica scratch_code=Codice Gratta e Vinci use_scratch_code=Utilizza un codice di zero diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 3c422034ef2f..ea32ad3c3b9c 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -101,7 +101,6 @@ email_not_associate=このEメールアドレスは、どのアカウントに send_reset_mail=パスワードリセットメールを再送するにはここをクリックしてください reset_password=パスワードリセット reset_password_helper=パスワードをリセットするにはここをクリック -password_too_short=%d文字未満のパスワードは設定できません。 verify=確認 scratch_code=スクラッチコード use_scratch_code=スクラッチコードを使う diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini index cd4528ffb959..6497467f4699 100644 --- a/options/locale/locale_ko-KR.ini +++ b/options/locale/locale_ko-KR.ini @@ -97,7 +97,6 @@ email_not_associate=이 이메일 주소로 등록된 계정이 없습니다. send_reset_mail=여기를 눌러 비밀번호 초기화 메일을 재전송 reset_password=비밀번호 초기화 reset_password_helper=이곳을 눌러 비밀번호를 재설정 -password_too_short=비밀번호의 길이는 %d글자 미만일 수 없습니다. verify=확인 scratch_code=스크래치 코드 use_scratch_code=스크래치 코드 사용 diff --git a/options/locale/locale_lt-LT.ini b/options/locale/locale_lt-LT.ini index 8a9f067aba3c..e12afe3777da 100644 --- a/options/locale/locale_lt-LT.ini +++ b/options/locale/locale_lt-LT.ini @@ -75,7 +75,6 @@ active_your_account=Aktyvinkite savo paskyrą resend_mail=Spauskite čia norėdami persiųsti aktyvacijos laišką reset_password=Atstatyti slaptažodį reset_password_helper=Paspauskite čia norėdami pakeisti savo slaptažodį -password_too_short=Slaptažodis negali būti trumpesnis nei %d simbolių. verify=Patikrinti [mail] diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 656910dc89f9..c2274b99a063 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -101,7 +101,6 @@ email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli reset_password_helper=Nospiediet šeit, lai atjaunotu paroli -password_too_short=Paroles garums nedrīkst būt mazāks par %d. verify=Pārbaudīt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 6b96b91dedf8..64db50357b9e 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -101,7 +101,6 @@ email_not_associate=Dit emailadres is niet gekoppeld aan een account. send_reset_mail=Klik hier om de wachtwoord reset mail (nogmaals) te versturen reset_password=Reset uw wachtwoord reset_password_helper=Klik hier om uw wachtwoord opnieuw in te stellen. -password_too_short=De lengte van uw wachtwoord moet minimaal %d karakters zijn. verify=Verifiëren scratch_code=Eenmalige code use_scratch_code=Gebruik een eenmalige code diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 954a37f5f7bd..3dcb05082526 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -97,7 +97,6 @@ email_not_associate=Adres e-mail nie jest powiązany z żadnym kontem. send_reset_mail=Kliknij tutaj, aby ponownie wysłać e-mail resetowania hasła reset_password=Resetowanie hasła reset_password_helper=Kliknij tutaj, aby zresetować hasło -password_too_short=Długość hasła nie może być mniejsza niż %d znaków. verify=Potwierdź scratch_code=Kod jednorazowy use_scratch_code=Użyj kodu jednorazowego diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 17b59f7b1193..0df553778eab 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -213,7 +213,7 @@ send_reset_mail=Clique aqui para re-enviar seu e-mail de redefinição de senha reset_password=Redefinir sua senha invalid_code=Seu código de confirmação é inválido ou expirou. reset_password_helper=Clique aqui para redefinir sua senha -password_too_short=O comprimento da senha não pode ser menor que %d. +password_too_short=A senha deve ter %d ou mais caracteres. non_local_account=Usuários não-locais não podem atualizar sua senha através da interface web do Gitea. verify=Verificar scratch_code=Código de backup diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index a8cf3098b21d..dfe8e9fa22e8 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -213,7 +213,6 @@ send_reset_mail=Нажмите сюда, чтобы отправить пись reset_password=Сброс пароля invalid_code=Этот код подтверждения недействителен или истек. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль -password_too_short=Длина пароля не менее %d символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. verify=Проверить scratch_code=Одноразовый пароль diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini index 3acc22c3adbf..e20c9ba91cf9 100644 --- a/options/locale/locale_sr-SP.ini +++ b/options/locale/locale_sr-SP.ini @@ -79,7 +79,6 @@ has_unconfirmed_mail=Здраво, %s! Имате непотврђену адр resend_mail=Кликните овде да поново пошаљете писмо reset_password=Ресет лозинке reset_password_helper=Кликните овде да ресетујете вашу лозинку -password_too_short=Лозинка неможе бити краћа од %d карактера. [mail] activate_account=Молимо вас активирајте ваш налог diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index e6bb938a5235..ca3d703f12b7 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -97,7 +97,6 @@ email_not_associate=Denna e-postadress är inte knutet till något konto. send_reset_mail=Klicka här för att skicka e-post med lösenordsåterställning igen reset_password=Återställ ditt lösenord reset_password_helper=Klicka här för att återställa ditt lösenord -password_too_short=Lösenordet får ej vara kortare än %d tecken. verify=Verifiera scratch_code=Skrapkod use_scratch_code=Använd en skrapkod diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini index f3ed0f7277b6..17f4fe02bed4 100644 --- a/options/locale/locale_tr-TR.ini +++ b/options/locale/locale_tr-TR.ini @@ -97,7 +97,6 @@ email_not_associate=Bu e-posta adresi hiçbir hesap ile ilişkilendirilmemiştir send_reset_mail=Parola sıfırlama e-postasını (yeniden) göndermek için buraya tıklayın reset_password=Parolanızı Sıfırlayın reset_password_helper=Parolanızı sıfırlamak için buraya tıklayın -password_too_short=Parola uzunluğu %d karakterden az olamaz. verify=Doğrula scratch_code=Çizgi kodu use_scratch_code=Bir çizgi kodu kullanınız diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 4fae010628cd..3bc79cdd58b3 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -199,7 +199,6 @@ send_reset_mail=Натисніть сюди, щоб відправити лис reset_password=Скинути пароль invalid_code=Цей код підтвердження недійсний або закінчився. reset_password_helper=Натисніть тут для скидання пароля -password_too_short=Довжина пароля не може бути меншою за %d. non_local_account=Нелокальні акаунти не можуть змінити пароль через Gitea. verify=Підтвердити scratch_code=Одноразовий пароль diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 8b23e404cf8b..658f133a2905 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -213,7 +213,6 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=此确认密钥无效或已过期。 reset_password_helper=单击此处重置密码 -password_too_short=密码长度不能少于 %d 位! non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 diff --git a/options/locale/locale_zh-HK.ini b/options/locale/locale_zh-HK.ini index a64367d39929..d8b8e210c42e 100644 --- a/options/locale/locale_zh-HK.ini +++ b/options/locale/locale_zh-HK.ini @@ -94,7 +94,6 @@ email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 reset_password_helper=單擊此處重置密碼 -password_too_short=密碼長度不能少於 %d 位! verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index fa716b27d829..8a6914af2df1 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -97,7 +97,6 @@ email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 reset_password_helper=單擊此處重置密碼 -password_too_short=密碼長度不能少於 %d 位! verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 From 324c4e45d433824d8cc654aced0fa3fccc970392 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Tue, 12 Jun 2018 13:34:56 +0300 Subject: [PATCH 010/447] Fixed drone command in readme (#4222) Signed-off-by: Alexey Terentyev --- integrations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/README.md b/integrations/README.md index 64041b5469f9..927368818c3e 100644 --- a/integrations/README.md +++ b/integrations/README.md @@ -13,7 +13,7 @@ Make sure to perform a clean build before running tests: ## Run all tests via local drone ``` -drone exec --local --build.event "pull_request" +drone exec --local --build-event "pull_request" ``` ## Run sqlite integrations tests From b0b1f58a31ac5cf105dbcd3347d904b8f8b8c0bf Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 12 Jun 2018 10:36:20 +0000 Subject: [PATCH 011/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ru-RU.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index dfe8e9fa22e8..0088951816d0 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -213,6 +213,7 @@ send_reset_mail=Нажмите сюда, чтобы отправить пись reset_password=Сброс пароля invalid_code=Этот код подтверждения недействителен или истек. reset_password_helper=Нажмите здесь, чтобы сбросить свой пароль +password_too_short=Длина пароля не может быть меньше, чем %d символов. non_local_account=Нелокальные аккаунты не могут изменить пароль через Gitea. verify=Проверить scratch_code=Одноразовый пароль @@ -489,7 +490,7 @@ delete_account_desc=Вы уверены, что хотите навсегда у [repo] owner=Владелец repo_name=Имя репозитория -repo_name_helper=Лучшие названия репозиториев состоят их коротких, легко запоминаемых и уникальных ключевых слов. +repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов. visibility=Видимость visiblity_helper=Сделать репозиторий приватным visiblity_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. From 851b75414b90a195c7504f1f3b4485c8dab677cd Mon Sep 17 00:00:00 2001 From: harry Date: Tue, 12 Jun 2018 19:27:18 +0800 Subject: [PATCH 012/447] Improve wiki content width. (#4195) --- public/css/index.css | 2 +- public/less/_markdown.less | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/public/css/index.css b/public/css/index.css index 607ab3f6a856..2ee3e831436d 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file diff --git a/public/less/_markdown.less b/public/less/_markdown.less index 9e2734e4237d..458016d715d2 100644 --- a/public/less/_markdown.less +++ b/public/less/_markdown.less @@ -5,6 +5,10 @@ line-height: 1.6 !important; word-wrap: break-word; + &.ui.segment { + padding: 3em; + } + &.file-view { padding: 2em 2em 2em !important; } From fab7aabe244b814608615ee1216e51305180d302 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 12 Jun 2018 16:59:22 +0200 Subject: [PATCH 013/447] Fix swagger errors (#4220) Fix all the resting errors to have a valid swagger file. They are still some warnings but nothing blocking. Doing so I found that some request still misses son parameters for some POST/PUT/PATCH request. This means the a client generated from the swagger file will not work completely. Fix #4088 by activating validation in drone Should fix #4010. --- .drone.yml | 1 + public/swagger.v1.json | 476 +++++++++++++--------- routers/api/v1/misc/markdown.go | 9 +- routers/api/v1/org/hook.go | 49 +++ routers/api/v1/org/team.go | 6 +- routers/api/v1/repo/file.go | 2 +- routers/api/v1/repo/hook.go | 7 +- routers/api/v1/repo/issue_comment.go | 4 +- routers/api/v1/repo/issue_tracked_time.go | 8 +- routers/api/v1/repo/milestone.go | 43 +- routers/api/v1/repo/repo.go | 12 +- routers/api/v1/swagger/options.go | 52 ++- routers/api/v1/swagger/repo.go | 1 + routers/api/v1/user/app.go | 12 + routers/api/v1/user/follower.go | 4 +- 15 files changed, 432 insertions(+), 254 deletions(-) diff --git a/.drone.yml b/.drone.yml index 011d4fefdf65..6ab40a39d32e 100644 --- a/.drone.yml +++ b/.drone.yml @@ -75,6 +75,7 @@ pipeline: - make lint - make fmt-check - make swagger-check + - make swagger-validate - make misspell-check - make test-vendor - make build diff --git a/public/swagger.v1.json b/public/swagger.v1.json index 2c263ef1f77d..1c381a8297e7 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -321,9 +321,13 @@ "operationId": "renderMarkdownRaw", "parameters": [ { - "type": "string", + "description": "Request body to render", "name": "body", - "in": "body" + "in": "body", + "required": true, + "schema": { + "type": "string" + } } ], "responses": { @@ -448,6 +452,15 @@ ], "summary": "List an organization's webhooks", "operationId": "orgListHooks", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/HookList" @@ -468,6 +481,15 @@ ], "summary": "Create a hook", "operationId": "orgCreateHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + } + ], "responses": { "201": { "$ref": "#/responses/Hook" @@ -485,6 +507,22 @@ ], "summary": "Get a hook", "operationId": "orgGetHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to get", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -500,6 +538,22 @@ ], "summary": "Delete a hook", "operationId": "orgDeleteHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "204": { "$ref": "#/responses/empty" @@ -518,6 +572,22 @@ ], "summary": "Update a hook", "operationId": "orgEditHook", + "parameters": [ + { + "type": "string", + "description": "name of the organization", + "name": "org", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to update", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Hook" @@ -994,7 +1064,7 @@ } } }, - "/repos/{owner}/{repo}/archive/{filepath}": { + "/repos/{owner}/{repo}/archive/{archive}": { "get": { "produces": [ "application/json" @@ -1530,6 +1600,47 @@ } } }, + "delete": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Delete a hook in a repository", + "operationId": "repoDeleteHook", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the hook to delete", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "$ref": "#/responses/empty" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + }, "patch": { "produces": [ "application/json" @@ -1554,6 +1665,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "index of the hook", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -1825,6 +1943,100 @@ } } }, + "/repos/{owner}/{repo}/issues/{id}/times": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "List an issue's tracked times", + "operationId": "issueTrackedTimes", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTimeList" + } + } + }, + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "issue" + ], + "summary": "Add a tracked time to a issue", + "operationId": "issueAddTime", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "index of the issue to add tracked time to", + "name": "id", + "in": "path", + "required": true + }, + { + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/AddTimeOption" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/TrackedTime" + }, + "400": { + "$ref": "#/responses/error" + }, + "403": { + "$ref": "#/responses/error" + } + } + } + }, "/repos/{owner}/{repo}/issues/{index}": { "get": { "produces": [ @@ -1941,7 +2153,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -1988,7 +2200,7 @@ { "type": "integer", "description": "index of the issue", - "name": "id", + "name": "index", "in": "path", "required": true }, @@ -2332,100 +2544,6 @@ } } }, - "/repos/{owner}/{repo}/issues/{index}/times": { - "get": { - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "List an issue's tracked times", - "operationId": "issueTrackedTimes", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue", - "name": "repo", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTimeList" - } - } - }, - "post": { - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "issue" - ], - "summary": "Add a tracked time to a issue", - "operationId": "issueAddTime", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "index of the issue to add tracked time to", - "name": "id", - "in": "path", - "required": true - }, - { - "name": "body", - "in": "body", - "schema": { - "$ref": "#/definitions/AddTimeOption" - } - } - ], - "responses": { - "200": { - "$ref": "#/responses/TrackedTime" - }, - "400": { - "$ref": "#/responses/error" - }, - "403": { - "$ref": "#/responses/error" - } - } - } - }, "/repos/{owner}/{repo}/keys": { "get": { "produces": [ @@ -2781,7 +2899,7 @@ "issue" ], "summary": "Get all of a repository's milestones", - "operationId": "issueGetMilestones", + "operationId": "issueGetMilestonesList", "parameters": [ { "type": "string", @@ -2796,13 +2914,6 @@ "name": "repo", "in": "path", "required": true - }, - { - "type": "integer", - "description": "id of the milestone to get", - "name": "id", - "in": "path", - "required": true } ], "responses": { @@ -2863,6 +2974,29 @@ ], "summary": "Get a milestone", "operationId": "issueGetMilestone", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/Milestone" @@ -2893,7 +3027,7 @@ { "type": "integer", "description": "id of the milestone to delete", - "name": "body", + "name": "id", "in": "path", "required": true } @@ -2931,6 +3065,13 @@ "in": "path", "required": true }, + { + "type": "integer", + "description": "id of the milestone", + "name": "id", + "in": "path", + "required": true + }, { "name": "body", "in": "body", @@ -3979,7 +4120,7 @@ } } }, - "/repos/{owner}/{repo}/times/{tracker}": { + "/repos/{owner}/{repo}/times/{user}": { "get": { "produces": [ "application/json" @@ -4019,49 +4160,6 @@ } } }, - "/repos/{user}/{repo}/hooks/{id}": { - "delete": { - "produces": [ - "application/json" - ], - "tags": [ - "repository" - ], - "summary": "Delete a hook in a repository", - "operationId": "repoDeleteHook", - "parameters": [ - { - "type": "string", - "description": "owner of the repo", - "name": "owner", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "name of the repo", - "name": "repo", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "id of the hook to delete", - "name": "id", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "$ref": "#/responses/empty" - }, - "404": { - "$ref": "#/responses/notFound" - } - } - } - }, "/repositories/{id}": { "get": { "produces": [ @@ -4238,7 +4336,7 @@ "organization" ], "summary": "Remove a team member", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamMember", "parameters": [ { "type": "integer", @@ -4297,7 +4395,7 @@ "organization" ], "summary": "Add a repository to a team", - "operationId": "orgAddTeamMember", + "operationId": "orgAddTeamRepository", "parameters": [ { "type": "integer", @@ -4336,7 +4434,7 @@ "organization" ], "summary": "Remove a repository from a team", - "operationId": "orgAddTeamMember", + "operationId": "orgRemoveTeamRepository", "parameters": [ { "type": "integer", @@ -4379,10 +4477,10 @@ "operationId": "topicSearch", "parameters": [ { - "type": "integer", - "description": "id of the repo to get", - "name": "keyword", - "in": "path", + "type": "string", + "description": "keywords to search", + "name": "q", + "in": "query", "required": true } ], @@ -4509,7 +4607,7 @@ } } }, - "/user/following/{followee}": { + "/user/following/{username}": { "get": { "tags": [ "user" @@ -4520,7 +4618,7 @@ { "type": "string", "description": "username of followed user", - "name": "followee", + "name": "username", "in": "path", "required": true } @@ -4533,9 +4631,7 @@ "$ref": "#/responses/notFound" } } - } - }, - "/user/following/{username}": { + }, "put": { "tags": [ "user" @@ -5301,6 +5397,15 @@ ], "summary": "List the authenticated user's access tokens", "operationId": "userGetTokens", + "parameters": [ + { + "type": "string", + "description": "username of user", + "name": "username", + "in": "path", + "required": true + } + ], "responses": { "200": { "$ref": "#/responses/AccessTokenList" @@ -5323,8 +5428,10 @@ { "type": "string", "x-go-name": "Name", - "name": "name", - "in": "query" + "description": "username of user", + "name": "username", + "in": "path", + "required": true } ], "responses": { @@ -7612,9 +7719,6 @@ "description": "SearchResults", "schema": { "$ref": "#/definitions/SearchResults" - }, - "headers": { - "body": {} } }, "ServerVersion": { @@ -7721,40 +7825,6 @@ "description": "parameterBodies", "schema": { "$ref": "#/definitions/EditAttachmentOptions" - }, - "headers": { - "AddCollaboratorOption": {}, - "AddTimeOption": {}, - "CreateEmailOption": {}, - "CreateForkOption": {}, - "CreateHookOption": {}, - "CreateIssueCommentOption": {}, - "CreateIssueOption": {}, - "CreateKeyOption": {}, - "CreateLabelOption": {}, - "CreateMilestoneOption": {}, - "CreateOrgOption": {}, - "CreatePullRequestOption": {}, - "CreateReleaseOption": {}, - "CreateRepoOption": {}, - "CreateStatusOption": {}, - "CreateTeamOption": {}, - "CreateUserOption": {}, - "DeleteEmailOption": {}, - "EditAttachmentOptions": {}, - "EditHookOption": {}, - "EditIssueCommentOption": {}, - "EditIssueOption": {}, - "EditLabelOption": {}, - "EditMilestoneOption": {}, - "EditOrgOption": {}, - "EditPullRequestOption": {}, - "EditReleaseOption": {}, - "EditTeamOption": {}, - "EditUserOption": {}, - "IssueLabelsOption": {}, - "MarkdownOption": {}, - "MigrateRepoForm": {} } }, "redirect": { diff --git a/routers/api/v1/misc/markdown.go b/routers/api/v1/misc/markdown.go index fd7d1489b33c..633dff98ebfc 100644 --- a/routers/api/v1/misc/markdown.go +++ b/routers/api/v1/misc/markdown.go @@ -62,9 +62,12 @@ func MarkdownRaw(ctx *context.APIContext) { // --- // summary: Render raw markdown as HTML // parameters: - // - name: body - // in: body - // type: string + // - name: body + // in: body + // description: Request body to render + // required: true + // schema: + // type: string // consumes: // - text/plain // produces: diff --git a/routers/api/v1/org/hook.go b/routers/api/v1/org/hook.go index 0a77d795e638..83d2a5e5ba07 100644 --- a/routers/api/v1/org/hook.go +++ b/routers/api/v1/org/hook.go @@ -20,6 +20,12 @@ func ListHooks(ctx *context.APIContext) { // summary: List an organization's webhooks // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/HookList" @@ -43,6 +49,17 @@ func GetHook(ctx *context.APIContext) { // summary: Get a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to get + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" @@ -64,9 +81,17 @@ func CreateHook(ctx *context.APIContext, form api.CreateHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true // responses: // "201": // "$ref": "#/responses/Hook" + + //TODO in body params if !utils.CheckCreateHookOption(ctx, &form) { return } @@ -82,9 +107,22 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // - application/json // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to update + // type: integer + // required: true // responses: // "200": // "$ref": "#/responses/Hook" + + //TODO in body params hookID := ctx.ParamsInt64(":id") utils.EditOrgHook(ctx, &form, hookID) } @@ -96,6 +134,17 @@ func DeleteHook(ctx *context.APIContext) { // summary: Delete a hook // produces: // - application/json + // parameters: + // - name: org + // in: path + // description: name of the organization + // type: string + // required: true + // - name: id + // in: path + // description: id of the hook to delete + // type: integer + // required: true // responses: // "204": // "$ref": "#/responses/empty" diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 408d8921dbf8..b8dd026bf30e 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -227,7 +227,7 @@ func AddTeamMember(ctx *context.APIContext) { // RemoveTeamMember api for remove one member from a team func RemoveTeamMember(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/members/{username} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/members/{username} organization orgRemoveTeamMember // --- // summary: Remove a team member // produces: @@ -306,7 +306,7 @@ func getRepositoryByParams(ctx *context.APIContext) *models.Repository { // AddTeamRepository api for adding a repository to a team func AddTeamRepository(ctx *context.APIContext) { - // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation PUT /teams/{id}/repos/{org}/{repo} organization orgAddTeamRepository // --- // summary: Add a repository to a team // produces: @@ -350,7 +350,7 @@ func AddTeamRepository(ctx *context.APIContext) { // RemoveTeamRepository api for removing a repository from a team func RemoveTeamRepository(ctx *context.APIContext) { - // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgAddTeamMember + // swagger:operation DELETE /teams/{id}/repos/{org}/{repo} organization orgRemoveTeamRepository // --- // summary: Remove a repository from a team // description: This does not delete the repository, it only removes the diff --git a/routers/api/v1/repo/file.go b/routers/api/v1/repo/file.go index a3c8309ac52e..610247bc27af 100644 --- a/routers/api/v1/repo/file.go +++ b/routers/api/v1/repo/file.go @@ -64,7 +64,7 @@ func GetRawFile(ctx *context.APIContext) { // GetArchive get archive of a repository func GetArchive(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/archive/{filepath} repository repoGetArchive + // swagger:operation GET /repos/{owner}/{repo}/archive/{archive} repository repoGetArchive // --- // summary: Get an archive of a repository // produces: diff --git a/routers/api/v1/repo/hook.go b/routers/api/v1/repo/hook.go index e412a7f1f2d2..1f121dfc387b 100644 --- a/routers/api/v1/repo/hook.go +++ b/routers/api/v1/repo/hook.go @@ -189,6 +189,11 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: index of the hook + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func EditHook(ctx *context.APIContext, form api.EditHookOption) { // DeleteHook delete a hook of a repository func DeleteHook(ctx *context.APIContext) { - // swagger:operation DELETE /repos/{user}/{repo}/hooks/{id} repository repoDeleteHook + // swagger:operation DELETE /repos/{owner}/{repo}/hooks/{id} repository repoDeleteHook // --- // summary: Delete a hook in a repository // produces: diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 2865ea91658a..0cbf6493d321 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -31,7 +31,7 @@ func ListIssueComments(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer @@ -139,7 +139,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti // description: name of the repo // type: string // required: true - // - name: id + // - name: index // in: path // description: index of the issue // type: integer diff --git a/routers/api/v1/repo/issue_tracked_time.go b/routers/api/v1/repo/issue_tracked_time.go index 1111d672a710..9be9fee91a42 100644 --- a/routers/api/v1/repo/issue_tracked_time.go +++ b/routers/api/v1/repo/issue_tracked_time.go @@ -21,7 +21,7 @@ func trackedTimesToAPIFormat(trackedTimes []*models.TrackedTime) []*api.TrackedT // ListTrackedTimes list all the tracked times of an issue func ListTrackedTimes(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/issues/{index}/times issue issueTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/issues/{id}/times issue issueTrackedTimes // --- // summary: List an issue's tracked times // produces: @@ -37,7 +37,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: repo + // - name: id // in: path // description: index of the issue // type: integer @@ -70,7 +70,7 @@ func ListTrackedTimes(ctx *context.APIContext) { // AddTime adds time manual to the given issue func AddTime(ctx *context.APIContext, form api.AddTimeOption) { - // swagger:operation Post /repos/{owner}/{repo}/issues/{index}/times issue issueAddTime + // swagger:operation Post /repos/{owner}/{repo}/issues/{id}/times issue issueAddTime // --- // summary: Add a tracked time to a issue // consumes: @@ -132,7 +132,7 @@ func AddTime(ctx *context.APIContext, form api.AddTimeOption) { // ListTrackedTimesByUser lists all tracked times of the user func ListTrackedTimesByUser(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/times/{tracker} user userTrackedTimes + // swagger:operation GET /repos/{owner}/{repo}/times/{user} user userTrackedTimes // --- // summary: List a user's tracked times in a repo // produces: diff --git a/routers/api/v1/repo/milestone.go b/routers/api/v1/repo/milestone.go index 3953b0c3c028..a138cb7a69a0 100644 --- a/routers/api/v1/repo/milestone.go +++ b/routers/api/v1/repo/milestone.go @@ -16,14 +16,25 @@ import ( // ListMilestones list all the milestones for a repository func ListMilestones(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone + // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestonesList // --- - // summary: Get a milestone + // summary: Get all of a repository's milestones // produces: // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true // responses: // "200": - // "$ref": "#/responses/Milestone" + // "$ref": "#/responses/MilestoneList" milestones, err := models.GetMilestonesByRepoID(ctx.Repo.Repository.ID) if err != nil { ctx.Error(500, "GetMilestonesByRepoID", err) @@ -39,9 +50,9 @@ func ListMilestones(ctx *context.APIContext) { // GetMilestone get a milestone for a repository func GetMilestone(ctx *context.APIContext) { - // swagger:operation GET /repos/{owner}/{repo}/milestones issue issueGetMilestones + // swagger:operation GET /repos/{owner}/{repo}/milestones/{id} issue issueGetMilestone // --- - // summary: Get all of a repository's milestones + // summary: Get a milestone // produces: // - application/json // parameters: @@ -55,25 +66,14 @@ func GetMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // parameters: - // - name: owner - // in: path - // description: owner of the repo - // type: string - // required: true - // - name: repo - // in: path - // description: name of the repo - // type: string - // required: true // - name: id // in: path - // description: id of the milestone to get + // description: id of the milestone // type: integer // required: true // responses: // "200": - // "$ref": "#/responses/MilestoneList" + // "$ref": "#/responses/Milestone" milestone, err := models.GetMilestoneByRepoID(ctx.Repo.Repository.ID, ctx.ParamsInt64(":id")) if err != nil { if models.IsErrMilestoneNotExist(err) { @@ -152,6 +152,11 @@ func EditMilestone(ctx *context.APIContext, form api.EditMilestoneOption) { // description: name of the repo // type: string // required: true + // - name: id + // in: path + // description: id of the milestone + // type: integer + // required: true // - name: body // in: body // schema: @@ -202,7 +207,7 @@ func DeleteMilestone(ctx *context.APIContext) { // description: name of the repo // type: string // required: true - // - name: body + // - name: id // in: path // description: id of the milestone to delete // type: integer diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 9f64dda61df8..ccfe0440c852 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -508,13 +508,13 @@ func TopicSearch(ctx *context.Context) { // --- // summary: search topics via keyword // produces: - // - application/json + // - application/json // parameters: - // - name: keyword - // in: path - // description: id of the repo to get - // type: integer - // required: true + // - name: q + // in: query + // description: keywords to search + // required: true + // type: string // responses: // "200": // "$ref": "#/responses/Repository" diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index 8d9363fe916a..4f2461f465a0 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -15,55 +15,87 @@ import ( // parameterBodies // swagger:response parameterBodies type swaggerParameterBodies struct { + // in:body AddCollaboratorOption api.AddCollaboratorOption + // in:body CreateEmailOption api.CreateEmailOption + // in:body DeleteEmailOption api.DeleteEmailOption + // in:body CreateHookOption api.CreateHookOption - EditHookOption api.EditHookOption + // in:body + EditHookOption api.EditHookOption + // in:body CreateIssueOption api.CreateIssueOption - EditIssueOption api.EditIssueOption + // in:body + EditIssueOption api.EditIssueOption + // in:body CreateIssueCommentOption api.CreateIssueCommentOption - EditIssueCommentOption api.EditIssueCommentOption + // in:body + EditIssueCommentOption api.EditIssueCommentOption + // in:body IssueLabelsOption api.IssueLabelsOption + // in:body CreateKeyOption api.CreateKeyOption + // in:body CreateLabelOption api.CreateLabelOption - EditLabelOption api.EditLabelOption + // in:body + EditLabelOption api.EditLabelOption + // in:body MarkdownOption api.MarkdownOption + // in:body CreateMilestoneOption api.CreateMilestoneOption - EditMilestoneOption api.EditMilestoneOption + // in:body + EditMilestoneOption api.EditMilestoneOption + // in:body CreateOrgOption api.CreateOrgOption - EditOrgOption api.EditOrgOption + // in:body + EditOrgOption api.EditOrgOption + // in:body CreatePullRequestOption api.CreatePullRequestOption - EditPullRequestOption api.EditPullRequestOption + // in:body + EditPullRequestOption api.EditPullRequestOption + // in:body CreateReleaseOption api.CreateReleaseOption - EditReleaseOption api.EditReleaseOption + // in:body + EditReleaseOption api.EditReleaseOption + // in:body CreateRepoOption api.CreateRepoOption + // in:body CreateForkOption api.CreateForkOption + // in:body CreateStatusOption api.CreateStatusOption + // in:body CreateTeamOption api.CreateTeamOption - EditTeamOption api.EditTeamOption + // in:body + EditTeamOption api.EditTeamOption + // in:body AddTimeOption api.AddTimeOption + // in:body CreateUserOption api.CreateUserOption - EditUserOption api.EditUserOption + // in:body + EditUserOption api.EditUserOption + // in:body MigrateRepoForm auth.MigrateRepoForm + // in:body EditAttachmentOptions api.EditAttachmentOptions } diff --git a/routers/api/v1/swagger/repo.go b/routers/api/v1/swagger/repo.go index 97837dfc2486..9decc8f58861 100644 --- a/routers/api/v1/swagger/repo.go +++ b/routers/api/v1/swagger/repo.go @@ -102,6 +102,7 @@ type swaggerResponseWatchInfo struct { // SearchResults // swagger:response SearchResults type swaggerResponseSearchResults struct { + // in:body Body api.SearchResults `json:"body"` } diff --git a/routers/api/v1/user/app.go b/routers/api/v1/user/app.go index e1f75de68303..fc4118649c06 100644 --- a/routers/api/v1/user/app.go +++ b/routers/api/v1/user/app.go @@ -18,6 +18,12 @@ func ListAccessTokens(ctx *context.APIContext) { // summary: List the authenticated user's access tokens // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessTokenList" @@ -46,6 +52,12 @@ func CreateAccessToken(ctx *context.APIContext, form api.CreateAccessTokenOption // - application/json // produces: // - application/json + // parameters: + // - name: username + // in: path + // description: username of user + // type: string + // required: true // responses: // "200": // "$ref": "#/responses/AccessToken" diff --git a/routers/api/v1/user/follower.go b/routers/api/v1/user/follower.go index 49d13cc38043..284b7323c309 100644 --- a/routers/api/v1/user/follower.go +++ b/routers/api/v1/user/follower.go @@ -119,11 +119,11 @@ func checkUserFollowing(ctx *context.APIContext, u *models.User, followID int64) // CheckMyFollowing whether the given user is followed by the authenticated user func CheckMyFollowing(ctx *context.APIContext) { - // swagger:operation GET /user/following/{followee} user userCurrentCheckFollowing + // swagger:operation GET /user/following/{username} user userCurrentCheckFollowing // --- // summary: Check whether a user is followed by the authenticated user // parameters: - // - name: followee + // - name: username // in: path // description: username of followed user // type: string From b76cfede64edc01e634a7a9e509e5d1568581fb9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 13 Jun 2018 00:44:17 +0800 Subject: [PATCH 014/447] fix bug when deleting a release (#4207) --- models/release.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/models/release.go b/models/release.go index 630995a74111..e3760e9ef713 100644 --- a/models/release.go +++ b/models/release.go @@ -448,6 +448,11 @@ func DeleteReleaseByID(id int64, u *User, delTag bool) error { } } + rel.Repo = repo + if err = rel.LoadAttributes(); err != nil { + return fmt.Errorf("LoadAttributes: %v", err) + } + mode, _ := accessLevel(x, u.ID, rel.Repo) if err := PrepareWebhooks(rel.Repo, HookEventRelease, &api.ReleasePayload{ Action: api.HookReleaseDeleted, From c38d511eabaaf001a958a67a27b166c3eb953b9b Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Tue, 12 Jun 2018 20:02:51 +0300 Subject: [PATCH 015/447] Delete reactions added to issues and comments when deleting repository (#4232) --- models/repo.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/models/repo.go b/models/repo.go index c95c867f37b1..f4923cf4a953 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1848,6 +1848,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error { if _, err = sess.In("issue_id", issueIDs).Delete(&IssueUser{}); err != nil { return err } + if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil { + return err + } attachments := make([]*Attachment, 0, 5) if err = sess. From 12e58d4c3dff3fca467a50033c3e113a1ae8769c Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Wed, 13 Jun 2018 01:23:00 +0200 Subject: [PATCH 016/447] Fix swagger security parts (#4236) --- public/swagger.v1.json | 16 ++++------------ routers/api/v1/api.go | 8 ++++---- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/public/swagger.v1.json b/public/swagger.v1.json index 1c381a8297e7..e0f2a7589af2 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -7864,24 +7864,16 @@ }, "security": [ { - "BasicAuth": [ - "[]" - ] + "BasicAuth": [] }, { - "Token": [ - "[]" - ] + "Token": [] }, { - "AccessToken": [ - "[]" - ] + "AccessToken": [] }, { - "AuthorizationHeaderToken": [ - "[]" - ] + "AuthorizationHeaderToken": [] } ] } \ No newline at end of file diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index a5ae328ac2b3..ea0a33292ab1 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -20,10 +20,10 @@ // - text/html // // Security: -// - BasicAuth: [] -// - Token: [] -// - AccessToken: [] -// - AuthorizationHeaderToken: [] +// - BasicAuth : +// - Token : +// - AccessToken : +// - AuthorizationHeaderToken : // // SecurityDefinitions: // BasicAuth: From 16d5013f6379d5683eaf23e372f0cd2d13d3fa30 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Fri, 15 Jun 2018 05:42:46 +0200 Subject: [PATCH 017/447] fix not respecting landing page setting (#4209) * fix not respecting landing page setting * fmt * add landing page test --- integrations/setting_test.go | 22 ++++++++++++++++++++++ modules/context/auth.go | 6 ------ routers/home.go | 4 ++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/integrations/setting_test.go b/integrations/setting_test.go index a8d1f01e8f9c..2aac8e90ede8 100644 --- a/integrations/setting_test.go +++ b/integrations/setting_test.go @@ -68,3 +68,25 @@ func TestSettingShowUserEmailProfile(t *testing.T) { setting.UI.ShowUserEmail = showUserEmail } + +func TestSettingLandingPage(t *testing.T) { + prepareTestEnv(t) + + landingPage := setting.LandingPageURL + + setting.LandingPageURL = setting.LandingPageHome + req := NewRequest(t, "GET", "/") + MakeRequest(t, req, http.StatusOK) + + setting.LandingPageURL = setting.LandingPageExplore + req = NewRequest(t, "GET", "/") + resp := MakeRequest(t, req, http.StatusFound) + assert.Equal(t, "/explore", resp.Header().Get("Location")) + + setting.LandingPageURL = setting.LandingPageOrganizations + req = NewRequest(t, "GET", "/") + resp = MakeRequest(t, req, http.StatusFound) + assert.Equal(t, "/explore/organizations", resp.Header().Get("Location")) + + setting.LandingPageURL = landingPage +} diff --git a/modules/context/auth.go b/modules/context/auth.go index 372bcb187aef..c38cc3948d42 100644 --- a/modules/context/auth.go +++ b/modules/context/auth.go @@ -37,12 +37,6 @@ func Toggle(options *ToggleOptions) macaron.Handler { return } - // Check non-logged users landing page. - if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LandingPageHome { - ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL)) - return - } - // Redirect to dashboard if user tries to visit any non-login page. if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" { ctx.Redirect(setting.AppSubURL + "/") diff --git a/routers/home.go b/routers/home.go index 5bb353c7e176..0aa907658c51 100644 --- a/routers/home.go +++ b/routers/home.go @@ -42,6 +42,10 @@ func Home(ctx *context.Context) { user.Dashboard(ctx) } return + // Check non-logged users landing page. + } else if setting.LandingPageURL != setting.LandingPageHome { + ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL)) + return } // Check auto-login. From a8302e00c43609d7638b6669fb838cc5d7fd11e2 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 03:43:54 +0000 Subject: [PATCH 018/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 + options/locale/locale_uk-UA.ini | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 4e56b30283b1..36430842473a 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -213,6 +213,7 @@ send_reset_mail=E-Mail zum Passwort-zurücksetzen erneut verschicken reset_password=Passwort zurücksetzen invalid_code=Dein Bestätigungs-Code ist ungültig oder abgelaufen. reset_password_helper=Passwort zurückzusetzen +password_too_short=Das Passwort muss mindestens %d Zeichen lang sein. non_local_account=Benutzer, die nicht von Gitea verwaltet werden können ihre Passwörter nicht über das Web Interface ändern. verify=Verifizieren scratch_code=Einmalpasswort diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 3bc79cdd58b3..d59851e6a1f7 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -38,6 +38,7 @@ u2f_use_twofa=Використовуйте дво-факторний код з u2f_error=Неможливо прочитати ваш ключ безпеки! u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі. Будь ласка, спробуйте інший браузер. u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. +u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. u2f_reload=Оновити @@ -398,7 +399,12 @@ generate_token=Згенерувати токен delete_token=Видалити access_token_deletion=Видалити токен доступу +twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. +twofa_is_enrolled=Ваш обліковий запис в даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію +twofa_enroll=Увімкнути двофакторну автентифікацію +twofa_disabled=Двофакторна автентифікація вимкнена. +scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної аутентифікації: or_enter_secret=Або введіть секрет: %s passcode_invalid=Некоректний пароль. Спробуй ще раз. From f59bc17b26d36fd167f5af83d2f8ae6f255f9c04 Mon Sep 17 00:00:00 2001 From: stevegt Date: Fri, 15 Jun 2018 00:47:13 -0700 Subject: [PATCH 019/447] fix CreateIssueCommentOption reference (#4239) * fixes a warning remaining from #4010 and #4220 --- public/swagger.v1.json | 2 +- routers/api/v1/repo/issue_comment.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/swagger.v1.json b/public/swagger.v1.json index e0f2a7589af2..9fd790281a9f 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -2208,7 +2208,7 @@ "name": "body", "in": "body", "schema": { - "$ref": "#/definitions/CreateIssueOption" + "$ref": "#/definitions/CreateIssueCommentOption" } } ], diff --git a/routers/api/v1/repo/issue_comment.go b/routers/api/v1/repo/issue_comment.go index 0cbf6493d321..af952a070bd0 100644 --- a/routers/api/v1/repo/issue_comment.go +++ b/routers/api/v1/repo/issue_comment.go @@ -147,7 +147,7 @@ func CreateIssueComment(ctx *context.APIContext, form api.CreateIssueCommentOpti // - name: body // in: body // schema: - // "$ref": "#/definitions/CreateIssueOption" + // "$ref": "#/definitions/CreateIssueCommentOption" // responses: // "201": // "$ref": "#/responses/Comment" From 6dba0f8d3e821aad3ff8c44be486e808e8c0ef3d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 07:48:26 +0000 Subject: [PATCH 020/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index d59851e6a1f7..511e6671fd18 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -400,7 +400,7 @@ delete_token=Видалити access_token_deletion=Видалити токен доступу twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. -twofa_is_enrolled=Ваш обліковий запис в даний час використовує двофакторну автентифікацію. +twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію twofa_enroll=Увімкнути двофакторну автентифікацію twofa_disabled=Двофакторна автентифікація вимкнена. From 588e6252e803ad9f9af7061bd5bd3762513361da Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Fri, 15 Jun 2018 14:42:49 +0200 Subject: [PATCH 021/447] markup: escape short wiki link (#4091) --- modules/markup/html.go | 3 +++ modules/markup/html_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/modules/markup/html.go b/modules/markup/html.go index 4f9d02a8ffcc..a4ef86de227e 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -469,6 +469,9 @@ func shortLinkProcessorFull(ctx *postProcessCtx, node *html.Node, noLink bool) { } else { link = strings.Replace(link, " ", "-", -1) } + if !strings.Contains(link, "/") { + link = url.PathEscape(link) + } } urlPrefix := ctx.urlPrefix if image { diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index fc11532d1ea1..bf7606e1da41 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -82,12 +82,18 @@ func TestRender_ShortLinks(t *testing.T) { rawtree := util.URLJoin(AppSubURL, "raw", "master") url := util.URLJoin(tree, "Link") otherURL := util.URLJoin(tree, "Other-Link") + encodedURL := util.URLJoin(tree, "Link%3F") imgurl := util.URLJoin(rawtree, "Link.jpg") otherImgurl := util.URLJoin(rawtree, "Link+Other.jpg") + encodedImgurl := util.URLJoin(rawtree, "Link+%23.jpg") + notencodedImgurl := util.URLJoin(rawtree, "some", "path", "Link+#.jpg") urlWiki := util.URLJoin(AppSubURL, "wiki", "Link") otherURLWiki := util.URLJoin(AppSubURL, "wiki", "Other-Link") + encodedURLWiki := util.URLJoin(AppSubURL, "wiki", "Link%3F") imgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link.jpg") otherImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+Other.jpg") + encodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "Link+%23.jpg") + notencodedImgurlWiki := util.URLJoin(AppSubURL, "wiki", "raw", "some", "path", "Link+#.jpg") favicon := "http://google.com/favicon.ico" test( @@ -134,4 +140,24 @@ func TestRender_ShortLinks(t *testing.T) { "[[Link]] [[Other Link]]", `

Link Other Link

`, `

Link Other Link

`) + test( + "[[Link?]]", + `

Link?

`, + `

Link?

`) + test( + "[[Link]] [[Other Link]] [[Link?]]", + `

Link Other Link Link?

`, + `

Link Other Link Link?

`) + test( + "[[Link #.jpg]]", + `

`, + `

`) + test( + "[[Name|Link #.jpg|alt=\"AltName\"|title='Title']]", + `

AltName

`, + `

AltName

`) + test( + "[[some/path/Link #.jpg]]", + `

`, + `

`) } From 1a3e33983f1bc483923b1a0f7ca01bf1fbb9b148 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 15 Jun 2018 12:43:56 +0000 Subject: [PATCH 022/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 511e6671fd18..f49b982808d8 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -68,7 +68,7 @@ activities=Дії pull_requests=Запити на злиття issues=Проблеми -cancel=Відміна +cancel=Відмінити [install] install=Встановлення @@ -318,7 +318,7 @@ update_profile=Оновити профіль update_profile_success=Профіль успішно оновлено. change_username=Ваше Ім'я кристувача було змінено. continue=Продовжити -cancel=Відміна +cancel=Відмінити language=Мова lookup_avatar_by_mail=Знайти Аватар за адресою електронної пошти @@ -532,7 +532,7 @@ editor.commit_message_desc=Додати необов'язковий розшир editor.commit_directly_to_this_branch=Зробіть коміт прямо в гілку %s. editor.create_new_branch=Створити нову гілку для цього коміту та відкрити запит на злиття. editor.new_branch_name_desc=Ім'я нової гілки… -editor.cancel=Відміна +editor.cancel=Відмінити editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. @@ -634,7 +634,7 @@ issues.collaborator=Співавтор issues.owner=Власник issues.sign_in_require_desc=Підпишіться щоб приєднатися до обговорення. issues.edit=Редагувати -issues.cancel=Відміна +issues.cancel=Відмінити issues.save=Зберегти issues.label_title=Назва мітки issues.label_description=Опис мітки @@ -663,11 +663,11 @@ issues.tracking_already_started=`Ви вже почали відстежуват issues.stop_tracking=Стоп issues.add_time=Вручну додати час issues.add_time_short=Додати час -issues.add_time_cancel=Відміна +issues.add_time_cancel=Відмінити issues.add_time_hours=Години issues.add_time_minutes=Хвилини issues.add_time_sum_to_small=Час не введено. -issues.cancel_tracking=Відміна +issues.cancel_tracking=Відмінити issues.cancel_tracking_history=`скасував відстеження часу %s` issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` @@ -718,7 +718,7 @@ milestones.desc=Опис milestones.due_date=Дата завершення (опціонально) milestones.clear=Очистити milestones.edit=Редагувати етап -milestones.cancel=Відміна +milestones.cancel=Відмінити milestones.modify=Оновити етап milestones.deletion=Видалити етап milestones.filter_sort.most_issues=Найбільш проблем @@ -939,7 +939,7 @@ release.preview=Переглянути release.loading=Завантаження… release.prerelease_desc=Позначити як пре-реліз release.prerelease_helper=Позначте цей випуск непридатним для ПРОД використання. -release.cancel=Відміна +release.cancel=Відмінити release.publish=Опублікувати реліз release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз From c83c9eccc5137de609ec0b702725d489b8e534fb Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Fri, 15 Jun 2018 16:07:48 +0200 Subject: [PATCH 023/447] Show second line by using >= 1 instead of > 1 (#4251) Signed-off-by: Jonas Franz --- modules/templates/helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/templates/helper.go b/modules/templates/helper.go index bf5c0130b643..b6c835ad44a2 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -323,7 +323,7 @@ func RenderCommitBody(msg, urlPrefix string, metas map[string]string) template.H // IsMultilineCommitMessage checks to see if a commit message contains multiple lines. func IsMultilineCommitMessage(msg string) bool { - return strings.Count(strings.TrimSpace(msg), "\n") > 1 + return strings.Count(strings.TrimSpace(msg), "\n") >= 1 } // Actioner describes an action From 304e4a9d346ed8ae9e74b8f0e2bd8adc1d727175 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 18 Jun 2018 19:16:53 +0200 Subject: [PATCH 024/447] Reorganized feature comparison (#4264) --- docs/content/doc/features/comparison.en-us.md | 746 +++--------------- 1 file changed, 90 insertions(+), 656 deletions(-) diff --git a/docs/content/doc/features/comparison.en-us.md b/docs/content/doc/features/comparison.en-us.md index 981365c7199c..698de4f46ed6 100644 --- a/docs/content/doc/features/comparison.en-us.md +++ b/docs/content/doc/features/comparison.en-us.md @@ -27,659 +27,93 @@ _Symbols used in table:_ * _✘ - unsupported_ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureGiteaGogsGitHub EEGitLab CEGitLab EEBitBucketRhodeCode CE
Open source and free
Issue tracker
Pull/Merge requests
Squash merging
Rebase merging
Pull/Merge request inline comments
Pull/Merge request approval
Merge conflict resolution
Restrict push and merge access to certain users
Markdown support
Issues and pull/merge requests templates
Revert specific commits or a merge request
Labels
Time tracking
Multiple assignees for issues
Related issues
Confidential issues
Comment reactions
Lock Discussion
Batch issue handling
Issue Boards
Create new branches from issues
Commit graph
Web code editor
Branch manager
Create new branches
Repository topics
Repository code search
Global code search
Issue search
Global issue search
Git LFS 2.0
Integrated Git-powered wiki
Static Git-powered pages
Group Milestones
Granular user roles (Code, Issues, Wiki etc)
Cherry-picking changes
GPG Signed Commits
Reject unsigned commits
Verified Committer?
Subgroups: groups within groups
Custom Git Hooks
Repository Activity page
Deploy Tokens
Repository Tokens with write rights
Easy upgrade process
Built-in Container Registry
External git mirroring
AD / LDAP integration
Multiple LDAP / AD server support
LDAP user synchronization
OpenId Connect support?
OAuth 2.0 integration (external authorization)?
Act as OAuth 2.0 provider
Two factor authentication (2FA)
FIDO U2F (2FA)
Webhook support
Mattermost/Slack integration
Discord integration
Built-in CI/CD
External CI/CD status display
Multiple database support
Multiple OS support
Low resource usage (RAM/CPU)
+#### General Features + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Open source and free | ✓ | ✓ | ✘| ✓ | ✘ | ✘ | ✓ | +| Low resource usage (RAM/CPU) | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✘ | +| Multiple database support | ✓ | ✓ | ✘ | ⁄ | ⁄ | ✓ | ✓ | +| Multiple OS support | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | ✓ | +| Easy upgrade process | ✓ | ✓ | ✘ | ✓ | ✓ | ✘ | ✓ | +| Markdown support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Static Git-powered pages | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Integrated Git-powered wiki | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Deploy Tokens | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Repository Tokens with write rights | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | +| Built-in Container Registry | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| External git mirroring | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | +| FIDO U2F (2FA) | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Built-in CI/CD | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Subgroups: groups within groups | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✓ | + +#### Code management + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Repository topics | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Repository code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Global code search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Git LFS 2.0 | ✓ | ✘ | ✓ | ✓ | ✓ | ⁄ | ✓ | +| Group Milestones | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Granular user roles (Code, Issues, Wiki etc) | ✓ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Verified Committer | ✘ | ✘ | ? | ✓ | ✓ | ✓ | ✘ | +| GPG Signed Commits | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Reject unsigned commits | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✓ | +| Repository Activity page | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Branch manager | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Create new branches | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Web code editor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Commit graph | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | + +#### Issue Tracker + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Issue tracker | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Issue templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Labels | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Time tracking | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Multiple assignees for issues | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Related issues | ✘ | ✘ | ⁄ | ✘ | ✓ | ✘ | ✘ | +| Confidential issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Comment reactions | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Lock Discussion | ✘ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Batch issue handling | ✓ | ✘ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Issue Boards | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Create new branches from issues | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | +| Issue search | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Global issue search | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | + +#### Pull/Merge requests + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Pull/Merge requests | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Squash merging | ✓ | ✘ | ✓ | ✘ | ✓ | ✓ | ✓ | +| Rebase merging | ✓ | ✓ | ✓ | ✘ | ⁄ | ✘ | ✓ | +| Pull/Merge request inline comments | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Pull/Merge request approval | ✘ | ✘ | ⁄ | ✓ | ✓ | ✓ | ✓ | +| Merge conflict resolution | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Restrict push and merge access to certain users | ✓ | ✘ | ✓ | ⁄ | ✓ | ✓ | ✓ | +| Revert specific commits or a merge request | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Pull/Merge requests templates | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | ✘ | +| Cherry-picking changes | ✘ | ✘ | ✘ | ✓ | ✓ | ✘ | ✘ | + + +#### 3rd-party integrations + +| Feature | Gitea | Gogs | GitHub EE | GitLab CE | GitLab EE | BitBucket | RhodeCode CE | +|---------|-------|------|-----------|-----------|-----------|-----------|--------------| +| Webhook support | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Custom Git Hooks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| AD / LDAP integration | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Multiple LDAP / AD server support | ✓ | ✓ | ✘ | ✘ | ✓ | ✓ | ✓ | +| LDAP user synchronization | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | +| OpenId Connect support | ✓ | ✘ | ✓ | ✓ | ✓ | ? | ✘ | +| OAuth 2.0 integration (external authorization) | ✓ | ✘ | ⁄ | ✓ | ✓ | ? | ✓ | +| Act as OAuth 2.0 provider | ✘ | ✘ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Two factor authentication (2FA) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✘ | +| Mattermost/Slack integration | ✓ | ✓ | ⁄ | ✓ | ✓ | ⁄ | ✓ | +| Discord integration | ✓ | ✓ | ✓ | ✘ | ✘ | ✘ | ✘ | +| External CI/CD status display | ✓ | ✘ | ✓ | ✓ | ✓ | ✓ | ✓ | From d7288ea9b2f03b47ca55428b74c1912d4d03aa1a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 18 Jun 2018 17:18:22 +0000 Subject: [PATCH 025/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 310 ++++++++++++++++---------------- options/locale/locale_uk-UA.ini | 10 +- 2 files changed, 162 insertions(+), 158 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 36430842473a..d618d2c9ad4b 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -83,12 +83,12 @@ host=Host user=Benutzername password=Passwort db_name=Datenbankname -db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB Speichersubsystem und den Zeichensatz "utf8_general_ci". +db_helper=Hinweis für MySQL-Benutzer: Bitte verwende das InnoDB-Speichersubsystem und den Zeichensatz „utf8_general_ci“. ssl_mode=SSL path=Pfad sqlite_helper=Der Dateipfad zur SQLite3- oder TiDB-Datenbank.
Bitte verwende einen absoluten Pfad, wenn Gitea als Service gestartet wird. -err_empty_db_path=Der SQLite3 oder TiDB Datenbankpfad darf nicht leer sein. -err_invalid_tidb_name=Der TiDB Datenbankname darf nicht die Zeichen "." und "-" enthalten. +err_empty_db_path=Der SQLite3- oder TiDB-Datenbankpfad darf nicht leer sein. +err_invalid_tidb_name=Der TiDB-Datenbankname darf nicht die Zeichen „.“ und „-“ enthalten. no_admin_and_disable_registration=Du kannst Selbst-Registrierungen nicht deaktivieren, ohne ein Administratorkonto zu erstellen. err_empty_admin_password=Das Administrator-Passwort darf nicht leer sein. @@ -101,13 +101,13 @@ lfs_path=Git LFS-Wurzelpfad lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren. run_user=Ausführen als run_user_helper=Gebe den Betriebssystem-Benutzernamen ein, unter welchem Gitea laufen soll. Beachte, dass dieser Nutzer Zugriff auf den Repository-Ordner haben muss. -domain=SSH Server-Domain +domain=SSH-Server-Domain domain_helper=Domain oder Host-Adresse für die SSH-URL. -ssh_port=SSH Server Port +ssh_port=SSH-Server-Port ssh_port_helper=Der Port deines SSH-Servers. Leer lassen um SSH zu deaktivieren. -http_port=Gitea HTTP-Listen-Port -http_port_helper=Port unter dem der Gitea Web Server laufen soll. -app_url=Gitea Basis-URL +http_port=Gitea-HTTP-Listen-Port +http_port_helper=Port, unter dem der Gitea-Webserver laufen soll. +app_url=Gitea-Basis-URL app_url_helper=Adresse für HTTP(S)-Klon-URLs und E-Mail-Benachrichtigungen. log_root_path=Logdateipfad log_root_path_helper=Log-Dateien werden in diesem Verzeichnis gespeichert. @@ -117,8 +117,8 @@ email_title=E-Mail-Einstellungen smtp_host=SMTP-Server smtp_from=E-Mail senden als smtp_from_helper=E-Mail-Adresse, die von Gitea genutzt werden soll. Bitte gib die E-Mail-Adresse im '"Name" '-Format ein. -mailer_user=SMTP Benutzername -mailer_password=SMTP Passwort +mailer_user=SMTP-Benutzername +mailer_password=SMTP-Passwort register_confirm=E-Mail-Bestätigung benötigt zum Registrieren mail_notify=E-Mail-Benachrichtigungen aktivieren server_service_title=Sonstige Server- und Drittserviceeinstellungen @@ -131,9 +131,9 @@ federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren disable_registration=Registrierung deaktivieren disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können. allow_only_external_registration_popup=Registrierung nur über externe Services aktiveren. -openid_signin=OpenID Anmeldung aktivieren +openid_signin=OpenID-Anmeldung aktivieren openid_signin_popup=Benutzeranmeldung via OpenID aktivieren. -openid_signup=OpenID Selbstregistrierung aktivieren +openid_signup=OpenID-Selbstregistrierung aktivieren openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren. enable_captcha=CAPTCHA aktivieren enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich. @@ -147,10 +147,10 @@ confirm_password=Passwort bestätigen admin_email=E-Mail-Adresse install_btn_confirm=Gitea installieren test_git_failed=Fehler beim Test des 'git' Kommandos: %v -sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die 'gobuild'-Version). +sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die „gobuild“-Version). invalid_db_setting=Datenbankeinstellungen sind ungültig: %v invalid_repo_path=Repository-Verzeichnis ist ungültig: %v -run_user_not_match=Der "Ausführen als" Benutzer ist nicht der aktuelle Benutzer: %s -> %s +run_user_not_match=Der „Ausführen als“-Benutzername ist nicht der aktuelle Benutzername: %s -> %s save_config_failed=Fehler beim Speichern der Konfiguration: %v invalid_admin_setting=Administrator-Konto Einstellungen sind ungültig: %v install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß! @@ -162,7 +162,7 @@ default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisa default_enable_timetracking=Zeiterfassung standardmäßig aktivieren default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositories aktivieren. no_reply_address=Versteckte E-Mail-Domain -no_reply_address_helper=Domain-Namen für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername "Joe" in Git als "joe@noreply.example.org" protokolliert, wenn die versteckte E-Mail-Domäne "noreply.example.org" festgelegt ist. +no_reply_address_helper=Domain-Name für Benutzer mit einer versteckten Emailadresse. Zum Beispiel wird der Benutzername „Joe“ in Git als „joe@noreply.example.org“ protokolliert, wenn die versteckte E-Mail-Domain „noreply.example.org“ festgelegt ist. [home] uname_holder=E-Mail-Adresse oder Benutzername @@ -225,9 +225,9 @@ login_userpass=Anmelden login_openid=OpenID openid_connect_submit=Verbinden openid_connect_title=Mit bestehendem Konto verbinden -openid_connect_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu. +openid_connect_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_register_title=Neues Konto einrichten -openid_register_desc=Die gewählte OpenID URI ist unbekannt. Ordne sie hier einem neuen Account zu. +openid_register_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. openid_signin_desc=Gib deine OpenID-URI ein. Zum Beispiel: https://anne.me, bob.openid.org.cn oder gnusocial.net/carry. disable_forgot_password_mail=Das Zurücksetzen von Passwörtern wurde deaktiviert. Bitte wende dich an den Administrator. @@ -264,8 +264,8 @@ TreeName=Dateipfad Content=Inhalt require_error=` darf nicht leer sein.` -alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-') und Unterstriche ('_') enthalten` -alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche ('-'), Unterstriche ('_') und Punkte ('.') enthalten` +alpha_dash_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“) und Unterstriche („_“) enthalten.` +alpha_dash_dot_error=` sollte nur Buchstaben, Zahlen, Bindestriche („-“), Unterstriche („_“) und Punkte („.“) enthalten.` git_ref_name_error=` muss ein wohlgeformter Git-Referenzname sein.` size_error=` muss die Größe %s haben.` min_size_error=` muss mindestens %s Zeichen enthalten.` @@ -283,13 +283,13 @@ org_name_been_taken=Der Organisationsname ist bereits vergeben. team_name_been_taken=Der Teamname ist bereits vergeben. team_no_units_error=Das Team muss auf mindestens einen Bereich Zugriff haben. email_been_used=Die E-Mail-Adresse wird bereits verwendet. -openid_been_used=Die OpenID-Adresse "%s" wird bereits verwendet. +openid_been_used=Die OpenID-Adresse „%s“ wird bereits verwendet. username_password_incorrect=Benutzername oder Passwort ist falsch. enterred_invalid_repo_name=Der eingegebenen Repository-Name ist falsch. -enterred_invalid_owner_name=Der Name des neuen Besitzers ist invalid. +enterred_invalid_owner_name=Der Name des neuen Besitzers ist ungültig. enterred_invalid_password=Das eingegebene Passwort ist falsch. user_not_exist=Dieser Benutzer ist nicht vorhanden. -last_org_owner=Du kannst den letzten Benutzer nicht aus dem "Besitzer"-Team entferenen. Es muss mindestens ein Besitzer in einer Organisation geben. +last_org_owner=Du kannst den letzten Benutzer nicht aus dem „Besitzer“-Team entfernen. Es muss mindestens einen Besitzer in einer Organisation geben. cannot_add_org_to_team=Eine Organisation kann nicht als Teammitglied hinzugefügt werden. invalid_ssh_key=Dein SSH-Key kann nicht überprüft werden: %s @@ -349,7 +349,7 @@ continue=Weiter cancel=Abbrechen language=Sprache -lookup_avatar_by_mail=Avatar anhand der E-Mail-Addresse suchen +lookup_avatar_by_mail=Profilbild anhand der E-Mail-Addresse suchen federated_avatar_lookup=Suche nach föderierten Profilbildern enable_custom_avatar=Benutzerdefiniertes Profilbild benutzen choose_new_avatar=Neues Profilbild auswählen @@ -364,7 +364,7 @@ new_password=Neues Passwort retype_new_password=Neues Passwort erneut eingeben password_incorrect=Das aktuelle Passwort ist falsch. change_password_success=Dein Passwort wurde aktualisiert. Bitte verwende dieses beim nächsten Einloggen. -password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web Interface nicht ändern. +password_change_disabled=Benutzer, die nicht von Gitea verwaltet werden, können ihr Passwort im Web-Interface nicht ändern. emails=E-Mail-Adressen manage_emails=E-Mail-Adressen verwalten @@ -383,7 +383,7 @@ add_new_email=Neue E-Mail-Adresse hinzufügen add_new_openid=Neue OpenID-URI hinzufügen add_email=E-Mail-Adresse hinzufügen add_openid=OpenID-URI hinzufügen -add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an '%s' gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen. +add_email_confirmation_sent=Eine Bestätigungs-E-Mail wurde an „%s“ gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die E-Mail-Adresse zu bestätigen. add_email_success=Die neue E-Mail-Addresse wurde hinzugefügt. add_openid_success=Die neue OpenID-Adresse wurde hinzugefügt. keep_email_private=E-Mail-Adresse verbergen @@ -394,8 +394,8 @@ manage_ssh_keys=SSH-Schlüssel verwalten manage_gpg_keys=GPG-Schlüssel verwalten add_key=Schlüssel hinzufügen ssh_desc=Diese öffentlichen SSH-Keys sind mit deinem Account verbunden. Der dazugehörigen privaten SSH-Keys geben dir vollen Zugriff auf deine Repositories. -gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten SSH-Keys geheim, da diese deine Commits signieren. -ssh_helper=Brauchst du Hilfe? Hier ist Githubs Anleitung zum Erzeugen von SSH-Schlüsseln oder Lösen einfacher SSH-Probleme. +gpg_desc=Diese öffentlichen GPG-Keys sind mit deinem Account verbunden. Halte die dazugehörigen privaten GPG-Keys geheim, da diese deine Commits signieren. +ssh_helper=Brauchst du Hilfe? Hier ist GitHubs Anleitung zum Erzeugen von SSH-Schlüsseln oder zum Lösen einfacher SSH-Probleme. gpg_helper=Brauchst du Hilfe? Hier ist GitHubs Anleitung über GPG. add_new_key=SSH-Schlüssel hinzufügen add_new_gpg_key=GPG-Schlüssel hinzufügen @@ -407,8 +407,8 @@ subkeys=Unterschlüssel key_id=Schlüssel-ID key_name=Schlüsselname key_content=Inhalt -add_key_success=Der SSH-Schlüssel "%s" wurde hinzugefügt. -add_gpg_key_success=Der GPG-Key "%s" wurde hinzugefügt. +add_key_success=Der SSH-Schlüssel „%s“ wurde hinzugefügt. +add_gpg_key_success=Der GPG-Key „%s“ wurde hinzugefügt. delete_key=Entfernen ssh_key_deletion=SSH-Schlüssel entfernen gpg_key_deletion=GPG-Schlüssel entfernen @@ -511,10 +511,10 @@ create_repo=Repository erstellen default_branch=Standardbranch mirror_prune=Entfernen mirror_prune_desc=Entferne veraltete remote-tracking Referenzen -mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind 'h', 'm', 's') +mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind „h“, „m“, „s“) mirror_interval_invalid=Das Spiegel-Intervall ist ungültig. mirror_address=Klonen via URL -mirror_address_desc=Bitte gebe alle benötigten Zugangsdaten in der URL an. +mirror_address_desc=Bitte gib alle benötigten Zugangsdaten in der URL an. mirror_last_synced=Zuletzt synchronisiert watchers=Beobachter stargazers=Favorisiert von @@ -523,7 +523,7 @@ pick_reaction=Wähle eine Reaktion reactions_more=und %d weitere form.reach_limit_of_creation=Du hast bereits dein Limit von %d Repositories erreicht. -form.name_reserved=Der Repository-Name '%s' ist reserviert. +form.name_reserved=Der Repository-Name „%s“ ist reserviert. form.name_pattern_not_allowed='%s' ist nicht erlaubt für Repository-Namen. need_auth=Authentifizierung zum Klonen benötigt @@ -598,31 +598,31 @@ editor.filename_help=Füge einen Ordner hinzu, indem du seinen Namen und anschli editor.or=oder editor.cancel_lower=Abbrechen editor.commit_changes=Änderungen committen -editor.add_tmpl='%s/' hinzufügen -editor.add='%s' hinzufügen -editor.update='%s' ändern -editor.delete='%s' löschen +editor.add_tmpl=„%s/“ hinzufügen +editor.add=„%s“ hinzufügen +editor.update=„%s“ ändern +editor.delete=„%s“ löschen editor.commit_message_desc=Eine ausführlichere (optionale) Beschreibung hinzufügen… -editor.commit_directly_to_this_branch=Direkt in die %s-Branch einchecken. -editor.create_new_branch=Einen neue Branch für diesen Commit erstellen und einen Pull Request starten. +editor.commit_directly_to_this_branch=Direkt in den Branch „%s“ einchecken. +editor.create_new_branch=Einen neuen Branch für diesen Commit erstellen und einen Pull Request starten. editor.new_branch_name_desc=Neuer Branchname… editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. -editor.directory_is_a_file=Der Verzeichnisname '%s' wird bereits als Dateiname in diesem Repository verwendet. +editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet. editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden. -editor.filename_is_a_directory=Der Dateiname '%s' wird bereits als Verzeichnisname in diesem Repository verwendet. -editor.file_editing_no_longer_exists=Die bearbeitete Datei '%s' existiert nicht mehr in diesem Repository. -editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken um die Änderungen anzusehen, oder Änderungen erneut comitten um sie zu überschreiben. -editor.file_already_exists=Eine Datei mit dem Namen '%s' ist bereits in diesem Repository vorhanden. +editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet. +editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert nicht mehr in diesem Repository. +editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken, um die Änderungen anzusehen, oder Änderungen erneut comitten, um sie zu überschreiben. +editor.file_already_exists=Eine Datei mit dem Namen „%s“ ist bereits in diesem Repository vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden. editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v editor.add_subdir=Verzeichnis erstellen… -editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach '%s'. Fehler: %v +editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v editor.upload_files_to_dir=Dateien hochladen nach '%s' -editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch '%s' ist nicht möglich. +editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch „%s“ ist nicht möglich. -commits.desc=Durchsuche die Quellcode Änderungshistorie. +commits.desc=Durchsuche die Quellcode-Änderungshistorie. commits.commits=Commits commits.search=Commits durchsuchen… commits.find=Suchen @@ -633,7 +633,7 @@ commits.date=Datum commits.older=Älter commits.newer=Neuer commits.signed_by=Signiert von -commits.gpg_key_id=GPG Schlüssel-ID +commits.gpg_key_id=GPG-Schlüssel-ID ext_issues=Externe Issues ext_issues.desc=Link zu externem Issuetracker. @@ -768,10 +768,10 @@ issues.cancel_tracking_history=hat die Zeiterfassung %s abgebrochen issues.time_spent_total=Zeitaufwand insgesamt issues.time_spent_from_all_authors=`Aufgewendete Zeit: %s` issues.due_date=Fällig am -issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben. +issues.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben. issues.error_modifying_due_date=Fehler beim Ändern des Fälligkeitsdatums. issues.error_removing_due_date=Fehler beim Entfernen des Fälligkeitsdatums. -issues.due_date_form=jjjj-mm-tt +issues.due_date_form=JJJJ-MM-TT issues.due_date_form_add=Fälligkeitsdatum hinzufügen issues.due_date_form_update=Fälligkeitsdatum ändern issues.due_date_form_remove=Fälligkeitsdatum löschen @@ -787,7 +787,7 @@ pulls.new=Neuer Pull-Request pulls.compare_changes=Neuer Pull-Request pulls.compare_changes_desc=Wähle die Ziel- und Quellbranch aus. pulls.compare_base=Ziel -pulls.compare_compare=pull von +pulls.compare_compare=pullen von pulls.filter_branch=Branch filtern pulls.no_results=Keine Ergebnisse verfügbar. pulls.nothing_to_compare=Diese Branches sind identisch. Es muss kein Pull-Request erstellt werden. @@ -827,13 +827,13 @@ milestones.title=Titel milestones.desc=Beschreibung milestones.due_date=Fälligkeitsdatum (optional) milestones.clear=Feld leeren -milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format 'JJJJ-MM-TT' haben. -milestones.create_success=Der Meilenstein '%s' wurde erstellt. +milestones.invalid_due_date_format=Das Fälligkeitsdatum muss das Format „JJJJ-MM-TT“ haben. +milestones.create_success=Der Meilenstein „%s“ wurde erstellt. milestones.edit=Meilenstein bearbeiten milestones.edit_subheader=Benutze Meilensteine, um Issues zu organisieren und den Fortschritt darzustellen. milestones.cancel=Abbrechen milestones.modify=Meilenstein bearbeiten -milestones.edit_success=Die Änderungen am Meilenstein "%s" wurden gespeichert. +milestones.edit_success=Die Änderungen am Meilenstein „%s“ wurden gespeichert. milestones.deletion=Meilenstein löschen milestones.deletion_desc=Das Löschen des Meilensteins entfernt ihn von allen Issues. Fortfahren? milestones.deletion_success=Der Meilenstein wurde gelöscht. @@ -849,7 +849,7 @@ ext_wiki.desc=Verweis auf externes Wiki. wiki=Wiki wiki.welcome=Willkommen im Wiki. -wiki.welcome_desc=Im Wiki kannst Dokumentation schreiben und mit Mitarbeitern teilen. +wiki.welcome_desc=Im Wiki kannst du Dokumentation schreiben und sie mit Mitarbeitern teilen. wiki.desc=Schreibe und teile Dokumentation mit Mitarbeitern. wiki.create_first_page=Erstelle die erste Seite wiki.page=Seite @@ -861,9 +861,9 @@ wiki.last_commit_info=%s hat diese Seite bearbeitet %s wiki.edit_page_button=Bearbeiten wiki.new_page_button=Neue Seite wiki.delete_page_button=Seite löschen -wiki.delete_page_notice_1=Das Löschen der Wiki-Seite '%s' kann nicht Rückgängig gemacht werden. Fortfahren? +wiki.delete_page_notice_1=Das Löschen der Wiki-Seite „%s“ kann nicht rückgängig gemacht werden. Fortfahren? wiki.page_already_exists=Eine Wiki-Seite mit dem gleichen Namen existiert bereits. -wiki.reserved_page=Der Wiki-Seitenname "%s" ist reserviert. +wiki.reserved_page=Der Wiki-Seitenname „%s“ ist reserviert. wiki.pages=Seiten wiki.last_updated=Zuletzt aktualisiert %s @@ -911,7 +911,7 @@ activity.published_release_label=Veröffentlicht search=Suchen search.search_repo=Repository durchsuchen -search.results=Suchergebnisse für "%s" in %s +search.results=Suchergebnisse für „%s“ in %s settings=Einstellungen settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen @@ -925,28 +925,28 @@ settings.hooks=Webhooks settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen settings.mirror_settings=Mirror Einstellungen -settings.sync_mirror=Jetzt Synchronisieren +settings.sync_mirror=Jetzt synchronisieren settings.mirror_sync_in_progress=Mirror-Synchronisierung wird zurzeit ausgeführt. Komm in ein paar Minuten zurück. settings.site=Webseite settings.update_settings=Einstellungen speichern settings.advanced_settings=Erweiterte Einstellungen -settings.wiki_desc=Repository Wiki aktivieren +settings.wiki_desc=Repository-Wiki aktivieren settings.use_internal_wiki=Eingebautes Wiki verwenden settings.use_external_wiki=Externes Wiki verwenden settings.external_wiki_url=Externe Wiki URL settings.external_wiki_url_error=Die externe Wiki-URL ist ungültig. -settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet wenn sie auf das Wiki-Tab klicken. -settings.issues_desc=Repository Issue-Tracker aktivieren +settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet, wenn sie auf das Wiki-Tab klicken. +settings.issues_desc=Repository-Issue-Tracker aktivieren settings.use_internal_issue_tracker=Integrierten Issue-Tracker verwenden settings.use_external_issue_tracker=Externen Issue-Tracker verwenden settings.external_tracker_url=URL eines externen Issue Trackers settings.external_tracker_url_error=Die URL des externen Issue-Trackers ist ungültig. -settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet wenn sie auf das Issues-Tab klicken. +settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet, wenn sie auf das Issues-Tab klicken. settings.tracker_url_format=URL-Format des externen Issue-Systems settings.tracker_issue_style=Namenskonvention des externen Issue-Trackers settings.tracker_issue_style.numeric=Numerisch settings.tracker_issue_style.alphanumeric=Alphanumerisch -settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositories und die Issue-Nummer verwenden. +settings.tracker_url_format_desc=Du kannst die Platzhalter {user}, {repo}, {index} für den Benutzernamen, den Namen des Repositorys und die Issue-Nummer verwenden. settings.enable_timetracker=Zeiterfassung aktivieren settings.allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen settings.pulls_desc=Repository-Pull-Requests aktivieren @@ -964,22 +964,22 @@ settings.convert_notices_1=Dieser Vorgang wandelt das Mirror-Repository in ein n settings.convert_confirm=Repository umwandeln settings.convert_succeed=Das Mirror-Repository wurde erfolgreich in ein normales Repository umgewandelt. settings.transfer=Besitz übertragen -settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation in der Du Admin-Rechte hast. -settings.transfer_notices_1=- Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. -settings.transfer_notices_2=- Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. +settings.transfer_desc=Übertrage dieses Repository auf einen anderen Benutzer oder eine Organisation, in der du Admin-Rechte hast. +settings.transfer_notices_1=– Du wirst keinen Zugriff mehr haben, wenn der neue Besitzer ein individueller Benutzer ist. +settings.transfer_notices_2=– Du wirst weiterhin Zugriff haben, wenn der neue Besitzer eine Organisation ist und du einer der Besitzer bist. settings.transfer_form_title=Gib den Repository-Namen zur Bestätigung ein: settings.wiki_delete=Wiki-Daten löschen settings.wiki_delete_desc=Das Löschen von Wiki-Daten kann nicht rückgängig gemacht werden. Bitte sei vorsichtig. -settings.wiki_delete_notices_1=- Dies löscht und deaktiviert das Wiki für %s. +settings.wiki_delete_notices_1=– Dies löscht und deaktiviert das Wiki für %s. settings.confirm_wiki_delete=Wiki-Daten löschen -settings.wiki_deletion_success=Repository Wiki-Daten wurden gelöscht. +settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig. settings.delete_notices_1=- Diese Operation kann NICHT rückgängig gemacht werden. -settings.delete_notices_2=- Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. -settings.delete_notices_fork_1=- Nach dem Löschen werden alle Forks unabhängig. +settings.delete_notices_2=– Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. +settings.delete_notices_fork_1=– Forks dieses Repositorys werden nach dem Löschen unabhängig. settings.deletion_success=Das Repository wurde gelöscht. -settings.update_settings_success=Repository Einstellungen wurden aktualisiert. +settings.update_settings_success=Repository-Einstellungen wurden aktualisiert. settings.transfer_owner=Neuer Besitzer settings.make_transfer=Transfer durchführen settings.transfer_succeed=Das Repository wurde transferiert. @@ -994,7 +994,7 @@ settings.search_user_placeholder=Benutzer suchen… settings.org_not_allowed_to_be_collaborator=Organisationen können nicht als Mitarbeiter hinzugefügt werden. settings.user_is_org_member=Der Benutzer ist ein Organisationsmitglied und kann nicht als Mitarbeiter hinzugefügt werden. settings.add_webhook=Webhook hinzufügen -settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch HTTP POST-Requets an einen Server. Lies mehr in unserer Anleitung zu Webhooks (Englisch). +settings.hooks_desc=Webhooks senden bei bestimmten Gitea-Events automatisch „HTTP POST“-Anfragen an einen Server. Lies mehr in unserer Anleitung zu Webhooks (auf Englisch). settings.webhook_deletion=Webhook löschen settings.webhook_deletion_desc=Das Entfernen eines Webhooks löscht seine Einstellungen und Zustellungsverlauf. Fortfahren? settings.webhook_deletion_success=Webhook wurde entfernt. @@ -1066,18 +1066,18 @@ settings.title=Titel settings.deploy_key_content=Inhalt settings.key_been_used=Ein Deploy-Key mit identischem Inhalt wird bereits verwendet. settings.key_name_used=Ein Deploy-Key mit diesem Namen existiert bereits. -settings.add_key_success=Der Deploy-Key '%s' wurde erfolgreich hinzugefügt. +settings.add_key_success=Der Deploy-Key „%s“ wurde erfolgreich hinzugefügt. settings.deploy_key_deletion=Deploy-Key löschen settings.deploy_key_deletion_desc=Nach dem Löschen wird dieser Deploy-Key keinen Zugriff mehr auf dieses Repository haben. Fortfahren? settings.deploy_key_deletion_success=Der Deploy-Key wurde entfernt. settings.branches=Branches -settings.protected_branch=Branch-Protection +settings.protected_branch=Branch-Schutz settings.protected_branch_can_push=Push erlauben? settings.protected_branch_can_push_yes=Du kannst pushen settings.protected_branch_can_push_no=Du kannst nicht pushen -settings.branch_protection=Branch-Schutz" für Branch '%s' +settings.branch_protection=Branch-Schutz für Branch „%s“ settings.protect_this_branch=Brach-Schutz aktivieren -settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere Git force push auf diese Branch. +settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das sog. „force pushing” von Git auf diesen Branch. settings.protect_whitelist_committers=Push-Whitelist aktivieren settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen. settings.protect_whitelist_users=Nutzer, die pushen dürfen: @@ -1090,12 +1090,12 @@ settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen: settings.protect_merge_whitelist_teams=Teams, die mergen dürfen: settings.add_protected_branch=Schutz aktivieren settings.delete_protected_branch=Schutz deaktivieren -settings.update_protect_branch_success=Branch-protection für die Branch '%s' wurde geändert. -settings.remove_protected_branch_success=Branch-protection für die Branch '%s' wurde deaktiviert. +settings.update_protect_branch_success=Branch-Schutz für den Branch „%s“ wurde geändert. +settings.remove_protected_branch_success=Branch-Schutz für den Branch „%s“ wurde deaktiviert. settings.protected_branch_deletion=Brach-Schutz deaktivieren -settings.protected_branch_deletion_desc=Wenn du die Branch-Protection deaktivierst, können alle Nutzer mit Schreibrechten auf die Branch pushen. Fortfahren? +settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? settings.default_branch_desc=Wähle eine Standardbranch für Pull-Requests und Code-Commits: -settings.choose_branch=Wähle eine Branch… +settings.choose_branch=Wähle einen Branch … settings.no_protected_branch=Es gibt keine geschützten Branches. diff.browse_source=Quellcode durchsuchen @@ -1131,7 +1131,7 @@ release.write=Schreiben release.preview=Vorschau release.loading=Laden… release.prerelease_desc=Als Pre-Release kennzeichnen -release.prerelease_helper=Dieses Release als "ungeeignet für den produktiven Einsatz" markieren. +release.prerelease_helper=Dieses Release als „ungeeignet für den produktiven Einsatz“ markieren. release.cancel=Abbrechen release.publish=Release veröffentlichen release.save_draft=Entwurf speichern @@ -1146,24 +1146,24 @@ release.downloads=Downloads branch.name=Branchname branch.search=Branches durchsuchen -branch.already_exists=Eine Branch mit dem Namen '%s' existiert bereits. +branch.already_exists=Ein Branch mit dem Namen „%s“ existiert bereits. branch.delete_head=Löschen -branch.delete=Branch '%s' löschen +branch.delete=Branch „%s“ löschen branch.delete_html=Branch löschen -branch.delete_desc=Das Löschen einer Branch ist permanent. Es KANN NICHT Rückgängig gemacht werden. Fortfahren? -branch.deletion_success=Branch '%s' wurde gelöscht. -branch.deletion_failed=Branch '%s' konnte nicht gelöscht werden. -branch.delete_branch_has_new_commits=Die Branch '%s' kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. +branch.delete_desc=Das Löschen eines Branches ist permanent. Es KANN NICHT rückgängig gemacht werden. Fortfahren? +branch.deletion_success=Branch „%s“ wurde gelöscht. +branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden. +branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. branch.create_branch=Erstelle Branch %s branch.create_from=von '%s' -branch.create_success=Branch '%s' wurde erstellt. +branch.create_success=Branch „%s“ wurde erstellt. branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. -branch.branch_name_conflict=Der Branch-Name '%s' steht in Konflikt mit der bestehendem Branch '%s'. -branch.tag_collision=Branch '%s' kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. +branch.branch_name_conflict=Der Branch-Name „%s“ steht in Konflikt mit dem bestehenden Branch „%s“. +branch.tag_collision=Branch „%s“ kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. branch.deleted_by=Von %s gelöscht -branch.restore_success=Branch '%s' wurde wiederhergestellt. -branch.restore_failed=Wiederherstellung der Branch '%s' fehlgeschlagen. -branch.protected_deletion_failed=Branch '%s' ist geschützt und kann nicht gelöscht werden. +branch.restore_success=Branch „%s“ wurde wiederhergestellt. +branch.restore_failed=Wiederherstellung des Branches „%s“ fehlgeschlagen. +branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht gelöscht werden. topic.manage_topics=Themen verwalten topic.done=Fertig @@ -1188,9 +1188,9 @@ team_desc_helper=Beschreibe den Zweck oder die Rolle des Teams. team_permission_desc=Berechtigungen team_unit_desc=Zugriff auf Repositorybereiche erlauben -form.name_reserved=Der Organisationsname '%s' ist reserviert. -form.name_pattern_not_allowed=Das Muster '%s' ist in Organisationsnamen nicht erlaubt. -form.create_org_not_allowed=Du bist nicht berechtigt eine Organisation zu erstellen. +form.name_reserved=Der Organisationsname „%s“ ist reserviert. +form.name_pattern_not_allowed=Das Muster „%s“ ist in Organisationsnamen nicht erlaubt. +form.create_org_not_allowed=Du bist nicht berechtigt, eine Organisation zu erstellen. settings=Einstellungen settings.options=Organisation @@ -1229,7 +1229,7 @@ teams.read_access_helper=Mitglieder können Teamrepositories ansehen und klonen. teams.write_access=Schreibzugriff teams.write_access_helper=Mitglieder können Teamrepositories ansehen und auf sie pushen. teams.admin_access=Administratorzugang -teams.admin_access_helper=Mitglieder können auf Team Repositories "pushen", von ihnen "pullen" und Mitarbeiter hinzufügen. +teams.admin_access_helper=Mitglieder können auf Team-Repositorys pushen, von ihnen pullen und Mitarbeiter hinzufügen. teams.no_desc=Dieses Team hat keine Beschreibung teams.settings=Einstellungen teams.owners_permission_desc=Besitzer haben vollen Zugriff auf alle Repositories und Admin-Rechte für diese Organisation. @@ -1277,12 +1277,12 @@ dashboard.delete_repo_archives=Alle Repository-Archive löschen dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen dashboard.delete_missing_repos_success=Alle Repository-Datensätze mit verlorenen Git-Dateien wurden gelöscht. -dashboard.git_gc_repos=Garbage Collection auf Repositories ausführen -dashboard.git_gc_repos_success=Alle Repositories haben Garbage Collection beendet. -dashboard.resync_all_sshkeys='.ssh/authorized_keys'-Datei mit Gitea SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH Server nutzt, musst du das nicht ausführen.) +dashboard.git_gc_repos=Garbage-Collection auf Repositories ausführen +dashboard.git_gc_repos_success=Alle Repositories haben Garbage-Collection beendet. +dashboard.resync_all_sshkeys=„.ssh/authorized_keys“-Datei mit Gitea-SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH-Server nutzt, musst du das nicht ausführen.) dashboard.resync_all_sshkeys_success=Alle von Gitea verwalteten öffentlichen Schlüssel wurden neu geschrieben. -dashboard.resync_all_hooks=Synchronisiere pre-receive, update und post-receive Hooks für alle Repositories. -dashboard.resync_all_hooks_success=Alle pre-receive, update und post-receive Repository-Hooks wurden synchronisiert. +dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut. +dashboard.resync_all_hooks_success=Alle „pre-receive“-, „update“- und „post-receive“-Repository-Hooks wurden erneut synchronisiert. dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert. dashboard.sync_external_users=Externe Benutzerdaten synchronisieren @@ -1305,11 +1305,11 @@ dashboard.heap_memory_released=Freigegebener Heap-Memory dashboard.heap_objects=Heap-Objekte dashboard.bootstrap_stack_usage=Bootstrap-Stack-Auslastung dashboard.stack_memory_obtained=Erhaltener Stack-Memory -dashboard.mspan_structures_usage=MSpan-Structures Auslastung -dashboard.mspan_structures_obtained=MSpan-Structures erhalten -dashboard.mcache_structures_usage=MCache-Structures Auslastung +dashboard.mspan_structures_usage=MSpan-Structures-Auslastung +dashboard.mspan_structures_obtained=Erhaltene MSpan-Structures +dashboard.mcache_structures_usage=MCache-Structures-Auslastung dashboard.mcache_structures_obtained=Erhaltene MCache-Structures -dashboard.profiling_bucket_hash_table_obtained=Analysesatz Hashtabellen erhalten +dashboard.profiling_bucket_hash_table_obtained=Erhaltene Analysesatz-Hashtabellen dashboard.gc_metadata_obtained=Erhaltene GC-Metadata dashboard.other_system_allocation_obtained=Andere erhaltene System-Allokationen dashboard.next_gc_recycle=Nächster GC-Zyklus @@ -1342,7 +1342,7 @@ users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwen users.is_activated=Account ist aktiviert users.prohibit_login=Anmelden deaktivieren users.is_admin=Ist Administrator -users.allow_git_hook=Darf "Git Hooks" erstellen +users.allow_git_hook=Darf „Git Hooks“ erstellen users.allow_import_local=Darf lokale Repositories importieren users.allow_create_organization=Darf Organisationen erstellen users.update_profile=Benutzerkonto aktualisieren @@ -1384,31 +1384,31 @@ auths.bind_dn=DN binden auths.bind_password=Passwort binden auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze wenn möglich einen Account mit nur Lesezugriff. auths.user_base=Basis für Benutzersuche -auths.user_dn=Benutzer DN -auths.attribute_username=Benutzername Attribut +auths.user_dn=Benutzer-DN +auths.attribute_username=Benutzernamens-Attribut auths.attribute_username_placeholder=Leerlassen, um den in Gitea eingegebenen Benutzernamen zu verwenden. auths.attribute_name=Vornamensattribut auths.attribute_surname=Nachnamensattribut -auths.attribute_mail=E-Mail Attribut -auths.attribute_ssh_public_key=Öffentliches SSH-Schlüssel Attribut +auths.attribute_mail=E-Mail-Attribut +auths.attribute_ssh_public_key=Öffentlicher-SSH-Schlüssel-Attribut auths.attributes_in_bind=Hole Attribute im Bind-Kontext auths.use_paged_search=Seitensuche verwenden auths.search_page_size=Seitengröße auths.filter=Benutzerfilter -auths.admin_filter=Admin Filter -auths.ms_ad_sa=MS AD Suchattribute +auths.admin_filter=Admin-Filter +auths.ms_ad_sa=MS-AD-Suchattribute auths.smtp_auth=SMTP-Authentifizierungstyp auths.smtphost=SMTP-Host auths.smtpport=SMTP-Port auths.allowed_domains=Erlaubte Domains -auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma (','). +auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma („,“). auths.enable_tls=TLS-Verschlüsselung aktivieren -auths.skip_tls_verify=TLS Verifikation überspringen -auths.pam_service_name=PAM Dienstname -auths.oauth2_provider=OAuth2 Anbieter +auths.skip_tls_verify=TLS-Verifikation überspringen +auths.pam_service_name=PAM-Dienstname +auths.oauth2_provider=OAuth2-Anbieter auths.oauth2_clientID=Client-ID (Schlüssel) auths.oauth2_clientSecret=Client-Secret -auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.openIdConnectAutoDiscoveryURL=OpenID-Connect-Auto-Discovery-URL auths.oauth2_use_custom_url=Benutzerdefinierte URLs anstelle von Standard-URLs verwenden auths.oauth2_tokenURL=Token-URL auths.oauth2_authURL=Authorisierungs-URL @@ -1416,48 +1416,48 @@ auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-Mail-URL auths.enable_auto_register=Automatische Registrierung aktivieren auths.tips=Tipps -auths.tips.oauth2.general=OAuth2 Authentifizierung -auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2 Authentifizierung sollte die Callback/Weiterleitungs-URL /user/oauth2//callback sein. -auths.tip.oauth2_provider=OAuth2 Anbieter -auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user//oauth-consumers/new und füge die Berechtigung "Account"-"Read" hinzu. +auths.tips.oauth2.general=OAuth2-Authentifizierung +auths.tips.oauth2.general.tip=Beim Registrieren einer neuen OAuth2-Authentifizierung sollte die Callback-/Weiterleitungs-URL „/user/oauth2//callback“ sein. +auths.tip.oauth2_provider=OAuth2-Anbieter +auths.tip.bitbucket=Registriere einen neuen OAuth-Consumer unter https://bitbucket.org/account/user//oauth-consumers/new und füge die Berechtigung „Account“ – „Read“ hinzu. auths.tip.dropbox=Erstelle eine neue App auf https://www.dropbox.com/developers/apps. -auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt "Facebook Login" hinzu. -auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth Anwendung. +auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook.com/apps und füge das Produkt „Facebook Login“ hinzu. +auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth-Anwendung. auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung. -auths.tip.google_plus=Du erhältst die OAuth2 Client Zugangsdaten in der Google API Console unter https://console.developers.google.com/ +auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter https://console.developers.google.com/ auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (/.well-known/openid-configuration) als Endpunkt. -auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option “Allow this application to be used to Sign in with Twitter” aktiviert ist +auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist auths.edit=Authentifikationsquelle bearbeiten auths.activated=Diese Authentifikationsquelle ist aktiviert -auths.new_success=Die Authentifizierung "%s" wurde hinzugefügt. +auths.new_success=Die Authentifizierung „%s“ wurde hinzugefügt. auths.update_success=Diese Authentifizierungsquelle wurde aktualisiert. auths.update=Authentifizierungsquelle aktualisieren auths.delete=Authentifikationsquelle löschen auths.delete_auth_title=Authentifizierungsquelle löschen auths.delete_auth_desc=Das Löschen einer Authentifizierungsquelle verhindert, dass Benutzer sich darüber anmelden können. Fortfahren? auths.still_in_used=Diese Authentifizierungsquelle wird noch verwendet. Bearbeite oder lösche zuerst alle Benutzer, die diese Authentifizierungsquelle benutzen. -auths.deletion_success=Die Authentifizierungsquelle '%s' wurde gelöscht. -auths.login_source_exist=Die Authentifizierungsquelle '%s' existiert bereits. +auths.deletion_success=Die Authentifizierungsquelle „%s“ wurde gelöscht. +auths.login_source_exist=Die Authentifizierungsquelle „%s“ existiert bereits. config.server_config=Serverkonfiguration config.app_name=Seitentitel -config.app_ver=Gitea Version -config.app_url=Gitea Basis-URL +config.app_ver=Gitea-Version +config.app_url=Gitea-Basis-URL config.custom_conf=Konfigurations-Datei-Pfad -config.domain=SSH Server-Domain +config.domain=SSH-Server-Domain config.offline_mode=Lokaler Modus config.disable_router_log=Router-Log deaktivieren config.run_user=Ausführen als config.run_mode=Laufzeit-Modus -config.git_version=Git Version -config.repo_root_path=Repository-Verzeichnis +config.git_version=Git-Version +config.repo_root_path=Repository-Wurzelpfad config.lfs_root_path=LFS-Wurzelpfad config.static_file_root_path=Verzeichnis für statische Dateien config.log_file_root_path=Logdateipfad config.script_type=Skript-Typ config.reverse_auth_user=Nutzer bei Reverse-Authentifizierung -config.ssh_config=SSH Konfiguration +config.ssh_config=SSH-Konfiguration config.ssh_enabled=Aktiviert config.ssh_start_builtin_server=Eingebauten Server verwenden config.ssh_domain=Server-Domain @@ -1465,9 +1465,9 @@ config.ssh_port=Port config.ssh_listen_port=Listen-Port config.ssh_root_path=Wurzelverzeichnis config.ssh_key_test_path=Schlüssel-Test-Pfad -config.ssh_keygen_path=Keygen ('ssh-keygen') Pfad +config.ssh_keygen_path=Keygen-Pfad („ssh-keygen“) config.ssh_minimum_key_size_check=Prüfung der Mindestschlüssellänge -config.ssh_minimum_key_sizes=Minimale Schlüssellängen +config.ssh_minimum_key_sizes=Mindestschlüssellängen config.db_config=Datenbankkonfiguration config.db_type=Typ @@ -1481,17 +1481,17 @@ config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren config.disable_register=Selbstegistrierung deaktivieren config.allow_only_external_registration=Registrierung nur über externe Services aktiveren -config.enable_openid_signup=OpenID Selbstregistrierung aktivieren -config.enable_openid_signin=OpenID Anmeldung aktivieren +config.enable_openid_signup=OpenID-Selbstregistrierung aktivieren +config.enable_openid_signin=OpenID-Anmeldung aktivieren config.show_registration_button=Schaltfläche zum Registrieren anzeigen config.require_sign_in_view=Seiten nur für angemeldete Benutzer zugänglich config.mail_notify=E-Mail-Benachrichtigungen aktivieren config.disable_key_size_check=Prüfung der Mindestschlüssellänge deaktiveren config.enable_captcha=CAPTCHA aktivieren -config.active_code_lives=Aktivierungscode Lebensdauer +config.active_code_lives=Aktivierungscode-Lebensdauer config.reset_password_code_lives=Ablaufdatum des Passworts zurücksetzen config.default_keep_email_private=E-Mail-Adressen standardmäßig verbergen -config.default_allow_create_organization=Erstellen von Organisationen standarmäßig erlauben +config.default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben config.enable_timetracking=Zeiterfassung aktivieren config.default_enable_timetracking=Zeiterfassung standardmäßig aktivieren config.default_allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen @@ -1500,11 +1500,11 @@ config.no_reply_address=Versteckte E-Mail-Domain config.webhook_config=Webhook-Konfiguration config.queue_length=Warteschlangenlänge config.deliver_timeout=Zeitlimit für Zustellung -config.skip_tls_verify=TLS Verifikation überspringen +config.skip_tls_verify=TLS-Verifikation überspringen -config.mailer_config=SMTP Mailer Konfiguration +config.mailer_config=SMTP-Mailer-Konfiguration config.mailer_enabled=Aktiviert -config.mailer_disable_helo=HELO Deaktivieren +config.mailer_disable_helo=HELO deaktivieren config.mailer_name=Name config.mailer_host=Host config.mailer_user=Benutzer @@ -1512,8 +1512,8 @@ config.mailer_use_sendmail=Sendmail benutzen config.mailer_sendmail_path=Sendmail-Pfad config.mailer_sendmail_args=Zusätzliche Argumente für Sendmail config.send_test_mail=Test-E-Mail senden -config.test_mail_failed=Das Senden der Test-E-Mail an '%s' ist fehlgeschlagen: %v -config.test_mail_sent=Eine Test-E-Mail wurde an '%s' gesendet. +config.test_mail_failed=Das Senden der Test-E-Mail an „%s“ ist fehlgeschlagen: %v +config.test_mail_sent=Eine Test-E-Mail wurde an „%s“ gesendet. config.oauth_config=OAuth-Konfiguration config.oauth_enabled=Aktiviert @@ -1533,16 +1533,16 @@ config.session_life_time=Session-Lebensdauer config.https_only=Nur HTTPS config.cookie_life_time=Cookie-Lebensdauer -config.picture_config=Avatar-Konfiguration +config.picture_config=Bild-und-Profilbild-Konfiguration config.picture_service=Bilderservice config.disable_gravatar=Gravatar deaktivieren config.enable_federated_avatar=Föderierte Profilbilder einschalten -config.git_config=Git Konfiguration -config.git_disable_diff_highlight=Diff Syntaxhervorhebung ausschalten -config.git_max_diff_lines=Max Diff Zeilen (in einer Datei) -config.git_max_diff_line_characters=Max Diff Zeichen (in einer Zeile) -config.git_max_diff_files=Max Diff Dateien (Anzeige) +config.git_config=Git-Konfiguration +config.git_disable_diff_highlight=Diff-Syntaxhervorhebung ausschalten +config.git_max_diff_lines=Max. Diff-Zeilen (in einer Datei) +config.git_max_diff_line_characters=Max. Diff-Zeichen (in einer Zeile) +config.git_max_diff_files=Max. Diff-Dateien (Angezeigte) config.git_gc_args=GC-Argumente config.git_migrate_timeout=Zeitlimit für Migration config.git_mirror_timeout=Zeitlimit für Mirror-Aktualisierung @@ -1638,12 +1638,12 @@ mark_all_as_read=Alle als gelesen markieren [gpg] error.extract_sign=Die Signatur konnte nicht extrahiert werden error.generate_hash=Es konnte kein Hash vom Commit generiert werden -error.no_committer_account=Es ist kein Benutzerkonto mit dieser Commiter-Email verbunden +error.no_committer_account=Es ist kein Benutzerkonto mit der E-Mail-Adresse des Committers verbunden error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden error.not_signed_commit=Kein signierter Commit error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos [units] -error.no_unit_allowed_repo=Du hast keine Berechtigung auf einen Bereich dieses Repositories zuzugreifen. -error.unit_not_allowed=Du hast keine Berechtigung auf diesen Repository-Bereich zuzugreifen. +error.no_unit_allowed_repo=Du hast keine Berechtigung, um auf irgendeinen Bereich dieses Repositories zuzugreifen. +error.unit_not_allowed=Du hast keine Berechtigung, um auf diesen Repository-Bereich zuzugreifen. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index f49b982808d8..b3e8a2fe034c 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -280,12 +280,12 @@ target_branch_not_exist=Цільової гілки не існує. [user] change_avatar=Змінити свій аватар… -join_on=Приєднався +join_on=Приєднався(-лась) repositories=Репозиторії activity=Публічна активність -followers=Підписники +followers=Читачі starred=Обрані Репозиторії -following=Слідкувати +following=Читає follow=Підписатися unfollow=Відписатися @@ -439,6 +439,7 @@ license=Ліцензія license_helper=Виберіть ліцензійний файл. readme=README readme_helper=Виберіть шаблон README. +auto_init=Ініціалізувати репозиторій (Додає .gitignore, LICENSE та README) create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити @@ -603,6 +604,8 @@ issues.filter_sort.recentupdate=Нещодавно оновлено issues.filter_sort.leastupdate=Найдавніше оновлені issues.filter_sort.mostcomment=Найбільш коментовані issues.filter_sort.leastcomment=Найменш коментовані +issues.filter_sort.moststars=Найбільш обраних +issues.filter_sort.feweststars=Найменш обраних issues.filter_sort.mostforks=Найбільше форків issues.action_open=Відкрити issues.action_close=Закрити @@ -1232,6 +1235,7 @@ config.default_keep_email_private=Приховати адресу електро config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням +config.no_reply_address=Прихований домен е-пошти config.webhook_config=Конфігурація web-хуків config.queue_length=Довжина черги From 56a1323cf52d82c6b320972b4834af2b1296ba65 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Mon, 18 Jun 2018 20:24:45 +0200 Subject: [PATCH 026/447] fix missing data on redirects (#3975) --- routers/user/setting/account.go | 32 ++++++++------- routers/user/setting/applications.go | 24 +++++------ routers/user/setting/keys.go | 54 ++++++++++++------------- routers/user/setting/profile.go | 1 + routers/user/setting/security.go | 44 +++++++++++--------- routers/user/setting/security_openid.go | 21 ++++------ 6 files changed, 90 insertions(+), 86 deletions(-) diff --git a/routers/user/setting/account.go b/routers/user/setting/account.go index 966d96aedace..bcf602c5ed67 100644 --- a/routers/user/setting/account.go +++ b/routers/user/setting/account.go @@ -24,12 +24,7 @@ func Account(ctx *context.Context) { ctx.Data["PageIsSettingsAccount"] = true ctx.Data["Email"] = ctx.User.Email - emails, err := models.GetEmailAddresses(ctx.User.ID) - if err != nil { - ctx.ServerError("GetEmailAddresses", err) - return - } - ctx.Data["Emails"] = emails + loadAccountData(ctx) ctx.HTML(200, tplSettingsAccount) } @@ -40,6 +35,8 @@ func AccountPost(ctx *context.Context, form auth.ChangePasswordForm) { ctx.Data["PageIsSettingsAccount"] = true if ctx.HasError() { + loadAccountData(ctx) + ctx.HTML(200, tplSettingsAccount) return } @@ -85,15 +82,9 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) { return } - // Add Email address. - emails, err := models.GetEmailAddresses(ctx.User.ID) - if err != nil { - ctx.ServerError("GetEmailAddresses", err) - return - } - ctx.Data["Emails"] = emails - if ctx.HasError() { + loadAccountData(ctx) + ctx.HTML(200, tplSettingsAccount) return } @@ -105,6 +96,8 @@ func EmailPost(ctx *context.Context, form auth.AddEmailForm) { } if err := models.AddEmailAddress(email); err != nil { if models.IsErrEmailAlreadyUsed(err) { + loadAccountData(ctx) + ctx.RenderWithErr(ctx.Tr("form.email_been_used"), tplSettingsAccount, &form) return } @@ -149,6 +142,8 @@ func DeleteAccount(ctx *context.Context) { if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil { if models.IsErrUserNotExist(err) { + loadAccountData(ctx) + ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), tplSettingsAccount, nil) } else { ctx.ServerError("UserSignIn", err) @@ -172,3 +167,12 @@ func DeleteAccount(ctx *context.Context) { ctx.Redirect(setting.AppSubURL + "/") } } + +func loadAccountData(ctx *context.Context) { + emails, err := models.GetEmailAddresses(ctx.User.ID) + if err != nil { + ctx.ServerError("GetEmailAddresses", err) + return + } + ctx.Data["Emails"] = emails +} diff --git a/routers/user/setting/applications.go b/routers/user/setting/applications.go index f292b65d707f..ac7252469a9b 100644 --- a/routers/user/setting/applications.go +++ b/routers/user/setting/applications.go @@ -22,12 +22,7 @@ func Applications(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsApplications"] = true - tokens, err := models.ListAccessTokens(ctx.User.ID) - if err != nil { - ctx.ServerError("ListAccessTokens", err) - return - } - ctx.Data["Tokens"] = tokens + loadApplicationsData(ctx) ctx.HTML(200, tplSettingsApplications) } @@ -38,12 +33,8 @@ func ApplicationsPost(ctx *context.Context, form auth.NewAccessTokenForm) { ctx.Data["PageIsSettingsApplications"] = true if ctx.HasError() { - tokens, err := models.ListAccessTokens(ctx.User.ID) - if err != nil { - ctx.ServerError("ListAccessTokens", err) - return - } - ctx.Data["Tokens"] = tokens + loadApplicationsData(ctx) + ctx.HTML(200, tplSettingsApplications) return } @@ -75,3 +66,12 @@ func DeleteApplication(ctx *context.Context) { "redirect": setting.AppSubURL + "/user/settings/applications", }) } + +func loadApplicationsData(ctx *context.Context) { + tokens, err := models.ListAccessTokens(ctx.User.ID) + if err != nil { + ctx.ServerError("ListAccessTokens", err) + return + } + ctx.Data["Tokens"] = tokens +} diff --git a/routers/user/setting/keys.go b/routers/user/setting/keys.go index ef986ef8c906..c62b117a76bc 100644 --- a/routers/user/setting/keys.go +++ b/routers/user/setting/keys.go @@ -23,19 +23,7 @@ func Keys(ctx *context.Context) { ctx.Data["PageIsSettingsKeys"] = true ctx.Data["DisableSSH"] = setting.SSH.Disabled - keys, err := models.ListPublicKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListPublicKeys", err) - return - } - ctx.Data["Keys"] = keys - - gpgkeys, err := models.ListGPGKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListGPGKeys", err) - return - } - ctx.Data["GPGKeys"] = gpgkeys + loadKeysData(ctx) ctx.HTML(200, tplSettingsKeys) } @@ -45,21 +33,9 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsKeys"] = true - keys, err := models.ListPublicKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListPublicKeys", err) - return - } - ctx.Data["Keys"] = keys - - gpgkeys, err := models.ListGPGKeys(ctx.User.ID) - if err != nil { - ctx.ServerError("ListGPGKeys", err) - return - } - ctx.Data["GPGKeys"] = gpgkeys - if ctx.HasError() { + loadKeysData(ctx) + ctx.HTML(200, tplSettingsKeys) return } @@ -73,9 +49,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Flash.Error(ctx.Tr("form.invalid_gpg_key", err.Error())) ctx.Redirect(setting.AppSubURL + "/user/settings/keys") case models.IsErrGPGKeyIDAlreadyUsed(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.gpg_key_id_used"), tplSettingsKeys, &form) case models.IsErrGPGNoEmailFound(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.gpg_no_key_email_found"), tplSettingsKeys, &form) default: @@ -103,9 +83,13 @@ func KeysPost(ctx *context.Context, form auth.AddKeyForm) { ctx.Data["HasSSHError"] = true switch { case models.IsErrKeyAlreadyExist(err): + loadKeysData(ctx) + ctx.Data["Err_Content"] = true ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), tplSettingsKeys, &form) case models.IsErrKeyNameAlreadyUsed(err): + loadKeysData(ctx) + ctx.Data["Err_Title"] = true ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), tplSettingsKeys, &form) default: @@ -147,3 +131,19 @@ func DeleteKey(ctx *context.Context) { "redirect": setting.AppSubURL + "/user/settings/keys", }) } + +func loadKeysData(ctx *context.Context) { + keys, err := models.ListPublicKeys(ctx.User.ID) + if err != nil { + ctx.ServerError("ListPublicKeys", err) + return + } + ctx.Data["Keys"] = keys + + gpgkeys, err := models.ListGPGKeys(ctx.User.ID) + if err != nil { + ctx.ServerError("ListGPGKeys", err) + return + } + ctx.Data["GPGKeys"] = gpgkeys +} diff --git a/routers/user/setting/profile.go b/routers/user/setting/profile.go index cf222d002738..22511ab89144 100644 --- a/routers/user/setting/profile.go +++ b/routers/user/setting/profile.go @@ -32,6 +32,7 @@ const ( func Profile(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsProfile"] = true + ctx.HTML(200, tplSettingsProfile) } diff --git a/routers/user/setting/security.go b/routers/user/setting/security.go index 860730303f71..862e4413c716 100644 --- a/routers/user/setting/security.go +++ b/routers/user/setting/security.go @@ -22,6 +22,30 @@ func Security(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("settings") ctx.Data["PageIsSettingsSecurity"] = true + if ctx.Query("openid.return_to") != "" { + settingsOpenIDVerify(ctx) + return + } + + loadSecurityData(ctx) + + ctx.HTML(200, tplSettingsSecurity) +} + +// DeleteAccountLink delete a single account link +func DeleteAccountLink(ctx *context.Context) { + if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil { + ctx.Flash.Error("RemoveAccountLink: " + err.Error()) + } else { + ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success")) + } + + ctx.JSON(200, map[string]interface{}{ + "redirect": setting.AppSubURL + "/user/settings/security", + }) +} + +func loadSecurityData(ctx *context.Context) { enrolled := true _, err := models.GetTwoFactorByUID(ctx.User.ID) if err != nil { @@ -71,30 +95,10 @@ func Security(ctx *context.Context) { } ctx.Data["AccountLinks"] = sources - if ctx.Query("openid.return_to") != "" { - settingsOpenIDVerify(ctx) - return - } - openid, err := models.GetUserOpenIDs(ctx.User.ID) if err != nil { ctx.ServerError("GetUserOpenIDs", err) return } ctx.Data["OpenIDs"] = openid - - ctx.HTML(200, tplSettingsSecurity) -} - -// DeleteAccountLink delete a single account link -func DeleteAccountLink(ctx *context.Context) { - if _, err := models.RemoveAccountLink(ctx.User, ctx.QueryInt64("loginSourceID")); err != nil { - ctx.Flash.Error("RemoveAccountLink: " + err.Error()) - } else { - ctx.Flash.Success(ctx.Tr("settings.remove_account_link_success")) - } - - ctx.JSON(200, map[string]interface{}{ - "redirect": setting.AppSubURL + "/user/settings/security", - }) } diff --git a/routers/user/setting/security_openid.go b/routers/user/setting/security_openid.go index c98dc2cda947..6813765f6f33 100644 --- a/routers/user/setting/security_openid.go +++ b/routers/user/setting/security_openid.go @@ -19,12 +19,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { ctx.Data["PageIsSettingsSecurity"] = true if ctx.HasError() { - openid, err := models.GetUserOpenIDs(ctx.User.ID) - if err != nil { - ctx.ServerError("GetUserOpenIDs", err) - return - } - ctx.Data["OpenIDs"] = openid + loadSecurityData(ctx) + ctx.HTML(200, tplSettingsSecurity) return } @@ -37,6 +33,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { id, err := openid.Normalize(form.Openid) if err != nil { + loadSecurityData(ctx) + ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form) return } @@ -53,6 +51,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { // Check that the OpenID is not already used for _, obj := range oids { if obj.URI == id { + loadSecurityData(ctx) + ctx.RenderWithErr(ctx.Tr("form.openid_been_used", id), tplSettingsSecurity, &form) return } @@ -61,6 +61,8 @@ func OpenIDPost(ctx *context.Context, form auth.AddOpenIDForm) { redirectTo := setting.AppURL + "user/settings/security" url, err := openid.RedirectURL(id, redirectTo, setting.AppURL) if err != nil { + loadSecurityData(ctx) + ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &form) return } @@ -73,13 +75,6 @@ func settingsOpenIDVerify(ctx *context.Context) { fullURL := setting.AppURL + ctx.Req.Request.URL.String()[1:] log.Trace("Full URL: " + fullURL) - oids, err := models.GetUserOpenIDs(ctx.User.ID) - if err != nil { - ctx.ServerError("GetUserOpenIDs", err) - return - } - ctx.Data["OpenIDs"] = oids - id, err := openid.Verify(fullURL) if err != nil { ctx.RenderWithErr(err.Error(), tplSettingsSecurity, &auth.AddOpenIDForm{ From b8a5fd1d967e172f84031ab3998ebf5c15d910bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20M?= Date: Tue, 19 Jun 2018 10:48:50 +0200 Subject: [PATCH 027/447] Fix missing close tags in U2F (#4256) --- custom/conf/app.ini.sample | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index ef88e5c3277d..f823f68e4f26 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -601,9 +601,9 @@ ko-KR = ko [U2F] ; Two Factor authentication with security keys ; https://developers.yubico.com/U2F/App_ID.html -APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s +APP_ID = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ ; Comma seperated list of truisted facets -TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s +TRUSTED_FACETS = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/ ; Extension mapping to highlight class ; e.g. .toml=ini From 63120d9848145e265b99eaea42d0a2b913270e8c Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 19 Jun 2018 08:51:02 +0000 Subject: [PATCH 028/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 20 ++++++++++++++------ options/locale/locale_zh-CN.ini | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b3e8a2fe034c..8f90f3a3f890 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -204,7 +204,7 @@ non_local_account=Нелокальні акаунти не можуть змін verify=Підтвердити scratch_code=Одноразовий пароль use_scratch_code=Використовувати одноразовий пароль -twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторной аутентифікації. +twofa_scratch_used=Ви використовували одноразовий пароль. Ви були перенаправлені на сторінку налаштувань для генерації нового коду або відключення двуфакторної автентифікації. twofa_passcode_incorrect=Ваш пароль є невірним. Якщо ви втратили пристрій, використовуйте ваш одноразовий пароль. twofa_scratch_token_incorrect=Невірний одноразовий пароль. login_userpass=Увійти @@ -399,20 +399,25 @@ generate_token=Згенерувати токен delete_token=Видалити access_token_deletion=Видалити токен доступу -twofa_desc=Двофакторна аутентифікація підвищує безпеку вашого облікового запису. +twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_disable=Вимкнути двофакторну автентифікацію +twofa_scratch_token_regenerate=Перестворити токен одноразового пароля twofa_enroll=Увімкнути двофакторну автентифікацію +twofa_disable_note=При необхідності можна відключити двофакторну автентифікацію. +regenerate_scratch_token_desc=Якщо ви втратили свій токен одноразового пароля або вже використовували його для входу, ви можете скинути його тут. twofa_disabled=Двофакторна автентифікація вимкнена. -scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної аутентифікації: +scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної автентифікації: or_enter_secret=Або введіть секрет: %s passcode_invalid=Некоректний пароль. Спробуй ще раз. +u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім u2f_delete_key=Видалити ключ безпеки manage_account_links=Керування обліковими записами +manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. remove_account_link=Видалити облікові записи orgs_none=Ви не є учасником будь-якої організації. @@ -428,6 +433,7 @@ owner=Власник repo_name=Назва репозиторію visibility=Видимість visiblity_helper=Зробити репозиторій приватним +visiblity_fork_helper=(Зміна цього вплине на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте Допомогу. fork_repo=Форкнути репозиторій fork_from=Форк з @@ -607,6 +613,7 @@ issues.filter_sort.leastcomment=Найменш коментовані issues.filter_sort.moststars=Найбільш обраних issues.filter_sort.feweststars=Найменш обраних issues.filter_sort.mostforks=Найбільше форків +issues.filter_sort.fewestforks=Найменше форків issues.action_open=Відкрити issues.action_close=Закрити issues.action_label=Мітка @@ -971,6 +978,7 @@ topic.done=Готово [org] org_name_holder=Назва організації org_full_name_holder=Повна назва організації +org_name_helper=Назва організації має бути простою та зрозумілою. create_org=Створити організацію repo_updated=Оновлено people=Учасники @@ -1133,7 +1141,7 @@ repos.forks=Форки repos.issues=Проблеми repos.size=Розмір -auths.auth_manage_panel=Керування джерелом аутентифікації +auths.auth_manage_panel=Керування джерелом автентифікації auths.new=Додати джерело автентифікації auths.name=Ім'я auths.type=Тип @@ -1170,8 +1178,8 @@ auths.oauth2_profileURL=URL профілю auths.oauth2_emailURL=URL електронної пошти auths.enable_auto_register=Увімкнути автоматичну реєстрацію auths.tips=Поради -auths.tips.oauth2.general=OAuth2 аутентифікація -auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні аутентифікації повинена виглядати так:/user/oauth2//callback +auths.tips.oauth2.general=OAuth2 автентифікація +auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні автентифікації повинена виглядати так:/user/oauth2//callback auths.tip.oauth2_provider=Постачальник OAuth2 auths.tip.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps auths.tip.facebook=Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 658f133a2905..4e59ed08ea03 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -213,6 +213,7 @@ send_reset_mail=单击此处(重新)发送您的密码重置邮件 reset_password=重置密码 invalid_code=此确认密钥无效或已过期。 reset_password_helper=单击此处重置密码 +password_too_short=密码长度不能少于 %d 位。 non_local_account=非本地帐户不能通过 Gitea 的 web 界面更改密码。 verify=验证 scratch_code=验证口令 From 34f68cbdd331e0bc525751ff74c4213596832355 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Tue, 19 Jun 2018 17:15:11 +0200 Subject: [PATCH 029/447] Fix milestone appliance and permission checks (#4271) * Fix milestone appliance Fix missing permission check Signed-off-by: Jonas Franz * Fix comment * Add Gitea copyright line --- routers/api/v1/repo/issue.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/routers/api/v1/repo/issue.go b/routers/api/v1/repo/issue.go index 211d8045a45b..7be39166d28a 100644 --- a/routers/api/v1/repo/issue.go +++ b/routers/api/v1/repo/issue.go @@ -1,4 +1,5 @@ // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -165,7 +166,7 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) { // "$ref": "#/responses/Issue" var deadlineUnix util.TimeStamp - if form.Deadline != nil { + if form.Deadline != nil && ctx.Repo.IsWriter() { deadlineUnix = util.TimeStamp(form.Deadline.Unix()) } @@ -178,15 +179,22 @@ func CreateIssue(ctx *context.APIContext, form api.CreateIssueOption) { DeadlineUnix: deadlineUnix, } - // Get all assignee IDs - assigneeIDs, err := models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees) - if err != nil { - if models.IsErrUserNotExist(err) { - ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) - } else { - ctx.Error(500, "AddAssigneeByName", err) + var assigneeIDs = make([]int64, 0) + var err error + if ctx.Repo.IsWriter() { + issue.MilestoneID = form.Milestone + assigneeIDs, err = models.MakeIDsFromAPIAssigneesToAdd(form.Assignee, form.Assignees) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.Error(422, "", fmt.Sprintf("Assignee does not exist: [name: %s]", err)) + } else { + ctx.Error(500, "AddAssigneeByName", err) + } + return } - return + } else { + // setting labels is not allowed if user is not a writer + form.Labels = make([]int64, 0) } if err := models.NewIssue(ctx.Repo.Repository, issue, form.Labels, assigneeIDs, nil); err != nil { From 481490b8c50690d6936b9879e1bf8765cd7f5924 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Tue, 19 Jun 2018 21:44:33 +0200 Subject: [PATCH 030/447] Fix not removed watches on unallowed repositories (#4201) --- models/issue_watch.go | 12 +++ models/migrations/migrations.go | 2 + models/migrations/v67.go | 158 ++++++++++++++++++++++++++++++++ models/org_team.go | 49 ++++++++++ models/repo.go | 3 + models/repo_collaboration.go | 9 ++ 6 files changed, 233 insertions(+) create mode 100644 models/migrations/v67.go diff --git a/models/issue_watch.go b/models/issue_watch.go index 69e218af0177..3e7d24821bbe 100644 --- a/models/issue_watch.go +++ b/models/issue_watch.go @@ -71,3 +71,15 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error Find(&watches) return } + +func removeIssueWatchersByRepoID(e Engine, userID int64, repoID int64) error { + iw := &IssueWatch{ + IsWatching: false, + } + _, err := e. + Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID). + Cols("is_watching", "updated_unix"). + Where("`issue_watch`.user_id = ?", userID). + Update(iw) + return err +} diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 1300065ab4c7..2537e5712b0e 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -186,6 +186,8 @@ var migrations = []Migration{ NewMigration("add u2f", addU2FReg), // v66 -> v67 NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable), + // v67 -> v68 + NewMigration("remove stale watches", removeStaleWatches), } // Migrate database to current version diff --git a/models/migrations/v67.go b/models/migrations/v67.go new file mode 100644 index 000000000000..27822191911e --- /dev/null +++ b/models/migrations/v67.go @@ -0,0 +1,158 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "code.gitea.io/gitea/modules/setting" + + "github.com/go-xorm/xorm" +) + +func removeStaleWatches(x *xorm.Engine) error { + type Watch struct { + ID int64 + UserID int64 + RepoID int64 + } + + type IssueWatch struct { + ID int64 + UserID int64 + RepoID int64 + IsWatching bool + } + + type Repository struct { + ID int64 + IsPrivate bool + OwnerID int64 + } + + type Access struct { + UserID int64 + RepoID int64 + Mode int + } + + const ( + // AccessModeNone no access + AccessModeNone int = iota // 0 + // AccessModeRead read access + AccessModeRead // 1 + ) + + accessLevel := func(userID int64, repo *Repository) (int, error) { + mode := AccessModeNone + if !repo.IsPrivate { + mode = AccessModeRead + } + + if userID == 0 { + return mode, nil + } + + if userID == repo.OwnerID { + return 4, nil + } + + a := &Access{UserID: userID, RepoID: repo.ID} + if has, err := x.Get(a); !has || err != nil { + return mode, err + } + return a.Mode, nil + } + + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + + repoCache := make(map[int64]*Repository) + err := x.BufferSize(setting.IterateBufferSize).Iterate(new(Watch), + func(idx int, bean interface{}) error { + watch := bean.(*Watch) + + repo := repoCache[watch.RepoID] + if repo == nil { + repo = &Repository{ + ID: watch.RepoID, + } + if _, err := x.Get(repo); err != nil { + return err + } + repoCache[watch.RepoID] = repo + } + + // Remove watches from now unaccessible repositories + mode, err := accessLevel(watch.UserID, repo) + if err != nil { + return err + } + has := AccessModeRead <= mode + if has { + return nil + } + + if _, err = sess.Delete(&Watch{0, watch.UserID, repo.ID}); err != nil { + return err + } + _, err = sess.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repo.ID) + + return err + }) + if err != nil { + return err + } + + repoCache = make(map[int64]*Repository) + err = x.BufferSize(setting.IterateBufferSize). + Distinct("issue_watch.user_id", "issue.repo_id"). + Join("INNER", "issue", "issue_watch.issue_id = issue.id"). + Where("issue_watch.is_watching = ?", true). + Iterate(new(IssueWatch), + func(idx int, bean interface{}) error { + watch := bean.(*IssueWatch) + + repo := repoCache[watch.RepoID] + if repo == nil { + repo = &Repository{ + ID: watch.RepoID, + } + if _, err := x.Get(repo); err != nil { + return err + } + repoCache[watch.RepoID] = repo + } + + // Remove issue watches from now unaccssible repositories + mode, err := accessLevel(watch.UserID, repo) + if err != nil { + return err + } + has := AccessModeRead <= mode + if has { + return nil + } + + iw := &IssueWatch{ + IsWatching: false, + } + + _, err = sess. + Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", watch.RepoID). + Cols("is_watching", "updated_unix"). + Where("`issue_watch`.user_id = ?", watch.UserID). + Update(iw) + + return err + + }) + if err != nil { + return err + } + + return sess.Commit() +} diff --git a/models/org_team.go b/models/org_team.go index 9d8a031418db..5ea6e76cd9b4 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -178,6 +178,11 @@ func (t *Team) removeRepository(e Engine, repo *Repository, recalculate bool) (e if err = watchRepo(e, teamUser.UID, repo.ID, false); err != nil { return err } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err := removeIssueWatchersByRepoID(e, teamUser.UID, repo.ID); err != nil { + return err + } } return nil @@ -374,11 +379,34 @@ func DeleteTeam(t *Team) error { return err } + if err := t.getMembers(sess); err != nil { + return err + } + // Delete all accesses. for _, repo := range t.Repos { if err := repo.recalculateTeamAccesses(sess, t.ID); err != nil { return err } + + // Remove watches from all users and now unaccessible repos + for _, user := range t.Members { + has, err := hasAccess(sess, user.ID, repo, AccessModeRead) + if err != nil { + return err + } else if has { + continue + } + + if err = watchRepo(sess, user.ID, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err = removeIssueWatchersByRepoID(sess, user.ID, repo.ID); err != nil { + return err + } + } } // Delete team-repo @@ -518,6 +546,10 @@ func AddTeamMember(team *Team, userID int64) error { if err := repo.recalculateTeamAccesses(sess, 0); err != nil { return err } + + if err = watchRepo(sess, userID, repo.ID, true); err != nil { + return err + } } return sess.Commit() @@ -558,6 +590,23 @@ func removeTeamMember(e *xorm.Session, team *Team, userID int64) error { if err := repo.recalculateTeamAccesses(e, 0); err != nil { return err } + + // Remove watches from now unaccessible + has, err := hasAccess(e, userID, repo, AccessModeRead) + if err != nil { + return err + } else if has { + continue + } + + if err = watchRepo(e, userID, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repositories + if err := removeIssueWatchersByRepoID(e, userID, repo.ID); err != nil { + return err + } } // Check if the user is a member of any team in the organization. diff --git a/models/repo.go b/models/repo.go index f4923cf4a953..7f2be502a488 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1851,6 +1851,9 @@ func DeleteRepository(doer *User, uid, repoID int64) error { if _, err = sess.In("issue_id", issueIDs).Delete(&Reaction{}); err != nil { return err } + if _, err = sess.In("issue_id", issueIDs).Delete(&IssueWatch{}); err != nil { + return err + } attachments := make([]*Attachment, 0, 5) if err = sess. diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 0448149e6a52..9d2935d581d8 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -172,5 +172,14 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) { return err } + if err = watchRepo(sess, uid, repo.ID, false); err != nil { + return err + } + + // Remove all IssueWatches a user has subscribed to in the repository + if err := removeIssueWatchersByRepoID(sess, uid, repo.ID); err != nil { + return err + } + return sess.Commit() } From 3c8181d418cc6fb60616def50ff75d6e17326197 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 20 Jun 2018 01:06:01 -0400 Subject: [PATCH 031/447] Change parsing of postgresql settings (#4275) * Change parsing of postgresql settings Fix #4200 * Add copyright * update postgresql connection string * add tests --- models/models.go | 22 ++++++++++++++-------- models/models_test.go | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/models/models.go b/models/models.go index ddf784deeebc..5743f1862db9 100644 --- a/models/models.go +++ b/models/models.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -184,6 +185,18 @@ func parsePostgreSQLHostPort(info string) (string, string) { return host, port } +func getPostgreSQLConnectionString(DBHost, DBUser, DBPasswd, DBName, DBParam, DBSSLMode string) (connStr string) { + host, port := parsePostgreSQLHostPort(DBHost) + if host[0] == '/' { // looks like a unix socket + connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", + url.PathEscape(DBUser), url.PathEscape(DBPasswd), port, DBName, DBParam, DBSSLMode, host) + } else { + connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", + url.PathEscape(DBUser), url.PathEscape(DBPasswd), host, port, DBName, DBParam, DBSSLMode) + } + return +} + func parseMSSQLHostPort(info string) (string, string) { host, port := "127.0.0.1", "1433" if strings.Contains(info, ":") { @@ -214,14 +227,7 @@ func getEngine() (*xorm.Engine, error) { DbCfg.User, DbCfg.Passwd, DbCfg.Host, DbCfg.Name, Param) } case "postgres": - host, port := parsePostgreSQLHostPort(DbCfg.Host) - if host[0] == '/' { // looks like a unix socket - connStr = fmt.Sprintf("postgres://%s:%s@:%s/%s%ssslmode=%s&host=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), port, DbCfg.Name, Param, DbCfg.SSLMode, host) - } else { - connStr = fmt.Sprintf("postgres://%s:%s@%s:%s/%s%ssslmode=%s", - url.QueryEscape(DbCfg.User), url.QueryEscape(DbCfg.Passwd), host, port, DbCfg.Name, Param, DbCfg.SSLMode) - } + connStr = getPostgreSQLConnectionString(DbCfg.Host, DbCfg.User, DbCfg.Passwd, DbCfg.Name, Param, DbCfg.SSLMode) case "mssql": host, port := parseMSSQLHostPort(DbCfg.Host) connStr = fmt.Sprintf("server=%s; port=%s; database=%s; user id=%s; password=%s;", host, port, DbCfg.Name, DbCfg.User, DbCfg.Passwd) diff --git a/models/models_test.go b/models/models_test.go index 649b1e02e547..7016fdb4b75b 100644 --- a/models/models_test.go +++ b/models/models_test.go @@ -1,4 +1,5 @@ // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -53,3 +54,42 @@ func Test_parsePostgreSQLHostPort(t *testing.T) { assert.Equal(t, test.Port, port) } } + +func Test_getPostgreSQLConnectionString(t *testing.T) { + tests := []struct { + Host string + Port string + User string + Passwd string + Name string + Param string + SSLMode string + Output string + }{ + { + Host: "/tmp/pg.sock", + Port: "4321", + User: "testuser", + Passwd: "space space !#$%^^%^```-=?=", + Name: "gitea", + Param: "", + SSLMode: "false", + Output: "postgres://testuser:space%20space%20%21%23$%25%5E%5E%25%5E%60%60%60-=%3F=@:5432/giteasslmode=false&host=/tmp/pg.sock", + }, + { + Host: "localhost", + Port: "1234", + User: "pgsqlusername", + Passwd: "I love Gitea!", + Name: "gitea", + Param: "", + SSLMode: "true", + Output: "postgres://pgsqlusername:I%20love%20Gitea%21@localhost:5432/giteasslmode=true", + }, + } + + for _, test := range tests { + connStr := getPostgreSQLConnectionString(test.Host, test.User, test.Passwd, test.Name, test.Param, test.SSLMode) + assert.Equal(t, test.Output, connStr) + } +} From 616608f2320d9763c0c67910d811eac1f18f923e Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 20 Jun 2018 18:03:22 +0200 Subject: [PATCH 032/447] Updated drone config to use the "next" git plugin (#4281) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index 6ab40a39d32e..8e571640b789 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ workspace: clone: git: - image: plugins/git:1 + image: plugins/git:next depth: 50 tags: true From 42c9759e1161df8ae43b1a20cc9345d3d9bfad81 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 20 Jun 2018 16:04:23 +0000 Subject: [PATCH 033/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index d618d2c9ad4b..4b1b85f92cb9 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -588,7 +588,7 @@ editor.edit_file=Datei bearbeiten editor.preview_changes=Vorschau der Änderungen editor.cannot_edit_non_text_files=Binärdateien können nicht im Webinterface bearbeitet werden. editor.edit_this_file=Datei bearbeiten -editor.must_be_on_a_branch=Du musst dich in einer Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. +editor.must_be_on_a_branch=Du musst dich in einem Branch befinden, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. editor.fork_before_edit=Du musst dieses Repository forken, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. editor.delete_this_file=Datei löschen editor.must_have_write_access=Du benötigst Schreibzugriff, um Änderungen an dieser Datei vorzuschlagen oder vorzunehmen. @@ -1085,16 +1085,16 @@ settings.protect_whitelist_search_users=Benutzer suchen… settings.protect_whitelist_teams=Teams, die pushen dürfen: settings.protect_whitelist_search_teams=Suche nach Teams… settings.protect_merge_whitelist_committers=Merge-Whitelist aktivieren -settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Pull-Requests in diese Branch zu mergen. +settings.protect_merge_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Pull-Requests in diesen Branch zu mergen. settings.protect_merge_whitelist_users=Nutzer, die mergen dürfen: settings.protect_merge_whitelist_teams=Teams, die mergen dürfen: settings.add_protected_branch=Schutz aktivieren settings.delete_protected_branch=Schutz deaktivieren settings.update_protect_branch_success=Branch-Schutz für den Branch „%s“ wurde geändert. settings.remove_protected_branch_success=Branch-Schutz für den Branch „%s“ wurde deaktiviert. -settings.protected_branch_deletion=Brach-Schutz deaktivieren +settings.protected_branch_deletion=Branch-Schutz deaktivieren settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, können alle Nutzer mit Schreibrechten auf den Branch pushen. Fortfahren? -settings.default_branch_desc=Wähle eine Standardbranch für Pull-Requests und Code-Commits: +settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: settings.choose_branch=Wähle einen Branch … settings.no_protected_branch=Es gibt keine geschützten Branches. @@ -1238,7 +1238,7 @@ teams.update_settings=Einstellungen aktualisieren teams.delete_team=Team löschen teams.add_team_member=Teammitglied hinzufügen teams.delete_team_title=Team löschen -teams.delete_team_desc=Das Löschen eines Teams wiederruft den Repository-Zugriff für seine Mitglieder. Fortfahren? +teams.delete_team_desc=Das Löschen eines Teams widerruft den Repository-Zugriff für seine Mitglieder. Fortfahren? teams.delete_team_success=Das Team wurde gelöscht. teams.read_permission_desc=Dieses Team hat Lesezugriff: Mitglieder können Team-Repositories einsehen und klonen. teams.write_permission_desc=Dieses Team hat Schreibzugriff: Mitglieder können Team-Repositories einsehen und darauf pushen. From e39062d62ecde787d9fd7ea7db2640396a2b25f9 Mon Sep 17 00:00:00 2001 From: Russell Aunger Date: Thu, 21 Jun 2018 01:22:03 -0400 Subject: [PATCH 034/447] Fix webhook type conflation. (#4285) - Fix typo that caused Gogs hooks to be created as Gitea hooks. - Fix typo that caused Gogs hooks to be duplicated upon edit (though this bug was masked by the previous one). Signed-off-by: Russell Aunger --- routers/repo/webhook.go | 2 +- routers/routes/routes.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index 63450ed8873d..53c1afe660ea 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -210,7 +210,7 @@ func GogsHooksNewPost(ctx *context.Context, form auth.NewGogshookForm) { Secret: form.Secret, HookEvent: ParseHookEvent(form.WebhookForm), IsActive: form.Active, - HookTaskType: models.GITEA, + HookTaskType: models.GOGS, OrgID: orCtx.OrgID, } if err := w.UpdateEvent(); err != nil { diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 15b91f159970..250b98507e60 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -486,7 +486,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/:id", repo.WebHooksEdit) m.Post("/:id/test", repo.TestWebhook) m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) - m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) m.Post("/discord/:id", bindIgnErr(auth.NewDiscordHookForm{}), repo.DiscordHooksEditPost) m.Post("/dingtalk/:id", bindIgnErr(auth.NewDingtalkHookForm{}), repo.DingtalkHooksEditPost) From cf0dfff0abc2057023029e294a2d78b1c4b91421 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Thu, 21 Jun 2018 12:09:46 +0300 Subject: [PATCH 035/447] Fix topics addition (Another solution) (#4031) (#4258) * Added topics validation, fixed repo topics duplication (#4031) Signed-off-by: Alexey Terentyev * Added tests Signed-off-by: Alexey Terentyev * Fixed fmt Signed-off-by: Alexey Terentyev * Added comments to exported functions Signed-off-by: Alexey Terentyev * Deleted RemoveDuplicateTopics function Signed-off-by: Alexey Terentyev * Fixed messages Signed-off-by: Alexey Terentyev * Added migration Signed-off-by: Alexey Terentyev * fmt migration file Signed-off-by: Alexey Terentyev * fixed lint Signed-off-by: Alexey Terentyev * Added Copyright Signed-off-by: Alexey Terentyev * Added query solution for duplicates Signed-off-by: Alexey Terentyev * Fixed migration query Signed-off-by: Alexey Terentyev * Changed RegExp. Fixed migration Signed-off-by: Alexey Terentyev * fmt migration file Signed-off-by: Alexey Terentyev * Fixed test for changed regexp Signed-off-by: Alexey Terentyev * Removed validation log messages Signed-off-by: Alexey Terentyev * Renamed migration file Signed-off-by: Alexey Terentyev * Renamed validate function Signed-off-by: Alexey Terentyev --- models/migrations/migrations.go | 2 + models/migrations/v68.go | 160 ++++++++++++++++++++++++++++++++ models/topic.go | 15 +++ models/topic_test.go | 13 +++ options/locale/locale_en-US.ini | 2 + public/js/index.js | 4 +- routers/repo/topic.go | 35 ++++++- routers/routes/routes.go | 2 +- 8 files changed, 229 insertions(+), 4 deletions(-) create mode 100644 models/migrations/v68.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 2537e5712b0e..7732e17094e0 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -188,6 +188,8 @@ var migrations = []Migration{ NewMigration("add login source id column for public_key table", addLoginSourceIDToPublicKeyTable), // v67 -> v68 NewMigration("remove stale watches", removeStaleWatches), + // v68 -> V69 + NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics), } // Migrate database to current version diff --git a/models/migrations/v68.go b/models/migrations/v68.go new file mode 100644 index 000000000000..d6a0d04c537d --- /dev/null +++ b/models/migrations/v68.go @@ -0,0 +1,160 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + + "github.com/go-xorm/xorm" +) + +func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { + log.Info("This migration could take up to minutes, please be patient.") + type Topic struct { + ID int64 + Name string `xorm:"unique"` + } + + sess := x.NewSession() + defer sess.Close() + + const batchSize = 100 + touchedRepo := make(map[int64]struct{}) + topics := make([]*Topic, 0, batchSize) + delTopicIDs := make([]int64, 0, batchSize) + ids := make([]int64, 0, 30) + + if err := sess.Begin(); err != nil { + return err + } + log.Info("Validating existed topics...") + for start := 0; ; start += batchSize { + topics = topics[:0] + if err := sess.Asc("id").Limit(batchSize, start).Find(&topics); err != nil { + return err + } + if len(topics) == 0 { + break + } + for _, topic := range topics { + if models.ValidateTopic(topic.Name) { + continue + } + topic.Name = strings.Replace(strings.TrimSpace(strings.ToLower(topic.Name)), " ", "-", -1) + + if err := sess.Table("repo_topic").Cols("repo_id"). + Where("topic_id = ?", topic.ID).Find(&ids); err != nil { + return err + } + for _, id := range ids { + touchedRepo[id] = struct{}{} + } + + if models.ValidateTopic(topic.Name) { + log.Info("Updating topic: id = %v, name = %v", topic.ID, topic.Name) + if _, err := sess.Table("topic").ID(topic.ID). + Update(&Topic{Name: topic.Name}); err != nil { + return err + } + } else { + delTopicIDs = append(delTopicIDs, topic.ID) + } + } + } + + log.Info("Deleting incorrect topics...") + for start := 0; ; start += batchSize { + if (start + batchSize) < len(delTopicIDs) { + ids = delTopicIDs[start:(start + batchSize)] + } else { + ids = delTopicIDs[start:] + } + + log.Info("Deleting 'repo_topic' rows for topics with ids = %v", ids) + if _, err := sess.In("topic_id", ids).Delete(&models.RepoTopic{}); err != nil { + return err + } + + log.Info("Deleting topics with id = %v", ids) + if _, err := sess.In("id", ids).Delete(&Topic{}); err != nil { + return err + } + + if len(ids) < batchSize { + break + } + } + + repoTopics := make([]*models.RepoTopic, 0, batchSize) + delRepoTopics := make([]*models.RepoTopic, 0, batchSize) + tmpRepoTopics := make([]*models.RepoTopic, 0, 30) + + log.Info("Checking the number of topics in the repositories...") + for start := 0; ; start += batchSize { + repoTopics = repoTopics[:0] + if err := sess.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). + GroupBy("repo_id").Having("COUNT(*) > 25").Find(&repoTopics); err != nil { + return err + } + if len(repoTopics) == 0 { + break + } + + log.Info("Number of repositories with more than 25 topics: %v", len(repoTopics)) + for _, repoTopic := range repoTopics { + touchedRepo[repoTopic.RepoID] = struct{}{} + + tmpRepoTopics = tmpRepoTopics[:0] + if err := sess.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { + return err + } + + log.Info("Repository with id = %v has %v topics", repoTopic.RepoID, len(tmpRepoTopics)) + + for i := len(tmpRepoTopics) - 1; i > 24; i-- { + delRepoTopics = append(delRepoTopics, tmpRepoTopics[i]) + } + } + } + + log.Info("Deleting superfluous topics for repositories (more than 25 topics)...") + for _, repoTopic := range delRepoTopics { + log.Info("Deleting 'repo_topic' rows for 'repository' with id = %v. Topic id = %v", + repoTopic.RepoID, repoTopic.TopicID) + + if _, err := sess.Where("repo_id = ? AND topic_id = ?", repoTopic.RepoID, + repoTopic.TopicID).Delete(&models.RepoTopic{}); err != nil { + return err + } + if _, err := sess.Exec( + "UPDATE topic SET repo_count = (SELECT repo_count FROM topic WHERE id = ?) - 1 WHERE id = ?", + repoTopic.TopicID, repoTopic.TopicID); err != nil { + return err + } + } + + topicNames := make([]string, 0, 30) + log.Info("Updating repositories 'topics' fields...") + for repoID := range touchedRepo { + if err := sess.Table("topic").Cols("name"). + Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). + Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + return err + } + log.Info("Updating 'topics' field for repository with id = %v", repoID) + if _, err := sess.ID(repoID).Cols("topics"). + Update(&models.Repository{Topics: topicNames}); err != nil { + return err + } + } + if err := sess.Commit(); err != nil { + return err + } + + return nil +} diff --git a/models/topic.go b/models/topic.go index 3b1737f8afef..247aac5fffe4 100644 --- a/models/topic.go +++ b/models/topic.go @@ -6,6 +6,7 @@ package models import ( "fmt" + "regexp" "strings" "code.gitea.io/gitea/modules/util" @@ -20,6 +21,8 @@ func init() { ) } +var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) + // Topic represents a topic of repositories type Topic struct { ID int64 @@ -51,6 +54,11 @@ func (err ErrTopicNotExist) Error() string { return fmt.Sprintf("topic is not exist [name: %s]", err.Name) } +// ValidateTopic checks topics by length and match pattern rules +func ValidateTopic(topic string) bool { + return len(topic) <= 35 && topicPattern.MatchString(topic) +} + // GetTopicByName retrieves topic by name func GetTopicByName(name string) (*Topic, error) { var topic Topic @@ -182,6 +190,13 @@ func SaveTopics(repoID int64, topicNames ...string) error { } } + topicNames = topicNames[:0] + if err := sess.Table("topic").Cols("name"). + Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). + Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + return err + } + if _, err := sess.ID(repoID).Cols("topics").Update(&Repository{ Topics: topicNames, }); err != nil { diff --git a/models/topic_test.go b/models/topic_test.go index 472f4e52d9b5..ef374e557bba 100644 --- a/models/topic_test.go +++ b/models/topic_test.go @@ -55,3 +55,16 @@ func TestAddTopic(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, 2, len(topics)) } + +func TestTopicValidator(t *testing.T) { + assert.True(t, ValidateTopic("12345")) + assert.True(t, ValidateTopic("2-test")) + assert.True(t, ValidateTopic("test-3")) + assert.True(t, ValidateTopic("first")) + assert.True(t, ValidateTopic("second-test-topic")) + assert.True(t, ValidateTopic("third-project-topic-with-max-length")) + + assert.False(t, ValidateTopic("$fourth-test,topic")) + assert.False(t, ValidateTopic("-fifth-test-topic")) + assert.False(t, ValidateTopic("sixth-go-project-topic-with-excess-length")) +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 8cf6111c6de2..21ae775e4197 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed = Branch '%s' is protected. It cannot be delete topic.manage_topics = Manage Topics topic.done = Done +topic.count_prompt = You can't select more than 25 topics +topic.format_prompt = Topics must start with a letter or number, can include hyphens(-) and must be no more than 35 characters long [org] org_name_holder = Organization Name diff --git a/public/js/index.js b/public/js/index.js index e98a3fe6de2e..823dd876695d 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -2336,8 +2336,10 @@ function initTopicbar() { }).done(function() { editDiv.hide(); viewDiv.show(); + }).fail(function(xhr) { + alert(xhr.responseJSON.message) }) - }) + }); $('#topic_edit .dropdown').dropdown({ allowAdditions: true, diff --git a/routers/repo/topic.go b/routers/repo/topic.go index 2a43d53ff0ba..63fcf793f98a 100644 --- a/routers/repo/topic.go +++ b/routers/repo/topic.go @@ -12,8 +12,8 @@ import ( "code.gitea.io/gitea/modules/log" ) -// TopicPost response for creating repository -func TopicPost(ctx *context.Context) { +// TopicsPost response for creating repository +func TopicsPost(ctx *context.Context) { if ctx.User == nil { ctx.JSON(403, map[string]interface{}{ "message": "Only owners could change the topics.", @@ -27,6 +27,37 @@ func TopicPost(ctx *context.Context) { topics = strings.Split(topicsStr, ",") } + invalidTopics := make([]string, 0) + i := 0 + for _, topic := range topics { + topic = strings.TrimSpace(strings.ToLower(topic)) + // ignore empty string + if len(topic) > 0 { + topics[i] = topic + i++ + } + if !models.ValidateTopic(topic) { + invalidTopics = append(invalidTopics, topic) + } + } + topics = topics[:i] + + if len(topics) > 25 { + ctx.JSON(422, map[string]interface{}{ + "invalidTopics": topics[:0], + "message": ctx.Tr("repo.topic.count_prompt"), + }) + return + } + + if len(invalidTopics) > 0 { + ctx.JSON(422, map[string]interface{}{ + "invalidTopics": invalidTopics, + "message": ctx.Tr("repo.topic.format_prompt"), + }) + return + } + err := models.SaveTopics(ctx.Repo.Repository.ID, topics...) if err != nil { log.Error(2, "SaveTopics failed: %v", err) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 250b98507e60..1eefbf1b6008 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -626,7 +626,7 @@ func RegisterRoutes(m *macaron.Macaron) { }, context.RepoAssignment(), context.UnitTypes(), context.LoadRepoUnits(), context.CheckUnit(models.UnitTypeReleases)) m.Group("/:username/:reponame", func() { - m.Post("/topics", repo.TopicPost) + m.Post("/topics", repo.TopicsPost) }, context.RepoAssignment(), reqRepoAdmin) m.Group("/:username/:reponame", func() { From cbda59fd2163a37988fde824b3f916a918113357 Mon Sep 17 00:00:00 2001 From: David Schneiderbauer Date: Thu, 21 Jun 2018 18:00:13 +0200 Subject: [PATCH 036/447] hide issues from org private repos w/o team assignment (#4034) --- integrations/api_repo_test.go | 6 +- models/access_test.go | 16 ++- models/fixtures/repository.yml | 15 ++- models/fixtures/team.yml | 8 +- models/fixtures/team_repo.yml | 10 +- models/fixtures/team_unit.yml | 209 ++++++++++++++++++++++++++++++++ models/fixtures/user.yml | 2 +- models/migrations/migrations.go | 2 + models/migrations/v38.go | 9 +- models/migrations/v69.go | 80 ++++++++++++ models/models.go | 1 + models/notification.go | 10 ++ models/org.go | 17 ++- models/org_team.go | 86 +++++++++++-- models/org_test.go | 12 +- models/repo.go | 18 +-- models/repo_list_test.go | 6 +- models/repo_watch.go | 17 +++ models/user.go | 38 ++++-- models/user_test.go | 22 ++++ routers/org/teams.go | 21 +++- routers/user/home.go | 6 +- routers/user/home_test.go | 4 +- templates/org/team/new.tmpl | 2 +- 24 files changed, 545 insertions(+), 72 deletions(-) create mode 100644 models/fixtures/team_unit.yml create mode 100644 models/migrations/v69.go diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index b766dd584615..12429c88a871 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -67,9 +67,9 @@ func TestAPISearchRepo(t *testing.T) { expectedResults }{ {name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{ - nil: {count: 15}, - user: {count: 15}, - user2: {count: 15}}, + nil: {count: 16}, + user: {count: 16}, + user2: {count: 16}}, }, {name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{ nil: {count: 10}, diff --git a/models/access_test.go b/models/access_test.go index 59575acb7db8..46d6f723ea8c 100644 --- a/models/access_test.go +++ b/models/access_test.go @@ -22,8 +22,12 @@ func TestAccessLevel(t *testing.T) { user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) - repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) - repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) + // A public repository owned by User 2 + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + assert.False(t, repo1.IsPrivate) + // A private repository owned by Org 3 + repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository) + assert.True(t, repo2.IsPrivate) level, err := AccessLevel(user1.ID, repo1) assert.NoError(t, err) @@ -47,8 +51,12 @@ func TestHasAccess(t *testing.T) { user1 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) user2 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) - repo1 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 2, IsPrivate: false}).(*Repository) - repo2 := AssertExistsAndLoadBean(t, &Repository{OwnerID: 3, IsPrivate: true}).(*Repository) + // A public repository owned by User 2 + repo1 := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository) + assert.False(t, repo1.IsPrivate) + // A private repository owned by Org 3 + repo2 := AssertExistsAndLoadBean(t, &Repository{ID: 3}).(*Repository) + assert.True(t, repo2.IsPrivate) for _, accessMode := range accessModes { has, err := HasAccess(user1.ID, repo1, accessMode) diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml index c7d73fe17d2f..3238b65ead54 100644 --- a/models/fixtures/repository.yml +++ b/models/fixtures/repository.yml @@ -351,7 +351,7 @@ is_mirror: true num_forks: 1 is_fork: false - + - id: 29 fork_id: 27 @@ -365,7 +365,7 @@ num_closed_pulls: 0 is_mirror: false is_fork: true - + - id: 30 fork_id: 28 @@ -389,3 +389,14 @@ num_forks: 0 num_issues: 0 is_mirror: false + +- + id: 32 + owner_id: 3 + lower_name: repo21 + name: repo21 + is_private: false + num_stars: 0 + num_forks: 0 + num_issues: 0 + is_mirror: false diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml index 1d242cb5bb00..4b4a1d798b4e 100644 --- a/models/fixtures/team.yml +++ b/models/fixtures/team.yml @@ -4,9 +4,8 @@ lower_name: owners name: Owners authorize: 4 # owner - num_repos: 2 + num_repos: 3 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 2 @@ -16,7 +15,6 @@ authorize: 2 # write num_repos: 1 num_members: 2 - unit_types: '[1,2,3,4,5,6,7]' - id: 3 @@ -26,7 +24,6 @@ authorize: 4 # owner num_repos: 0 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 4 @@ -36,7 +33,6 @@ authorize: 4 # owner num_repos: 0 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' - id: 5 @@ -46,7 +42,6 @@ authorize: 4 # owner num_repos: 2 num_members: 2 - unit_types: '[1,2,3,4,5,6,7]' - id: 6 @@ -56,4 +51,3 @@ authorize: 4 # owner num_repos: 2 num_members: 1 - unit_types: '[1,2,3,4,5,6,7]' \ No newline at end of file diff --git a/models/fixtures/team_repo.yml b/models/fixtures/team_repo.yml index 9e6d745539d2..b324e094151f 100644 --- a/models/fixtures/team_repo.yml +++ b/models/fixtures/team_repo.yml @@ -33,9 +33,15 @@ org_id: 19 team_id: 6 repo_id: 27 - + - id: 7 org_id: 19 team_id: 6 - repo_id: 28 \ No newline at end of file + repo_id: 28 + +- + id: 8 + org_id: 3 + team_id: 1 + repo_id: 32 diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml new file mode 100644 index 000000000000..ad5466a5c133 --- /dev/null +++ b/models/fixtures/team_unit.yml @@ -0,0 +1,209 @@ +- + id: 1 + team_id: 1 + type: 1 + +- + id: 2 + team_id: 1 + type: 2 + +- + id: 3 + team_id: 1 + type: 3 + +- + id: 4 + team_id: 1 + type: 4 + +- + id: 5 + team_id: 1 + type: 5 + +- + id: 6 + team_id: 1 + type: 6 + +- + id: 7 + team_id: 1 + type: 7 + +- + id: 8 + team_id: 2 + type: 1 + +- + id: 9 + team_id: 2 + type: 2 + +- + id: 10 + team_id: 2 + type: 3 + +- + id: 11 + team_id: 2 + type: 4 + +- + id: 12 + team_id: 2 + type: 5 + +- + id: 13 + team_id: 2 + type: 6 + +- + id: 14 + team_id: 2 + type: 7 + +- + id: 15 + team_id: 3 + type: 1 + +- + id: 16 + team_id: 3 + type: 2 + +- + id: 17 + team_id: 3 + type: 3 + +- + id: 18 + team_id: 3 + type: 4 + +- + id: 19 + team_id: 3 + type: 5 + +- + id: 20 + team_id: 3 + type: 6 + +- + id: 21 + team_id: 3 + type: 7 + +- + id: 22 + team_id: 4 + type: 1 + +- + id: 23 + team_id: 4 + type: 2 + +- + id: 24 + team_id: 4 + type: 3 + +- + id: 25 + team_id: 4 + type: 4 + +- + id: 26 + team_id: 4 + type: 5 + +- + id: 27 + team_id: 4 + type: 6 + +- + id: 28 + team_id: 4 + type: 7 + +- + id: 29 + team_id: 5 + type: 1 + +- + id: 30 + team_id: 5 + type: 2 + +- + id: 31 + team_id: 5 + type: 3 + +- + id: 32 + team_id: 5 + type: 4 + +- + id: 33 + team_id: 5 + type: 5 + +- + id: 34 + team_id: 5 + type: 6 + +- + id: 35 + team_id: 5 + type: 7 + +- + id: 36 + team_id: 6 + type: 1 + +- + id: 37 + team_id: 6 + type: 2 + +- + id: 38 + team_id: 6 + type: 3 + +- + id: 39 + team_id: 6 + type: 4 + +- + id: 40 + team_id: 6 + type: 5 + +- + id: 41 + team_id: 6 + type: 6 + +- + id: 42 + team_id: 6 + type: 7 diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml index 7ad48f7fbe17..a2e3b88d7967 100644 --- a/models/fixtures/user.yml +++ b/models/fixtures/user.yml @@ -45,7 +45,7 @@ is_admin: false avatar: avatar3 avatar_email: user3@example.com - num_repos: 2 + num_repos: 3 num_members: 2 num_teams: 2 diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 7732e17094e0..cc262d810232 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -190,6 +190,8 @@ var migrations = []Migration{ NewMigration("remove stale watches", removeStaleWatches), // v68 -> V69 NewMigration("Reformat and remove incorrect topics", reformatAndRemoveIncorrectTopics), + // v69 -> v70 + NewMigration("move team units to team_unit table", moveTeamUnitsToTeamUnitTable), } // Migrate database to current version diff --git a/models/migrations/v38.go b/models/migrations/v38.go index 6f66484b056a..eb90f9fbff53 100644 --- a/models/migrations/v38.go +++ b/models/migrations/v38.go @@ -25,10 +25,15 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) { Created time.Time `xorm:"-"` } + type Team struct { + ID int64 + UnitTypes []int `xorm:"json"` + } + // Update team unit types const batchSize = 100 for start := 0; ; start += batchSize { - teams := make([]*models.Team, 0, batchSize) + teams := make([]*Team, 0, batchSize) if err := x.Limit(batchSize, start).Find(&teams); err != nil { return err } @@ -36,7 +41,7 @@ func removeCommitsUnitType(x *xorm.Engine) (err error) { break } for _, team := range teams { - ut := make([]models.UnitType, 0, len(team.UnitTypes)) + ut := make([]int, 0, len(team.UnitTypes)) for _, u := range team.UnitTypes { if u < V16UnitTypeCommits { ut = append(ut, u) diff --git a/models/migrations/v69.go b/models/migrations/v69.go new file mode 100644 index 000000000000..8d964688aec1 --- /dev/null +++ b/models/migrations/v69.go @@ -0,0 +1,80 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "fmt" + + "github.com/go-xorm/xorm" +) + +func moveTeamUnitsToTeamUnitTable(x *xorm.Engine) error { + // Team see models/team.go + type Team struct { + ID int64 + OrgID int64 + UnitTypes []int `xorm:"json"` + } + + // TeamUnit see models/org_team.go + type TeamUnit struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type int `xorm:"UNIQUE(s)"` + } + + if err := x.Sync2(new(TeamUnit)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + // Update team unit types + const batchSize = 100 + for start := 0; ; start += batchSize { + teams := make([]*Team, 0, batchSize) + if err := x.Limit(batchSize, start).Find(&teams); err != nil { + return err + } + if len(teams) == 0 { + break + } + + for _, team := range teams { + var unitTypes []int + if len(team.UnitTypes) == 0 { + unitTypes = allUnitTypes + } else { + unitTypes = team.UnitTypes + } + + // insert units for team + var units = make([]TeamUnit, 0, len(unitTypes)) + for _, tp := range unitTypes { + units = append(units, TeamUnit{ + OrgID: team.OrgID, + TeamID: team.ID, + Type: tp, + }) + } + + if _, err := sess.Insert(&units); err != nil { + return fmt.Errorf("Insert team units: %v", err) + } + + } + } + + if err := dropTableColumns(sess, "team", "unit_types"); err != nil { + return err + } + return sess.Commit() +} diff --git a/models/models.go b/models/models.go index 5743f1862db9..aaf1370fd4c0 100644 --- a/models/models.go +++ b/models/models.go @@ -122,6 +122,7 @@ func init() { new(Reaction), new(IssueAssignees), new(U2FRegistration), + new(TeamUnit), ) gonicNames := []string{"SSL", "UID"} diff --git a/models/notification.go b/models/notification.go index c8376a857b2d..8c36c0c5c944 100644 --- a/models/notification.go +++ b/models/notification.go @@ -119,7 +119,17 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor } } + issue.loadRepo(e) + for _, watch := range watches { + issue.Repo.Units = nil + if issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypePullRequests) { + continue + } + if !issue.IsPull && !issue.Repo.CheckUnitUser(watch.UserID, false, UnitTypeIssues) { + continue + } + if err := notifyUser(watch.UserID); err != nil { return err } diff --git a/models/org.go b/models/org.go index ed0d5830671d..23f6c58bf6ab 100644 --- a/models/org.go +++ b/models/org.go @@ -154,12 +154,26 @@ func CreateOrganization(org, owner *User) (err error) { Name: ownerTeamName, Authorize: AccessModeOwner, NumMembers: 1, - UnitTypes: allRepUnitTypes, } if _, err = sess.Insert(t); err != nil { return fmt.Errorf("insert owner team: %v", err) } + // insert units for team + var units = make([]TeamUnit, 0, len(allRepUnitTypes)) + for _, tp := range allRepUnitTypes { + units = append(units, TeamUnit{ + OrgID: org.ID, + TeamID: t.ID, + Type: tp, + }) + } + + if _, err = sess.Insert(&units); err != nil { + sess.Rollback() + return err + } + if _, err = sess.Insert(&TeamUser{ UID: owner.ID, OrgID: org.ID, @@ -238,6 +252,7 @@ func deleteOrg(e *xorm.Session, u *User) error { &Team{OrgID: u.ID}, &OrgUser{OrgID: u.ID}, &TeamUser{OrgID: u.ID}, + &TeamUnit{OrgID: u.ID}, ); err != nil { return fmt.Errorf("deleteBeans: %v", err) } diff --git a/models/org_team.go b/models/org_team.go index 5ea6e76cd9b4..3b37f936ff6d 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -1,3 +1,4 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. // Copyright 2016 The Gogs Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -10,7 +11,6 @@ import ( "strings" "code.gitea.io/gitea/modules/log" - "github.com/go-xorm/xorm" ) @@ -28,15 +28,16 @@ type Team struct { Members []*User `xorm:"-"` NumRepos int NumMembers int - UnitTypes []UnitType `xorm:"json"` + Units []*TeamUnit `xorm:"-"` } -// GetUnitTypes returns unit types the team owned, empty means all the unit types -func (t *Team) GetUnitTypes() []UnitType { - if len(t.UnitTypes) == 0 { - return allRepUnitTypes +func (t *Team) getUnits(e Engine) (err error) { + if t.Units != nil { + return nil } - return t.UnitTypes + + t.Units, err = getUnitsByTeamID(e, t.ID) + return err } // HasWriteAccess returns true if team has at least write level access mode. @@ -214,11 +215,12 @@ func (t *Team) RemoveRepository(repoID int64) error { // UnitEnabled returns if the team has the given unit type enabled func (t *Team) UnitEnabled(tp UnitType) bool { - if len(t.UnitTypes) == 0 { - return true + if err := t.getUnits(x); err != nil { + log.Warn("Error loading repository (ID: %d) units: %s", t.ID, err.Error()) } - for _, u := range t.UnitTypes { - if u == tp { + + for _, unit := range t.Units { + if unit.Type == tp { return true } } @@ -275,6 +277,17 @@ func NewTeam(t *Team) (err error) { return err } + // insert units for team + if len(t.Units) > 0 { + for _, unit := range t.Units { + unit.TeamID = t.ID + } + if _, err = sess.Insert(&t.Units); err != nil { + sess.Rollback() + return err + } + } + // Update organization number of teams. if _, err = sess.Exec("UPDATE `user` SET num_teams=num_teams+1 WHERE id = ?", t.OrgID); err != nil { sess.Rollback() @@ -424,6 +437,13 @@ func DeleteTeam(t *Team) error { return err } + // Delete team-unit. + if _, err := sess. + Where("team_id=?", t.ID). + Delete(new(TeamUnit)); err != nil { + return err + } + // Delete team. if _, err := sess.ID(t.ID).Delete(new(Team)); err != nil { return err @@ -695,3 +715,47 @@ func GetTeamsWithAccessToRepo(orgID, repoID int64, mode AccessMode) ([]*Team, er And("team_repo.repo_id = ?", repoID). Find(&teams) } + +// ___________ ____ ___ .__ __ +// \__ ___/___ _____ _____ | | \____ |__|/ |_ +// | |_/ __ \\__ \ / \| | / \| \ __\ +// | |\ ___/ / __ \| Y Y \ | / | \ || | +// |____| \___ >____ /__|_| /______/|___| /__||__| +// \/ \/ \/ \/ + +// TeamUnit describes all units of a repository +type TeamUnit struct { + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + TeamID int64 `xorm:"UNIQUE(s)"` + Type UnitType `xorm:"UNIQUE(s)"` +} + +// Unit returns Unit +func (t *TeamUnit) Unit() Unit { + return Units[t.Type] +} + +func getUnitsByTeamID(e Engine, teamID int64) (units []*TeamUnit, err error) { + return units, e.Where("team_id = ?", teamID).Find(&units) +} + +// UpdateTeamUnits updates a teams's units +func UpdateTeamUnits(team *Team, units []TeamUnit) (err error) { + sess := x.NewSession() + defer sess.Close() + if err = sess.Begin(); err != nil { + return err + } + + if _, err = sess.Where("team_id = ?", team.ID).Delete(new(TeamUnit)); err != nil { + return err + } + + if _, err = sess.Insert(units); err != nil { + sess.Rollback() + return err + } + + return sess.Commit() +} diff --git a/models/org_test.go b/models/org_test.go index 42ab4a2a4534..c54e7a93bf19 100644 --- a/models/org_test.go +++ b/models/org_test.go @@ -489,8 +489,8 @@ func TestAccessibleReposEnv_CountRepos(t *testing.T) { assert.NoError(t, err) assert.EqualValues(t, expectedCount, count) } - testSuccess(2, 2) - testSuccess(4, 1) + testSuccess(2, 3) + testSuccess(4, 2) } func TestAccessibleReposEnv_RepoIDs(t *testing.T) { @@ -503,8 +503,8 @@ func TestAccessibleReposEnv_RepoIDs(t *testing.T) { assert.NoError(t, err) assert.Equal(t, expectedRepoIDs, repoIDs) } - testSuccess(2, 1, 100, []int64{3, 5}) - testSuccess(4, 0, 100, []int64{3}) + testSuccess(2, 1, 100, []int64{3, 5, 32}) + testSuccess(4, 0, 100, []int64{3, 32}) } func TestAccessibleReposEnv_Repos(t *testing.T) { @@ -522,8 +522,8 @@ func TestAccessibleReposEnv_Repos(t *testing.T) { } assert.Equal(t, expectedRepos, repos) } - testSuccess(2, []int64{3, 5}) - testSuccess(4, []int64{3}) + testSuccess(2, []int64{3, 5, 32}) + testSuccess(4, []int64{3, 32}) } func TestAccessibleReposEnv_MirrorRepos(t *testing.T) { diff --git a/models/repo.go b/models/repo.go index 7f2be502a488..d1cc290c44df 100644 --- a/models/repo.go +++ b/models/repo.go @@ -365,22 +365,14 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) ( return err } - var allTypes = make(map[UnitType]struct{}, len(allRepUnitTypes)) - for _, team := range teams { - // Administrators can not be limited - if team.Authorize >= AccessModeAdmin { - return nil - } - for _, unitType := range team.UnitTypes { - allTypes[unitType] = struct{}{} - } - } - // unique var newRepoUnits = make([]*RepoUnit, 0, len(repo.Units)) for _, u := range repo.Units { - if _, ok := allTypes[u.Type]; ok { - newRepoUnits = append(newRepoUnits, u) + for _, team := range teams { + if team.UnitEnabled(u.Type) { + newRepoUnits = append(newRepoUnits, u) + break + } } } diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 3bccb1aebe72..164bc19bf078 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -147,10 +147,10 @@ func TestSearchRepositoryByName(t *testing.T) { count: 14}, {name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, AllPublic: true}, - count: 15}, + count: 16}, {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, - count: 19}, + count: 20}, {name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName", opts: &SearchRepoOptions{Keyword: "test", Page: 1, PageSize: 10, OwnerID: 15, Private: true, AllPublic: true}, count: 13}, @@ -159,7 +159,7 @@ func TestSearchRepositoryByName(t *testing.T) { count: 11}, {name: "AllPublic/PublicRepositoriesOfOrganization", opts: &SearchRepoOptions{Page: 1, PageSize: 10, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse}, - count: 15}, + count: 16}, } for _, testCase := range testCases { diff --git a/models/repo_watch.go b/models/repo_watch.go index fb89a55a11ed..8019027c1e51 100644 --- a/models/repo_watch.go +++ b/models/repo_watch.go @@ -109,6 +109,23 @@ func notifyWatchers(e Engine, act *Action) error { act.ID = 0 act.UserID = watches[i].UserID + act.Repo.Units = nil + + switch act.OpType { + case ActionCommitRepo, ActionPushTag, ActionDeleteTag, ActionDeleteBranch: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeCode) { + continue + } + case ActionCreateIssue, ActionCommentIssue, ActionCloseIssue, ActionReopenIssue: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypeIssues) { + continue + } + case ActionCreatePullRequest, ActionMergePullRequest, ActionClosePullRequest, ActionReopenPullRequest: + if !act.Repo.CheckUnitUser(act.UserID, false, UnitTypePullRequests) { + continue + } + } + if _, err = e.InsertOne(act); err != nil { return fmt.Errorf("insert new action: %v", err) } diff --git a/models/user.go b/models/user.go index 1497eef44de6..653e99426322 100644 --- a/models/user.go +++ b/models/user.go @@ -546,28 +546,46 @@ func (u *User) GetRepositories(page, pageSize int) (err error) { return err } -// GetRepositoryIDs returns repositories IDs where user owned -func (u *User) GetRepositoryIDs() ([]int64, error) { +// GetRepositoryIDs returns repositories IDs where user owned and has unittypes +func (u *User) GetRepositoryIDs(units ...UnitType) ([]int64, error) { var ids []int64 - return ids, x.Table("repository").Cols("id").Where("owner_id = ?", u.ID).Find(&ids) + + sess := x.Table("repository").Cols("repository.id") + + if len(units) > 0 { + sess = sess.Join("INNER", "repo_unit", "repository.id = repo_unit.repo_id") + sess = sess.In("repo_unit.type", units) + } + + return ids, sess.Where("owner_id = ?", u.ID).Find(&ids) } -// GetOrgRepositoryIDs returns repositories IDs where user's team owned -func (u *User) GetOrgRepositoryIDs() ([]int64, error) { +// GetOrgRepositoryIDs returns repositories IDs where user's team owned and has unittypes +func (u *User) GetOrgRepositoryIDs(units ...UnitType) ([]int64, error) { var ids []int64 - return ids, x.Table("repository"). + + sess := x.Table("repository"). Cols("repository.id"). - Join("INNER", "team_user", "repository.owner_id = team_user.org_id AND team_user.uid = ?", u.ID). + Join("INNER", "team_user", "repository.owner_id = team_user.org_id"). + Join("INNER", "team_repo", "repository.is_private != ? OR (team_user.team_id = team_repo.team_id AND repository.id = team_repo.repo_id)", true) + + if len(units) > 0 { + sess = sess.Join("INNER", "team_unit", "team_unit.team_id = team_user.team_id") + sess = sess.In("team_unit.type", units) + } + + return ids, sess. + Where("team_user.uid = ?", u.ID). GroupBy("repository.id").Find(&ids) } // GetAccessRepoIDs returns all repositories IDs where user's or user is a team member organizations -func (u *User) GetAccessRepoIDs() ([]int64, error) { - ids, err := u.GetRepositoryIDs() +func (u *User) GetAccessRepoIDs(units ...UnitType) ([]int64, error) { + ids, err := u.GetRepositoryIDs(units...) if err != nil { return nil, err } - ids2, err := u.GetOrgRepositoryIDs() + ids2, err := u.GetOrgRepositoryIDs(units...) if err != nil { return nil, err } diff --git a/models/user_test.go b/models/user_test.go index 4fd0bc0fada1..20de1a64be50 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -159,3 +159,25 @@ func BenchmarkHashPassword(b *testing.B) { u.HashPassword(pass) } } + +func TestGetOrgRepositoryIDs(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + user5 := AssertExistsAndLoadBean(t, &User{ID: 5}).(*User) + + accessibleRepos, err := user2.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 2's team has access to private repos 3, 5, repo 32 is a public repo of the organization + assert.Equal(t, []int64{3, 5, 32}, accessibleRepos) + + accessibleRepos, err = user4.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 4's team has access to private repo 3, repo 32 is a public repo of the organization + assert.Equal(t, []int64{3, 32}, accessibleRepos) + + accessibleRepos, err = user5.GetOrgRepositoryIDs() + assert.NoError(t, err) + // User 5's team has no access to any repo + assert.Len(t, accessibleRepos, 0) +} diff --git a/routers/org/teams.go b/routers/org/teams.go index d894c8661436..87bfb8596a8e 100644 --- a/routers/org/teams.go +++ b/routers/org/teams.go @@ -182,7 +182,14 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { Authorize: models.ParseAccessMode(form.Permission), } if t.Authorize < models.AccessModeAdmin { - t.UnitTypes = form.Units + var units = make([]*models.TeamUnit, 0, len(form.Units)) + for _, tp := range form.Units { + units = append(units, &models.TeamUnit{ + OrgID: ctx.Org.Organization.ID, + Type: tp, + }) + } + t.Units = units } ctx.Data["Team"] = t @@ -264,9 +271,17 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) { } t.Description = form.Description if t.Authorize < models.AccessModeAdmin { - t.UnitTypes = form.Units + var units = make([]models.TeamUnit, 0, len(form.Units)) + for _, tp := range form.Units { + units = append(units, models.TeamUnit{ + OrgID: t.OrgID, + TeamID: t.ID, + Type: tp, + }) + } + models.UpdateTeamUnits(t, units) } else { - t.UnitTypes = nil + models.UpdateTeamUnits(t, nil) } if ctx.HasError() { diff --git a/routers/user/home.go b/routers/user/home.go index 2a193bbdef51..0c84b2498e01 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -203,7 +203,11 @@ func Issues(ctx *context.Context) { return } } else { - userRepoIDs, err = ctxUser.GetAccessRepoIDs() + unitType := models.UnitTypeIssues + if isPullList { + unitType = models.UnitTypePullRequests + } + userRepoIDs, err = ctxUser.GetAccessRepoIDs(unitType) if err != nil { ctx.ServerError("ctxUser.GetAccessRepoIDs", err) return diff --git a/routers/user/home_test.go b/routers/user/home_test.go index a9b146b76278..8a3d9b9f5175 100644 --- a/routers/user/home_test.go +++ b/routers/user/home_test.go @@ -26,8 +26,8 @@ func TestIssues(t *testing.T) { Issues(ctx) assert.EqualValues(t, http.StatusOK, ctx.Resp.Status()) - assert.EqualValues(t, map[int64]int64{1: 1, 2: 1}, ctx.Data["Counts"]) + assert.EqualValues(t, map[int64]int64{1: 1}, ctx.Data["Counts"]) assert.EqualValues(t, true, ctx.Data["IsShowClosed"]) assert.Len(t, ctx.Data["Issues"], 1) - assert.Len(t, ctx.Data["Repos"], 2) + assert.Len(t, ctx.Data["Repos"], 1) } diff --git a/templates/org/team/new.tmpl b/templates/org/team/new.tmpl index ec1a3dd72e2a..12cdd697c32e 100644 --- a/templates/org/team/new.tmpl +++ b/templates/org/team/new.tmpl @@ -57,7 +57,7 @@ {{range $t, $unit := $.Units}}
- + {{$.i18n.Tr $unit.DescKey}}
From e0be1d18dc4ace8aba68430983b82d1fcf53fe1d Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Thu, 21 Jun 2018 17:12:56 -0400 Subject: [PATCH 037/447] Remove call to update certs (#4296) --- docker/etc/s6/gitea/setup | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker/etc/s6/gitea/setup b/docker/etc/s6/gitea/setup index 500cca584c7c..03758ed819ac 100755 --- a/docker/etc/s6/gitea/setup +++ b/docker/etc/s6/gitea/setup @@ -1,7 +1,5 @@ #!/bin/bash -/usr/sbin/update-ca-certificates - if [ ! -d /data/git/.ssh ]; then mkdir -p /data/git/.ssh chmod 700 /data/git/.ssh From 9edcb1f0f047b7bf03a246d168f0bbf986a09e65 Mon Sep 17 00:00:00 2001 From: Richard Coleman Date: Sun, 24 Jun 2018 03:55:48 +0100 Subject: [PATCH 038/447] Add details about USER_UID and USER_GID environment variables (#4301) --- docs/content/doc/installation/with-docker.en-us.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/content/doc/installation/with-docker.en-us.md b/docs/content/doc/installation/with-docker.en-us.md index c672393cc033..aa4337e082ef 100644 --- a/docs/content/doc/installation/with-docker.en-us.md +++ b/docs/content/doc/installation/with-docker.en-us.md @@ -245,6 +245,8 @@ You can configure some of Gitea's settings via environment variables: * `SECRET_KEY`: **""**: Global secret key. This should be changed. If this has a value and `INSTALL_LOCK` is empty, `INSTALL_LOCK` will automatically set to `true`. * `DISABLE_REGISTRATION`: **false**: Disable registration, after which only admin can create accounts for users. * `REQUIRE_SIGNIN_VIEW`: **false**: Enable this to force users to log in to view any page. +* `USER_UID`: **1000**: The UID (Unix user ID) of the user that runs Gitea within the container. Match this to the UID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes). +* `USER_GID`: **1000**: The GID (Unix group ID) of the user that runs Gitea within the container. Match this to the GID of the owner of the `/data` volume if using host volumes (this is not necessary with named volumes). # Customization From 24123384081659128e09be141412ef15aada1c5b Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sun, 24 Jun 2018 08:40:30 +0200 Subject: [PATCH 039/447] Add gpg-sign step to drone (#4188) * Add gpg-sign step to drone * add compressed releases to gpg-sign targets * Use exclude to simplify file list drone-plugins/drone-gpgsign#2 --- .drone.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.drone.yml b/.drone.yml index 8e571640b789..dd56477dbe98 100644 --- a/.drone.yml +++ b/.drone.yml @@ -255,6 +255,18 @@ pipeline: when: event: [ push, tag ] + gpg-sign: + image: plugins/gpgsign:1 + pull: true + secrets: [ gpgsign_key, gpgsign_passphrase ] + detach_sign: true + files: + - dist/release/* + excludes: + - dist/release/*.sha265 + when: + event: [ push, tag ] + release: image: plugins/s3:1 pull: true From c88d4abfc1783aa27ff42f30f7a63ff293f9f1e5 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 24 Jun 2018 19:10:11 +0800 Subject: [PATCH 040/447] fix exclude files .sha265 to .sha256 (#4304) --- .drone.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index dd56477dbe98..9a27e1c219a4 100644 --- a/.drone.yml +++ b/.drone.yml @@ -263,7 +263,7 @@ pipeline: files: - dist/release/* excludes: - - dist/release/*.sha265 + - dist/release/*.sha256 when: event: [ push, tag ] From e6bd8f11b77d23b1377d9f9a11102126b3a503d5 Mon Sep 17 00:00:00 2001 From: Antonio Huete Jimenez Date: Sun, 24 Jun 2018 21:24:00 +0000 Subject: [PATCH 041/447] Add a basic SMF manifest for SunOS platforms (#4238) Signed-off-by: Antonio Huete Jimenez --- contrib/init/sunos/gitea.xml | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 contrib/init/sunos/gitea.xml diff --git a/contrib/init/sunos/gitea.xml b/contrib/init/sunos/gitea.xml new file mode 100644 index 000000000000..4b8cc3a381d9 --- /dev/null +++ b/contrib/init/sunos/gitea.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 59fcac13b97fd49219b3d3555d32b26a83c357b9 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 24 Jun 2018 21:25:00 +0000 Subject: [PATCH 042/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 8 +++++--- options/locale/locale_uk-UA.ini | 36 ++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 4b1b85f92cb9..972b62261a57 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -97,7 +97,7 @@ app_name=Seitentitel app_name_helper=Du kannst hier den Namen deines Unternehmens eingeben. repo_path=Repository-Verzeichnis repo_path_helper=Remote-Git-Repositories werden in diesem Verzeichnis gespeichert. -lfs_path=Git LFS-Wurzelpfad +lfs_path=Git-LFS-Wurzelpfad lfs_path_helper=In diesem Verzeichnis werden die Dateien von Git LFS abgespeichert. Leer lassen um LFS zu deaktivieren. run_user=Ausführen als run_user_helper=Gebe den Betriebssystem-Benutzernamen ein, unter welchem Gitea laufen soll. Beachte, dass dieser Nutzer Zugriff auf den Repository-Ordner haben muss. @@ -658,7 +658,7 @@ issues.new_label_placeholder=Labelname issues.new_label_desc_placeholder=Beschreibung issues.create_label=Label erstellen issues.label_templates.title=Lade vordefinierte Label -issues.label_templates.info=Es existieren noch keine Labels. Erstelle ein neues Label ("Neues Label") oder verwende das Standard Label-Set: +issues.label_templates.info=Es existieren noch keine Label. Erstelle ein neues Label („Neues Label“) oder verwende das Standard-Label-Set: issues.label_templates.helper=Wähle ein Label issues.label_templates.use=Label-Set verwenden issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v @@ -676,7 +676,7 @@ issues.delete_branch_at=`löschte die Branch %s %s` issues.open_tab=%d offen issues.close_tab=%d geschlossen issues.filter_label=Label -issues.filter_label_no_select=Alle Labels +issues.filter_label_no_select=Alle Label issues.filter_milestone=Meilenstein issues.filter_milestone_no_select=Alle Meilensteine issues.filter_assignee=Zuständig @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht g topic.manage_topics=Themen verwalten topic.done=Fertig +topic.count_prompt=Du kannst nicht mehr als 25 Themen auswählen +topic.format_prompt=Themen müssen mit einem Buchstaben oder einer Zahl beginnen. Sie können Bindestriche (-) enthalten und dürfen nicht länger als 35 Zeichen sein [org] org_name_holder=Name der Organisation diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 8f90f3a3f890..c6855090ae89 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -40,6 +40,7 @@ u2f_unsupported_browser=Ваш браузер не підтримує U2F клю u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. +u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити repository=Репозиторій @@ -105,6 +106,7 @@ ssh_port_helper=Номер порту, який використовує SSH с http_port=Gitea HTTP порт http_port_helper=Номер порту, який буде прослуховуватися Giteas веб-сервером. app_url=Базова URL-адреса Gitea +app_url_helper=Базова адреса для HTTP(S) клонування через URL та повідомлень електронної пошти. log_root_path=Шлях до лог файлу log_root_path_helper=Файли журналу будуть записані в цей каталог. @@ -112,6 +114,7 @@ optional_title=Додаткові налаштування email_title=Налаштування Email smtp_host=SMTP хост smtp_from=Відправляти Email від імені +smtp_from_helper=Електронна пошта для використання в Gіtea. Введіть звичайну електронну адресу або використовуйте формат: "Ім'я" . mailer_user=SMTP Ім'я кристувача mailer_password=SMTP Пароль register_confirm=Потрібно підтвердити електронну пошту для реєстрації @@ -125,9 +128,11 @@ federated_avatar_lookup=Увімкнути федеративні аватари federated_avatar_lookup_popup=Увімкнути зовнішний Аватар за допомогою Libravatar. disable_registration=Вимкнути самостійну реєстрацію disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи. +allow_only_external_registration_popup=Включити реєстрацію тільки через зовнішні сервіси. openid_signin=Увімкнути реєстрацію за допомогою OpenID openid_signin_popup=Увімкнути вхід за допомогою OpenID. openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID +openid_signup_popup=Увімкнути самореєстрацію користувачів на основі OpenID. enable_captcha=Увімкнути CAPTCHA enable_captcha_popup=Вимагати перевірку CAPTCHA при самостійній реєстрації користувача. require_sign_in_view=Вимагати авторизації для перегляду сторінок @@ -141,6 +146,7 @@ admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v invalid_db_setting=Налаштування бази даних є некоректними: %v +invalid_repo_path=Помилковий шлях до кореня репозиторію: %v save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -152,6 +158,7 @@ default_allow_create_organization_popup=Дозволити новим облік default_enable_timetracking=Увімкнути відстеження часу за замовчуванням default_enable_timetracking_popup=Включити відстеження часу для нових репозиторіїв за замовчуванням. no_reply_address=Прихований поштовий домен +no_reply_address_helper=Доменне ім'я для користувачів із прихованою електронною адресою. Наприклад, ім'я користувача 'joe' буде входити в Git як 'joe@noreply.example.org', якщо для прихованого домену електронної пошти встановлено 'noreply.example.org'. [home] uname_holder=Ім'я користувача або Ел. пошта @@ -176,11 +183,13 @@ code=Код repo_no_results=Відповідних репозиторіїв не знайдено. user_no_results=Відповідних користувачів не знайдено. org_no_results=Відповідних організацій не знайдено. +code_no_results=Відповідний пошуковому запитанню код не знайдено. code_search_results=Результати пошуку '%s' [auth] create_new_account=Реєстрація облікового запису register_helper_msg=Вже зареєстровані? Увійдіть зараз! +social_register_helper_msg=Вже є аккаунт? Зв'яжіть його зараз! disable_register_prompt=Вибачте, можливість реєстрації відключена. Будь ласка, зв'яжіться з адміністратором сайту. disable_register_mail=Підтвердження реєстрації електронною поштою вимкнено. remember_me=Запам'ятати мене @@ -200,6 +209,7 @@ send_reset_mail=Натисніть сюди, щоб відправити лис reset_password=Скинути пароль invalid_code=Цей код підтвердження недійсний або закінчився. reset_password_helper=Натисніть тут для скидання пароля +password_too_short=Довжина пароля не може бути меншою за %d символів. non_local_account=Нелокальні акаунти не можуть змінити пароль через Gitea. verify=Підтвердити scratch_code=Одноразовий пароль @@ -211,7 +221,10 @@ login_userpass=Увійти login_openid=OpenID openid_connect_submit=Під’єднатися openid_connect_title=Підключитися до існуючого облікового запису +openid_connect_desc=Вибраний OpenID URI невідомий. Пов'яжіть його з новим обліковим записом тут. openid_register_title=Створити новий обліковий запис +openid_register_desc=Вибраний OpenID URI невідомий. Пов'яжіть йогоз новим обліковим записом тут. +openid_signin_desc=Введіть свій ідентифікатор OpenID. Наприклад: https://anne.me, bob.openid.org.cn або gnusocial.net/carry. disable_forgot_password_mail=На жаль скидання пароля відключене. Будь ласка, зв'яжіться з адміністратором сайту. [mail] @@ -247,6 +260,8 @@ TreeName=Шлях до файлу Content=Зміст require_error=` не може бути пустим.` +alpha_dash_error=` повинен містити тільки літерно-цифрові символи, дефіс ('-') та підкреслення ('_'). ` +alpha_dash_dot_error=` повинен містити тільки літерно-цифрові символи, дефіс ('-') , підкреслення ('_') та точки ('.'). ` git_ref_name_error=` повинен бути правильним посилальним ім'ям Git.` size_error=` повинен бути розмір %s.` min_size_error=` повинен бути принаймні %s символів.` @@ -262,6 +277,7 @@ username_been_taken=Ім'я користувача вже зайнято. repo_name_been_taken=Ім'я репозіторію вже використовується. org_name_been_taken=Назва організації вже зайнято. team_name_been_taken=Назва команди вже зайнято. +team_no_units_error=Дозволити доступ до принаймні одного розділу репозитарію. email_been_used=Ця електронна адреса вже використовується. openid_been_used=OpenID адреса '%s' вже використовується. username_password_incorrect=Неправильне ім'я користувача або пароль. @@ -269,12 +285,15 @@ enterred_invalid_repo_name=Невірно введено ім'я репозит enterred_invalid_owner_name=Ім'я нового власника не є дійсним. enterred_invalid_password=Введений вами пароль некоректний. user_not_exist=Даний користувач не існує. +last_org_owner=Ви не можете вилучити останнього користувача з команди 'власники'. У кожній команді має бути хоча б один власник. cannot_add_org_to_team=Організацію неможливо додати як учасника команди. invalid_ssh_key=Неможливо перевірити ваш SSH ключ: %s invalid_gpg_key=Неможливо перевірити ваш GPG ключ: %s +unable_verify_ssh_key=Не вдається підтвердити ключ SSH; подвійно перевірте його на наявність похибки. auth_failed=Помилка автентифікації: %v +still_own_repo=Ваш обліковий запис володіє одним або декількома репозиторіями; видаліть або перенесіть їх в першу чергу. target_branch_not_exist=Цільової гілки не існує. @@ -290,6 +309,7 @@ follow=Підписатися unfollow=Відписатися form.name_reserved=Ім'я користувача "%s" зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в імені користувача. [settings] profile=Профіль @@ -311,6 +331,7 @@ u2f=Ключі безпеки public_profile=Загальнодоступний профіль profile_desc=Ваша адреса електронної пошти використовуватиметься для сповіщення та інших операцій. +password_username_disabled=Нелокальним користувачам заборонено змінювати ім'я користувача. Щоб отримати докладнішу інформацію, зв'яжіться з адміністратором сайту. full_name=Повне ім'я website=Веб-сайт location=Місцезнаходження @@ -340,28 +361,36 @@ password_change_disabled=Нелокальні акаунти не можуть emails=Адреса електронної пошти manage_emails=Керування адресами ел. пошти +manage_openid=Керування OpenID email_desc=Ваша основна адреса електронної пошти використовуватиметься для сповіщення та інших операцій. primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти openid_deletion=Видалити адресу OpenID +openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти add_new_openid=Додати новий OpenID URI add_email=Додати адресу електронної пошти add_openid=Додати OpenID URI add_email_confirmation_sent=Електронний лист із підтвердженням було відправлено на '%s', будь ласка, перевірте вашу поштову скриньку протягом наступних %s, щоб підтвердити адресу. add_email_success=Додано нову адресу електронної пошти. +add_openid_success=Нова адреса OpenID була додана. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. manage_ssh_keys=Керувати SSH ключами manage_gpg_keys=Керувати GPG ключами add_key=Додати ключ +ssh_desc=Ці відкриті SSH-ключі пов'язані з вашим обліковим записом. Відповідні приватні ключі дозволяють отримати повний доступ до ваших репозиторіїв. +gpg_desc=Ці публічні ключі GPG пов'язані з вашим обліковим записом. Тримайте свої приватні ключі в безпеці, оскільки вони дозволяють здійснювати перевірку комітів. ssh_helper=Потрібна допомога? Дивіться гід на GitHub з генерації ключів SSH або виправлення типових неполадок SSH. gpg_helper= Потрібна допомога? Перегляньте посібник GitHub про GPG . add_new_key=Додати SSH ключ add_new_gpg_key=Додати GPG ключ +ssh_key_been_used=Цей ключ SSH вже додано до вашого облікового запису. +ssh_key_name_used=Ключ SSH з таким самим ім'ям вже додано до вашого облікового запису. +gpg_key_id_used=Публічний ключ GPG з таким самим ідентифікатором вже існує. subkeys=Підключі key_id=ID ключа key_name=Ім'я ключа @@ -560,6 +589,7 @@ commits.date=Дата commits.older=Давніше commits.newer=Новіше commits.signed_by=Підписано +commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми @@ -731,6 +761,8 @@ milestones.edit=Редагувати етап milestones.cancel=Відмінити milestones.modify=Оновити етап milestones.deletion=Видалити етап +milestones.filter_sort.closest_due_date=Найближче за датою +milestones.filter_sort.furthest_due_date=Далі за датою milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем @@ -1107,7 +1139,9 @@ users.admin=Адміністратор users.repos=Репозиторії users.created=Створено users.last_login=Останній вхід +users.never_login=Ніколи не входив users.send_register_notify=Надіслати повідомлення про реєстрацію користувача +users.new_success=Обліковий запис '%s' створений. users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні @@ -1243,7 +1277,7 @@ config.default_keep_email_private=Приховати адресу електро config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням -config.no_reply_address=Прихований домен е-пошти +config.no_reply_address=Прихований домен електронної пошти config.webhook_config=Конфігурація web-хуків config.queue_length=Довжина черги From 3ea4c189441dfd5b2f558cbdcdbfdd7bc9ea4406 Mon Sep 17 00:00:00 2001 From: stevegt Date: Mon, 25 Jun 2018 05:12:46 -0700 Subject: [PATCH 043/447] Create api-usage doc page (#4306) * add api user guides in doc * update user-guides api page * fix typo: user guides -> user guide * move api-usage page under advanced category * flesh out API usage docs * Build on work by @tungsheng * Address issues raised in #4037, #3673, and #4243 * Close #4247 Signed-off-by: Steve Traugott --- docs/content/doc/advanced/api-usage.en-us.md | 75 ++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 docs/content/doc/advanced/api-usage.en-us.md diff --git a/docs/content/doc/advanced/api-usage.en-us.md b/docs/content/doc/advanced/api-usage.en-us.md new file mode 100644 index 000000000000..f04a99f14b12 --- /dev/null +++ b/docs/content/doc/advanced/api-usage.en-us.md @@ -0,0 +1,75 @@ +--- +date: "2018-06-24:00:00+02:00" +title: "API Usage" +slug: "api-usage" +weight: 40 +toc: true +draft: false +menu: + sidebar: + parent: "advanced" + name: "API Usage" + weight: 40 + identifier: "api-usage" +--- + +# Gitea API Usage + +## Enabling/configuring API access + +By default, `ENABLE_SWAGGER_ENDPOINT` is true, and +`MAX_RESPONSE_ITEMS` is set to 50. See [Config Cheat +Sheet](https://docs.gitea.io/en-us/config-cheat-sheet/) for more +information. + +## Authentication via the API + +Gitea supports these methods of API authentication: + +- HTTP basic authentication +- `token=...` parameter in URL query string +- `access_token=...` parameter in URL query string +- `Authorization: token ...` header in HTTP headers + +All of these methods accept the same apiKey token type. You can +better understand this by looking at the code -- as of this writing, +Gitea parses queries and headers to find the token in +[modules/auth/auth.go](https://github.com/go-gitea/gitea/blob/6efdcaed86565c91a3dc77631372a9cc45a58e89/modules/auth/auth.go#L47). + +You can create an apiKey token via your gitea install's web interface: +`Settings | Applications | Generate New Token`. + +### More on the `Authorization:` header + +For historical reasons, Gitea needs the word `token` included before +the apiKey token in an authorization header, like this: + +``` +Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675 +``` + +In a `curl` command, for instance, this would look like: + +``` +curl -X POST "http://localhost:4000/api/v1/repos/test1/test1/issues" \ + -H "accept: application/json" \ + -H "Authorization: token 65eaa9c8ef52460d22a93307fe0aee76289dc675" \ + -H "Content-Type: application/json" -d "{ \"body\": \"testing\", \"title\": \"test 20\"}" -i +``` + +As mentioned above, the token used is the same one you would use in +the `token=` string in a GET request. + +## Listing your issued tokens via the API + +As mentioned in +[#3842](https://github.com/go-gitea/gitea/issues/3842#issuecomment-397743346), +`/users/:name/tokens` is special and requires you to authenticate +using BasicAuth, as follows: + +### Using basic authentication: + +``` +$ curl --request GET --url https://yourusername:yourpassword@gitea.your.host/api/v1/users/yourusername/tokens +[{"name":"test","sha1":"..."},{"name":"dev","sha1":"..."}] +``` From 158124ac88621dcefa63bb764b2d5a4e992962f9 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 25 Jun 2018 12:13:56 +0000 Subject: [PATCH 044/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index c6855090ae89..b0d098badd7b 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -430,6 +430,7 @@ access_token_deletion=Видалити токен доступу twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. +twofa_not_enrolled=Ваш обліковий запис наразі не використовує двофакторну автентифікаціїю. twofa_disable=Вимкнути двофакторну автентифікацію twofa_scratch_token_regenerate=Перестворити токен одноразового пароля twofa_enroll=Увімкнути двофакторну автентифікацію From 691e7c779059c57d416dfceb8c873c41b49fa527 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Tue, 26 Jun 2018 16:45:18 +0200 Subject: [PATCH 045/447] Fix open redirect vulnerability on login screen (#4312) * Fix open redirect vulnerability on login screen Signed-off-by: Jonas Franz * Reorder imports Signed-off-by: Jonas Franz * Replace www. from Domain too Signed-off-by: Jonas Franz --- modules/util/util.go | 13 +++++++++++++ modules/util/util_test.go | 35 +++++++++++++++++++++++++++++++++++ routers/user/auth.go | 3 ++- 3 files changed, 50 insertions(+), 1 deletion(-) diff --git a/modules/util/util.go b/modules/util/util.go index b6acb9796e76..5dcbe448fc04 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -10,6 +10,7 @@ import ( "strings" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" ) // OptionalBool a boolean that can be "null" @@ -78,6 +79,18 @@ func URLJoin(base string, elems ...string) string { return joinedURL } +// IsExternalURL checks if rawURL points to an external URL like http://example.com +func IsExternalURL(rawURL string) bool { + parsed, err := url.Parse(rawURL) + if err != nil { + return true + } + if len(parsed.Host) != 0 && strings.Replace(parsed.Host, "www.", "", 1) != strings.Replace(setting.Domain, "www.", "", 1) { + return true + } + return false +} + // Min min of two ints func Min(a, b int) int { if a > b { diff --git a/modules/util/util_test.go b/modules/util/util_test.go index 0d79df605033..d9357ffa3d58 100644 --- a/modules/util/util_test.go +++ b/modules/util/util_test.go @@ -7,6 +7,8 @@ package util import ( "testing" + "code.gitea.io/gitea/modules/setting" + "github.com/stretchr/testify/assert" ) @@ -42,3 +44,36 @@ func TestURLJoin(t *testing.T) { assert.Equal(t, test.Expected, URLJoin(test.Base, test.Elements...)) } } + +func TestIsExternalURL(t *testing.T) { + setting.Domain = "try.gitea.io" + type test struct { + Expected bool + RawURL string + } + newTest := func(expected bool, rawURL string) test { + return test{Expected: expected, RawURL: rawURL} + } + for _, test := range []test{ + newTest(false, + "https://try.gitea.io"), + newTest(true, + "https://example.com/"), + newTest(true, + "//example.com"), + newTest(true, + "http://example.com"), + newTest(false, + "a/"), + newTest(false, + "https://try.gitea.io/test?param=false"), + newTest(false, + "test?param=false"), + newTest(false, + "//try.gitea.io/test?param=false"), + newTest(false, + "/hey/hey/hey#3244"), + } { + assert.Equal(t, test.Expected, IsExternalURL(test.RawURL)) + } +} diff --git a/routers/user/auth.go b/routers/user/auth.go index 9a59f52db259..317b4af3bb04 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -18,6 +18,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" "github.com/go-macaron/captcha" "github.com/markbates/goth" @@ -474,7 +475,7 @@ func handleSignInFull(ctx *context.Context, u *models.User, remember bool, obeyR return setting.AppSubURL + "/" } - if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { + if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 && !util.IsExternalURL(redirectTo) { ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) if obeyRedirect { ctx.RedirectToFirst(redirectTo) From 63aee46f56f45acd524a7d0ffe9ef3682e1a4de3 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 26 Jun 2018 14:46:26 +0000 Subject: [PATCH 046/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_lv-LV.ini | 5 +++-- options/locale/locale_pt-BR.ini | 2 ++ options/locale/locale_ru-RU.ini | 2 ++ options/locale/locale_uk-UA.ini | 11 ++++++++++- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index c2274b99a063..1b0129ba124f 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -54,13 +54,14 @@ password=Parole db_name=Datu bāzes nosaukums path=Ceļš -repo_path=Repozitoriju glabāšanas vieta -log_root_path=Žurnalizēšanas direktorija +repo_path=Repozitoriju glabāšanas ceļš +log_root_path=Žurnalizēšanas ceļš optional_title=Neobligātie iestatījumi smtp_host=SMTP resursdators federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. openid_signin=Iespējot OpenID autorizāciju +openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. admin_password=Parole confirm_password=Apstipriniet paroli diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 0df553778eab..f2ec96dd0161 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se topic.manage_topics=Gerenciar Tópicos topic.done=Feito +topic.count_prompt=Você não pode selecionar mais de 25 tópicos +topic.format_prompt=Tópicos devem começar com uma letra ou um número, podem incluir hífens (-) e não devem ter mais de 35 caracteres [org] org_name_holder=Nome da organização diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 0088951816d0..9df7e4e16ed0 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=Ветка '%s' защищена. Её нель topic.manage_topics=Редактировать тематические метки topic.done=Сохранить +topic.count_prompt=Вы не можете выбрать более 25 тем +topic.format_prompt=Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов [org] org_name_holder=Название организации diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index b0d098badd7b..8946d2894e92 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -40,6 +40,7 @@ u2f_unsupported_browser=Ваш браузер не підтримує U2F клю u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. u2f_error_3=Сервер не може обробити, ваш запит. +u2f_error_4=Представлений ключ не дає право на цей запит. Якщо спробуєте зареєструвати його, переконайтеся, що ключ ще не зареєстровано. u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити @@ -74,7 +75,7 @@ cancel=Відмінити [install] install=Встановлення title=Початкова конфігурація -docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як що-небудь змінити на цій сторінці. +docker_helper=Якщо ви запускаєте Gitea всередині Docker, будь ласка уважно прочитайте документацію перед тим, як щось змінити на цій сторінці. requite_db_desc=Gitea потребує MySQL, PostgreSQL, MSSQL, SQLite3 або TiDB. db_title=Налаштування бази даних db_type=Тип бази даних @@ -593,6 +594,7 @@ commits.signed_by=Підписано commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми +ext_issues.desc=Посилання на зовнішню систему відстеження проблем. issues.new=Нова проблема issues.new.labels=Мітки @@ -614,6 +616,7 @@ issues.new_label_desc_placeholder=Опис issues.create_label=Створити мітку issues.label_templates.title=Завантажити визначений набір міток issues.label_templates.helper=Оберіть набір міток +issues.label_templates.use=Використовувати набір міток issues.label_templates.fail_to_load_file=Не вдалося завантажити файл шаблона мітки '%s': %v issues.add_label_at=додав(ла) мітку
%s
%s issues.add_milestone_at=`додав(ла) до %s етапу %s` @@ -702,9 +705,11 @@ issues.start_tracking=Почати відстеження часу issues.start_tracking_history=`почав працювати %s` issues.tracking_already_started=`Ви вже почали відстежувати час для цієї проблеми!` issues.stop_tracking=Стоп +issues.stop_tracking_history=`перестав(-ла) працювати %s` issues.add_time=Вручну додати час issues.add_time_short=Додати час issues.add_time_cancel=Відмінити +issues.add_time_history=`додав(-ла) витрачений час %s` issues.add_time_hours=Години issues.add_time_minutes=Хвилини issues.add_time_sum_to_small=Час не введено. @@ -713,6 +718,8 @@ issues.cancel_tracking_history=`скасував відстеження часу issues.time_spent_total=Загальний витрачений час issues.time_spent_from_all_authors=`Загальний витрачений час: %s` issues.due_date=Дата завершення +issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. +issues.error_modifying_due_date=Не вдалося змінити дату завершення. issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_update=Оновити дату завершення @@ -768,6 +775,7 @@ milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем ext_wiki=Зов. Вікі +ext_wiki.desc=Посилання на зовнішню вікі. wiki=Вікі wiki.welcome=Ласкаво просимо до Вікі. @@ -817,6 +825,7 @@ activity.closed_issue_label=Закрито activity.new_issues_count_1=Нова Проблема activity.new_issues_count_n=%d Проблем activity.new_issue_label=Відкриті +activity.title.unresolved_conv_1=%d Незавершене обговорення activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів From faa133f5541c5d1b6a9bf79d76bea52b3ee8feae Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Wed, 27 Jun 2018 08:23:10 +0300 Subject: [PATCH 047/447] Fixed violation of the unique constraint for v68 migration (#4297) --- models/migrations/v68.go | 147 ++++++++++++++++++++++++++------------- models/topic.go | 12 ++-- 2 files changed, 106 insertions(+), 53 deletions(-) diff --git a/models/migrations/v68.go b/models/migrations/v68.go index d6a0d04c537d..e27b896c82df 100644 --- a/models/migrations/v68.go +++ b/models/migrations/v68.go @@ -5,19 +5,47 @@ package migrations import ( + "fmt" + "regexp" "strings" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "github.com/go-xorm/xorm" ) +var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) + +func validateTopic(topic string) bool { + return len(topic) <= 35 && topicPattern.MatchString(topic) +} + func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { log.Info("This migration could take up to minutes, please be patient.") + type Topic struct { - ID int64 - Name string `xorm:"unique"` + ID int64 + Name string `xorm:"UNIQUE"` + RepoCount int + CreatedUnix int64 `xorm:"INDEX created"` + UpdatedUnix int64 `xorm:"INDEX updated"` + } + + type RepoTopic struct { + RepoID int64 `xorm:"UNIQUE(s)"` + TopicID int64 `xorm:"UNIQUE(s)"` + } + + type Repository struct { + ID int64 `xorm:"pk autoincr"` + Topics []string `xorm:"TEXT JSON"` + } + + if err := x.Sync2(new(Topic)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + if err := x.Sync2(new(RepoTopic)); err != nil { + return fmt.Errorf("Sync2: %v", err) } sess := x.NewSession() @@ -25,79 +53,99 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { const batchSize = 100 touchedRepo := make(map[int64]struct{}) - topics := make([]*Topic, 0, batchSize) delTopicIDs := make([]int64, 0, batchSize) - ids := make([]int64, 0, 30) + log.Info("Validating existed topics...") if err := sess.Begin(); err != nil { return err } - log.Info("Validating existed topics...") for start := 0; ; start += batchSize { - topics = topics[:0] - if err := sess.Asc("id").Limit(batchSize, start).Find(&topics); err != nil { + topics := make([]*Topic, 0, batchSize) + if err := x.Cols("id", "name").Asc("id").Limit(batchSize, start).Find(&topics); err != nil { return err } if len(topics) == 0 { break } for _, topic := range topics { - if models.ValidateTopic(topic.Name) { + if validateTopic(topic.Name) { continue } + log.Info("Incorrect topic: id = %v, name = %q", topic.ID, topic.Name) + topic.Name = strings.Replace(strings.TrimSpace(strings.ToLower(topic.Name)), " ", "-", -1) + ids := make([]int64, 0, 30) if err := sess.Table("repo_topic").Cols("repo_id"). Where("topic_id = ?", topic.ID).Find(&ids); err != nil { return err } + log.Info("Touched repo ids: %v", ids) for _, id := range ids { touchedRepo[id] = struct{}{} } - if models.ValidateTopic(topic.Name) { - log.Info("Updating topic: id = %v, name = %v", topic.ID, topic.Name) - if _, err := sess.Table("topic").ID(topic.ID). - Update(&Topic{Name: topic.Name}); err != nil { + if validateTopic(topic.Name) { + unifiedTopic := Topic{Name: topic.Name} + exists, err := sess.Cols("id", "name").Get(&unifiedTopic) + log.Info("Exists topic with the name %q? %v, id = %v", topic.Name, exists, unifiedTopic.ID) + if err != nil { return err } - } else { - delTopicIDs = append(delTopicIDs, topic.ID) + if exists { + log.Info("Updating repo_topic rows with topic_id = %v to topic_id = %v", topic.ID, unifiedTopic.ID) + if _, err := sess.Where("topic_id = ? AND repo_id NOT IN "+ + "(SELECT rt1.repo_id FROM repo_topic rt1 INNER JOIN repo_topic rt2 "+ + "ON rt1.repo_id = rt2.repo_id WHERE rt1.topic_id = ? AND rt2.topic_id = ?)", + topic.ID, topic.ID, unifiedTopic.ID).Update(&RepoTopic{TopicID: unifiedTopic.ID}); err != nil { + return err + } + log.Info("Updating topic `repo_count` field") + if _, err := sess.Exec( + "UPDATE topic SET repo_count = (SELECT COUNT(*) FROM repo_topic WHERE topic_id = ? GROUP BY topic_id) WHERE id = ?", + unifiedTopic.ID, unifiedTopic.ID); err != nil { + return err + } + } else { + log.Info("Updating topic: id = %v, name = %q", topic.ID, topic.Name) + if _, err := sess.Table("topic").ID(topic.ID). + Update(&Topic{Name: topic.Name}); err != nil { + return err + } + continue + } } + delTopicIDs = append(delTopicIDs, topic.ID) } } + if err := sess.Commit(); err != nil { + return err + } - log.Info("Deleting incorrect topics...") - for start := 0; ; start += batchSize { - if (start + batchSize) < len(delTopicIDs) { - ids = delTopicIDs[start:(start + batchSize)] - } else { - ids = delTopicIDs[start:] - } - - log.Info("Deleting 'repo_topic' rows for topics with ids = %v", ids) - if _, err := sess.In("topic_id", ids).Delete(&models.RepoTopic{}); err != nil { - return err - } - - log.Info("Deleting topics with id = %v", ids) - if _, err := sess.In("id", ids).Delete(&Topic{}); err != nil { - return err - } + sess.Init() - if len(ids) < batchSize { - break - } + log.Info("Deleting incorrect topics...") + if err := sess.Begin(); err != nil { + return err + } + log.Info("Deleting 'repo_topic' rows for topics with ids = %v", delTopicIDs) + if _, err := sess.In("topic_id", delTopicIDs).Delete(&RepoTopic{}); err != nil { + return err + } + log.Info("Deleting topics with id = %v", delTopicIDs) + if _, err := sess.In("id", delTopicIDs).Delete(&Topic{}); err != nil { + return err + } + if err := sess.Commit(); err != nil { + return err } - repoTopics := make([]*models.RepoTopic, 0, batchSize) - delRepoTopics := make([]*models.RepoTopic, 0, batchSize) - tmpRepoTopics := make([]*models.RepoTopic, 0, 30) + delRepoTopics := make([]*RepoTopic, 0, batchSize) log.Info("Checking the number of topics in the repositories...") for start := 0; ; start += batchSize { - repoTopics = repoTopics[:0] - if err := sess.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). + repoTopics := make([]*RepoTopic, 0, batchSize) + if err := x.Cols("repo_id").Asc("repo_id").Limit(batchSize, start). GroupBy("repo_id").Having("COUNT(*) > 25").Find(&repoTopics); err != nil { return err } @@ -109,8 +157,8 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { for _, repoTopic := range repoTopics { touchedRepo[repoTopic.RepoID] = struct{}{} - tmpRepoTopics = tmpRepoTopics[:0] - if err := sess.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { + tmpRepoTopics := make([]*RepoTopic, 0, 30) + if err := x.Where("repo_id = ?", repoTopic.RepoID).Find(&tmpRepoTopics); err != nil { return err } @@ -122,13 +170,18 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { } } + sess.Init() + log.Info("Deleting superfluous topics for repositories (more than 25 topics)...") + if err := sess.Begin(); err != nil { + return err + } for _, repoTopic := range delRepoTopics { log.Info("Deleting 'repo_topic' rows for 'repository' with id = %v. Topic id = %v", repoTopic.RepoID, repoTopic.TopicID) if _, err := sess.Where("repo_id = ? AND topic_id = ?", repoTopic.RepoID, - repoTopic.TopicID).Delete(&models.RepoTopic{}); err != nil { + repoTopic.TopicID).Delete(&RepoTopic{}); err != nil { return err } if _, err := sess.Exec( @@ -138,17 +191,17 @@ func reformatAndRemoveIncorrectTopics(x *xorm.Engine) (err error) { } } - topicNames := make([]string, 0, 30) log.Info("Updating repositories 'topics' fields...") for repoID := range touchedRepo { + topicNames := make([]string, 0, 30) if err := sess.Table("topic").Cols("name"). - Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). - Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id"). + Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil { return err } log.Info("Updating 'topics' field for repository with id = %v", repoID) if _, err := sess.ID(repoID).Cols("topics"). - Update(&models.Repository{Topics: topicNames}); err != nil { + Update(&Repository{Topics: topicNames}); err != nil { return err } } diff --git a/models/topic.go b/models/topic.go index 247aac5fffe4..678795a3dba9 100644 --- a/models/topic.go +++ b/models/topic.go @@ -26,7 +26,7 @@ var topicPattern = regexp.MustCompile(`^[a-z0-9][a-z0-9-]*$`) // Topic represents a topic of repositories type Topic struct { ID int64 - Name string `xorm:"unique"` + Name string `xorm:"UNIQUE"` RepoCount int CreatedUnix util.TimeStamp `xorm:"INDEX created"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` @@ -34,8 +34,8 @@ type Topic struct { // RepoTopic represents associated repositories and topics type RepoTopic struct { - RepoID int64 `xorm:"unique(s)"` - TopicID int64 `xorm:"unique(s)"` + RepoID int64 `xorm:"UNIQUE(s)"` + TopicID int64 `xorm:"UNIQUE(s)"` } // ErrTopicNotExist represents an error that a topic is not exist @@ -190,10 +190,10 @@ func SaveTopics(repoID int64, topicNames ...string) error { } } - topicNames = topicNames[:0] + topicNames = make([]string, 0, 25) if err := sess.Table("topic").Cols("name"). - Join("INNER", "repo_topic", "topic.id = repo_topic.topic_id"). - Where("repo_topic.repo_id = ?", repoID).Find(&topicNames); err != nil { + Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id"). + Where("repo_topic.repo_id = ?", repoID).Desc("topic.repo_count").Find(&topicNames); err != nil { return err } From 85da34cdab038d1be478edb48ec8a69604a7ee7f Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 27 Jun 2018 05:25:28 +0000 Subject: [PATCH 048/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 8946d2894e92..14d6335d8a29 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -1,4 +1,4 @@ -app_desc=Зручний сервіс, власного Git хостінгу +app_desc=Зручний сервіс, власного Git хостингу home=Головна dashboard=Панель управління @@ -146,6 +146,7 @@ confirm_password=Підтвердження пароля admin_email=Адреса електронної пошти install_btn_confirm=Встановлення Gitea test_git_failed=Не в змозі перевірити 'git' команду: %v +sqlite3_not_available=Ця версія Gitea не підтримує SQLite3. Будь ласка, завантажте офіційну бінарну версію з %s (не версію gobuild). invalid_db_setting=Налаштування бази даних є некоректними: %v invalid_repo_path=Помилковий шлях до кореня репозиторію: %v save_config_failed=Не в змозі зберегти конфігурацію: %v @@ -295,6 +296,8 @@ unable_verify_ssh_key=Не вдається підтвердити ключ SSH; auth_failed=Помилка автентифікації: %v still_own_repo=Ваш обліковий запис володіє одним або декількома репозиторіями; видаліть або перенесіть їх в першу чергу. +still_has_org=Ваш обліковий запис є учасником однієї чи декількох організацій; вийдіть з них в першу чергу. +org_still_own_repo=Ця організація як і раніше володіє одним або декількома репозиторіями; спочатку видаліть або перенесіть їх. target_branch_not_exist=Цільової гілки не існує. @@ -368,6 +371,7 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +email_deletion_success=Адресу електронної пошти було видалено. openid_deletion=Видалити адресу OpenID openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти @@ -401,6 +405,7 @@ add_gpg_key_success=GPG ключ '%s' додано. delete_key=Видалити ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ +ssh_key_deletion_desc=Видалення ключа SSH скасовує доступ до вашого облікового запису. Продовжити? gpg_key_deletion_desc=Видалення GPG ключа скасовує перевірку підписаних ним комітів. Продовжити? ssh_key_deletion_success=SSH було видалено. gpg_key_deletion_success=GPG було видалено. @@ -624,6 +629,7 @@ issues.deleted_milestone=`(видалено)` issues.add_assignee_at=`був призначений %s %s` issues.remove_assignee_at=`видалили із призначених %s` issues.change_title_at=`змінив(ла) заголовок з %s на %s %s` +issues.delete_branch_at=`видалена гілка %s %s` issues.open_tab=%d відкрито issues.close_tab=%d закрито issues.filter_label=Мітка From ecb893df21eca993e3b7211b1cc3fc4f876eb2cf Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Wed, 27 Jun 2018 03:06:39 -0400 Subject: [PATCH 049/447] Backport 1.4.3 changelog to master branch (#4323) --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 373ce00e681e..b31730a09910 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.4.3](https://github.com/go-gitea/gitea/releases/tag/v1.4.3) - 2018-06-26 +* SECURITY + * HTML-escape plain-text READMEs (#4192) (#4214) + * Fix open redirect vulnerability on login screen (#4312) (#4312) +* BUGFIXES + * Fix broken monitoring page when running processes are shown (#4203) (#4208) + * Fix delete comment bug (#4216) (#4228) + * Delete reactions added to issues and comments when deleting repository (#4232) (#4237) + * Fix wiki URL encoding bug (#4091) (#4254) + * Fix code tab link when viewing tags (#3908) (#4263) + * Fix webhook type conflation (#4285) (#4285) + ## [1.4.2](https://github.com/go-gitea/gitea/releases/tag/v1.4.2) - 2018-06-04 * BUGFIXES * Adjust z-index for floating labels (#3939) (#3950) From d1a4101396121af860bccc41976112fd5952863a Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sat, 30 Jun 2018 13:13:17 -0400 Subject: [PATCH 050/447] Add scope to Gitlab oauth request (#4330) Fix #3449 --- modules/auth/oauth2/oauth2.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/auth/oauth2/oauth2.go b/modules/auth/oauth2/oauth2.go index 89286a1bd612..de125c6195a6 100644 --- a/modules/auth/oauth2/oauth2.go +++ b/modules/auth/oauth2/oauth2.go @@ -163,7 +163,7 @@ func createProvider(providerName, providerType, clientID, clientSecret, openIDCo profileURL = customURLMapping.ProfileURL } } - provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL) + provider = gitlab.NewCustomisedURL(clientID, clientSecret, callbackURL, authURL, tokenURL, profileURL, "read_user") case "gplus": provider = gplus.New(clientID, clientSecret, callbackURL, "email") case "openidConnect": From f066cc00c6fafb3ac349cce2830501fc7c617a9a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 30 Jun 2018 17:14:19 +0000 Subject: [PATCH 051/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_bg-BG.ini | 72 ++++ options/locale/locale_de-DE.ini | 98 ++--- options/locale/locale_es-ES.ini | 96 ++++- options/locale/locale_fi-FI.ini | 105 ++++- options/locale/locale_fr-FR.ini | 709 +++++++++++++++++++++++++++++++- options/locale/locale_id-ID.ini | 111 ++++- options/locale/locale_it-IT.ini | 16 +- options/locale/locale_ja-JP.ini | 2 + options/locale/locale_lv-LV.ini | 683 +++++++++++++++++++++++++++++- options/locale/locale_nb-NO.ini | 6 + options/locale/locale_nl-NL.ini | 45 ++ options/locale/locale_pl-PL.ini | 152 +++++++ options/locale/locale_uk-UA.ini | 215 +++++++++- options/locale/locale_zh-CN.ini | 2 + options/locale/locale_zh-TW.ini | 486 +++++++++++++++++++++- 15 files changed, 2715 insertions(+), 83 deletions(-) diff --git a/options/locale/locale_bg-BG.ini b/options/locale/locale_bg-BG.ini index f0d6b1c0a475..99aa173e17eb 100644 --- a/options/locale/locale_bg-BG.ini +++ b/options/locale/locale_bg-BG.ini @@ -11,6 +11,7 @@ version=Версия page=Страница template=Шаблон language=Език +notifications=Известия signed_in_as=Вписан като username=Потребител @@ -28,6 +29,9 @@ manage_org=Управление на организации account_settings=Настройки на профила settings=Настройки +all=Всичко +sources=Източници +mirrors=Огледала activities=Активности pull_requests=Заявки за сливане @@ -69,7 +73,9 @@ issues.in_your_repos=Във Вашите хранилища [explore] repos=Хранилища users=Потребители +organizations=Организации search=Търсене +code=Код [auth] register_helper_msg=Вече имате профил? Впишете се сега! @@ -79,11 +85,14 @@ has_unconfirmed_mail=Здравейте %s, имате непотвърден а resend_mail=Щракнете тук, за да се изпрати ново писмо за потвърждение reset_password=Нулиране на паролата reset_password_helper=Щракнете тук, за да нулирате паролата си +openid_connect_submit=Свързване [mail] activate_account=Моля активирайте Вашия профил activate_email=Провери адрес на ел. поща reset_password=Нулиране на паролата +register_success=Успешна регистрация +register_notify=Добре дошли в Gitea [modal] yes=Да @@ -117,6 +126,7 @@ url_error=` не е валиден URL адрес.` include_error=` трябва да съдържа текст '%s'.` unknown_error=Неизвестна грешка: +user_not_exist=Потребителят не съществува. auth_failed=Неуспешно удостоверяване: %v @@ -136,9 +146,11 @@ unfollow=Не следвай [settings] profile=Профил password=Парола +security=Сигурност avatar=Аватар social=Социални профили delete=Изтрий профил +twofa=Двуфакторно удостоверяване uid=UID public_profile=Публичен профил @@ -169,6 +181,8 @@ key_content=Съдържание add_on=Добавен на last_used=Последно използван на no_activity=Няма скорошна дейност +show_openid=Показване в профила +hide_openid=Скриване от профила manage_social=Управление на свързани профили в социалните мрежи @@ -239,6 +253,7 @@ file_view_raw=Виж директен файл file_permalink=Постоянна връзка editor.preview_changes=Преглед на промени +editor.name_your_file=Име на файла ви… editor.or=или editor.commit_changes=Промени в ревизия editor.add_tmpl=Добави '%s/' @@ -247,6 +262,7 @@ editor.update=Модифицирай '%s' editor.delete=Изтрий '%s' editor.commit_directly_to_this_branch=Запази ревизия директно в клон %s. editor.create_new_branch=Създай нов клон от тази ревизия и изпрати заявки за сливане. +editor.new_branch_name_desc=Име на новия клон… editor.cancel=Отказ editor.branch_already_exists=Клон '%s' вече съществува в това хранилище. editor.no_changes_to_show=Няма промени. @@ -255,6 +271,7 @@ editor.unable_to_upload_files=Невъзможно качване на файл editor.upload_files_to_dir=Качи файлове в '%s' commits.commits=Ревизии +commits.find=Търсене commits.author=Автор commits.message=Съобщение commits.date=Дата @@ -277,6 +294,7 @@ issues.create_label=Създай етикет issues.label_templates.title=Зареждане на предварително зададен набор от етикети issues.label_templates.helper=Изберете набор етикети issues.label_templates.fail_to_load_file=Неуспешно зареждане на шаблон с етикети '%s': %v +issues.deleted_milestone=`(изтрито)` issues.open_tab=%d отворени issues.close_tab=%d затворени issues.filter_label=Етикет @@ -294,6 +312,11 @@ issues.filter_sort.recentupdate=Последно променени issues.filter_sort.leastupdate=Отдавна променени issues.filter_sort.mostcomment=Най-много коментирани issues.filter_sort.leastcomment=Най-малко коментирани +issues.action_open=Отваряне +issues.action_close=Затваряне +issues.action_label=Етикет +issues.action_milestone=Етап +issues.action_milestone_no_select=Няма етап issues.opened_by=отворен %[1]s от %[3]s issues.opened_by_fake=отворен %[1]s от %[2]s issues.previous=Предишна @@ -323,9 +346,17 @@ issues.label_count=%d етикети issues.label_open_issues=%d отворени задачи issues.label_edit=Редакция issues.label_delete=Изтрий +issues.label.filter_sort.alphabetically=По азбучен ред +issues.label.filter_sort.by_size=Големина issues.num_participants=%d участника issues.attachment.open_tab=`Щракнете за да прегледате "%s" в нов раздел` issues.attachment.download=`Щракнете за да изтеглите "%s"` +issues.start_tracking_short=Начало +issues.stop_tracking=Спиране +issues.add_time_cancel=Отказ +issues.add_time_hours=Часа +issues.add_time_minutes=Минути +issues.cancel_tracking=Отказ pulls.new=Нова заявка за сливане pulls.filter_branch=Филтър по клон @@ -367,7 +398,19 @@ wiki.page_already_exists=Страница със същото име вече с wiki.pages=Страници wiki.last_updated=Последна модификация на %s +activity.period.filter_label=Период: +activity.period.daily=1 ден +activity.period.halfweekly=3 дни +activity.period.weekly=1 седмица +activity.period.monthly=1 месец +activity.title.user_1=%d потребител +activity.title.user_n=%d потребителя +activity.closed_issue_label=Затворено +activity.new_issue_label=Отворено +activity.unresolved_conv_label=Отваряне +activity.published_release_label=Публикувано +search=Търсене settings=Настройки settings.collaboration.write=За писане @@ -389,6 +432,7 @@ settings.transfer=Прехвърли притежание settings.delete=Изтрий това хранилище settings.delete_notices_1=- Тази операция НЕ МОЖЕ да бъде отменена в последствие. settings.transfer_owner=Нов притежател +settings.search_user_placeholder=Търсене на потребител… settings.add_webhook=Добави уеб-кука settings.webhook.test_delivery=Тестово изпращане settings.webhook.request=Заявка @@ -402,6 +446,8 @@ settings.update_githook=Запази куката settings.secret=Тайна settings.slack_username=Потребителско име settings.slack_icon_url=URL адрес на икона +settings.discord_username=Потребителско име +settings.discord_icon_url=URL адрес на икона settings.slack_color=Цвят settings.event_create=Създаване settings.event_pull_request=Заявка за сливане @@ -416,6 +462,11 @@ settings.deploy_keys=Ключове за внедряване settings.add_deploy_key=Добави ключ за внедряване settings.title=Заглавие settings.deploy_key_content=Съдържание +settings.branches=Клонове +settings.protected_branch=Защита на клона +settings.add_protected_branch=Включване на защита +settings.delete_protected_branch=Изключване на защита +settings.choose_branch=Изберете клон… diff.browse_source=Преглед на файлове diff.parent=родител @@ -424,6 +475,7 @@ diff.show_diff_stats=Покажи статистика за разликите diff.show_split_view=Разделен изглед diff.show_unified_view=Обединен изглед diff.stats_desc=променени са %d файла, в които са добавени %d реда и са изтрити %d реда +diff.bin=Двоични данни diff.view_file=Целия файл diff.file_suppressed=Файловите разлики са ограничени, защото са твърде много diff.too_many_files=Някои файлове не бяха показани, защото твърде много файлове са промени @@ -442,11 +494,17 @@ release.title=Заглавие release.content=Съдържание release.write=Редактор release.preview=Преглед +release.loading=Зарежда се… release.cancel=Отказ release.publish=Публикувай версия release.save_draft=Запис на чернова release.downloads=Изтегляния +branch.search=Търсене на клонове +branch.delete_head=Изтриване +branch.delete_html=Изтриване на клон +branch.create_from=от '%s' +branch.deleted_by=Изтрито от %s [org] @@ -458,6 +516,8 @@ people=Участници teams=Екипи lower_members=участници lower_repositories=хранилища +create_new_team=Нов отбор +create_team=Създаване на отбор org_desc=Описание team_name=Име на екипа team_desc=Описание @@ -546,6 +606,7 @@ users.edit=Редакция users.auth_source=Начин на удостоверяване users.local=Локално +orgs.org_manage_panel=Управление на организацията orgs.name=Име orgs.teams=Екипи orgs.members=Участници @@ -556,6 +617,7 @@ repos.private=Частно repos.watches=Наблюдавания repos.stars=Харесвания repos.issues=Задачи +repos.size=Големина auths.name=Име auths.type=Тип @@ -580,12 +642,15 @@ auths.allowed_domains=Разрешени домейни auths.enable_tls=Включи TLS криптиране auths.skip_tls_verify=Пропусни проверка на TLS сертификат auths.pam_service_name=Име на PAM услуга +auths.oauth2_profileURL=URL адрес на профила +auths.oauth2_emailURL=Имейл адрес auths.enable_auto_register=Включи автоматична регистрация auths.tips=Съвети config.server_config=Сървърни настройки config.disable_router_log=Изключи журнал на маршрутизатора config.run_mode=Режим на изпълнение +config.git_version=Версия на Git config.repo_root_path=Основен път към хранилища config.static_file_root_path=Път към статични файлове config.script_type=Тип на скрипта @@ -700,6 +765,7 @@ push_tag=предаде маркер %[2]s към '-Format ein. +smtp_from_helper=E-Mail-Adresse, die von Gitea genutzt werden soll. Bitte gib die E-Mail-Adresse im Format „"Name" “ ein. mailer_user=SMTP-Benutzername mailer_password=SMTP-Passwort register_confirm=E-Mail-Bestätigung benötigt zum Registrieren @@ -146,7 +146,7 @@ admin_password=Passwort confirm_password=Passwort bestätigen admin_email=E-Mail-Adresse install_btn_confirm=Gitea installieren -test_git_failed=Fehler beim Test des 'git' Kommandos: %v +test_git_failed=Fehler beim Test des „git“-Befehls: %v sqlite3_not_available=Diese Gitea-Version unterstützt SQLite3 nicht. Bitte lade die offizielle binäre Version von %s herunter (nicht die „gobuild“-Version). invalid_db_setting=Datenbankeinstellungen sind ungültig: %v invalid_repo_path=Repository-Verzeichnis ist ungültig: %v @@ -188,7 +188,7 @@ repo_no_results=Keine passenden Repositories gefunden. user_no_results=Keine passenden Benutzer gefunden. org_no_results=Keine passenden Organisatioen gefunden. code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden. -code_search_results=Suchergebnisse für '%s' +code_search_results=Suchergebnisse für „%s“ [auth] create_new_account=Konto anlegen @@ -254,12 +254,12 @@ HttpsUrl=HTTPS-URL PayloadUrl=Payload-URL TeamName=Teamname AuthName=Name der Autorisierung -AdminEmail=Administrator E-Mail +AdminEmail=Administrator-E-Mail -NewBranchName=Neuer Branch Name -CommitSummary=Commit Zusammenfassung -CommitMessage=Commit Nachricht -CommitChoice=Commit Auswahl +NewBranchName=Neuer Branchname +CommitSummary=Commit-Zusammenfassung +CommitMessage=Commit-Nachricht +CommitChoice=Commit-Auswahl TreeName=Dateipfad Content=Inhalt @@ -272,7 +272,7 @@ min_size_error=` muss mindestens %s Zeichen enthalten.` max_size_error=` darf höchstens %s Zeichen enthalten.` email_error=` ist keine gültige E-Mail-Adresse.` url_error=` ist keine gültige URL.` -include_error=` muss den Text '%s' enthalten.` +include_error=` muss den Text „%s“ enthalten.` unknown_error=Unbekannter Fehler: captcha_incorrect=Der eingegebene CAPTCHA-Code ist falsch. password_not_match=Die Passwörter stimmen nicht überein. @@ -314,8 +314,8 @@ following=Folge ich follow=Folgen unfollow=Nicht mehr folgen -form.name_reserved=Der Benutzername '%s' ist reserviert. -form.name_pattern_not_allowed='%s' ist nicht erlaubt für Benutzernamen. +form.name_reserved=Der Benutzername „%s“ ist reserviert. +form.name_pattern_not_allowed=Das Muster „%s“ ist nicht in einem Benutzernamen erlaubt. [settings] profile=Profil @@ -323,7 +323,7 @@ account=Account password=Passwort security=Sicherheit avatar=Profilbild -ssh_gpg_keys=SSH / GPG Schlüssel +ssh_gpg_keys=SSH- / GPG-Schlüssel social=Soziale Konten applications=Anwendungen orgs=Organisationen verwalten @@ -402,7 +402,7 @@ add_new_gpg_key=GPG-Schlüssel hinzufügen ssh_key_been_used=Dieser SSH-Key wurde bereits zu deinem Account hinzugefügt. ssh_key_name_used=Ein gleichnamiger SSH-Key existiert bereits in deinem Account. gpg_key_id_used=Ein öffentlicher GPG-Schlüssel mit der gleichen ID existiert bereits. -gpg_no_key_email_found=Dieser GPG Schlüssel kann mit keiner E-Mail-Adresse deines Accounts verwendet werden. +gpg_no_key_email_found=Dieser GPG-Schlüssel kann mit keiner E-Mail-Adresse deines Kontos verwendet werden. subkeys=Unterschlüssel key_id=Schlüssel-ID key_name=Schlüsselname @@ -463,7 +463,7 @@ then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird. -u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den FIDO U2F-Standard unterstützen. +u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard FIDO U2F unterstützen. u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung aktivieren, um Hardware-Sicherheitsschlüssel nutzen zu können. u2f_register_key=Sicherheitsschlüssel hinzufügen u2f_nickname=Nickname @@ -482,7 +482,7 @@ orgs_none=Du bist kein Mitglied in einer Organisation. repos_none=Du besitzt keine Repositories delete_account=Konto löschen -delete_prompt=Wenn du fortfährst wird dein Account permanent gelöscht. Dies KANN NICHT rückgängig gemacht werden. +delete_prompt=Wenn du fortfährst, wird dein Account permanent gelöscht. Dies KANN NICHT rückgängig gemacht werden. confirm_delete_account=Löschen bestätigen delete_account_title=Benutzerkonto löschen delete_account_desc=Bist du sicher, dass du diesen Account dauerhaft löschen möchtest? @@ -531,7 +531,7 @@ migrate_type=Migrationstyp migrate_type_helper=Dieses Repository wird ein Mirror sein migrate_repo=Repository migrieren migrate.clone_address=Migrations- / Klon-URL -migrate.clone_address_desc=Die HTTP(s) oder Klon-URL eines bereits existierenden Repositories +migrate.clone_address_desc=Die HTTP(S)- oder „git clone“-URL eines bereits existierenden Repositorys migrate.clone_local_path=oder ein lokaler Serverpfad migrate.permission_denied=Du hast keine Berechtigung zum Importieren lokaler Repositories. migrate.invalid_local_path=Der lokale Pfad ist ungültig, existiert nicht oder ist kein Ordner. @@ -608,7 +608,7 @@ editor.create_new_branch=Einen neuen Branch für diesen Commit editor.new_branch_name_desc=Neuer Branchname… editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. -editor.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. +editor.branch_already_exists=Branch „%s“ existiert bereits in diesem Repository. editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet. editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden. editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet. @@ -616,10 +616,10 @@ editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert ni editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken, um die Änderungen anzusehen, oder Änderungen erneut comitten, um sie zu überschreiben. editor.file_already_exists=Eine Datei mit dem Namen „%s“ ist bereits in diesem Repository vorhanden. editor.no_changes_to_show=Keine Änderungen vorhanden. -editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei '%s'. Fehler: %v +editor.fail_to_update_file=Fehler beim Ändern/Erstellen der Datei „%s“. Fehler: %v editor.add_subdir=Verzeichnis erstellen… editor.unable_to_upload_files=Fehler beim Hochladen der Dateien nach „%s“. Fehler: %v -editor.upload_files_to_dir=Dateien hochladen nach '%s' +editor.upload_files_to_dir=Dateien hochladen nach „%s“ editor.cannot_commit_to_protected_branch=Commit in den geschützten Branch „%s“ ist nicht möglich. commits.desc=Durchsuche die Quellcode-Änderungshistorie. @@ -639,10 +639,10 @@ ext_issues=Externe Issues ext_issues.desc=Link zu externem Issuetracker. issues.desc=Verwalte Bug-Reports, Aufgaben und Meilensteine. -issues.new=Neuer Issue +issues.new=Neues Issue issues.new.labels=Label issues.new.no_label=Kein Label -issues.new.clear_labels=Labels entfernen +issues.new.clear_labels=Label entfernen issues.new.milestone=Meilenstein issues.new.no_milestone=Kein Meilenstein issues.new.clear_milestone=Meilenstein entfernen @@ -659,9 +659,9 @@ issues.new_label_desc_placeholder=Beschreibung issues.create_label=Label erstellen issues.label_templates.title=Lade vordefinierte Label issues.label_templates.info=Es existieren noch keine Label. Erstelle ein neues Label („Neues Label“) oder verwende das Standard-Label-Set: -issues.label_templates.helper=Wähle ein Label +issues.label_templates.helper=Wähle ein Label-Set issues.label_templates.use=Label-Set verwenden -issues.label_templates.fail_to_load_file=Fehler beim Laden der Label Template Datei '%s': %v +issues.label_templates.fail_to_load_file=Fehler beim Laden der Label-Vorlagendatei „%s“: %v issues.add_label_at=hat das
%s
-Label %s hinzugefügt issues.remove_label_at=hat das
%s
-Label %s entfernt issues.add_milestone_at=`hat diesen Issue %[2]s zum %[1]s Meilenstein hinzugefügt` @@ -745,8 +745,8 @@ issues.label.filter_sort.reverse_alphabetically=Umgekehrt alphabetisch issues.label.filter_sort.by_size=Kleinste zuerst issues.label.filter_sort.reverse_by_size=Größte zuerst issues.num_participants=%d Beteiligte -issues.attachment.open_tab=`Klicken um "%s" in einem neuen Tab zu öffnen` -issues.attachment.download=`Klicken um "%s" herunterzuladen` +issues.attachment.open_tab=`Klicken, um „%s“ in einem neuen Tab zu öffnen` +issues.attachment.download=`Klicken, um „%s“ herunterzuladen` issues.subscribe=Abonnieren issues.unsubscribe=Abbestellen issues.tracker=Zeiterfassung @@ -914,7 +914,7 @@ search.search_repo=Repository durchsuchen search.results=Suchergebnisse für „%s“ in %s settings=Einstellungen -settings.desc=In den Einstellungen kannst du die Einstellungen des Repository anpassen +settings.desc=In den Einstellungen kannst du die Einstellungen des Repositorys anpassen settings.options=Repository settings.collaboration=Mitarbeiter settings.collaboration.admin=Administrator @@ -924,7 +924,7 @@ settings.collaboration.undefined=Nicht definiert settings.hooks=Webhooks settings.githooks=Git-Hooks settings.basic_settings=Grundeinstellungen -settings.mirror_settings=Mirror Einstellungen +settings.mirror_settings=Mirror-Einstellungen settings.sync_mirror=Jetzt synchronisieren settings.mirror_sync_in_progress=Mirror-Synchronisierung wird zurzeit ausgeführt. Komm in ein paar Minuten zurück. settings.site=Webseite @@ -933,13 +933,13 @@ settings.advanced_settings=Erweiterte Einstellungen settings.wiki_desc=Repository-Wiki aktivieren settings.use_internal_wiki=Eingebautes Wiki verwenden settings.use_external_wiki=Externes Wiki verwenden -settings.external_wiki_url=Externe Wiki URL +settings.external_wiki_url=Externe Wiki-URL settings.external_wiki_url_error=Die externe Wiki-URL ist ungültig. settings.external_wiki_url_desc=Besucher werden auf die externe Wiki-URL weitergeleitet, wenn sie auf das Wiki-Tab klicken. settings.issues_desc=Repository-Issue-Tracker aktivieren settings.use_internal_issue_tracker=Integrierten Issue-Tracker verwenden settings.use_external_issue_tracker=Externen Issue-Tracker verwenden -settings.external_tracker_url=URL eines externen Issue Trackers +settings.external_tracker_url=URL eines externen Issue-Trackers settings.external_tracker_url_error=Die URL des externen Issue-Trackers ist ungültig. settings.external_tracker_url_desc=Besucher werden auf die externe Issue-Tracker-URL weitergeleitet, wenn sie auf das Issues-Tab klicken. settings.tracker_url_format=URL-Format des externen Issue-Systems @@ -975,7 +975,7 @@ settings.confirm_wiki_delete=Wiki-Daten löschen settings.wiki_deletion_success=Repository-Wiki-Daten wurden gelöscht. settings.delete=Dieses Repository löschen settings.delete_desc=Wenn dieses Repository gelöscht wurde, gibt es keinen Weg zurück. Bitte sei vorsichtig. -settings.delete_notices_1=- Diese Operation kann NICHT rückgängig gemacht werden. +settings.delete_notices_1=– Diese Operation KANN NICHT rückgängig gemacht werden. settings.delete_notices_2=– Die Operation wird das %s-Repository dauerhaft löschen, inklusive der Dateien, Issues, Kommentare und Zugriffseinstellungen. settings.delete_notices_fork_1=– Forks dieses Repositorys werden nach dem Löschen unabhängig. settings.deletion_success=Das Repository wurde gelöscht. @@ -1049,7 +1049,7 @@ settings.update_webhook=Webhook aktualisieren settings.update_hook_success=Webhook wurde aktualisiert. settings.delete_webhook=Webhook entfernen settings.recent_deliveries=Letzte Zustellungen -settings.hook_type=Hook Typ +settings.hook_type=Hook-Typ settings.add_slack_hook_desc=Slack-Integration zu deinem Repository hinzufügen. settings.slack_token=Token settings.slack_domain=Domain @@ -1077,7 +1077,7 @@ settings.protected_branch_can_push_yes=Du kannst pushen settings.protected_branch_can_push_no=Du kannst nicht pushen settings.branch_protection=Branch-Schutz für Branch „%s“ settings.protect_this_branch=Brach-Schutz aktivieren -settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das sog. „force pushing” von Git auf diesen Branch. +settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das „force pushing” von Git auf diesen Branch. settings.protect_whitelist_committers=Push-Whitelist aktivieren settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen. settings.protect_whitelist_users=Nutzer, die pushen dürfen: @@ -1155,9 +1155,9 @@ branch.deletion_success=Branch „%s“ wurde gelöscht. branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden. branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. branch.create_branch=Erstelle Branch %s -branch.create_from=von '%s' +branch.create_from=von „%s“ branch.create_success=Branch „%s“ wurde erstellt. -branch.branch_already_exists=Branch '%s' existiert bereits in diesem Repository. +branch.branch_already_exists=Branch „%s“ existiert bereits in diesem Repository. branch.branch_name_conflict=Der Branch-Name „%s“ steht in Konflikt mit dem bestehenden Branch „%s“. branch.tag_collision=Branch „%s“ kann nicht erstellt werden, da in diesem Repository bereits ein Tag mit dem selben Namen existiert. branch.deleted_by=Von %s gelöscht @@ -1206,7 +1206,7 @@ settings.update_avatar_success=Der Organisationsavatar wurde aktualisiert. settings.delete=Organisation löschen settings.delete_account=Diese Organisation löschen settings.delete_prompt=Die Organisation wird dauerhaft gelöscht. Dies KANN NICHT rückgängig gemacht werden! -settings.confirm_delete_account=Löschen +settings.confirm_delete_account=Löschen bestätigen settings.delete_org_title=Organisation löschen settings.delete_org_desc=Diese Organisation wird dauerhaft gelöscht. Fortfahren? settings.hooks_desc=Webhooks hinzufügen, die für alle Repositories dieser Organisation ausgelöst werden. @@ -1267,7 +1267,7 @@ total=Gesamt: %d dashboard.statistic=Übersicht dashboard.operations=Wartungsoperationen dashboard.system_status=System-Status -dashboard.statistic_info=Gitea's Datenbank hat %d Benutzer, %d Organisationen, %d öffentliche Schlüssel, %d Repositories, %d Beobachtungen, %d Favoriten, %d Aktionen, %d Zugriffe, %d Issues, %d Kommentare, %d Konten sozialer Netzwerke, %d Gefolgte, %d Mirrors, %d Releases, %d Login-Quellen, %d Webhooks, %d Meilensteine, %d Label, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. +dashboard.statistic_info=Giteas Datenbank hat %d Benutzer, %d Organisationen, %d öffentliche Schlüssel, %d Repositorys, %d Beobachtungen, %d Favoriten, %d Aktionen, %d Zugriffe, %d Issues, %d Kommentare, %d Konten sozialer Netzwerke, %d Gefolgte, %d Mirrors, %d Releases, %d Login-Quellen, %d Webhooks, %d Meilensteine, %d Label, %d Hook-Tasks, %d Teams, %d Aktualisierungs-Tasks, %d Anhänge. dashboard.operation_name=Name der Operation dashboard.operation_switch=Wechseln dashboard.operation_run=Ausführen @@ -1283,7 +1283,7 @@ dashboard.git_gc_repos=Garbage-Collection auf Repositories ausführen dashboard.git_gc_repos_success=Alle Repositories haben Garbage-Collection beendet. dashboard.resync_all_sshkeys=„.ssh/authorized_keys“-Datei mit Gitea-SSH-Keys neu schreiben. (Wenn Du den eingebauten SSH-Server nutzt, musst du das nicht ausführen.) dashboard.resync_all_sshkeys_success=Alle von Gitea verwalteten öffentlichen Schlüssel wurden neu geschrieben. -dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositorys erneut. +dashboard.resync_all_hooks=Synchronisiere „pre-receive“-, „update“- und „post-receive“-Hooks für alle Repositories erneut. dashboard.resync_all_hooks_success=Alle „pre-receive“-, „update“- und „post-receive“-Repository-Hooks wurden erneut synchronisiert. dashboard.reinit_missing_repos=Alle Git-Repositories mit Einträgen neu einlesen dashboard.reinit_missing_repos_success=Alle verlorenen Git-Repositories mit existierenden Einträgen wurden erfolgreich aktualisiert. @@ -1331,13 +1331,13 @@ users.created=Registriert am users.last_login=Letzte Anmeldung users.never_login=Hat sich noch nie eingeloggt users.send_register_notify=Benutzer-Registrierungsbenachrichtigung senden -users.new_success=Der Account '%s' wurde erstellt. +users.new_success=Der Account „%s“ wurde erstellt. users.edit=Bearbeiten users.auth_source=Authentifizierungsquelle users.local=Lokal users.auth_login_name=Anmeldename zur Authentifizierung users.password_helper=Passwort leerlassen, um es nicht zu verändern. -users.update_profile_success=Der Account '%s' wurde aktualisiert. +users.update_profile_success=Der Account „%s“ wurde aktualisiert. users.edit_account=Benutzerkonto bearbeiten users.max_repo_creation=Maximale Anzahl Repositories users.max_repo_creation_desc=(Gib -1 ein, um das globale Standardlimit zu verwenden.) @@ -1384,7 +1384,7 @@ auths.host=Host auths.port=Port auths.bind_dn=DN binden auths.bind_password=Passwort binden -auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze wenn möglich einen Account mit nur Lesezugriff. +auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. Benutze, wenn möglich, einen Account, der nur über Lesezugriff verfügt. auths.user_base=Basis für Benutzersuche auths.user_dn=Benutzer-DN auths.attribute_username=Benutzernamens-Attribut @@ -1427,7 +1427,7 @@ auths.tip.facebook=Erstelle eine neue Anwendung auf https://developers.facebook. auths.tip.github=Erstelle unter https://github.com/settings/applications/new eine neue OAuth-Anwendung. auths.tip.gitlab=Erstelle unter https://gitlab.com/profile/applications eine neue Anwendung. auths.tip.google_plus=Du erhältst die OAuth2-Client-Zugangsdaten in der Google-API-Konsole unter https://console.developers.google.com/ -auths.tip.openid_connect=Benutze die OpenID Connect Discovery URL (/.well-known/openid-configuration) als Endpunkt. +auths.tip.openid_connect=Benutze die OpenID-Connect-Discovery-URL (/.well-known/openid-configuration), um die Endpunkte zu spezifizieren auths.tip.twitter=Gehe auf https://dev.twitter.com/apps, erstelle eine Anwendung und stelle sicher, dass die Option „Allow this application to be used to Sign in with Twitter“ aktiviert ist auths.edit=Authentifikationsquelle bearbeiten auths.activated=Diese Authentifikationsquelle ist aktiviert @@ -1584,13 +1584,13 @@ notices.delete_success=Diese Systemmeldung wurde gelöscht. create_repo=hat das Repository %s erstellt rename_repo=hat das Repository von %[1]s zu %[3]s umbenannt commit_repo=hat auf %[3]s in %[4]s gepusht -create_issue=`hat den Issue %s#%[2]s geöffnet` -close_issue=`hat den Issue %s#%[2]s geschlossen` -reopen_issue=`hat den Issue %s#%[2]s wieder geöffnet` +create_issue=`hat das Issue %s#%[2]s geöffnet` +close_issue=`hat das Issue %s#%[2]s geschlossen` +reopen_issue=`hat das Issue %s#%[2]s erneut geöffnet` create_pull_request=`hat den Pull-Request %s#%[2]s erstellt` close_pull_request=`hat den Pull-Request %s#%[2]s geschlossen` reopen_pull_request=`hat den Pull-Request %s#%[2]s wieder geöffnet` -comment_issue=`hat den Issue %s#%[2]s kommentiert` +comment_issue=`hat das Issue %s#%[2]s kommentiert` merge_pull_request=`hat den Pull-Request %s#%[2]s zusammengeführt` transfer_repo=hat Repository %s transferiert an %s push_tag=hat Tag %[2]s auf %[3]s gepusht @@ -1640,7 +1640,7 @@ mark_all_as_read=Alle als gelesen markieren [gpg] error.extract_sign=Die Signatur konnte nicht extrahiert werden error.generate_hash=Es konnte kein Hash vom Commit generiert werden -error.no_committer_account=Es ist kein Benutzerkonto mit der E-Mail-Adresse des Committers verbunden +error.no_committer_account=Es ist kein Account mit der E-Mail-Adresse des Committers verbunden error.no_gpg_keys_found=Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden error.not_signed_commit=Kein signierter Commit error.failed_retrieval_gpg_keys=Fehler beim Abrufen eines Keys des Commiter-Kontos diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index cb9c47a2b0d5..44deec04a7f3 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -1,11 +1,15 @@ +app_desc=Un servicio de Git auto alojado y sin complicaciones home=Inicio dashboard=Panel de control explore=Explorar help=Ayuda sign_in=Iniciar sesión +sign_in_with=Iniciar sesión con sign_out=Cerrar sesión +sign_up=Registro link_account=Vincular Cuenta +link_account_signin_or_signup=Inicia sesión con credenciales existentes para vincular tu cuenta a esta cuenta. O registra una nueva. register=Registro website=Página web version=Versión @@ -13,12 +17,27 @@ page=Página template=Plantilla language=Idioma notifications=Notificaciones +create_new=Crear… +user_profile_and_more=Perfil y ajustes… signed_in_as=Identificado como +enable_javascript=Este sitio web funciona mejor con JavaScript. username=Nombre de usuario +email=Correo electrónico password=Contraseña +re_type=Vuelva a escribir la contraseña +captcha=CAPTCHA +twofa=Autenticación de dos factores passcode=Contraseña +u2f_insert_key=Inserte su clave de seguridad +u2f_use_twofa=Use un código de dos factores de su celular +u2f_error=No podemos leer su llave de seguridad! +u2f_unsupported_browser=Su navegador no soporta llaves U2F. Por favor utilicé otro navegador. +u2f_error_1=Un error desconocido ha ocurrido. Por favor vuelva a intentarlo. +u2f_error_2=Por favor asegúrese de que está utilizando una conexión cifrada (https://) y que esta visitando la dirección URL correcta. +u2f_error_3=El servidor no pudo procesar su petición. +u2f_reload=Recargar repository=Repositorio organization=Organización @@ -31,6 +50,9 @@ new_org=Nueva organización manage_org=Administrar organizaciones account_settings=Configuraciones de la cuenta settings=Configuraciones +your_profile=Perfil +your_starred=Destacado +your_settings=Configuración all=Todos sources=Fuentes @@ -46,29 +68,64 @@ cancel=Cancelar [install] install=Instalación +title=Configuración inicial +docker_helper=Si esta ejecutando Gitea dentro de un contenedor Docker, por favor lea la documentaciónn antes de realizar cambios a la configuración. +requite_db_desc=Gitea requiere una base de datos MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB. db_title=Configuración de base de datos db_type=Tipo de base de datos host=Servidor +user=Nombre de usuario password=Contraseña db_name=Nombre de la base de datos +db_helper=Nota para usuarios de la base de datos MySQL: por favor use el motor InnoDB y el esquema de caracteres 'utf8_general_ci'. +ssl_mode=SSL path=Ruta +general_title=Configuración general +app_name=Título del Sitio +app_name_helper=Puedes colocar aquí el nombre de tu empresa. repo_path=Ruta del repositorio de Raiz (Root) +run_user=Ejecutar como usuario +domain=Dominio del servidor SSH log_root_path=Ruta del registro optional_title=Configuración opcional +email_title=Configuración de Correo smtp_host=Servidor SMTP +mailer_user=Nombre de usuario SMTP +mailer_password=Contraseña SMTP +offline_mode=Habilitar autenticación Local +disable_gravatar=Desactivar Gravatar federated_avatar_lookup_popup=Habilitar búsqueda de avatares federador para usar el servicio federado de código abierto basado en libravatar. +enable_captcha=Activar CAPTCHA enable_captcha_popup=Requerir CAPTCHA para auto-registro de usuario. +require_sign_in_view=Debes iniciar sesión para ver las páginas admin_password=Contraseña confirm_password=Confirmar Contraseña +admin_email=Correo electrónico install_btn_confirm=Instalar Gitea test_git_failed=Fallo al probar el comando 'git': %v +invalid_db_setting=La configuración de la base de datos no es válida: %v +invalid_repo_path=La ruta de la raíz del repositorio no es válida: %v +run_user_not_match=El nombre de usuario 'ejecutar como' no es el nombre actual de usuario: %s -> %s save_config_failed=Error al guardar la configuración: %v +invalid_admin_setting=La configuración de la cuenta de administración no es válida: %v +install_success=¡Bienvenido! Gracias por elegir Gitea. ¡Diviértete y cuidate! +invalid_log_root_path=La ruta para los registros no es válida: %v +default_keep_email_private=Ocultar direcciones de correo electrónico por defecto +default_keep_email_private_popup=Ocultar direcciones de correo electrónico de nuevas cuentas de usuario por defecto. +default_allow_create_organization=Permitir la creación de organizaciones por defecto +default_allow_create_organization_popup=Permitir crear organizaciones a las nuevas cuentas de usuario de forma predeterminada. +default_enable_timetracking=Activar el seguimiento de tiempo por defecto +default_enable_timetracking_popup=Activar el seguimiento de tiempo para nuevos repositorios por defecto. +no_reply_address=Dominio de correos electrónicos ocultos [home] +uname_holder=Nombre de usuario o correo electrónico password_holder=Contraseña switch_dashboard_context=Cambiar el contexto del Dashboard +my_repos=Repositorios +show_more_repos=Mostrar más repositorios… collaborative_repos=Repositorios colaborativos my_orgs=Mis organizaciones my_mirrors=Mis réplicas @@ -81,28 +138,46 @@ repos=Repositorios users=Usuarios organizations=Organizaciones search=Buscar +code=Código +repo_no_results=No se ha encontrado ningún repositorio coincidente. +user_no_results=No se ha encontrado ningún usuario coincidente. +org_no_results=No se ha encontrado ninguna organización coincidente. +code_no_results=No se ha encontrado código de fuente que coincida con su término de búsqueda. +code_search_results=Resultados de búsqueda para '%s' [auth] +create_new_account=Registrar una cuenta register_helper_msg=¿Ya tienes una cuenta? ¡Inicia sesión! +social_register_helper_msg=¿Ya tienes una cuenta? ¡Enlázala! +disable_register_prompt=Registro deshabilitado. Por favor, póngase en contacto con el administrador del sitio. +disable_register_mail=Correo electrónico de confirmación de registro deshabilitado. remember_me=Recuérdame forgot_password_title=He olvidado mi contraseña forgot_password=¿Has olvidado tu contraseña? +sign_up_now=¿Necesitas una cuenta? Regístrate ahora. confirmation_mail_sent_prompt=Un nuevo correo de confirmación se ha enviado a %s. Comprueba tu bandeja de entrada en las siguientes %s para completar el registro. reset_password_mail_sent_prompt=Un correo de confirmación se ha enviado a %s. Comprueba tu bandeja de entrada en las siguientes %s para completar el reinicio de contraseña. active_your_account=Activa tu cuenta +prohibit_login=Ingreso prohibido +prohibit_login_desc=Su cuenta tiene prohibido ingresar al sistema. Por favor contacte con el administrador del sistema. +resent_limit_prompt=Ya ha solicitado recientemente un correo de activación. Por favor, espere 3 minutos y vuelva a intentarlo. has_unconfirmed_mail=Hola %s, tu correo electrónico (%s) no está confirmado. Si no has recibido un correo de confirmación o necesitas que lo enviemos de nuevo, por favor, haz click en el siguiente botón. resend_mail=Haz click aquí para reenviar tu correo electrónico de activación email_not_associate=Esta dirección de correo electrónico no esta asociada a ninguna cuenta. send_reset_mail=Haz clic aquí para reenviar tu email de restauración de contraseña reset_password=Restablecer su contraseña +invalid_code=Su código de confirmación no es válido o ha caducado. reset_password_helper=Haga Clic aquí para restablecer su contraseña +non_local_account=Los usuarios no locales no pueden actualizar su contraseña a través de la interfaz web de Gitea. verify=Verificar twofa_scratch_used=Ya has utilizado el código. Has sido redirigido a la página de configuración de dos factores poder remover la inscripción del dispositivo o generar un nuevo código. twofa_scratch_token_incorrect=El código cero es incorrecto. +login_userpass=Iniciar sesión login_openid=OpenID openid_connect_submit=Conectar openid_connect_title=Accede con una cuenta existente openid_register_title=Crear una nueva cuenta +disable_forgot_password_mail=El restablecimiento de contraseña está desactivado. Por favor, contacte con el administrador del sitio. [mail] activate_account=Por favor, active su cuenta @@ -114,12 +189,14 @@ register_notify=¡Bienvenido a Gitea [modal] yes=Sí no=No +modify=Actualizar [form] UserName=Nombre de usuario RepoName=Nombre del repositorio Email=Dirección de correo electrónico Password=Contraseña +Retype=Vuelva a escribir la contraseña SSHTitle=Nombre de la Clave de SSH HttpsUrl=URL HTTPS PayloadUrl=URL de carga @@ -135,6 +212,7 @@ TreeName=Ruta del archivo Content=Contenido require_error=` no puede estar vacío.` +alpha_dash_error=` solo debe contener caracteres alfanuméricos, guiones medios ('-') y guiones bajos ('_').` size_error=` debe ser de tamaño %s.` min_size_error=` debe contener al menos %s caracteres.` max_size_error=` debe contener como máximo %s caracteres.` @@ -142,7 +220,10 @@ email_error=` no es una dirección de correo válida.` url_error=` no es una URL válida.` include_error=` debe contener la subcadena '%s'.` unknown_error=Error desconocido: +captcha_incorrect=El código CAPTCHA no es correcto. +password_not_match=Las contraseñas no coinciden. +username_been_taken=El nombre de usuario ya está en uso. user_not_exist=Este usuario no existe. auth_failed=Autenticación fallo: %v @@ -248,6 +329,7 @@ fork_from=Crear un Fork desde repo_desc=Descripción repo_lang=Idioma license=Licencia +auto_init=Inicializar el repositorio (añade .gitignore, licencia y README) create_repo=Crear repositorio default_branch=Rama por defecto mirror_prune=Purgar @@ -343,8 +425,8 @@ issues.label_templates.helper=Seleccionar un conjunto de etiquetas issues.label_templates.fail_to_load_file=Error al cargar el archivo de plantilla de etiqueta '%s': %v issues.add_label_at=añadida la etiqueta
%s
%s issues.remove_label_at=eliminada la etiqueta
%s
%s -issues.add_milestone_at=`agregado esto al %s hito %s ' -issues.change_milestone_at=` modificó el hito de %s to %s %s` +issues.add_milestone_at=`ha añadido esto al hito %s %s ' +issues.change_milestone_at=`modificó el hito de %s a %s %s` issues.remove_milestone_at=`eliminado esto del %s hito %s ' issues.deleted_milestone=`(eliminado)` issues.self_assign_at=`auto asignado este %s` @@ -411,6 +493,8 @@ issues.attachment.open_tab='Haga clic para ver "%s" en una pestaña nueva' issues.attachment.download=`Haga clic para descargar "%s"` issues.subscribe=Suscribir issues.unsubscribe=Desuscribirse +issues.start_tracking_short=Iniciar +issues.start_tracking_history=`ha empezado a trabajar %s` issues.tracking_already_started='Ya has comenzado el tiempo de seguimiento en este tema!' issues.add_time_hours=Horas issues.add_time_minutes=Minutos @@ -461,6 +545,8 @@ wiki.page_already_exists=Ya existe una página con el mismo nombre. wiki.pages=Páginas wiki.last_updated=Última actualización %s +activity=Actividad +activity.period.filter_label=Periodo: activity.period.daily=1 día activity.period.halfweekly=3 días activity.period.weekly=1 semana @@ -503,6 +589,7 @@ settings.new_owner_has_same_repo=El nuevo propietario tiene un repositorio con e settings.transfer=Transferir la propiedad settings.delete=Eliminar este repositorio settings.delete_notices_1=- Esta operación NO PUEDE revertirse. +settings.delete_notices_fork_1=Los forks de este repositorio serán independientes después de eliminarlo. settings.transfer_owner=Nuevo Propietario settings.add_webhook=Añadir Webhook settings.webhook.test_delivery=Test de entrega @@ -531,6 +618,7 @@ settings.deploy_keys=Claves de Despliegue settings.add_deploy_key=Añadir Clave de Despliegue settings.title=Título settings.deploy_key_content=Contenido +settings.protect_merge_whitelist_committers_desc=Permitir a los usuarios o equipos de la lista a fusionar peticiones pull dentro de esta rama. settings.add_protected_branch=Activar protección settings.delete_protected_branch=Desactivar protección @@ -574,6 +662,7 @@ branch.create_from=desde '%s' branch.branch_already_exists=La rama '%s' ya existe en este repositorio. branch.deleted_by=Eliminada por %s +topic.done=Hecho [org] org_name_holder=Nombre de la organización @@ -613,6 +702,7 @@ teams.join=Unirse teams.leave=Abandonar teams.read_access=Acceso de Lectura teams.write_access=Acceso de Escritura +teams.admin_access_helper=Los miembros pueden hacer pull y push a los repositorios del equipo y añadir colaboradores a ellos. teams.no_desc=Este equipo no tiene descripción teams.settings=Configuración teams.members=Miembros del equipo @@ -640,6 +730,7 @@ dashboard.operation_run=Ejecutar dashboard.clean_unbind_oauth_success=Se han eliminado las conexiones de OAuth no vinculadas. dashboard.delete_inactivate_accounts=Eliminar todas las cuentas inactivas dashboard.delete_inactivate_accounts_success=Todas las cuentas inactivas han sido eliminadas. +dashboard.resync_all_sshkeys=Actualizar el archivo '.ssh/authorized_keys' con las claves SSH de Gitea (no es necesario para el servidor SSH incorporado). dashboard.reinit_missing_repos=Reiniciar todos los repositorios Git faltantes de los que existen registros dashboard.reinit_missing_repos_success=Todos los repositorios Git faltantes para los que existen registros se han reinicializado. dashboard.server_uptime=Tiempo de actividad del servidor @@ -859,6 +950,7 @@ file_too_big=El tamaño del archivo ({{filesize}} MB) excede el tamaño máximo remove_file=Eliminar archivo [notification] +notifications=Notificaciones unread=Sin leer read=Leídas mark_as_read=Marcar como leído diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini index 0d49ff4b3a7b..fe34f0e58f4f 100644 --- a/options/locale/locale_fi-FI.ini +++ b/options/locale/locale_fi-FI.ini @@ -1,10 +1,15 @@ +app_desc=Ongelmaton, itsehostattu Git-palvelu home=Etusivu dashboard=Kojelauta explore=Tutki help=Apua sign_in=Kirjaudu sisään +sign_in_with=Kirjaudu sisään tunnuksilla sign_out=Kirjaudu ulos +sign_up=Rekisteröidy +link_account=Yhdistä tili +link_account_signin_or_signup=Kirjaudu sisään olemassaolevilla tunnuksilla yhdistääksesi tilisi käyttäjätunnukseen. Tai rekisteröi uusi käyttäjätunnus. register=Rekisteröidy website=Nettisivut version=Versio @@ -12,10 +17,18 @@ page=Sivu template=Malli language=Kieli notifications=Ilmoitukset +create_new=Luo… +user_profile_and_more=Profiili ja asetukset… signed_in_as=Kirjautuneena käyttäjänä +enable_javascript=Tämä sivusto toimii paremmin JavaScriptillä. username=Käyttäjätunnus +email=Sähköpostiosoite password=Salasana +re_type=Kirjoita salasana uudelleen +captcha=CAPTCHA +twofa=Kaksivaiheinen todennus +twofa_scratch=Kaksivaiheinen kertakäyttöinen koodi passcode=Tunnuskoodi @@ -25,11 +38,21 @@ mirror=Peili new_repo=Uusi repo new_migrate=Uusi migraatio new_mirror=Uusi peilaus +new_fork=Uusi repositorio new_org=Uusi organisaatio manage_org=Ylläpidä organisaatioita +admin_panel=Sivuston ylläpito account_settings=Tilin asetukset settings=Asetukset - +your_profile=Profiili +your_starred=Tähdelliset +your_settings=Asetukset + +all=Kaikki +sources=Lähteet +mirrors=Peilit +collaborative=Yhteistyössä +forks=Haarat activities=Toimet pull_requests=Pull requestit @@ -39,19 +62,60 @@ cancel=Peruuta [install] install=Asennus +title=Alkuperäiset asetukset +docker_helper=Jos ajat Giteaa Dockerissa, tutustuthan dokumentaatioon ennen asetusten muuttamista. +requite_db_desc=Gitea tarvitsee toimiakseen MySQL-, PostgreSQL-, MSSQL-, SQLite3 tai TiDB-tietokannan. db_title=Tietokanta asetukset db_type=Tietokanta tyyppi host=Isäntä +user=Käyttäjätunnus password=Salasana db_name=Tietokannan nimi +db_helper=Huomio MySQL-käyttäjille: käytäthän InnoDB-kantamoottoria ja 'utf8_general_ci'-merkistöä. +ssl_mode=SSL path=Polku - +sqlite_helper=Tiedostopolku SQLite3- tai TiDB-tietokantaan.
Kirjoita absoluuttinen polku, jos ajat Giteaa palveluna. +err_empty_db_path=SQLite3- tai TiDB-tietokantapolku ei voi olla tyhjä. +err_invalid_tidb_name=TiDB-tietokannan nimi ei voi sisältää '.'- tai '-'-merkkejä. +no_admin_and_disable_registration=Et voi kytkeä rekisteröintiä pois luomatta sitä ennen ylläpitotiliä. +err_empty_admin_password=Ylläpitäjän salasana ei voi olla tyhjä. + +general_title=Yleiset asetukset +app_name=Sivuston otsikko repo_path=Repon juuren polku +repo_path_helper=Muualla olevat git-repositoriot tullaan tallentamaan tähän kansioon. +lfs_path=Git LFS -juuripolku +lfs_path_helper=Git LFS:n ylläpitämät tiedostot tullaan tallentamaan tähän hakemistoon. Jätä tyhjäksi kytkeäksesi toiminnon pois. +run_user=Aja käyttäjänä +run_user_helper=Anna käyttäjätunnus, jona Giteaa ajetaan. Käyttäjällä on oltava oikeudet repositorioiden juuripolkuun. +domain=SSH-palvelimen osoite (hostname) +domain_helper=Domain tai osoite SSH-klooniosoitteille. +ssh_port=SSH-palvelimen portti +ssh_port_helper=Porttinumero, jossa SSH-palvelimesi kuuntelee. Jätä tyhjäksi kytkeäksesi pois. +http_port=Gitean HTTP-kuunteluportti +http_port_helper=Portti, jossa Gitean web-palvelin kuuntelee. +app_url=Gitean juuriosoite +app_url_helper=Juuriosoite HTTP(S)-klooniosoitteille ja sähköpostimuistutuksille. log_root_path=Lokin polku +log_root_path_helper=Lokitiedostot kirjoitetaan tähän kansioon. optional_title=Valinnaiset asetukset +email_title=Sähköpostiasetukset smtp_host=SMTP isäntä +smtp_from=Lähetä sähköpostit osoitteella +smtp_from_helper=Sähköpostiosoite, jota Gitea käyttää. Kirjoita osoite ”nimi” -muodossa. +mailer_user=SMTP-käyttäjätunnus +mailer_password=SMTP-salasana +register_confirm=Vaadi sähköpostin vahvistaminen rekisteröintiin +mail_notify=Ota käyttöön sähköpostiilmoitukset +server_service_title=Palvelin ja kolmansien osapuolten palveluiden asetukset +offline_mode=Ota käyttöön lokaali tila +offline_mode_popup=Poista kolmannen osapuolen sisällöstä jakeluverkot ja tarjoa kaikki resurssit paikallisesti. +disable_gravatar=Poista Gravatar käytöstä +disable_gravatar_popup=Poista Gravatar ja kolmannen osapuolen avaratir käytöstä. Oletus-avatar näytetään, ellei käyttäjä ole ladannut omaansa. +federated_avatar_lookup=Käytä ulkopuolisia profiilikuvia federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Poista rekisteröinti käytöstä enable_captcha_popup=Pakollinen captcha käyttäjän itse rekisteröityessä. admin_password=Salasana confirm_password=Varmista salasana @@ -73,32 +137,69 @@ repos=Repot users=Käyttäjät organizations=Organisaatiot search=Hae +code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt. +code_search_results=Hakutulokset: '%s ' [auth] +create_new_account=Rekisteröi tili register_helper_msg=On jo tili? Kirjaudu sisään nyt! +social_register_helper_msg=Onko sinulla jo tili? Linkitä se nyt! +disable_register_prompt=Rekisteröinti on estetty. Ota yhteys ylläpitäjääsi. +disable_register_mail=Sähköpostivahvistus rekisteröinnille on estetty. remember_me=Muista minut +forgot_password_title=Unohtuiko salasana +forgot_password=Unohtuiko salasana? +sign_up_now=Tarvitsetko tilin? Rekisteröidy nyt. +confirmation_mail_sent_prompt=Uusi varmistussähköposti on lähetetty osoitteeseen %s, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi rekisteröintiprosessin valmiiksi. +reset_password_mail_sent_prompt=Varmistussähköposti on lähetetty osoitteeseen %s, ole hyvä ja tarkista saapuneet seuraavan %s tunnin sisällä saadaksesi salasananvaihdon valmiiksi. active_your_account=Aktivoi tilisi +prohibit_login=Kirjautuminen estetty +prohibit_login_desc=Käyttäjätilisi kirjautuminen on estetty. Ota yhteys sivuston ylläpitäjään. +resent_limit_prompt=Olet jo tilannut aktivointisähköpostin hetki sitten. Ole hyvä ja odota 3 minuuttia ja yritä sitten uudelleen. has_unconfirmed_mail=Hei %s, sinulla on varmistamaton sähköposti osoite (%s). Jos et ole saanut varmistus sähköpostia tai tarvitset uudelleenlähetyksen, ole hyvä ja klikkaa allaolevaa painiketta. resend_mail=Klikkaa tästä uudelleenlähettääksesi aktivointi sähköpostisi +email_not_associate=Tätä sähköpostiosoitetta ei ole liitetty mihinkään tiliin. +send_reset_mail=Klikkaa tästä (uudelleen) lähettääksesi salasanan nollaussähköpostin reset_password=Nollaa salasanasi +invalid_code=Vahvistusavain on virheellinen tai vanhentunut. reset_password_helper=Klikkaa tästä nollataksesi salasanasi +non_local_account=Ei-lokaalit käyttäjät eivät voi päivittää salasanojaan Gitean web-käyttöliittymän kautta. verify=Vahvista +scratch_code=Kertakäyttökoodi +use_scratch_code=Käytä kertakäyttökoodia +twofa_scratch_used=Olet käyttänyt kertakäyttökoodisi. Sinut on uudelleenohjattu kaksivaiheisen kirjautumisen asetussivulle, jotta voit kytkeä sen pois tai luoda uuden kertakäyttökoodin. +twofa_passcode_incorrect=Salasanasi on väärä. Jos olet hukannut laitteesi, käytäthän kertakäyttökoodia sisäänkirjautumiseen. +twofa_scratch_token_incorrect=Kertakäyttökoodisi on virheellinen. +login_userpass=Kirjaudu sisään +login_openid=OpenID +openid_connect_submit=Connect +openid_connect_title=Yhdistä olemassaolevaan tiliin +openid_connect_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä. +openid_register_title=Luo uusi tili +openid_register_desc=Valittu OpenID-osoite on tuntematon. Liitä se uuteen tiliin täällä. +openid_signin_desc=Anna OpenID-osoitteesi. Esimerkiksi: https://anne.me, bob.openid.org.cn tai gnusocial.net/carry. +disable_forgot_password_mail=Salasanan nollaus on estetty. Ota yhteys ylläpitäjääsi. [mail] activate_account=Ole hyvä ja aktivoi tilisi activate_email=Vahvista sähköpostiosoitteesi reset_password=Tyhjennä salasana +register_success=Rekisteröinti onnistui +register_notify=Tervetuloa Giteaan [modal] yes=Kyllä no=Ei +modify=Päivitys [form] UserName=Käyttäjätunnus RepoName=Repon nimi Email=Sähköposti osoite Password=Salasana +Retype=Kirjoita salasana uudelleen SSHTitle=SSH avain nimi +HttpsUrl=HTTPS-osoite TeamName=Tiimin nimi AuthName=Luvan nimi AdminEmail=Ylläpito sähköposti diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 50e90b96f75b..0870d82acb4b 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -1,11 +1,15 @@ +app_desc=Un service Git auto-hébergé sans prise de tête home=Accueil dashboard=Tableau de bord explore=Explorateur help=Aide sign_in=Connexion +sign_in_with=Se connecter avec sign_out=Déconnexion +sign_up=S'inscrire link_account=Lier un Compte +link_account_signin_or_signup=Connectez-vous avec vos identifiants pour lier votre compte existant et ce nouveau compte, ou créez un nouveau compte. register=S'inscrire website=Site web version=Version @@ -13,12 +17,32 @@ page=Page template=Modèle language=Langue notifications=Notifications +create_new=Créer… +user_profile_and_more=Profil et réglages… signed_in_as=Connecté en tant que +enable_javascript=Ce site fonctionne mieux avec JavaScript. username=Nom d'utilisateur +email=Adresse e-mail password=Mot de passe +re_type=Confirmez le mot de passe +captcha=CAPTCHA +twofa=Authentification à deux facteurs +twofa_scratch=Code de secours pour l'authentification à deux facteurs passcode=Code d'accès +u2f_insert_key=Insérez votre clef de sécurité +u2f_sign_in=Appuyez sur le bouton de votre clef de sécurité. Si vous ne voyez pas de bouton, ré-insérez là. +u2f_press_button=Veuillez appuyer sur le bouton de votre clef de sécurité… +u2f_use_twofa=Utilisez l'authentification à deux facteurs avec votre téléphone +u2f_error=Nous ne pouvons pas lire votre clé de sécurité ! +u2f_unsupported_browser=Votre navigateur n'est pas compatible avec les clefs U2F. Veuillez réessayer avec un autre navigateur. +u2f_error_1=Une erreur inconnue s'est produite. Veuillez réessayer. +u2f_error_2=Veuillez vous assurer que vous utilisez une connexion chiffrée (https) et que vous visitez la bonne adresse. +u2f_error_3=Le serveur n'a pas pu répondre à votre requête. +u2f_error_4=Cette clef n'est pas compatible avec votre requête. Si vous êtes en train de l'enregistrer, veuillez vous assurer que cette clef n'est pas déjà enregistrée. +u2f_error_5=Le délai d'attente imparti a été atteint avant que votre clef ne puisse être lue. Veuillez recharger la page pour réessayer. +u2f_reload=Recharger repository=Dépôt organization=Organisation @@ -29,8 +53,12 @@ new_mirror=Nouveau miroir new_fork=Nouveau Fork new_org=Nouvelle organisation manage_org=Gérer les organisations +admin_panel=Administration du site account_settings=Paramètres du compte settings=Paramètres +your_profile=Profil +your_starred=Favoris +your_settings=Configuration all=Tous sources=Sources @@ -46,34 +74,107 @@ cancel=Annuler [install] install=Installation +title=Configuration initiale +docker_helper=Si vous utilisez Gitea avec Docker, veuillez lire la documentation avant de modifier les paramètres. +requite_db_desc=Gitea requiert MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB. db_title=Paramètres de la base de données db_type=Type de base de données host=Hôte +user=Nom d'utilisateur password=Mot de passe db_name=Nom de base de données +db_helper=Note aux utilisateurs de MySQL : veuillez utiliser le moteur de stockage InnoDB et le jeu de caractères 'utf8_general_ci'. +ssl_mode=SSL path=Emplacement - +sqlite_helper=Chemin d'accès pour la base de données SQLite3 ou TiDB.
Entrer un chemin absolu si vous exécutez Gitea en tant que service. +err_empty_db_path=Le chemin de la base de données SQLite3 ou TiDB ne peut être vide. +err_invalid_tidb_name=Le nom de la base de données TiDB ne peut pas contenir les caractères '.' et '-'. +no_admin_and_disable_registration=Vous ne pouvez pas désactiver la création de nouveaux utilisateurs avant d'avoir créé un compte administrateur. +err_empty_admin_password=Le mot de passe administrateur ne peut pas être vide. + +general_title=Configuration générale +app_name=Titre du site +app_name_helper=Entrez ici le nom de votre société. repo_path=Emplacement racine des dépôts +repo_path_helper=Les dépôts Git distants seront stockés dans ce répertoire. +lfs_path=Répertoire racine Git LFS +lfs_path_helper=Les fichiers suivis par Git LFS seront stockés dans ce dossier. Laissez vide pour désactiver LFS. +run_user=Exécuter avec le compte d'un autre utilisateur +run_user_helper=Veuillez entrer le nom d'utilisateur système exécutant Gitea. Cet utilisateur doit avoir accès au dossier racine des dépôts. +domain=Domaine du serveur SSH +domain_helper=Domaine ou adresse de l'hôte pour les URLs de clonage par SSH. +ssh_port=Port du serveur SSH +ssh_port_helper=Port d'écoute du serveur SSH. Laissez le vide pour le désactiver. +http_port=Port d'écoute HTTP de Gitea +http_port_helper=Port sur lequel le serveur web Gitea attendra des requêtes. +app_url=URL de base de Gitea +app_url_helper=Adresse HTTP(S) de base pour les clones git et les notifications par e-mail. log_root_path=Chemin des fichiers log +log_root_path_helper=Les fichiers de journalisation seront écrits dans ce répertoire. optional_title=Paramètres facultatifs +email_title=Paramètres E-mail smtp_host=Hôte SMTP +smtp_from=Envoyer les e-mails en tant que +smtp_from_helper=Adresse e-mail utilisée par Gitea. Veuillez entrer votre e-mail directement ou sous la forme . +mailer_user=Utilisateur SMTP +mailer_password=Mot de passe SMTP +register_confirm=Exiger la confirmation de l'e-mail lors de l'inscription +mail_notify=Activer les notifications par e-mail +server_service_title=Paramètres Serveur et Tierce Parties +offline_mode=Activer le mode hors-ligne +offline_mode_popup=Désactiver l'utilisation de CDNs, et servir toutes les ressources localement. +disable_gravatar=Désactiver Gravatar +disable_gravatar_popup=Désactiver Gravatar et les autres sources d'avatars tierces. Un avatar par défaut sera utilisé pour les utilisateurs n'ayant pas téléversé un avatar personnalisé. +federated_avatar_lookup=Activer les avatars unifiés federated_avatar_lookup_popup=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar. +disable_registration=Désactiver le formulaire d'inscription +disable_registration_popup=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs. +allow_only_external_registration_popup=N'autoriser l'inscription qu'à partir des services externes. openid_signin=Activer l'inscription OpenID +openid_signin_popup=Activer l'authentification via OpenID. +openid_signup=Activer l'inscription OpenID +openid_signup_popup=Activer l'inscription avec OpenID. +enable_captcha=Activer le CAPTCHA enable_captcha_popup=Demander un Captcha à l'inscription. +require_sign_in_view=Exiger la connexion à un compte pour afficher les pages +require_sign_in_view_popup=Limiter l'accès aux pages aux utilisateurs connectés. Les visiteurs ne verront que les pages de connexion et d'inscription. +admin_setting_desc=La création d'un compte administrateur est facultative. Le premier utilisateur enregistré deviendra automatiquement un administrateur le cas échéant. +admin_title=Paramètres de compte administrateur +admin_name=Nom d’utilisateur administrateur admin_password=Mot de passe confirm_password=Confirmez le mot de passe +admin_email=Adresse e-mail install_btn_confirm=Installer Gitea test_git_failed=Le test de la commande "git" a échoué : %v +sqlite3_not_available=Cette version de Gitea ne supporte pas SQLite3. Veuillez télécharger la version binaire officielle de %s (pas la version 'gobuild'). +invalid_db_setting=Les paramètres de la base de données sont invalides : %v +invalid_repo_path=Le chemin racine du dépôt est invalide : %v +run_user_not_match=Le nom d'utilisateur sous lequel Gitea est configuré n'est pas le nom d'utilisateur courant : %s -> %s save_config_failed=L'enregistrement de la configuration %v a échoué +invalid_admin_setting=Paramètres du compte administrateur invalides : %v +install_success=Bienvenue et merci d'avoir choisi Gitea. Profitez-en bien ! +invalid_log_root_path=Le répertoire des fichiers de journalisation est invalide : %v +default_keep_email_private=Masquer les adresses e-mail par défaut +default_keep_email_private_popup=Masquer les adresses e-mail des nouveaux comptes utilisateurs par défaut. +default_allow_create_organization=Autoriser la création d'organisations par défaut +default_allow_create_organization_popup=Permettre aux nouveaux comptes utilisateurs de créer des organisations par défaut. +default_enable_timetracking=Activer le suivi de temps par défaut +default_enable_timetracking_popup=Activer le suivi du temps pour les nouveaux dépôts par défaut. +no_reply_address=Domaine pour les e-mails cachés +no_reply_address_helper=Nom de domaine pour les utilisateurs possédant une adresse email cachée. Par exemple, le nom d’utilisateur « joe » sera enregistré dans Git comme « joe@noreply.example.org » si le domaine pour les e-mails cachés a la valeur « noreply.example.org ». [home] +uname_holder=Nom d'utilisateur ou adresse e-mail password_holder=Mot de passe switch_dashboard_context=Basculer le contexte du tableau de bord +my_repos=Dépôts +show_more_repos=Afficher plus de dépôts… collaborative_repos=Dépôts collaboratifs my_orgs=Mes organisations my_mirrors=Mes miroirs view_home=Voir %s +search_repos=Trouver un dépôt … issues.in_your_repos=Dans vos dépôts @@ -82,30 +183,53 @@ repos=Dépôts users=Utilisateurs organizations=Organisations search=Rechercher +code=Code +repo_no_results=Aucun dépôt correspondant n'a été trouvé. +user_no_results=Aucun utilisateur correspondant n'a été trouvé. +org_no_results=Aucune organisation correspondante n'a été trouvée. +code_no_results=Aucun code source correspondant à votre terme de recherche n'a été trouvé. +code_search_results=Résultats de recherche pour "%s [auth] +create_new_account=Créer un compte register_helper_msg=Déjà enregistré ? Connectez-vous ! +social_register_helper_msg=Déjà inscrit ? Connectez-vous ! +disable_register_prompt=Les inscriptions sont désactivées. Veuillez contacter l'administrateur du site. +disable_register_mail=La confirmation par e-mail à l'inscription est désactivée. remember_me=Se souvenir de moi forgot_password_title=Mot de passe oublié forgot_password=Mot de passe oublié ? +sign_up_now=Pas de compte ? Inscrivez-vous maintenant. confirmation_mail_sent_prompt=Un nouveau mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour valider votre enregistrement. reset_password_mail_sent_prompt=Un mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour terminer la réinitialisation du mot de passe. active_your_account=Activer votre compte +prohibit_login=Connexion interdite +prohibit_login_desc=Votre compte n'est pas autorisé à se connecter, contactez l’administrateur du site. +resent_limit_prompt=Désolé, vous avez récemment demandé un e-mail d'activation. Veuillez réessayer dans 3 minutes. has_unconfirmed_mail=Bonjour %s, votre adresse e-mail (%s) n'a pas été confirmée. Si vous n'avez reçu aucun mail de confirmation ou souhaitez renouveler l'envoi, cliquez sur le bouton ci-dessous. resend_mail=Cliquez ici pour renvoyer un mail de confirmation email_not_associate=L'adresse e-mail n'est associée à aucun compte. send_reset_mail=Cliquez ici pour renvoyer le mail de réinitialisation de votre mot de passe reset_password=Réinitialiser le mot de passe +invalid_code=Votre code de confirmation est invalide ou a expiré. reset_password_helper=Cliquez ici pour réinitialiser votre mot de passe +password_too_short=Le mot de passe doit contenir %d caractères minimum. +non_local_account=Les mots de passes des comptes utilisateurs externes ne peuvent pas être modifiées depuis l'interface web Gitea. verify=Vérifier scratch_code=Code de secours use_scratch_code=Utiliser un code de secours twofa_scratch_used=Vous avez utilisé votre code de secours. Vous avez été redirigé vers cette page de configuration afin de supprimer l'authentification à deux facteurs de votre appareil ou afin de générer un nouveau code de secours. +twofa_passcode_incorrect=Votre code d’accès n’est pas correct. Si vous avez égaré votre appareil, utilisez votre code de secours pour vous connecter. twofa_scratch_token_incorrect=Votre code de secours est incorrect. +login_userpass=Connexion login_openid=OpenID openid_connect_submit=Se connecter openid_connect_title=Se connecter à un compte existant +openid_connect_desc=L'URI OpenID choisie est inconnue. Associez-le à un nouveau compte ici. openid_register_title=Créer un nouveau compte +openid_register_desc=L'URI OpenID choisie est inconnue. Associez-le à un nouveau compte ici. +openid_signin_desc=Veuillez entrer votre URI OpenID. Par exemple: https://anne.me, bob.openid.org.cn ou gnusocial.net/charles. +disable_forgot_password_mail=La réinitialisation de mot de passe est désactivée. Veuillez contacter l'administrateur du site. [mail] activate_account=Veuillez activer votre compte @@ -117,12 +241,14 @@ register_notify=Bienvenue sur Gitea [modal] yes=Oui no=Non +modify=Mettre à jour [form] UserName=Nom d'utilisateur RepoName=Nom du dépôt Email=Adresse e-mail Password=Mot de passe +Retype=Retapez le mot de passe SSHTitle=Nom de la clé SSH HttpsUrl=URL HTTPS PayloadUrl=URL des données utiles @@ -138,6 +264,9 @@ TreeName=Chemin du fichier Content=Contenu require_error=` ne peut pas être vide.` +alpha_dash_error=` ne doit contenir que des caractères alphanumériques, des tirets ("-") et des tirets bas (" _ ").` +alpha_dash_dot_error=` ne doit contenir que des caractères alphanumériques, des tirets ("-"), des tirets bas ("_"), et des points. (".").` +git_ref_name_error=` doit être un nom de référence Git bien formé.` size_error=` doit être à la taille de %s.` min_size_error=` %s caractères minimum ` max_size_error=` %s caractères maximum ` @@ -145,70 +274,148 @@ email_error=` adresse e-mail invalide ` url_error=` URL invalide ` include_error=`doit contenir la sous-chaîne '%s'.` unknown_error=Erreur inconnue : - +captcha_incorrect=Le code CAPTCHA est incorrect. +password_not_match=Les mots de passe ne correspondent pas. + +username_been_taken=Le nom d'utilisateur est déjà pris. +repo_name_been_taken=Ce nom de dépôt est déjà utilisé. +org_name_been_taken=Ce nom d'organisation est déjà pris. +team_name_been_taken=Le nom d'équipe est déjà pris. +team_no_units_error=Autoriser l’accès à au moins une section du dépôt. +email_been_used=Cette adresse e-mail est déjà utilisée. +openid_been_used=Adresse OpenID '%s' déjà utilisée. +username_password_incorrect=Identifiant ou mot de passe invalide. +enterred_invalid_repo_name=Le nom de dépôt saisi est incorrect. +enterred_invalid_owner_name=Le nom du nouveau propriétaire est invalide. +enterred_invalid_password=Le mot de passe saisi est incorrect. user_not_exist=Cet utilisateur n'existe pas. +last_org_owner=Vous ne pouvez pas supprimer le dernier utilisateur de l’équipe « propriétaires ». Il doit y avoir au moins un propriétaire dans chaque équipe. +cannot_add_org_to_team=Une organisation ne peut être ajoutée comme membre d'une équipe. +invalid_ssh_key=Impossible de vérifier votre clé SSH : %s +invalid_gpg_key=Impossible de vérifier votre clé GPG : %s +unable_verify_ssh_key=Impossible de vérifier la clé SSH ; veuillez vérifier que vous n'avez pas fait d'erreur. auth_failed=Échec d'authentification : %v +still_own_repo=Ce compte possède toujours un ou plusieurs dépôts, vous devez d'abord les supprimer ou les transférer. +still_has_org=Votre compte est un membre d’une ou plusieurs organisations, veuillez d'abord les quitter. +org_still_own_repo=Cette organisation possède encore un ou plusieurs dépôts. Vous devez d'abord les supprimer ou les transférer. target_branch_not_exist=La branche cible n'existe pas. [user] +change_avatar=Changer votre avatar… join_on=Inscrit le repositories=Dépôts activity=Activité publique followers=abonnés +starred=Dépôts favoris following=Abonnements follow=Suivre unfollow=Ne plus suivre form.name_reserved=Le nom d’utilisateur "%s" est réservé. +form.name_pattern_not_allowed=%s" n'est pas autorisé dans un nom d'utilisateur. [settings] profile=Profil +account=Compte password=Mot de passe security=Sécurité avatar=Avatar ssh_gpg_keys=Clés SSH / GPG social=Réseaux Sociaux +applications=Applications +orgs=Gérer les organisations repos=Dépôts delete=Supprimer le compte twofa=Authentification à deux facteurs +account_link=Comptes associés +organization=Organisations uid=ID d'Utilisateur +u2f=Clefs de sécurité public_profile=Profil public +profile_desc=Votre adresse e-mail sera utilisée pour les notifications et d'autres opérations. +password_username_disabled=Les utilisateurs externes ne peuvent pas modifier leur nom d'utilisateur. Merci de contacter l'administrateur de votre site pour plus d'informations. full_name=Nom complet website=Site Web location=Localisation update_profile=Valider les modifications update_profile_success=Votre profil a été mis à jour. +change_username=Votre nom d'utilisateur a été modifié. +change_username_prompt=Remarque : changer votre nom d'utilisateur change également l'URL de votre compte. continue=Continuer cancel=Annuler +language=Langues +lookup_avatar_by_mail=Rechercher un avatar par adresse e-mail federated_avatar_lookup=Recherche d'avatars unifiés enable_custom_avatar=Activer l'avatar personnalisé choose_new_avatar=Sélectionner un nouvel avatar +update_avatar=Mise à jour de l'avatar delete_current_avatar=Supprimer l'avatar actuel +uploaded_avatar_not_a_image=Le fichier téléversé n'est pas une image. +update_avatar_success=Votre avatar a été mis à jour. +change_password=Modifier le mot de passe old_password=Mot de passe actuel new_password=Nouveau mot de passe +retype_new_password=Retapez le nouveau mot de passe +password_incorrect=Le mot de passe actuel est incorrect. +change_password_success=Votre mot de passe a été mis à jour. Désormais, connectez-vous avec votre nouveau mot de passe. +password_change_disabled=Les mots de passes des comptes utilisateurs externes ne peuvent pas être modifiées depuis l'interface web Gitea. emails=Adresses e-mail +manage_emails=Gérer les adresses de courriel +manage_openid=Gérer les adresses OpenID email_desc=Votre adresse e-mail principale sera utilisée pour les notifications et d'autres opérations. primary=Principale +primary_email=Faire de cette adresse votre adresse principale +delete_email=Supprimer +email_deletion=Supprimer l'adresse e-mail +email_deletion_desc=L'adresse e-mail et les informations connexes seront retirées de votre compte. Les révisions Git effectués par cette adresse resteront inchangées. Continuer ? +email_deletion_success=L'adresse e-mail a été supprimée. +openid_deletion=Supprimer l'adresse OpenID +openid_deletion_desc=La suppression de cette adresse OpenID vous empêchera de vous y connecter à l'avenir. Souhaitez-vous confirmer ? +openid_deletion_success=L'adresse OpenID a été supprimée. +add_new_email=Ajouter une adresse e-mail +add_new_openid=Ajouter une nouvelle URI OpenID +add_email=Ajouter une adresse e-mail add_openid=Ajouter une URI OpenID +add_email_confirmation_sent=Un email de confirmation a été envoyé à '%s'. Merci de relever votre boite dans les prochaines %s pour confirmer votre adresse. +add_email_success=La nouvelle adresse e-mail a été ajoutée. +add_openid_success=La nouvelle adresse OpenID a été ajoutée. +keep_email_private=Cacher l'adresse e-mail +keep_email_private_popup=Votre adresse e-mail sera cachée aux autres utilisateurs. +openid_desc=OpenID vous permet de confier l'authentification à une tierce partie. manage_ssh_keys=Gérer les clés SSH manage_gpg_keys=Gérer les clés GPG add_key=Ajouter une clé +ssh_desc=Ces clefs SSH publiques sont associées à votre compte. Les clefs privées correspondantes permettent l'accès complet à vos dépôts. +gpg_desc=Ces clefs GPG sont associées avec votre compte. Conservez-les en lieu sûr car elles permettent la vérification de vos révisions. ssh_helper=Besoin d'aide ? Consultez le guide Github pour générer votre clé SSH ou résoudre les problèmes courants que vous pouvez rencontrer en utilisant SSH. gpg_helper=Besoin d'aide ? Consultez le guide Github à propos de GPG. add_new_key=Ajouter une clé SSH add_new_gpg_key=Ajouter une clé GPG +ssh_key_been_used=Cette clef SSH est déjà liée à votre compte. +ssh_key_name_used=Une clef SSH du même nom est déjà associée à votre compte. +gpg_key_id_used=Une clef GPG publique avec le même identifiant existe déjà. +gpg_no_key_email_found=Cette clef GPG n'est utilisable avec aucune adresse e-mail associée à ce compte. subkeys=Sous-clés key_id=Clé ID key_name=Nom de la Clé key_content=Contenu +add_key_success=La clef SSH "%s" a été ajoutée. +add_gpg_key_success=La clef GPG "%s" a été ajoutée. +delete_key=Supprimer +ssh_key_deletion=Supprimer la clé SSH +gpg_key_deletion=Supprimer la clé GPG +ssh_key_deletion_desc=La suppression d'une clé SSH révoque son accès à votre compte. Continuer ? +gpg_key_deletion_desc=Retirer une clef GPG annule la vérification des révisions l'utilisant. Continuer ? +ssh_key_deletion_success=La clé SSH a été retirée. +gpg_key_deletion_success=La clé GPG a été retirée. add_on=Ajouté le valid_until=Valide jusqu’à valid_forever=Valide pour toujours @@ -220,40 +427,95 @@ key_state_desc=Cette clé a été utilisée durant les 7 derniers jours token_state_desc=Ce jeton a été utilisé durant les 7 derniers jours show_openid=Afficher sur mon profil hide_openid=Masquer du profil +ssh_disabled=SSH désactivé manage_social=Gérer les réseaux sociaux associés +social_desc=Ces réseaux sociaux sont liés à votre compte Gitea. Veuillez vous assurer que vous les reconnaissez tous car ils peuvent être utilisés pour se connecter à votre compte Gitea. +unbind=Dissocier +unbind_success=Le réseau social a été dissocié de votre compte Gitea. +manage_access_token=Gérer les jetons d'accès generate_new_token=Générer le nouveau jeton +tokens_desc=Ces jetons permettent l'accès à votre compte à travers l'API Gitea. +new_token_desc=Les applications utilisant un jeton ont un accès total à votre compte. token_name=Nom du jeton generate_token=Générer le jeton +generate_token_success=Votre nouveau jeton a été généré. Copiez-le maintenant car il ne sera plus jamais affiché ici. delete_token=Supprimer +access_token_deletion=Suppression de jetons d'accès +access_token_deletion_desc=Supprimer un jeton révoquera l'accès à votre compte pour toutes les applications l'utilisant. Continuer ? +delete_token_success=Ce jeton a été supprimé. Les applications l'utilisant n'ont plus accès à votre compte. +twofa_desc=L'authentification à deux facteurs améliore la sécurité de votre compte. twofa_is_enrolled=Votre compte est inscrit à l'authentification à deux facteurs. twofa_not_enrolled=Votre compte n'est pas inscrit à l'authentification à deux facteurs. +twofa_disable=Désactiver l'authentification à deux facteurs +twofa_scratch_token_regenerate=Regénérer un code de secours +twofa_scratch_token_regenerated=Votre jeton de secours est maintenant %s. Gardez-le en lieu sûr. +twofa_enroll=Activer l'authentification à deux facteurs +twofa_disable_note=Vous pouvez désactiver l'authentification à deux facteurs si nécessaire. +twofa_disable_desc=Désactiver l'authentification à deux facteurs rendra votre compte plus vulnérable. Souhaitez-vous confirmer ? +regenerate_scratch_token_desc=Si vous avez perdu votre code de secours, ou avez dû l'utiliser pour vous authentifier, vous pouvez le réinitialiser. twofa_disabled=L'authentification à deux facteurs a été désactivée. scan_this_image=Scannez cette image avec votre application d'authentification : or_enter_secret=Ou saisissez le code secret: %s - - +then_enter_passcode=Et entrez le mot de passe s'affichant dans l'application : +passcode_invalid=Le mot de passe est invalide. Réessayez. +twofa_enrolled=L'authentification à deux facteurs a été activée pour votre compte. Gardez votre jeton de secours (%s) en lieu sûr car il ne vous sera montré qu'une seule fois ! + +u2f_desc=Les clefs de sécurité sont des dispositifs matériels contenant des clefs cryptographiques. Elles peuvent être utilisées pour l'authentification à deux facteurs. La clef de sécurité doit supporter le standard FIDO U2F. +u2f_require_twofa=L'authentification à deux facteurs doit être activée afin d'utiliser une clef de sécurité. +u2f_register_key=Ajouter une clef de sécurité +u2f_nickname=Pseudonyme +u2f_press_button=Appuyer sur le bouton de votre clef de sécurité pour l'enregistrer. +u2f_delete_key=Supprimer une clef de sécurité +u2f_delete_key_desc=Si vous supprimez une clef de sécurité vous ne pourrez plus l'utiliser pour vous connecter. Continuer? + +manage_account_links=Gérer les comptes liés +manage_account_links_desc=Ces comptes externes sont liés à votre compte Gitea. +account_links_not_available=Il n'y a pour l'instant pas de compte externe connecté à votre compte Gitea. +remove_account_link=Supprimer un compte lié +remove_account_link_desc=Supprimer un compte lié révoquera son accès à votre compte Gitea. Continuer ? +remove_account_link_success=Le compte lié a été supprimé. orgs_none=Vous n'êtes membre d'aucune organisation. repos_none=Vous ne possédez aucun dépôt delete_account=Supprimer votre compte +delete_prompt=Cette opération supprimera votre compte. Ceci NE PEUT PAS être annulé. confirm_delete_account=Confirmer la suppression +delete_account_title=Supprimer un compte +delete_account_desc=Êtes-vous sûr de vouloir supprimer définitivement ce compte ? [repo] owner=Propriétaire repo_name=Nom du dépôt +repo_name_helper=Idéalement, le nom d'un dépôt devrait être court, mémorisable et unique. visibility=Visibilité +visiblity_helper=Rendre le dépôt privé +visiblity_helper_forced=L'administrateur de votre site impose que les nouveaux dépôts soient privés. +visiblity_fork_helper=(Les changement de cette valeur affecteront toutes les bifurcations.) +clone_helper=Besoin d'aide pour dupliquer ? Visitez l'aide. fork_repo=Créer une bifurcation du dépôt fork_from=Bifurquer depuis +fork_visiblity_helper=La visibilité d'un dépôt bifurqué ne peut être changée. repo_desc=Description repo_lang=Langue +repo_gitignore_helper=Choisissez un modèle de fichier .gitignore. license=Licence +license_helper=Sélectionner un fichier de licence. +readme=LISEZMOI +readme_helper=Choisissez un modèle de fichier LISEZMOI. +auto_init=Initialiser le dépôt (ajoute les fichiers .gitignore, Licence et LISEZMOI) create_repo=Créer un dépôt default_branch=Branche par défaut mirror_prune=Purger +mirror_prune_desc=Supprimer les références externes obsolètes +mirror_interval=Intervalle de synchronisation (les unités de temps valides sont "h", "m" et "s") +mirror_interval_invalid=L'intervalle de synchronisation est invalide. +mirror_address=Cloner depuis une URL +mirror_address_desc=Inclure les informations d'authentification requises dans l'URL. +mirror_last_synced=Dernière synchronisation watchers=Observateurs stargazers=Fans forks=Bifurcations @@ -262,22 +524,33 @@ reactions_more=et %d de plus form.reach_limit_of_creation=Vous avez déjà atteint la limite des %d dépôts. form.name_reserved=Le dépôt "%s" a un nom réservé. +form.name_pattern_not_allowed=%s" n'est pas autorisé dans un nom de dépôt. +need_auth=Autorisations de clonage migrate_type=Type de migration migrate_type_helper=Ce dépôt sera un miroir migrate_repo=Migrer le dépôt +migrate.clone_address=Migrer/Cloner depuis une URL +migrate.clone_address_desc=L'URL HTTP(S) ou Git "clone" d'un dépôt existant +migrate.clone_local_path=ou un chemin serveur local migrate.permission_denied=Vous n'êtes pas autorisé à importer des dépôts locaux. +migrate.invalid_local_path=Chemin local non valide, non existant ou n'étant pas un dossier. migrate.failed=Echec de migration: %v +migrate.lfs_mirror_unsupported=La synchronisation des objets LFS n'est pas supportée - veuillez utiliser 'git lfs fetch --all' et 'git lfs push --all' à la place. mirror_from=miroir de forked_from=bifurqué depuis +fork_from_self=Vous ne pouvez pas bifurquer un dépôt que vous possédez. copy_link=Copier +copy_link_success=Le lien a été copié +copy_link_error=Appuyez sur ⌘-C ou Ctrl-C pour copier copied=Copié unwatch=Ne plus suivre watch=Suivre unstar=Retirer le vote star=Favoriser fork=Bifurcation +download_archive=Télécharger ce dépôt no_desc=Aucune description quick_guide=Introduction rapide @@ -287,6 +560,7 @@ push_exist_repo=Soumission d'un dépôt existant par ligne de commande bare_message=Ce dépôt ne contient aucune information. code=Code +code.desc=Accéder au code source, fichiers, révisions et branches. branch=Branche tree=Aborescence filter_branch_and_tag=Filtrer une branche ou un tag @@ -303,34 +577,68 @@ file_raw=Brut file_history=Historique file_view_raw=Voir le Raw file_permalink=Lien permanent +file_too_large=Le fichier est trop gros pour être affiché. +video_not_supported_in_browser=Votre navigateur ne supporte pas le tag HTML5 "video". stored_lfs=Stocké avec Git LFS +commit_graph=Graphique des révisions +editor.new_file=Nouveau fichier +editor.upload_file=Téléverser un fichier +editor.edit_file=Modifier le fichier editor.preview_changes=Aperçu des modifications +editor.cannot_edit_non_text_files=Les fichiers binaires ne peuvent pas être édités dans l'interface web. +editor.edit_this_file=Modifier le fichier +editor.must_be_on_a_branch=Vous devez être sur une branche pour appliquer ou proposer des modifications à ce fichier. +editor.fork_before_edit=Vous devez faire bifurquer ce dépôt pour appliquer ou proposer des modifications à ce fichier. +editor.delete_this_file=Supprimer le fichier +editor.must_have_write_access=Vous devez avoir un accès en écriture pour appliquer ou proposer des modifications à ce fichier. +editor.file_delete_success=Le fichier '%s' a été supprimé. +editor.name_your_file=Nommez votre fichier… +editor.filename_help=Ajoutez un dossier en entrant son nom suivi d'une barre oblique ('/'). Supprimez un dossier avec un retour arrière au début du champ. editor.or=ou +editor.cancel_lower=Annuler editor.commit_changes=Committer les modifications editor.add_tmpl=Ajouter '%s/' editor.add=Ajouter '%s' editor.update=Mettre à jour '%s' editor.delete=Supprimer '%s' +editor.commit_message_desc=Ajouter une description détaillée facultative… editor.commit_directly_to_this_branch=Soumettre directement dans la branche %s. editor.create_new_branch=Créer une nouvelle branche pour cette révision et envoyer une nouvelle demande d'ajout. +editor.new_branch_name_desc=Nouveau nom de la branche… editor.cancel=Annuler +editor.filename_cannot_be_empty=Le nom de fichier ne peut être vide. editor.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. +editor.directory_is_a_file=Le nom de dossier '%s' est déjà utilisé comme nom de fichier dans ce dépôt. +editor.file_is_a_symlink='%s' est un lien symbolique. Les liens symboliques ne peuvent être édités dans l'interface web +editor.filename_is_a_directory=Le nom de fichier '%s' est déjà utilisé comme nom de dossier dans ce dépôt. +editor.file_editing_no_longer_exists=Le fichier en cours d'édition, '%s', n'existe plus dans ce dépôt. +editor.file_changed_while_editing=Le contenu de ce fichier a changé depuis le début de l'édition. Cliquez ici pour voir les changements ou soumettez de nouveau pour écraser ces changements. +editor.file_already_exists=Un fichier nommé '%s' existe déjà dans ce dépôt. editor.no_changes_to_show=Il n’y a aucun changement à afficher. editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l’erreur : %v +editor.add_subdir=Ajouter un dossier… editor.unable_to_upload_files=Échec lors de l'envoie du fichier '%s' avec l’erreur : %v editor.upload_files_to_dir=Transférer les fichiers vers '%s' +editor.cannot_commit_to_protected_branch=Impossible de créer une révision sur la branche protégée '%s'. +commits.desc=Naviguer dans l'historique des modifications. commits.commits=Révisions +commits.search=Rechercher des révisions… commits.find=Chercher +commits.search_all=Toutes les branches commits.author=Auteur commits.message=Message commits.date=Date commits.older=Précédemment commits.newer=Récemment commits.signed_by=Signé par +commits.gpg_key_id=ID de la clé GPG +ext_issues=Gestionnaire de tickets externe +ext_issues.desc=Lien vers un gestionnaire de tickets externe. +issues.desc=Organiser les rapports de bug, les tâches et les jalons. issues.new=Nouveau ticket issues.new.labels=Étiquettes issues.new.no_label=Pas d'étiquette @@ -340,12 +648,19 @@ issues.new.no_milestone=Aucun jalon issues.new.clear_milestone=Effacer le jalon issues.new.open_milestone=Ouvrir un jalon issues.new.closed_milestone=Jalons fermés +issues.new.assignees=Affecté à +issues.new.clear_assignees=Supprimer les affectations +issues.new.no_assignees=Aucune affectation issues.no_ref=Aucune branche/tag spécifiés issues.create=Créer un ticket issues.new_label=Nouvelle étiquette +issues.new_label_placeholder=Nom de l'étiquette +issues.new_label_desc_placeholder=Description issues.create_label=Créer une étiquette issues.label_templates.title=Charger un ensemble prédéfini d'étiquettes +issues.label_templates.info=Il n'existe pas encore d'étiquettes. Créez une étiquette avec 'Nouvelle étiquette' ou utilisez un jeu d'étiquettes prédéfini : issues.label_templates.helper=Sélectionnez un ensemble d'étiquettes +issues.label_templates.use=Utiliser le jeu de labels issues.label_templates.fail_to_load_file=Impossible de charger le fichier de modèle étiquette '%s' : %v issues.add_label_at=a ajouté l'étiquette
%s
%s issues.remove_label_at=a supprimé l'étiquette
%s
%s @@ -361,8 +676,11 @@ issues.delete_branch_at=`a supprimé la branche %s %s` issues.open_tab=%d Ouvert issues.close_tab=%d Fermé issues.filter_label=Étiquette +issues.filter_label_no_select=Toutes les étiquettes issues.filter_milestone=Jalon +issues.filter_milestone_no_select=Tous les jalons issues.filter_assignee=Assigné +issues.filter_assginee_no_select=Toutes les affectations issues.filter_type=Type issues.filter_type.all_issues=Tous les tickets issues.filter_type.assigned_to_you=Qui vous sont assignés @@ -375,6 +693,10 @@ issues.filter_sort.recentupdate=Mis à jour récemment issues.filter_sort.leastupdate=Moins récemment mis à jour issues.filter_sort.mostcomment=Les plus commentés issues.filter_sort.leastcomment=Les moins commentés +issues.filter_sort.moststars=Favoris (décroissant) +issues.filter_sort.feweststars=Favoris (croissant) +issues.filter_sort.mostforks=Bifurcations (décroissant) +issues.filter_sort.fewestforks=Bifurcations (croissant) issues.action_open=Ouvrir issues.action_close=Fermer issues.action_label=Étiquette @@ -393,7 +715,9 @@ issues.commented_at=`a commenté %s` issues.delete_comment_confirm=Êtes-vous certain de vouloir supprimer ce commentaire? issues.no_content=Il n'existe pas encore de contenu. issues.close_issue=Fermer +issues.close_comment_issue=Commenter et Fermer issues.reopen_issue=Réouvrir +issues.reopen_comment_issue=Commenter et Réouvrir issues.create_comment=Créer un commentaire issues.closed_at=`fermé à %[2]s` issues.reopened_at=`réouvert à %[2]s` @@ -406,11 +730,16 @@ issues.edit=Modifier issues.cancel=Annuler issues.save=Enregistrer issues.label_title=Nom de l'étiquette +issues.label_description=Description de l’étiquette issues.label_color=Couleur de l'étiquette issues.label_count=%d étiquettes issues.label_open_issues=%d tickets ouverts issues.label_edit=Éditer issues.label_delete=Supprimer +issues.label_modify=Modifier l'étiquette +issues.label_deletion=Supprimer l'étiquette +issues.label_deletion_desc=Supprimer une etiquette l'enlève de tous les tickets. Continuer ? +issues.label_deletion_success=L'étiquette a été supprimée. issues.label.filter_sort.alphabetically=Par ordre alphabétique issues.label.filter_sort.reverse_alphabetically=Par ordre alphabétique inversé issues.label.filter_sort.by_size=Taille @@ -420,32 +749,70 @@ issues.attachment.open_tab=`Cliquez ici pour voir '%s' dans un nouvel onglet` issues.attachment.download=`Cliquez pour télécharger "%s"` issues.subscribe=S’abonner issues.unsubscribe=Se désabonner +issues.tracker=Suivi du temps issues.start_tracking_short=Démarrer +issues.start_tracking=Démarrer le suivi du temps issues.start_tracking_history=`a démarré il y a %s` issues.tracking_already_started=`Vous avez déjà démarré le suivi de temps pour cette tâche!` issues.stop_tracking=Arrêter issues.stop_tracking_history=`a fini de travaillé pour %s` +issues.add_time=Ajouter un minuteur manuellement +issues.add_time_short=Ajouter un minuteur issues.add_time_cancel=Annuler issues.add_time_history=` temps passé ajouté %s` issues.add_time_hours=Heures issues.add_time_minutes=Minutes +issues.add_time_sum_to_small=Aucun minuteur n'a été saisi. issues.cancel_tracking=Annuler issues.cancel_tracking_history=`a annulé le suivi de temps pour %s` - +issues.time_spent_total=Temps passé total +issues.time_spent_from_all_authors=`Temps passé total : %s` +issues.due_date=Échéance +issues.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'aaaa-mm-jj'. +issues.error_modifying_due_date=Impossible de modifier l'échéance. +issues.error_removing_due_date=Impossible de supprimer l'échéance. +issues.due_date_form=aaaa-mm-jj +issues.due_date_form_add=Ajouter une échéance +issues.due_date_form_update=Mettre à jour l'échéance +issues.due_date_form_remove=Retirer l'échéance +issues.due_date_not_writer=Vous devez avoir accès au dépôt en écriture pour mettre à jour l'échéance d'un ticket. +issues.due_date_not_set=Aucune échéance n'a été définie. +issues.due_date_added=a ajouté l'échéance %s %s +issues.due_date_modified=a modifié l'échéance de %[2]s vers %[1]s %[3]s +issues.due_date_remove=a supprimé l'échéance %s %s +issues.due_date_overdue=En retard + +pulls.desc=Activer les demandes de fusion et la revue de code. pulls.new=Nouvelle demande d'ajout +pulls.compare_changes=Nouvelle demande de fusion +pulls.compare_changes_desc=Sélectionnez la branche dans laquelle fusionner et la branche depuis laquelle tirer les modifications. +pulls.compare_base=fusionner dans +pulls.compare_compare=tirer les modifications depuis pulls.filter_branch=Filtre de branche pulls.no_results=Aucun résultat trouvé. +pulls.nothing_to_compare=Ces branches sont identiques. Il n'y a pas besoin de créer une demande de fusion. +pulls.has_pull_request=`Une demande de fusion entre ces branches existe déjà : %[2]s#%[3]d` pulls.create=Creer une demande d'ajout pulls.title_desc=veut fusionner %[1]d révision(s) depuis %[2]s vers %[3]s pulls.merged_title_desc=a fusionné %[1]d révision(s) à partir de %[2]s vers %[3]s %[4]s pulls.tab_conversation=Discussion pulls.tab_commits=Révisions +pulls.tab_files=Fichiers Modifiés pulls.reopen_to_merge=Veuillez rouvrir cette demande d'ajout pour effectuer l'opération de fusion. pulls.merged=Fusionnée +pulls.has_merged=La pull request a été fusionnée. +pulls.data_broken=Cette demande de fusion est impossible par manque d'informations de bifurcation. +pulls.is_checking=Vérification des conflits de fusion en cours. Réessayez dans quelques instants. pulls.can_auto_merge_desc=Cette demande d'ajout peut être fusionnée automatiquement. +pulls.cannot_auto_merge_desc=Cette demande de fusion ne peut être appliquée automatiquement en raison de conflits de fusion. +pulls.cannot_auto_merge_helper=Fusionner manuellement pour résoudre les conflits. +pulls.no_merge_desc=Cette demande de fusion ne peut être appliquée directement car toutes les options de fusion du dépôt sont désactivées. +pulls.no_merge_helper=Activez des options de fusion dans les paramètres du dépôt ou fusionnez la demande manuellement. pulls.merge_pull_request=Fusionner la demande d'ajout pulls.rebase_merge_pull_request=Rebase et fusionner pulls.squash_merge_pull_request=Squash et fusionner +pulls.invalid_merge_option=Vous ne pouvez pas utiliser cette option de fusion pour cette demande. +pulls.open_unmerged_pull_exists=`Vous ne pouvez pas effectuer une opération de réouverture car il y a une demande de pull (#%d) en attente avec des propriétés identiques.` milestones.new=Nouveau jalon milestones.open_tab=%d Ouvert @@ -454,13 +821,22 @@ milestones.closed=%s fermé milestones.no_due_date=Aucune date d'échéance milestones.open=Ouvrir milestones.close=Fermer +milestones.new_subheader=Les jalons organisent les tickets et le suivi d'avancement. milestones.create=Créer un Jalon milestones.title=Titre milestones.desc=Description milestones.due_date=Date d'échéance (facultatif) milestones.clear=Effacer +milestones.invalid_due_date_format=Le format de la date d'échéance est invalide, il doit être comme suit 'aaaa-mm-jj'. +milestones.create_success=Le jalon "%s" a été créé. milestones.edit=Éditer le Jalon +milestones.edit_subheader=Les jalons organisent les tickets et le suivi d'avancement. milestones.cancel=Annuler +milestones.modify=Mettre à jour un jalon +milestones.edit_success=Le jalon "%s" a été mis à jour. +milestones.deletion=Supprimer un Jalon +milestones.deletion_desc=Supprimer un jalon le retire de tous les tickets. Continuer ? +milestones.deletion_success=Le jalon a été supprimé. milestones.filter_sort.closest_due_date=Date d'échéance la plus proche milestones.filter_sort.furthest_due_date=Date d'échéance la plus éloignée milestones.filter_sort.least_complete=Le moins complété @@ -468,17 +844,26 @@ milestones.filter_sort.most_complete=Le plus complété milestones.filter_sort.most_issues=Le plus de tickets milestones.filter_sort.least_issues=Le moins de tickets +ext_wiki=Wiki externe +ext_wiki.desc=Lier un wiki externe. wiki=Wiki +wiki.welcome=Bienvenue sur le Wiki. +wiki.welcome_desc=Le wiki vous permet d'écrire ou de partager de la documentation avec vos collaborateurs. +wiki.desc=Écrire et partager de la documentation avec vos collaborateurs. +wiki.create_first_page=Créer la première page wiki.page=Page wiki.filter_page=Filtrer la page +wiki.new_page=Page wiki.default_commit_message=Écrire une note concernant cette mise à jour (optionnel). wiki.save_page=Enregistrer la page wiki.last_commit_info=%s a édité cette page %s wiki.edit_page_button=Modifier wiki.new_page_button=Nouvelle Page wiki.delete_page_button=Supprimer la page +wiki.delete_page_notice_1=Supprimer la page de wiki "%s" ne peut être annulé. Continuer ? wiki.page_already_exists=Une page de wiki avec le même nom existe déjà. +wiki.reserved_page=Le nom de page de wiki "%s" est réservé. wiki.pages=Pages wiki.last_updated=Dernière mise à jour: %s @@ -487,7 +872,7 @@ activity.period.filter_label=Période: activity.period.daily=1 jour activity.period.halfweekly=3 jours activity.period.weekly=1 semaine -activity.period.monthly=1 semaine +activity.period.monthly=1 mois activity.overview=Vue d'ensemble activity.active_prs_count_1=%d demande d'ajout active activity.active_prs_count_n=%d demandes d'ajout actives @@ -515,6 +900,9 @@ activity.closed_issue_label=Fermé activity.new_issues_count_1=Nouveau ticket activity.new_issues_count_n=Nouveaux tickets activity.new_issue_label=Ouvert +activity.title.unresolved_conv_1=%d conversations non résolues +activity.title.unresolved_conv_n=%d conversations non résolues +activity.unresolved_conv_desc=Ces tickets et demandes de fusion récemment mis à jour n'ont pas encore été résolus. activity.unresolved_conv_label=Ouvrir activity.title.releases_1=%d version activity.title.releases_n=%d versions @@ -527,6 +915,9 @@ search.results=Résulats de la recherche « %s » dans %s settings=Paramètres settings.desc=Les paramètres sont l'endroit où gérer les options du dépôt +settings.options=Dépôt +settings.collaboration=Collaborateurs +settings.collaboration.admin=Administrateur settings.collaboration.write=Écriture settings.collaboration.read=Lecture settings.collaboration.undefined=Indéfini @@ -534,56 +925,178 @@ settings.hooks=Déclencheurs Web settings.githooks=Déclencheurs Git settings.basic_settings=Paramètres de base settings.mirror_settings=Réglages Miroir +settings.sync_mirror=Synchroniser maintenant +settings.mirror_sync_in_progress=La synchronisation est en cours. Revenez dans une minute. +settings.site=Site Web settings.update_settings=Valider settings.advanced_settings=Paramètres avancés +settings.wiki_desc=Activer le wiki du dépôt +settings.use_internal_wiki=Utiliser le wiki interne +settings.use_external_wiki=Utiliser un wiki externe settings.external_wiki_url=URL Wiki externe +settings.external_wiki_url_error=L’URL du wiki externe n’est pas une URL valide. +settings.external_wiki_url_desc=Les visiteurs sont redirigés vers l’URL du wiki externe lors d'un clic sur l’onglet wiki. +settings.issues_desc=Activer le suivi de tickets du dépôt +settings.use_internal_issue_tracker=Utiliser le suivi de tickets interne +settings.use_external_issue_tracker=Utiliser un système de suivi de tickets externe settings.external_tracker_url=Adresse du système de tickets externe +settings.external_tracker_url_error=L’URL du système de suivi de tickets externe n’est pas une URL valide. +settings.external_tracker_url_desc=Les visiteurs sont redirigés vers l’URL du système de suivi de tickets externe lors d'un clic sur l’onglet tickets. settings.tracker_url_format=Format de l'URL du système de tickets +settings.tracker_issue_style=Format du nombre de tickets du système de tickets externe settings.tracker_issue_style.numeric=Numérique settings.tracker_issue_style.alphanumeric=Alphanumérique +settings.tracker_url_format_desc=Utilisez les balises {user}, {repo} et {index} respectivement pour le nom d'utilisateur, le nom du dépôt et le numéro de ticket. +settings.enable_timetracker=Activer le suivi du temps +settings.allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs +settings.pulls_desc=Activer les demandes de fusion +settings.pulls.ignore_whitespace=Ignorer les espaces lors des conflits +settings.pulls.allow_merge_commits=Activer la fusion de révisions +settings.pulls.allow_rebase_merge=Activer le rebasage pour la fusion de révisions +settings.pulls.allow_squash_commits=Activer la concaténation de révisions +settings.admin_settings=Paramètres administrateur +settings.admin_enable_health_check=Activer les vérifications de santé du dépôt (git fsck) settings.danger_zone=Zone de danger settings.new_owner_has_same_repo=Le nouveau propriétaire a déjà un dépôt nommé ainsi. +settings.convert=Convertir en dépôt standard +settings.convert_desc=Vous pouvez convertir ce miroir en dépôt standard. Ceci ne peut pas être annulé. +settings.convert_notices_1=Cette opération convertira le miroir en dépôt standard et ne peut être annulée. +settings.convert_confirm=Convertir le dépôt +settings.convert_succeed=Le miroir a été converti en dépôt standard. settings.transfer=Changer de propriétaire +settings.transfer_desc=Transférer ce dépôt à un autre utilisateur ou une organisation dont vous possédez des droits d'administrateur. +settings.transfer_notices_1=- Vous perdrez l'accès à ce dépôt si vous le transférez à un autre utilisateur. +settings.transfer_notices_2=- Vous conserverez l'accès à ce dépôt si vous le transférez à une organisation dont vous êtes (co-)propriétaire. +settings.transfer_form_title=Entrez le nom du dépôt pour confirmer : +settings.wiki_delete=Supprimer les données du Wiki +settings.wiki_delete_desc=Supprimer les données du wiki d'un dépôt est permanent et ne peut être annulé. +settings.wiki_delete_notices_1=- Ceci supprimera de manière permanente et désactivera le wiki de dépôt pour %s. +settings.confirm_wiki_delete=Supprimer les données du Wiki +settings.wiki_deletion_success=Les données du wiki de ce dépôt ont été effacées. settings.delete=Supprimer ce dépôt +settings.delete_desc=Supprimer un dépôt est permanent et ne peut être annulé. settings.delete_notices_1=- Cette opération ne peut pas être annulée. +settings.delete_notices_2=- Cette opération supprimera définitivement le dépôt %s, y compris le code, les tickets, les commentaires, les données de wiki et les accès des collaborateurs. +settings.delete_notices_fork_1=- Les bifurcations de ce dépôt deviendront indépendants après suppression. +settings.deletion_success=Le dépôt a été supprimé. +settings.update_settings_success=Les options du dépôt ont été mises à jour. settings.transfer_owner=Nouveau propriétaire +settings.make_transfer=Transférer +settings.transfer_succeed=Le dépôt a été transféré. +settings.confirm_delete=Supprimer le dépôt +settings.add_collaborator=Ajouter un collaborateur +settings.add_collaborator_success=Le collaborateur a été ajouté. +settings.delete_collaborator=Supprimer +settings.collaborator_deletion=Supprimer le collaborateur +settings.collaborator_deletion_desc=La suppression d'un collaborateur révoque son accès à ce dépôt. Continuer ? +settings.remove_collaborator_success=Le collaborateur a été retiré. +settings.search_user_placeholder=Rechercher un utilisateur… +settings.org_not_allowed_to_be_collaborator=Les organisations ne peuvent être ajoutées en tant que collaborateur. +settings.user_is_org_member=L'utilisateur est un membre d'organisation qui ne peut être ajouté comme collaborateur. settings.add_webhook=Ajouter un déclencheur Web +settings.hooks_desc=Les webhooks envoient automatiquement des requêtes HTTP POST vers un serveur lorsque certains événements Gitea sont déclenchés. Apprenez-en plus dans le guide webhooks. +settings.webhook_deletion=Retirer le Webhook +settings.webhook_deletion_desc=Supprimer un webhook supprime ses paramètres et son historique. Continuer ? +settings.webhook_deletion_success=Le webhook a été supprimé. settings.webhook.test_delivery=Tester la version +settings.webhook.test_delivery_desc=Testez ce webhook avec un faux événement. +settings.webhook.test_delivery_success=Un faux événement a été ajouté à la file d'attente. L'affichage dans l'historique peut prendre quelques secondes. settings.webhook.request=Requête settings.webhook.response=Réponse settings.webhook.headers=Entêtes +settings.webhook.payload=Contenu settings.webhook.body=Corps +settings.githooks_desc=Les déclencheurs Git sont lancés par Git lui-même. Ils sont modifiables dans la liste ci-dessous afin de configurer des opérations personnalisées. settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous sera proposé. Un contenu laissé vide signifie un Hook inactif. settings.githook_name=Nom du Hook settings.githook_content=Contenu du Hook settings.update_githook=Mettre le Hook à jour +settings.add_webhook_desc=Gitea enverra des requêtes POST avec un type de contenu donné à l'URL cible. Apprenez-en plus dans le guide webhooks. +settings.payload_url=URL cible +settings.content_type=Type de contenu POST settings.secret=Confidentiel settings.slack_username=Nom d'utilisateur settings.slack_icon_url=URL de l'icône settings.discord_username=Nom d'utilisateur settings.discord_icon_url=URL de l'icône settings.slack_color=Couleur +settings.event_desc=Événement déclencheur : +settings.event_push_only=Événements de pe poussée +settings.event_send_everything=Tous les événements +settings.event_choose=Événements personnalisés… settings.event_create=Créer +settings.event_create_desc=Branche ou Tag créé. +settings.event_delete=Supprimer +settings.event_delete_desc=Branche ou tag supprimé +settings.event_fork=Bifurcation +settings.event_fork_desc=Dépôt bifurqué +settings.event_issues=Tickets +settings.event_issues_desc=Ticket ouvert, fermé, réouvert, modifié, assigné, non-assigné, étiquette mise à jour, étiquette nettoyée, jalonnée, ou déjalonnée. +settings.event_issue_comment=Commentaire du ticket +settings.event_issue_comment_desc=Commentaire du ticket créé, modifié, ou supprimé. +settings.event_release=Version +settings.event_release_desc=Version publiée, mise à jour ou supprimée dans un dépôt. settings.event_pull_request=Demande d'ajout +settings.event_pull_request_desc=Demande de fusion ouverte, fermée, rouverte, éditée, attribuée, désattribuée, étiquette mise à jour, étiquette désactivée ou synchronisée. settings.event_push=Pousser +settings.event_push_desc=Git push vers un dépôt. settings.event_repository=Dépôt +settings.event_repository_desc=Dépôt créé ou supprimé. +settings.active=Inclure les détails de l'événement +settings.active_helper=Ajouter des informations sur l’événement déclencheur aux requêtes. +settings.add_hook_success=Nouveau Webhook ajouté. settings.update_webhook=Mettre à jour le Webhook +settings.update_hook_success=Webhook mis à jour. +settings.delete_webhook=Retirer le Webhook settings.recent_deliveries=Livraisons récentes settings.hook_type=Type de Hook +settings.add_slack_hook_desc=Intégrer Slack au dépôt. settings.slack_token=Jeton settings.slack_domain=Domaine settings.slack_channel=Canal +settings.add_discord_hook_desc=Intégrer Discord au dépôt. +settings.add_dingtalk_hook_desc=Intégrer Dingtalk au dépôt. settings.deploy_keys=Clés de déploiement settings.add_deploy_key=Ajouter une clé de déploiement +settings.deploy_key_desc=Les clefs de déploiement on un accès en lecture seule au dépôt. +settings.is_writable=Activer l'accès en écriture +settings.is_writable_info=Permettre à cette clef de déploiement de pousser des modifications vers ce dépôt. +settings.no_deploy_keys=Il n'y a pas encore de clefs de déploiement. settings.title=Titre settings.deploy_key_content=Contenu +settings.key_been_used=Une clef de déploiement identique est déjà en cours d'utilisation. +settings.key_name_used=Une clef de déploiement du même nom existe déjà. +settings.add_key_success=La clef de déploiement "%s" à été ajoutée. +settings.deploy_key_deletion=Supprimer une clef de déploiement +settings.deploy_key_deletion_desc=La suppression d'une clef de déploiement révoque son accès à ce dépôt. Continuer ? +settings.deploy_key_deletion_success=La clé de déploiement a été supprimée. settings.branches=Branches settings.protected_branch=Protection de branche settings.protected_branch_can_push=Autoriser la poussée ? settings.protected_branch_can_push_yes=Vous pouvez pousser settings.protected_branch_can_push_no=Vous ne pouvez pas pousser +settings.branch_protection=Protection de la branche "%s +settings.protect_this_branch=Protection de la branche +settings.protect_this_branch_desc=Interdire de supprimer la branche et désactiver les mises à jours forcées. +settings.protect_whitelist_committers=Activer la liste blanche pour les mises à jour +settings.protect_whitelist_committers_desc=Autoriser les utilisateurs sur la liste blanche et les équipes de contourner les restrictions. +settings.protect_whitelist_users=Utilisateurs en liste blanche : +settings.protect_whitelist_search_users=Rechercher des utilisateurs… +settings.protect_whitelist_teams=Équipes en liste blanche : +settings.protect_whitelist_search_teams=Rechercher des équipes… +settings.protect_merge_whitelist_committers=Activer la liste blanche pour la fusion +settings.protect_merge_whitelist_committers_desc=N'autoriser que les utilisateurs et les équipes en liste blanche d'appliquer les demandes de fusion sur cette branche. +settings.protect_merge_whitelist_users=Utilisateurs en liste blanche de fusion : +settings.protect_merge_whitelist_teams=Équipes en liste blanche de fusion : settings.add_protected_branch=Activer la protection settings.delete_protected_branch=Désactiver la protection +settings.update_protect_branch_success=La protection de branche à été mise à jour pour la branche "%s". +settings.remove_protected_branch_success=La protection de branche à été désactivée pour la branche "%s". +settings.protected_branch_deletion=Désactiver la protection de branche +settings.protected_branch_deletion_desc=Désactiver la protection de branche permet aux utilisateurs ayant accès en écriture de pousser des modifications sur la branche. Continuer ? +settings.default_branch_desc=Sélectionnez une branche par défaut pour les demandes de fusion et les révisions : +settings.choose_branch=Choisissez une branche… +settings.no_protected_branch=Il n'y a pas de branche protégée. diff.browse_source=Parcourir la source diff.parent=Parent @@ -598,6 +1111,7 @@ diff.view_file=Voir le fichier diff.file_suppressed=Fichier diff supprimé car celui-ci est trop grand diff.too_many_files=Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff +releases.desc=Suivi des versions et des téléchargements. release.releases=Versions release.new_release=Nouvelle version release.draft=Brouillon @@ -606,53 +1120,102 @@ release.stable=Stable release.edit=Éditer release.ahead=%d révisions sur %s depuis cette publication release.source_code=Code source +release.new_subheader=Les versions organisent les versions publiées du projet. +release.edit_subheader=Les versions organisent les versions publiées du projet. release.tag_name=Nom du tag release.target=Cible +release.tag_helper=Choisissez un tag existant ou créez un nouveau tag. release.title=Titre release.content=Contenu release.write=Écrire release.preview=Prévisualiser +release.loading=Chargement… +release.prerelease_desc=Marquer comme pré-version +release.prerelease_helper=Marquer cette version comme impropre à la production. release.cancel=Annuler release.publish=Publier release.save_draft=Sauvegarder le Brouillon +release.edit_release=Modifier la version +release.delete_release=Supprimer cette version +release.deletion=Supprimer cette version +release.deletion_desc=Supprimer une version enlève sa balise du dépôt. Le contenu et l'historique du dépôt restent inchangés. Continuer ? release.deletion_success=Cette livraison a été supprimée. +release.tag_name_already_exist=Une version avec ce nom de balise existe déjà. +release.tag_name_invalid=Le nom de balise est invalide. release.downloads=Téléchargements +branch.name=Nom de la branche branch.search=Rechercher des branches +branch.already_exists=Une branche nommée %s existe déjà. branch.delete_head=Supprimer +branch.delete=Supprimer la branche '%s' branch.delete_html=Supprimer la branche +branch.delete_desc=Supprimer une branche est permanent. Cela NE PEUVENT être annulées. Continuer ? +branch.deletion_success=La branche "%s" a été supprimée. +branch.deletion_failed=Impossible de supprimer la branche %s. +branch.delete_branch_has_new_commits=La branche '%s' ne peut être supprimé car de nouvelles révisions ont été ajoutées après la fusion. branch.create_branch=Créer la branche %s branch.create_from=de '%s' +branch.create_success=La branche "%s" a été crée. branch.branch_already_exists=La branche '%s' existe déjà dans ce dépôt. +branch.branch_name_conflict=Le nom de la branche « %s » est en conflit avec une branche existante « %s ». +branch.tag_collision=La branche '%s' ne peut être créée comme une balise car un nom identique existe déjà dans le dépôt. branch.deleted_by=Supprimée par %s +branch.restore_success=La branche "%s" a été restaurée. +branch.restore_failed=La restauration de la branche '%s' a échoué. +branch.protected_deletion_failed=La branche '%s' est protégé. Il ne peut pas être supprimé. +topic.manage_topics=Gérer les sujets +topic.done=Terminé +topic.count_prompt=Vous ne pouvez pas sélectionner plus de 25 sujets +topic.format_prompt=Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets (-), sans dépasser 35 caractères [org] org_name_holder=Nom de l'organisation org_full_name_holder=Nom complet de l'organisation +org_name_helper=Le nom de l'organisation doit être court et mémorable. create_org=Créer une organisation repo_updated=Mis à jour people=Contacts teams=Équipes lower_members=Membres lower_repositories=dépôts +create_new_team=Nouvelle équipe +create_team=Créer une équipe org_desc=Description team_name=Nom de l'équipe team_desc=Description +team_name_helper=Le nom d'équipe doit être court et mémorable. +team_desc_helper=Décrire le but ou le rôle de l’équipe. +team_permission_desc=Autorisation +team_unit_desc=Permettre l’accès aux Sections du dépôt +form.name_reserved=Le nom d'organisation "%s" est réservé. +form.name_pattern_not_allowed=Le paterne '%s' n'est pas autorisé dans un nom d'oraganisation. +form.create_org_not_allowed=Vous n'êtes pas autorisé à créer une organisation. settings=Paramètres +settings.options=Organisation settings.full_name=Non Complet settings.website=Site Web settings.location=Localisation settings.update_settings=Valider settings.update_setting_success=Les paramètres de l'organisation ont été mis à jour. +settings.change_orgname_prompt=NB: changer le nom de l'organisation changera aussi son URL. +settings.update_avatar_success=L'avatar de l'organisation a été mis à jour. settings.delete=Supprimer l'organisation settings.delete_account=Supprimer cette organisation +settings.delete_prompt=Cette organisation sera supprimée définitivement. Cette opération est IRRÉVERSIBLE ! settings.confirm_delete_account=Confirmez la suppression +settings.delete_org_title=Supprimer l'organisation +settings.delete_org_desc=Cette organisation sera supprimée définitivement. Voulez-vous continuer ? settings.hooks_desc=Vous pouvez ajouter des déclencheurs qui seront activés pour tous les dépôts de cette organisation. members.membership_visibility=Visibilité des membres: +members.public=Public +members.public_helper=rendre caché +members.private=Caché +members.private_helper=rendre visible members.member_role=Rôle du membre : members.owner=Propriétaire members.member=Membre @@ -664,22 +1227,36 @@ members.invite_now=Envoyer une invitation teams.join=Rejoindre teams.leave=Quitter teams.read_access=Accès en lecture +teams.read_access_helper=Les membres peuvent voir et cloner les dépôts d'équipes. teams.write_access=Accès en écriture +teams.write_access_helper=Les membres peuvent voir et cloner les dépôts d'équipes. +teams.admin_access=Accès Administrateur +teams.admin_access_helper=Les membres peuvent tirer et pousser des modifications vers les dépôts de l'équipe, et y ajouter des collaborateurs. teams.no_desc=Aucune description teams.settings=Paramètres +teams.owners_permission_desc=Les propriétaires ont un accès complet à tous les dépôts et disposent d'un accès administrateur de l'organisation. teams.members=Membres de L'Équipe teams.update_settings=Valider +teams.delete_team=Supprimer l'équipe teams.add_team_member=Ajouter un Membre +teams.delete_team_title=Supprimer l'équipe +teams.delete_team_desc=Supprimer une équipe supprime l'accès au dépôt à ses membres. Continuer ? teams.delete_team_success=L’équipe a été supprimé. +teams.read_permission_desc=Cette équipe permet l'accès en lecture : les membres peuvent voir et dupliquer ses dépôts. +teams.write_permission_desc=Cette équipe permet l'accès en écriture : les membres peuvent participer à ses dépôts. +teams.admin_permission_desc=Cette équipe permet l'accès administrateur : les membres peuvent voir, participer et ajouter des collaborateurs à ses dépôts. teams.repositories=Dépôts de l'Équipe +teams.search_repo_placeholder=Rechercher dans le dépôt… teams.add_team_repository=Ajouter un Dépôt à l'Équipe teams.remove_repo=Supprimer teams.add_nonexistent_repo=Dépôt inexistant, veuillez d'abord le créer. [admin] dashboard=Tableau de bord +users=Comptes utilisateurs organizations=Organisations repositories=Dépôts +authentication=Sources d'authentification config=Configuration notices=Notes Systèmes monitor=Surveillance @@ -687,6 +1264,10 @@ first_page=Première last_page=Dernière total=Total : %d +dashboard.statistic=Résumé +dashboard.operations=Opérations de maintenance +dashboard.system_status=État du système +dashboard.statistic_info=La base de données Gitea contient %d utilisateurs, %d organisations, %d clés publiques, %d dépôts, %d surveillances de dépôts, %d votes, %d actions, %d accès, %d tickets, %d commentaires, %d comptes de réseaux sociaux, %d abonnements, %d miroirs, %d versions, %d sources d'authentification externes, %d webhooks, %d versions, %d labels, %d tâches hook, %d équipes, %d tâches de mise à jour, %d fichiers. dashboard.operation_name=Nom de l'Opération dashboard.operation_switch=Basculer dashboard.operation_run=Exécuter @@ -694,15 +1275,30 @@ dashboard.clean_unbind_oauth=Effacer les connexions OAuth associées dashboard.clean_unbind_oauth_success=Toutes les connexions OAuth associées ont été supprimées. dashboard.delete_inactivate_accounts=Supprimer tous les comptes inactifs dashboard.delete_inactivate_accounts_success=Tous les comptes inactifs ont été supprimés. +dashboard.delete_repo_archives=Supprimer toutes les archives du dépôt +dashboard.delete_repo_archives_success=Toutes les archives du dépôt ont été supprimées. +dashboard.delete_missing_repos=Supprimer tous les dépôts dont les fichiers Git sont manquants +dashboard.delete_missing_repos_success=Tous les dépôts dont les fichiers Git sont manquants ont été supprimés. +dashboard.git_gc_repos=Collecter les déchets des dépôts +dashboard.git_gc_repos_success=Les déchets de tous les dépôts ont été collectés. +dashboard.resync_all_sshkeys=Ajouter les clefs SSH Gitea au fichier ".ssh/authorized_keys". (Inutile si vous utilisez le serveur SSH intégré). +dashboard.resync_all_sshkeys_success=Toutes les clés publiques contrôlées par Gitea ont été réécrites. +dashboard.resync_all_hooks=Re-synchroniser les déclencheurs Git pre-receive, update et post-receive de tous les dépôts. +dashboard.resync_all_hooks_success=Tous les déclencheurs Git pre-receive, update et post-receive ont été resynchronisés. dashboard.reinit_missing_repos=Réinitialiser tous les dépôts Git manquants pour lesquels un enregistrement existe dashboard.reinit_missing_repos_success=Tous les dépôts Git manquants pour lesquels un enregistrement existait ont été réinitialisés. dashboard.sync_external_users=Synchroniser les données de l’utilisateur externe +dashboard.sync_external_users_started=La synchronisation des données des utilisateurs externes a commencé. +dashboard.git_fsck=Effectuer des contrôles de santé sur tous les dépôts +dashboard.git_fsck_started=Début des contrôles de santé du dépôt. dashboard.server_uptime=Uptime du serveur dashboard.current_goroutine=Goroutines actuelles dashboard.current_memory_usage=Utilisation Mémoire actuelle dashboard.total_memory_allocated=Mémoire totale allouée dashboard.memory_obtained=Mémoire obtenue dashboard.pointer_lookup_times=Nombre de Consultations Pointeur +dashboard.memory_allocate_times=Allocations de mémoire +dashboard.memory_free_times=Nombre de libérations de mémoire dashboard.current_heap_usage=Utilisation Tas (Heap) dashboard.heap_memory_obtained=Mémoire Tas (Heap) obtenue dashboard.heap_memory_idle=Mémoire Tas (Heap) au Repos @@ -725,18 +1321,43 @@ dashboard.total_gc_pause=Pause GC dashboard.last_gc_pause=Dernière Pause GC dashboard.gc_times=Nombres de GC +users.user_manage_panel=Gestion du compte utilisateur +users.new_account=Créer un compte +users.name=Nom d'utilisateur users.activated=Activé users.admin=Administrateur users.repos=Dépôts users.created=Créés +users.last_login=Dernière connexion +users.never_login=Jamais connecté +users.send_register_notify=Envoyer une notification d'inscription +users.new_success=L'utilisateur '%s' à bien été créé. users.edit=Éditer users.auth_source=Sources d'authentification users.local=Locales +users.auth_login_name=Nom d'utilisateur pour l'authentification +users.password_helper=Laissez le mot de passe vide pour le garder inchangé. +users.update_profile_success=Le compte a bien été mis à jour. +users.edit_account=Modifier un compte +users.max_repo_creation=Nombre maximal de dépôts +users.max_repo_creation_desc=(Mettre à -1 pour utiliser la limite globale par défaut.) +users.is_activated=Ce compte est activé +users.prohibit_login=Désactiver la connexion +users.is_admin=Est Administrateur +users.allow_git_hook=Autoriser la création de Git Hooks +users.allow_import_local=Autoriser l'importation de dépôts locaux +users.allow_create_organization=Autoriser la création d'organisations +users.update_profile=Modifier un compte +users.delete_account=Supprimer cet utilisateur +users.still_own_repo=Cet utilisateur possède un ou plusieurs dépôts. Veuillez les supprimer ou les transférer à un autre utilisateur. +users.still_has_org=Cet utilisateur est membre d'une organisation. Veuillez le retirer de toutes les organisations dont il est membre au préalable. +users.deletion_success=Le compte a été supprimé. orgs.org_manage_panel=Gestion des organisations orgs.name=Nom orgs.teams=Équipes orgs.members=Membres +orgs.new_orga=Nouvelle organisation repos.repo_manage_panel=Gestion des dépôts repos.owner=Propriétaire @@ -744,12 +1365,16 @@ repos.name=Nom repos.private=Privé repos.watches=Suivi par repos.stars=Votes +repos.forks=Bifurcations repos.issues=Tickets repos.size=Taille +auths.auth_manage_panel=Gestion des sources d'authentification +auths.new=Ajouter une source d'authentification auths.name=Nom auths.type=Type auths.enabled=Activé +auths.syncenabled=Activer la synchronisation des utilisateurs auths.updated=Mis à jour auths.auth_type=Type d'authentification auths.auth_name=Nom de l'authentification @@ -759,8 +1384,18 @@ auths.host=Hôte auths.port=Port auths.bind_dn=Bind DN auths.bind_password=Bind mot de passe +auths.bind_password_helper=Attention: ce mot de passe est stocké en clair. Veuillez utiliser, si possible, un compte avec des droits limités en lecture seule. auths.user_base=Utilisateur Search Base auths.user_dn=Utilisateur DN +auths.attribute_username=Attribut nom d'utilisateur +auths.attribute_username_placeholder=Laisser vide afin d'utiliser le nom d'utilisateur spécifié dans Gitea. +auths.attribute_name=Attribut prénom +auths.attribute_surname=Attribut nom de famille +auths.attribute_mail=Attribut e-mail +auths.attribute_ssh_public_key=Attribut clef SSH publique +auths.attributes_in_bind=Aller chercher les attributs dans le contexte de liaison DN +auths.use_paged_search=Utiliser la recherche paginée +auths.search_page_size=Taille de la page auths.filter=Filtre utilisateur auths.admin_filter=Filtre administrateur auths.ms_ad_sa=Rechercher les attributs MS AD @@ -768,6 +1403,7 @@ auths.smtp_auth=Type d'authentification SMTP auths.smtphost=Hôte SMTP auths.smtpport=Port SMTP auths.allowed_domains=Domaines autorisés +auths.allowed_domains_helper=Laisser ce champ vide autorise tous les domaines. Separez les domaines multiples avec une virgule (","). auths.enable_tls=Activer le Chiffrement TLS auths.skip_tls_verify=Ne pas vérifier TLS auths.pam_service_name=Nom du Service PAM @@ -775,6 +1411,7 @@ auths.oauth2_provider=Fournisseur OAuth2 auths.oauth2_clientID=ID du client (clé) auths.oauth2_clientSecret=Secret du client auths.openIdConnectAutoDiscoveryURL=URL de découverte OpenID Connect +auths.oauth2_use_custom_url=Utiliser des URLs personnalisées au lieu de l’URL par défaut auths.oauth2_tokenURL=URL du jeton auths.oauth2_authURL=URL d'autorisation auths.oauth2_profileURL=URL du profil @@ -784,27 +1421,48 @@ auths.tips=Conseils auths.tips.oauth2.general=Authentification OAuth2 auths.tips.oauth2.general.tip=Lorsque vous enregistrez une nouvelle authentification OAuth2, l'URL de redirection doit être de la forme : /user/oauth2 //callback auths.tip.oauth2_provider=Fournisseur OAuth2 +auths.tip.bitbucket=Créez un nouveau jeton OAuth sur https://bitbucket.org/account/user//oauth-consumers/new et ajoutez la permission "Compte"-"Lecture auths.tip.dropbox=Créez une nouvelle application sur https://www.dropbox.com/developers/apps auths.tip.facebook=Enregistrez une nouvelle application sur https://developers.facebook.com/apps et ajoutez le produit "Facebook Login auths.tip.github=Créez une nouvelle application OAuth sur https://github.com/settings/applications/new auths.tip.gitlab=Créez une nouvelle application sur https://gitlab.com/profile/applications +auths.tip.google_plus=Obtenez des identifiants OAuth2 sur la console API de Google (https://console.developers.google.com/) auths.tip.openid_connect=Utilisez l'URL de découvert OpenID (/.well-known/openid-configuration) pour spécifier les points d'accès +auths.tip.twitter=Rendez-vous sur https://dev.twitter.com/apps, créez une application et assurez-vous que l'option "Autoriser l'application à être utilisée avec Twitter Connect" est activée +auths.edit=Mettre à jour la source d'authentification +auths.activated=Cette source d'authentification est activée auths.new_success=L'authentification "%s" a été ajoutée. +auths.update_success=La source d'authentification a été mise à jour. +auths.update=Mettre à jour la source d'authentification +auths.delete=Supprimer la source d'authentification auths.delete_auth_title=Suppression de la source d'authentification +auths.delete_auth_desc=La suppression d'une source d'authentification empêche les utilisateurs de l'utiliser pour se connecter. Continuer ? +auths.still_in_used=Cette source d'authentification est utilisée par un ou plusieurs utilisateurs, veuillez convertir ou supprimer ces comptes utilisateurs avant toute action. +auths.deletion_success=La source d'authentification a été supprimée. +auths.login_source_exist=La source d'authentification "%s" existe déjà. config.server_config=Configuration du serveur +config.app_name=Titre du site +config.app_ver=Version de Gitea +config.app_url=URL de base de Gitea config.custom_conf=Chemin du fichier de configuration +config.domain=Domaine du serveur SSH +config.offline_mode=Mode hors-ligne config.disable_router_log=Désactiver la Journalisation du Routeur +config.run_user=Exécuter avec l'utilisateur config.run_mode=Mode d'Éxécution config.git_version=Version de Git config.repo_root_path=Emplacement des Dépôts config.lfs_root_path=Répertoire racine LFS config.static_file_root_path=Chemin statique des fichiers racines +config.log_file_root_path=Chemin des fichiers logs config.script_type=Type de Script config.reverse_auth_user=Annuler l'Authentification de l'Utilisateur config.ssh_config=Configuration SSH config.ssh_enabled=Activé +config.ssh_start_builtin_server=Utiliser le serveur incorporé +config.ssh_domain=Domaine du serveur config.ssh_port=Port config.ssh_listen_port=Port d'écoute config.ssh_root_path=Emplacement racine @@ -817,19 +1475,36 @@ config.db_config=Configuration de la base de données config.db_type=Type config.db_host=Hôte config.db_name=Nom +config.db_user=Nom d'utilisateur +config.db_ssl_mode=SSL config.db_path=Emplacement config.service_config=Configuration du service +config.register_email_confirm=Exiger la confirmation de l'e-mail lors de l'inscription +config.disable_register=Désactiver le formulaire d'inscription +config.allow_only_external_registration=N'autoriser l'inscription qu'à partir des services externes +config.enable_openid_signup=Activer l'inscription avec OpenID +config.enable_openid_signin=Activer la connexion avec OpenID config.show_registration_button=Afficher le bouton d'enregistrement +config.require_sign_in_view=Exiger la connexion pour afficher les pages +config.mail_notify=Activer les notifications par e-mail config.disable_key_size_check=Désactiver la vérification de la taille de clé minimale +config.enable_captcha=Activer le CAPTCHA config.active_code_lives=Limites de Code Actif config.reset_password_code_lives=Réinitialiser le délai d'expiration du code de mot de passe +config.default_keep_email_private=Masquer les adresses e-mail par défaut +config.default_allow_create_organization=Autoriser la création d'organisations par défaut +config.enable_timetracking=Activer le suivi du temps +config.default_enable_timetracking=Activer le suivi de temps par défaut +config.default_allow_only_contributors_to_track_time=Restreindre le suivi de temps aux contributeurs +config.no_reply_address=Domaine pour les e-mails cachés config.webhook_config=Configuration Webhook config.queue_length=Longueur de la file d'attente config.deliver_timeout=Expiration d'Envoi config.skip_tls_verify=Passer la vérification TLS +config.mailer_config=Configuration du service SMTP config.mailer_enabled=Activé config.mailer_disable_helo=Désactiver HELO config.mailer_name=Nom @@ -837,6 +1512,10 @@ config.mailer_host=Hôte config.mailer_user=Utilisateur config.mailer_use_sendmail=Utiliser Sendmail config.mailer_sendmail_path=Chemin d’accès à Sendmail +config.mailer_sendmail_args=Arguments supplémentaires pour Sendmail +config.send_test_mail=Envoyer un e-mail de test +config.test_mail_failed=Impossible d'envoyer un e-mail de test à '%s' : %v +config.test_mail_sent=Un e-mail de test à été envoyé à '%s'. config.oauth_config=Configuration OAuth config.oauth_enabled=Activé @@ -856,6 +1535,7 @@ config.session_life_time=Durée des sessions config.https_only=HTTPS uniquement config.cookie_life_time=Expiration du cookie +config.picture_config=Configuration de l'avatar config.picture_service=Service d'Imagerie config.disable_gravatar=Désactiver Gravatar config.enable_federated_avatar=Activer les avatars unifiés @@ -880,6 +1560,7 @@ monitor.name=Nom monitor.schedule=Planification monitor.next=Suivant monitor.previous=Précédent +monitor.execute_times=Exécutions monitor.process=Processus en cours d'exécution monitor.desc=Description monitor.start=Heure de démarrage @@ -906,11 +1587,11 @@ commit_repo=a poussé dans %[3]s sur %s#%[2]s` close_issue=`tickets clos %s#%[2]s` reopen_issue=`tickets ré-ouverts %s#%[2]s` -create_pull_request=`pull request créée le %s#%[2]s` -close_pull_request=`pull request fermé %s#%[2]s` -reopen_pull_request=`pull request ré-ouverte %s#%[2]s` +create_pull_request=`a créé la demande d'ajout %s#%[2]s` +close_pull_request=`a fermé la demande d'ajout %s#%[2]s` +reopen_pull_request=`a rouvert la demande d'ajout %s#%[2]s` comment_issue=`a commenté le ticket %s#%[2]s` -merge_pull_request=`demande d'ajout fusionnée le %s#%[2]s` +merge_pull_request=`a fusionné la demande d'ajout %s#%[2]s` transfer_repo=a transféré le dépôt %s à %s push_tag=a soumis le tag %[2]s sur %[3]s delete_tag=étiquette supprimée %[2]s de %[3]s @@ -940,6 +1621,8 @@ raw_seconds=secondes raw_minutes=minutes [dropzone] +default_message=Déposez les fichiers ou cliquez ici pour téléverser. +invalid_input_type=Vous ne pouvez pas téléverser des fichiers de ce type. file_too_big=La taille du fichier ({{filesize}} Mo) dépasse la taille maximale ({{maxFilesize}} Mo). remove_file=Supprimer le fichier @@ -947,6 +1630,8 @@ remove_file=Supprimer le fichier notifications=Notifications unread=Non lue(s) read=Lue(s) +no_unread=Aucune notification non lue. +no_read=Aucune notification lue. pin=Epingler la notification mark_as_read=Marquer comme lu mark_as_unread=Marquer comme non lue @@ -955,8 +1640,12 @@ mark_all_as_read=Tout marquer comme lu [gpg] error.extract_sign=Impossible d'extraire la signature error.generate_hash=Impossible de générer la chaine de hachage de la révision +error.no_committer_account=Aucun compte lié à l'adresse e-mail de l'auteur error.no_gpg_keys_found=Aucune clé connue n'a été trouvée dans la base pour cette signature error.not_signed_commit=Révision non signée +error.failed_retrieval_gpg_keys=Impossible de récupérer la clé liée au compte de l'auteur [units] +error.no_unit_allowed_repo=Vous n'êtes pas autorisé à accéder à n'importe quelle section de ce dépôt. +error.unit_not_allowed=Vous n'êtes pas autorisé à accéder à cette section du dépôt. diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 56f14d771d00..41a56ece85b7 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -1,11 +1,15 @@ +app_desc=Sebuah layanan Git hosting pribadi yang mudah home=Beranda dashboard=Dasbor explore=Jelajahi help=Bantuan sign_in=Masuk +sign_in_with=Masuk Dengan sign_out=Keluar +sign_up=Daftar link_account=Tautan Akun +link_account_signin_or_signup=Masuk dengan kredensial yang ada untuk menautkan akun anda yang ada ke akun ini atau daftar akun yang baru. register=Daftar website=Situs Web version=Versi @@ -13,12 +17,32 @@ page=Halaman template=Contoh language=Bahasa notifications=Notifikasi +create_new=Buat… +user_profile_and_more=Profil dan Pengaturan… signed_in_as=Masuk sebagai +enable_javascript=Situs web ini bekerja lebih baik dengan JavaScript. username=Nama Pengguna +email=Alamat Email password=Kata Sandi +re_type=Ketik Ulang Kata Sandi +captcha=CAPTCHA +twofa=Otentikasi Dua Faktor +twofa_scratch=Kode Awal Dua Faktor passcode=Kode Akses +u2f_insert_key=Masukkan kunci keamanan anda +u2f_sign_in=Tekan tombol pada kunci keamanan anda. Jika anda tidak menemukan tombol, masukkan kembali. +u2f_press_button=Silahkan tekan tombol pada kunci keamanan anda… +u2f_use_twofa=Menggunakan kode dua faktor dari telepon anda +u2f_error=Kami tidak bisa membaca kunci keamanan anda! +u2f_unsupported_browser=Browser anda tidak mendukung kunci U2F. Silakan mencoba browser lain. +u2f_error_1=Terdapat kesalahan yang tidak diketahui. Mohon coba lagi. +u2f_error_2=Pastikan bahwa anda menggunakan koneksi terenkripsi (https://) dan mengunjungi URL yang benar. +u2f_error_3=Server tidak bisa melanjutkan permintaan anda. +u2f_error_4=Kunci tidak layak untuk permintaan ini. Jika Anda mencoba untuk mendaftarkanya, pastikan bahwa kunci sudah tidak terdaftar. +u2f_error_5=Timeout tercapai sebelum kunci anda bisa terbaca. Silahkan muat ulang untuk mencoba kembali. +u2f_reload=Muat Ulang repository=Repositori organization=Organisasi @@ -29,8 +53,12 @@ new_mirror=Duplikat Baru new_fork=Fork Repositori Baru new_org=Organisasi Baru manage_org=Mengelola Organisasi +admin_panel=Administrasi Situs account_settings=Pengaturan Akun settings=Pengaturan +your_profile=Profil +your_starred=Dibintangi +your_settings=Pengaturan all=Semua sources=Sumber @@ -46,34 +74,86 @@ cancel=Batal [install] install=Pemasangan +title=Konfigurasi Awal +docker_helper=Jika Anda menjalankan Gitea di dalam Docker, baca dokumentasi sebelum mengubah pengaturan. +requite_db_desc=Gitea memerlukan MySQL, PostgreSQL, MSSQL, SQLite3 atau TiDB. db_title=Pengaturan Basis Data db_type=Tipe Basis Data host=Host +user=Nama Pengguna password=Kata Sandi db_name=Nama Basis Data +db_helper=Catatan untuk pengguna MySQL: Gunakan mesin penyimpanan InnoDB dan karakter set 'utf8_general_ci'. +ssl_mode=SSL path=Jalur - +sqlite_helper=Path berkas untuk basis data SQLite3 atau TiDB.
Masukkan path absolut jika anda menjalankan Gitea sebagai layanan. +err_empty_db_path=Path basis data SQLite3 atau TiDB tidak boleh kosong. +err_invalid_tidb_name=Nama basis data TiDB tidak boleh berisi karakter '.' dan '-'. +no_admin_and_disable_registration=Anda tidak dapat menonaktifkan pendaftaran tanpa membuat akun admin. +err_empty_admin_password=Sandi administrator tidak boleh kosong. + +general_title=Pengaturan Umum +app_name=Judul Situs +app_name_helper=Anda dapat memasukkan nama perusahaan anda di sini. repo_path=Path Root Repositori +repo_path_helper=Repositori Git remote akan disimpan ke direktori ini. +lfs_path=Path Akar Git LFS +lfs_path_helper=Berkas yang tersimpan dengan Git LFS akan disimpan ke direktori ini. Biarkan kosong untuk menonaktifkan LFS. +run_user=Jalankan Sebagai Nama Pengguna +run_user_helper=Masukkan nama pengguna sistem operasi yang menjalankan Gitea. Perhatikan bahwa pengguna ini harus memiliki akses ke path akar dari repositori. +domain=SSH Server Domain +domain_helper=Alamat domain atau host untuk URL klon SSH. +ssh_port=Port Server SSH +ssh_port_helper=Nomor port server SSH anda. Biarkan kosong untuk menonaktifkan. +http_port=Port HTTP Gitea +http_port_helper=Nomor port web server dimana Gitea akan berjalan. +app_url=URL Dasar Gitea +app_url_helper=Alamat dasar untuk klon URL HTTP(S) dan pemberitahuan lewat surel. log_root_path=Path Log +log_root_path_helper=Berkas log akan ditulis ke direktori ini. optional_title=Pengaturan Opsional +email_title=Pengaturan Surel smtp_host=Host SMTP +smtp_from=Kirim Surel sebagai +smtp_from_helper=Alamat surel Gitea akan digunakan. Masukkan alamat surel atau gunakan fomat "Nama" . +mailer_user=Nama Pengguna SMTP +mailer_password=Sandi SMTP +register_confirm=Memerlukan Konfirmasi Surel Untuk Mendaftar +mail_notify=Aktifkan Pemberitahuan Surel +server_service_title=Server dan Pengaturan Layanan Pihak Ketiga +offline_mode=Aktifkan Mode Lokal +offline_mode_popup=Non-aktifkan jaringan pengiriman konten dari pihak ketiga dan layani semua sumber daya secara lokal. +disable_gravatar=Non-aktifkan Gravatar federated_avatar_lookup_popup=Mengaktifkan pencarian avatar federasi menggunakan Libravatar. openid_signin=Aktifkan Login OpenID +openid_signup=Aktifkan Pendaftaran OpenID +openid_signup_popup=Aktifkan pendaftaran berdasarkan OpenID. +enable_captcha=Aktifkan CAPTCHA enable_captcha_popup=Membutukan CAPTCHA untuk pendaftaran. +require_sign_in_view=Anda Harus Login untuk Melihat Halaman +admin_title=Pengaturan Akun Admin +admin_name=Nama Pengguna Admin admin_password=Kata sandi confirm_password=Konfirmasi Kata Sandi +admin_email=Alamat Surel install_btn_confirm=Memasang Gitea test_git_failed=Tidak dapat menguji perintah 'git': %v +sqlite3_not_available=Gitea versi ini tidak mendukung SQLite3, Silahkan untuh versi biner resmi dari %s (bukan versi 'gobuild'). +invalid_db_setting=Pengaturan basis data tidak valid: %v save_config_failed=Gagal menyimpan konfigurasi: %v [home] +uname_holder=Nama Pengguna atau Alamat Surel password_holder=Kata Sandi switch_dashboard_context=Alihkan Dasbor Konteks +my_repos=Repositori +show_more_repos=Tampilkan repositori lainnya… collaborative_repos=Repositori Kolaboratif my_orgs=Organisasi Saya my_mirrors=Duplikat Saya view_home=Lihat %s +search_repos=Cari repositori… issues.in_your_repos=Dalam repositori anda @@ -82,9 +162,16 @@ repos=Repositori users=Pengguna organizations=Organisasi search=Cari +code=Kode +repo_no_results=Tidak ditemukan repositori yang cocok. +org_no_results=Tidak ada organisasi yang cocok ditemukan. +code_no_results=Tidak ada kode sumber yang cocok dengan istilah yang anda cari. +code_search_results=Hasil pencarian untuk '%s' [auth] +create_new_account=Daftar Akun register_helper_msg=Sudah memiliki akun? Masuk sekarang! +social_register_helper_msg=Sudah memiliki akun? Hubungkan sekarang! remember_me=Ingat Saya forgot_password_title=Lupa Kata Sandi forgot_password=Lupa kata sandi? @@ -306,14 +393,17 @@ file_permalink=Permalink stored_lfs=Tersimpan dengan GIT LFS editor.preview_changes=Tinjau Perubahan +editor.name_your_file=Nama berkas… editor.or=atau editor.commit_changes=Perubahan komitmen editor.add_tmpl=Tambah '%s/' editor.add=Menambah '%s' editor.update=Memperbarui '%s' editor.delete=Menghapus '%s' +editor.commit_message_desc=Tambahkan deskripsi opsional yang panjang… editor.commit_directly_to_this_branch=Komitmen langsung ke %s cabang. editor.create_new_branch=Membuat new branch untuk tarik komit ini mulai permintaan. +editor.new_branch_name_desc=Nama branch baru… editor.cancel=Membatalkan editor.branch_already_exists=Cabang '%s' sudah ada di repositori ini. editor.no_changes_to_show=Tidak ada perubahan untuk ditampilkan. @@ -406,6 +496,7 @@ issues.edit=Sunting issues.cancel=Batal issues.save=Simpan issues.label_title=Nama label +issues.label_description=Keterangan label issues.label_color=Warna label issues.label_count=%d label issues.label_open_issues=%d masalah terbuka @@ -547,6 +638,7 @@ settings.transfer=Transfer Kepemilikan settings.delete=Menghapus Repositori Ini settings.delete_notices_1=- Operasi ini TIDAK BISA dibatalkan. settings.transfer_owner=Pemilik Baru +settings.search_user_placeholder=Cari pengguna… settings.add_webhook=Tambahkan Webhook settings.webhook.test_delivery=Percobaan Pengiriman settings.webhook.request=Permintaan @@ -584,6 +676,7 @@ settings.protected_branch_can_push_yes=Anda dapat mendorong settings.protected_branch_can_push_no=Anda tidak dapat mendorong settings.add_protected_branch=Aktifkan perlindungan settings.delete_protected_branch=Nonaktifkan perlindungan +settings.choose_branch=Pilih branch… diff.browse_source=Telusuri Sumber diff.parent=orang tua @@ -612,6 +705,7 @@ release.title=Judul release.content=Konten release.write=Menulis release.preview=Pratinjau +release.loading=Memuat… release.cancel=Membatalkan release.publish=Mempublikasikan Rilis release.save_draft=Simpan Draft @@ -636,6 +730,8 @@ people=Orang teams=Tim lower_members=anggota lower_repositories=repositori +create_new_team=Tim Baru +create_team=Buat Tim Baru org_desc=Deskripsi team_name=Nama tim team_desc=Deskripsi @@ -672,6 +768,7 @@ teams.update_settings=Memperbarui pengaturan teams.add_team_member=Tambahkan Anggota Tim teams.delete_team_success=Tim sudah di hapus. teams.repositories=Tim repositori +teams.search_repo_placeholder=Cari repositori… teams.add_team_repository=Tambahkan Tim Repositori teams.remove_repo=Menghapus teams.add_nonexistent_repo=Repositori yang ingin Anda tambahkan tidak ada; Silahkan buat terlebih dahulu. @@ -697,6 +794,7 @@ dashboard.delete_inactivate_accounts_success=Semua akun yang tidak aktif telah d dashboard.reinit_missing_repos=Menginstal kembali semua repositori Git yang hilang dimana ada catatan dashboard.reinit_missing_repos_success=Semua repositori Git yang hilang yang catatannya dan telah diinisialisasi ulang. dashboard.sync_external_users=Sinkronkan data pengguna eksternal +dashboard.git_fsck=Lakukan pemeriksaan kesehatan pada semua repositori dashboard.server_uptime=Waktu tambahan server dashboard.current_goroutine=Goroutin saat ini dashboard.current_memory_usage=Penggunaan memori saat ini @@ -709,6 +807,8 @@ dashboard.heap_memory_idle=Tumpukan memori yang menganggur dashboard.heap_memory_in_use=Tumpukan memori yang digunakan dashboard.heap_memory_released=Tumpukan memori dirilis dashboard.heap_objects=Benda tumpukan +dashboard.bootstrap_stack_usage=Penggunaan bootstrap Stack +dashboard.stack_memory_obtained=Memori Stack Didapat dashboard.mspan_structures_usage=Penggunaan struktur MSpan dashboard.mspan_structures_obtained=Struktur MSpan didapatkan dashboard.mcache_structures_usage=Penggunaan struktur MCache @@ -725,6 +825,7 @@ dashboard.gc_times=Waktu GC users.activated=Diaktifkan users.admin=Pengelola +users.repos=Repo users.created=Dibuat users.edit=Edit users.auth_source=Sumber Otentikasi @@ -795,16 +896,24 @@ config.disable_router_log=Menonaktifkan router log config.run_mode=Jalankan mode config.git_version=Versi Git config.repo_root_path=Jalur akar repositori +config.lfs_root_path=Path Root LFS config.static_file_root_path=Jalur akar berkas statis config.script_type=Jenis skrip config.reverse_auth_user=Mengembalikan pengguna otentikasi config.ssh_config=Konfigurasi SSH config.ssh_enabled=Aktif +config.ssh_port=Port +config.ssh_listen_port=Listen Port +config.ssh_root_path=Path Induk +config.ssh_key_test_path=Path Key Test +config.ssh_keygen_path=Path Keygen ('ssh-keygen') config.ssh_minimum_key_size_check=Periksa ukuran kunci minimum config.ssh_minimum_key_sizes=Ukuran kunci minimum config.db_config=Konfigurasi basis data +config.db_type=Tipe +config.db_host=Host config.db_name=Nama config.db_path=Jalur diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index e3b752851b11..d3aa6c609a89 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -169,7 +169,7 @@ profile=Profilo password=Password security=Sicurezza avatar=Avatar -ssh_gpg_keys=SSH / GPG chiavi +ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali repos=Repository delete=Elimina account @@ -201,7 +201,7 @@ add_openid=Aggiungere OpenID URI manage_ssh_keys=Gestisci chiavi SSH manage_gpg_keys=Gestisci Chiavi GPG add_key=Aggiungi Chiave -ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub crea le tue chiavi SSH o risolvere problemi comuni puoi trovare usando SSH. +ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub percrea le tue chiavi SSH o risolvere problemi comuni che potresti trovare utilizzando SSH. gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. add_new_key=Aggiungi Chiave SSH add_new_gpg_key=Aggiungi Chiave GPG @@ -302,7 +302,7 @@ editor.delete=Eliminare '%s' editor.commit_directly_to_this_branch=Impegnarsi direttamente con il %s branch. editor.create_new_branch=Creare un nuovo branch per questo commit e inizia una pull request. editor.cancel=Cancellare -editor.branch_already_exists=Branch '%s' esiste già in questo repository. +editor.branch_already_exists=Il branch '%s' esiste già in questo repository. editor.no_changes_to_show=Non ci sono cambiamenti da mostrare. editor.fail_to_update_file=Errore durante l'aggiornamento/ creazione del file '%s' con errore: %v editor.unable_to_upload_files=Impossibile caricare i file su '%s' con errore:%v @@ -513,7 +513,7 @@ settings.confirm_delete_account=Conferma Eliminazione members.member_role=Ruolo del membro: members.owner=Proprietario members.member=Membro -members.remove=Rimuovere +members.remove=Rimuovi members.leave=Abbandona members.invite_desc=Aggiungi un nuovo membro a %s: members.invite_now=Invita ora @@ -526,7 +526,7 @@ teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni teams.members=Membri del Team teams.update_settings=Aggiorna Impostazioni -teams.add_team_member=Aggiungere un Membro al Team +teams.add_team_member=Aggiungi un Membro al Team teams.repositories=Repository di Squadra teams.add_team_repository=Aggiungere Repository di Squadra teams.remove_repo=Rimuovi @@ -619,7 +619,7 @@ auths.tips=Consigli config.server_config=Configurazione Server config.disable_router_log=Disattivare Log del Router config.run_mode=Modalità Esecuzione -config.repo_root_path=Percorso Root del Repository +config.repo_root_path=Percorso radice del Repository config.static_file_root_path=Percorso Root del File Statico config.script_type=Tipo di Script config.reverse_auth_user=Autenticazione Utente Inversa @@ -685,7 +685,7 @@ config.git_mirror_timeout=Timeout per l'aggiornamento del mirror config.log_config=Configurazione Log config.log_mode=Modalità Log -monitor.cron=Incarici di cron +monitor.cron=Incarichi Cron monitor.name=Nome monitor.schedule=Agenda monitor.next=La Prossima Volta @@ -717,7 +717,7 @@ close_pull_request=`richiesta di pull chiuso %s#%[2]s` reopen_pull_request=`richiesta di riapertura riaperta %s#%[2]s` comment_issue=`ha commentato il problema %s#%[2]s` merge_pull_request=`unita pull request %s#%[2]s` -transfer_repo=ha trasferito il repository %s a %s +transfer_repo=repository %s trasferito in %s push_tag=ha pushato il tag %[2]s a %[3]s delete_tag=tag eliminato %[2]s da %[3]s delete_branch=branch eliminato %[2]s da %[3]s diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index ea32ad3c3b9c..c3a61090818c 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -1,9 +1,11 @@ +app_desc=痛みのない、自己ホスト型の Git サービス home=ホーム dashboard=ダッシュボード explore=エクスプローラ help=ヘルプ sign_in=サインイン +sign_in_with=サインインします。 sign_out=サインアウト link_account=連携アカウント register=登録 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 1b0129ba124f..0a6950b84aa1 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -1,11 +1,15 @@ +app_desc=Viegli uzstādāms Git serviss home=Sākums dashboard=Infopanelis explore=Izpētīt help=Palīdzība sign_in=Pierakstīties +sign_in_with=Pierakstīties izmantojot sign_out=Izrakstīties +sign_up=Reģistrēties link_account=Saistītie konti +link_account_signin_or_signup=Autorizējieties ar esošo lietotāja vārdu un paroli, lai piesaistītu esošam kontam, vai reģistrējieties, ja nepieciešams izveidot jaunu. register=Reģistrēties website=Mājas lapa version=Versija @@ -14,12 +18,31 @@ template=Sagatave language=Valoda notifications=Paziņojumi create_new=Izveidot… +user_profile_and_more=Profils un iestatījumi… signed_in_as=Pierakstījies kā +enable_javascript=Šī lapa labāk darbojas, ja pārlūkam ir iespējots JavaScript. username=Lietotājvārds +email=E-pasta adrese password=Parole +re_type=Atkārtoti ievadiet paroli +captcha=Cilvēktests +twofa=Divu faktoru autentifikācija +twofa_scratch=Divu faktoru vienreizējais kods passcode=Kods +u2f_insert_key=Ievietojiet Jūsu drošības atslēgu +u2f_sign_in=Nospiediet drošības atslēgas pogu. Ja nevarat to atrast, ievietojiet atkārtoti. +u2f_press_button=Nospiediet drošības atslēgas pogu… +u2f_use_twofa=Izmantot divu faktoru kodu no tālruņa +u2f_error=Nav iespējams nolasīt drošības atslēgu! +u2f_unsupported_browser=Jūsu pārlūks neatbalsta U2F atslēgas. Izmantojiet citu pārlūku. +u2f_error_1=Notikusi nezināma kļūda. Atkārtojiet darbību vēlreiz. +u2f_error_2=Pārliecinieties, ka izmantojat šifrētu savienojumu (https://) un apmeklējat pareizo URL. +u2f_error_3=Serveris nevar apstrādāt Jūsu pieprasījumu. +u2f_error_4=Nav iespējams izmantot atslēgu šim pieprasījumam. Ja mēģināt to reģistrēt, pārliecinieties, ka atslēga jau nav reģistrēta. +u2f_error_5=Iestājusies noildze nolasot atslēgu. Pārlādējiet lapu, lai atkārtotu vēlreiz. +u2f_reload=Pārlādēt repository=Repozitorijs organization=Organizācija @@ -30,8 +53,12 @@ new_mirror=Jauns spogulis new_fork=Jauns atdalīts repozitorijs new_org=Jauna organizācija manage_org=Pārvaldīt organizācijas +admin_panel=Lapas administrēšana account_settings=Konta iestatījumi settings=Iestatījumi +your_profile=Profils +your_starred=Atzīmēts ar zvaigznīti +your_settings=Iestatījumi all=Visi sources=Avoti @@ -47,31 +74,101 @@ cancel=Atcelt [install] install=Instalācija +title=Sākotnējā konfigurācija +docker_helper=Ja Gitea ir uzstādīts Docker konteinerī, izlasiet vadlīninas pirms maināt iestatījumus. +requite_db_desc=Gitea nepieciešams MySQL, PostgreSQL, MSSQL, SQLite3 vai TiDB. db_title=Datu bāzes iestatījumi db_type=Datu bāzes veids host=Resursdators +user=Lietotāja vārds password=Parole db_name=Datu bāzes nosaukums +db_helper=MySQL lietotājiem: izmantojiet InnoDB dzini ar rakstzīmju kopu 'utf8_general_ci'. +ssl_mode=SSL path=Ceļš - +sqlite_helper=Faila ceļš SQLite3 vai TiDB datu bāzei.
Ievadiet absolūto ceļu, ja Gitea tiek startēts kā serviss. +err_empty_db_path=Nepieciešams norādīt SQLite3 vai TiDB datu bāzes atrašanās vietu. +err_invalid_tidb_name=TiDB datu bāzes nosaukums nevar saturēt simbolus '.' un '-'. +no_admin_and_disable_registration=Reģistrāciju nevar atslēgt, kamēr nav izveidots administratora konts. +err_empty_admin_password=Administratora kontam ir obligāti jānorāda parole. + +general_title=Vispārīgie iestatījumi +app_name=Vietnes nosaukums +app_name_helper=Šeit var ievadīt savas kompānijas nosaukumu. repo_path=Repozitoriju glabāšanas ceļš +repo_path_helper=Git repozitoriji tiks glabāti šajā direktorijā. +lfs_path=Git LFS glabāšanas vieta +lfs_path_helper=Faili, kas pievienoti Git LFS, tiks glabāti šajā direktorijā. Atstājiet tukšu, lai atspējotu. +run_user=Izpildes lietotājs +run_user_helper=Norādiet operētājsistēmas lietotājvārdu ar kuru tiks izpildīts Gitea process. Ņemiet vērā, ka lietotājam ir jābūt rakstīšanas tiesībām repozitoriju glabāšanas vietai. +domain=SSH servera domēns +domain_helper=Domēns vai saimniekdatora adrese SSH klonēšanas URL. +ssh_port=SSH servera ports +ssh_port_helper=Porta numurs, kuru SSH serveris klausīsies. Atstājiet tukšu, lai atspējotu. +http_port=Gitea HTTP klausīšanās ports +http_port_helper=Porta numurs, kuru Gitea tīmekļa serveris klausīsies. +app_url=Gitea pamata URL +app_url_helper=Pamata adrese HTTP(S) klonēšanas URL un e-pastu paziņojumiem. log_root_path=Žurnalizēšanas ceļš +log_root_path_helper=Žurnalizēšanas faili tiks rakstīti šajā direktorijā. optional_title=Neobligātie iestatījumi +email_title=E-pastu iestatījumi smtp_host=SMTP resursdators +smtp_from=Nosūtīt e-pastu kā +smtp_from_helper=E-pasta adrese, ko Gitea izmantos. Ievadiet tika e-pasta adrese vai izmantojiet "Vārds" formātu. +mailer_user=SMTP lietotāja vārds +mailer_password=SMTP parole +register_confirm=Reģistrējoties pieprasīt apstiprināt e-pastu +mail_notify=Iespējot e-pasta paziņojumus +server_service_title=Servera un citu servisu iestatījumi +offline_mode=Iespējot bezsaistes režīmu +offline_mode_popup=Atspējot ārējos satura piegādes tīklus, lai visi resursi tiktu piegādāti lokāli. +disable_gravatar=Atspējot Gravatar +disable_gravatar_popup=Atspējot Gravatar un citus avotus, visus avatarus augšupielādēts lietotāji vai izmantos noklusēto attēlu. +federated_avatar_lookup=Iespējot apvienotās profila bildes federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. +disable_registration=Atspējot lietotāju reģistrāciju +disable_registration_popup=Atspējot iespēju reģistrēties. Tikai administratori varēs izveidot jaunus kontus. +allow_only_external_registration_popup=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus. openid_signin=Iespējot OpenID autorizāciju openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. +openid_signup=Iespējot reģistrāciju, izmantojot OpenID +openid_signup_popup=Iespējot lietotāju reģistrāciju pirms tam autorizējoties ar OpenID. +enable_captcha=Iespējot drošības kodu enable_captcha_popup=Lietotājam reģistrējoties, pieprasīt ievadīt drošības kodu. +require_sign_in_view=Iespējot nepieciešamību autorizēties, lai aplūkotu lapas +require_sign_in_view_popup=Tikai autorizēti lietotāji var aplūkot lapas. Apmeklētāji redzēs tikai autorizācijas un reģistrācijas lapu. +admin_setting_desc=Nav nepieciešams izveidot administratora kontu uzreiz, pirmais reģistrētais lietotājs saņems administratora tiesības automātiski. +admin_title=Administratora konta iestatījumi +admin_name=Administratora lietotāja vārds admin_password=Parole confirm_password=Apstipriniet paroli +admin_email=E-pasta adrese install_btn_confirm=Instalēt Gitea test_git_failed=Kļūda pārbaudot 'git' komandu: %v +sqlite3_not_available=Jūsu pašreizējā versija neatbalsta SQLite3, lūdzu lejupielādējiet oficiālo bināro versiju no %s, NEVIS gobuild versiju. +invalid_db_setting=Nederīgi datu bāzes iestatījumi: %v +invalid_repo_path=Nederīga repozitorija glabāšanas vieta: %v +run_user_not_match=Izpildes lietotājs nav pašreizējais lietotājs: %s -> %s save_config_failed=Neizdevās saglabāt konfigurāciju: %v +invalid_admin_setting=Nederīgs administratora iestatījums: %v +install_success=Laipni lūdzam! Paldies, ka izvēlējāties Gitea, patīkamu lietošanu! +invalid_log_root_path=Nederīgs žurnalizēšanas ceļš: %v +default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses +default_keep_email_private_popup=Šī ir noklusētā pazīme, lai noteiktu lietotāja e-pasta adreses redzamību. Atzīmējot to e-pasta adrese visiem jaunajiem lietotājiem nebūs redzama līdz lietotājs neizmainīs to savos iestatījumos. +default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas +default_allow_create_organization_popup=Atzīmējiet šo pazīmi, ja vēlaties, lai jauniem lietotājiem pēc noklusējuma tiek piešķirtas tiesības veidot organizācijas. +default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti +default_enable_timetracking_popup=Repozitorijiem pēc noklusējuma tiks iespējota laika uzskaite atkarībā no šī iestatījuma. +no_reply_address=Neatbildēt e-pasta adreses domēns +no_reply_address_helper=Domēns lietotāja e-pasta adresei git žurnālos, ja lietotājs izvēlas paturēt savu e-pasta adresi privātu. Piemēram, ja lietotājs ir 'janis' un domēns 'neatbildet.piemers.lv', tad e-pasta adrese būs 'janis@neatbildet.piemers.lv'. [home] +uname_holder=Lietotājvārds vai e-pasts password_holder=Parole switch_dashboard_context=Mainīt infopaneļa kontekstu +my_repos=Repozitoriji show_more_repos=Parādīt vairāk repozitorijus… collaborative_repos=Sadarbības repozitoriji my_orgs=Manas organizācijas @@ -87,30 +184,52 @@ users=Lietotāji organizations=Organizācijas search=Meklēt code=Kods +repo_no_results=Netika atrasts neviens repozitorijs, kas atbilstu kritērijiem. +user_no_results=Netika atrasts neviens lietotājs, kas atbilstu kritērijiem. +org_no_results=Netika atrasta neviena organizācija, kas atbilstu kritērijiem. +code_no_results=Netika atrasts pirmkods, kas atbilstu kritērijiem. +code_search_results=Meklēšanas rezultāti '%s' [auth] +create_new_account=Reģistrēt kontu register_helper_msg=Jau ir konts? Pieraksties tagad! +social_register_helper_msg=Jau ir konts? Pievienojies! +disable_register_prompt=Reģistrācija ir atspējota. Lūdzu, sazinieties ar vietnes administratoru. +disable_register_mail=Reģistrācijas e-pasta apstiprināšana ir atspējota. remember_me=Atcerēties mani forgot_password_title=Aizmirsu paroli forgot_password=Aizmirsi paroli? +sign_up_now=Nepieciešams konts? Reģistrējies tagad. confirmation_mail_sent_prompt=Jauns apstiprināšanas e-pasts ir nosūtīts uz %s, pārbaudies savu e-pasta kontu tuvāko %s laikā, lai pabeigtu reģistrācijas procesu. reset_password_mail_sent_prompt=Apstiprināšanas e-pasts tika nosūtīts uz %s. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai pabeigtu paroles atjaunošanas procesu. active_your_account=Aktivizēt savu kontu +prohibit_login=Aizliegt pieteikšanos +prohibit_login_desc=Jūsu konts ir bloķēts, sazinieties ar sistēmas administratoru. +resent_limit_prompt=Jūs pieprasījāt aktivizācijas e-pastu pārāk bieži. Lūdzu, uzgaidiet 3 minūtes un mēģiniet vēlreiz. has_unconfirmed_mail=Sveiki %s, Jums ir neapstiprināta e-pasta adrese (%s). Ja neesat saņēmis apstiprināšanas e-pastu vai Jums ir nepieciešams nosūtīt jaunu, lūdzu, nospiediet pogu, kas atrodas zemāk. resend_mail=Nospiediet šeit, lai vēlreiz nosūtītu aktivizācijas e-pastu email_not_associate=Šī e-pasta adrese nav saistīta ar nevienu kontu. send_reset_mail=Spiediet šeit, lai nosūtītu paroles maiņas vēstuli uz Jūsu e-pastu reset_password=Atjaunot savu paroli +invalid_code=Jūsu apstiprināšanas kodam ir beidzies derīguma termiņš vai arī tas ir nepareizs. reset_password_helper=Nospiediet šeit, lai atjaunotu paroli +password_too_short=Paroles garums nedrīkst būt mazāks par %d simboliem. +non_local_account=Ārējie konti nevar mainīt paroli, izmantojot, Gitea saskarni. verify=Pārbaudīt scratch_code=Vienreizējais kods use_scratch_code=Izmantot vienreizējo kodu twofa_scratch_used=Jūs esat izmantojis vienreizējo kodu. Jūs tikāt pārsūtīts uz divu faktoru iestatījumu lapu, lai varētu piesaistīto ierīci vai lai uzģenerētu jaunu vienreizējo kodu. +twofa_passcode_incorrect=Jūsu kods nav pareizs. Ja esat pazaudējis ierīci, izmantojiet vienreizējo kodu, lai autorizētos. twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. +login_userpass=Pierakstīties login_openid=OpenID openid_connect_submit=Pievienoties openid_connect_title=Pievienoties jau esošam kontam +openid_connect_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. openid_register_title=Izveidot jaunu kontu +openid_register_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. +openid_signin_desc=Ievadiet savu OpenID URI, piemēram: https://anna.me, peteris.openid.org.lv, gnusocial.net/janis. +disable_forgot_password_mail=Paroles atjaunošana nav pieejama. Sazinieties ar sistēmas administratoru. [mail] activate_account=Lūdzu, aktivizējiet savu kontu @@ -122,12 +241,14 @@ register_notify=Laipni lūdzam Gitea [modal] yes=Jā no=Nē +modify=Atjaunināt [form] UserName=Lietotājvārds RepoName=Repozitorija nosaukums Email=E-pasta adrese Password=Parole +Retype=Atkārtoti ievadiet paroli SSHTitle=SSH atslēgas nosaukums HttpsUrl=HTTPS URL PayloadUrl=Vērtuma URL @@ -143,6 +264,9 @@ TreeName=Faila ceļš Content=Saturs require_error=` nedrīkst būt tukšs.` +alpha_dash_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus vai domuzīmes (-_).` +alpha_dash_dot_error=` drīkst saturēt tikai latīņu alfabēta burtus, ciparus, domuzīmes (-_) vai punktu.` +git_ref_name_error=` jābūt korektam git references nosaukumam.` size_error=` jābūt %s simbolus garam.` min_size_error=` jabūt vismaz %s simbolu garumā.` max_size_error=` jabūt ne mazāk kā %s simbolu garumā.` @@ -150,70 +274,148 @@ email_error=` nav derīga e-pasta adrese.` url_error=` nav korekts URL.` include_error=` ir jāsatur tekstu '%s'.` unknown_error=Nezināma kļūda: - +captcha_incorrect=Ievadīts nepareizs drošības kods. +password_not_match=Izvēlētā parole nesakrīt ar atkārtoti ievadīto. + +username_been_taken=Lietotājvārds jau ir aizņemts. +repo_name_been_taken=Jau eksistē repozitorijs ar šādu nosaukumu. +org_name_been_taken=Organizācijas nosaukums jau ir aizņemts. +team_name_been_taken=Komandas nosaukums jau ir aizņemts. +team_no_units_error=Komandai ir jābūt iespējotai vismaz vienai sadaļai. +email_been_used=E-pasta adrese jau ir izmantota. +openid_been_used=OpenID adrese '%s' jau ir izmantota. +username_password_incorrect=Nepareizs lietotājvārds vai parole. +enterred_invalid_repo_name=Pārliecinieties, vai ievadītā repozitorija nosaukums ir pareizs. +enterred_invalid_owner_name=Pārliecinieties, vai ievadītā īpašnieka vārds ir pareizs. +enterred_invalid_password=Pārliecinieties, vai ievadītā parole ir pareiza. user_not_exist=Lietotājs neeksistē. +last_org_owner=Nevar noņemt pēdējo īpašnieku komandas lietotāju, jo organizācijām ir jābūt vismaz vienam īpašniekam. +cannot_add_org_to_team=Organizāciju nevar pievienot kā komandas biedru. +invalid_ssh_key=Nav iespējams pārbaudīt SSH atslēgu: %s +invalid_gpg_key=Nav iespējams pārbaudīt GPG atslēgu: %s +unable_verify_ssh_key=SSH atslēgu nav iespējams pārbaudīt, pārliecinieties, ka tajā nav kļūdu. auth_failed=Autentifikācija neizdevās: %v +still_own_repo=Šis konts ir vismaz viena repozitorija īpašnieks, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +still_has_org=Jūsu konts ir piesaistīts vismaz vienai organizācijai, sākumā nepieciešams to pamest. +org_still_own_repo=Organizācijai pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. target_branch_not_exist=Mērķa atzars neeksistē [user] +change_avatar=Mainīt profila attēlu… join_on=Pievienojās repositories=Repozitoriji activity=Publiskā aktivitāte followers=Sekotāji +starred=Atzīmēti repozitoriji following=Seko follow=Sekot unfollow=Nesekot form.name_reserved=Lietotājvārdu '%s' nedrīkst izmantot. +form.name_pattern_not_allowed=Lietotājvārds '%s' nav atļauts. [settings] profile=Profils +account=Konts password=Parole security=Drošība avatar=Profila attēls ssh_gpg_keys=SSH / GPG atslēgas social=Sociālie konti +applications=Lietotnes +orgs=Pārvaldīt organizācijas repos=Repozitoriji delete=Dzēst kontu twofa=Divu faktoru autentifikācija +account_link=Saistītie konti +organization=Organizācijas uid=Lietotāja ID +u2f=Drošības atslēgas public_profile=Publiskais profils +profile_desc=Konta e-pasta adrese ir publiska un tiks izmantota visiem ar kontu saistītiem paziņojumiem un no pārlūka veiktajām darbībām. +password_username_disabled=Ārējiem lietotājiem nav atļauts mainīt savu lietotāja vārdu. Sazinieties ar sistēmas administratoru, lai uzzinātu sīkāk. full_name=Pilns vārds website=Mājas lapa location=Atrašanās vieta update_profile=Mainīt profilu update_profile_success=Jūsu profila informācija tika saglabāta. +change_username=Lietotājvārds mainīts. +change_username_prompt=Piezīme: Šī darbība izmainīs norādes uz šo kontu. continue=Turpināt cancel=Atcelt +language=Valoda +lookup_avatar_by_mail=Meklēt profila bildes pēc e-pasta federated_avatar_lookup=Apvienotais profila bilžu meklētājs enable_custom_avatar=Iespējot maināmu profila attēlu choose_new_avatar=Izvēlēties jaunu profila attēlu +update_avatar=Saglabāt profila bildi delete_current_avatar=Dzēst pašreizējo profila bildi +uploaded_avatar_not_a_image=Augšupielādētais fails nav attēls. +update_avatar_success=Profila attēls tika saglabāts. +change_password=Atjaunināt paroli old_password=Pašreizējā parole new_password=Jauna parole +retype_new_password=Ievadīt paroli atkāroti +password_incorrect=Ievadīta nepareiza pašreizējā parole. +change_password_success=Parole tika veiksmīgi nomainīta. Tagad varat autorizēties ar jauno paroli. +password_change_disabled=Ārējie konti nevar mainīt paroli, izmantojot, Gitea saskarni. emails=E-pasta adreses +manage_emails=Pārvaldīt e-pasta adreses +manage_openid=Pārvaldīt OpenID adreses email_desc=Primārā e-pasta adrese tiks izmantota sūtot notifikācijas un citām dabībām. primary=Primārā +primary_email=Uzstādīt kā primāro +delete_email=Noņemt +email_deletion=Dzēst e-pasta adresi +email_deletion_desc=E-pasta adrese un ar to saistītā informācija tiks dzēsta no šī konta. Git revīzijas ar šo e-pasta adresi netiks mainītas. Vai turpināt? +email_deletion_success=E-pasta adrese ir veiksmīgi izdzēsta. +openid_deletion=Dzēst OpenID adresi +openid_deletion_desc=Dzēšot šo OpenID adresi no Jūsu konta, ar to vairs nebūs iespējams autorizēties. Vai turpināt? +openid_deletion_success=OpenID adrese tika noņemta. +add_new_email=Pievienot jaunu e-pasta adresi +add_new_openid=Pievienot jaunu OpenID vietrādi +add_email=Pievienot e-pasta adresi add_openid=Pievienot OpenID vietrādi +add_email_confirmation_sent=Jauns apstiprināšanas e-pasts tika nosūtīts uz '%s'. Pārbaudiet savu e-pasta kontu tuvāko %s laikā, lai apstiprinātu savu e-pasta adresi. +add_email_success=Jūsu jaunā e-pasta adrese tika veiksmīgi pievienota. +add_openid_success=Jūsu jaunā OpenID adrese tika veiksmīgi pievienota. +keep_email_private=Paslēpt e-pasta adresi +keep_email_private_popup=Jūsu e-pasta adrese nebūs redzama citiem lietotājiem. +openid_desc=Jūsu OpenID adreses ļauj autorizēties, izmantojot, Jūsu izvēlēto pakalpojumu sniedzēju. manage_ssh_keys=Pārvaldīt SSH atslēgas manage_gpg_keys=Pārvaldīt GPG atslēgas add_key=Pievienot atslēgu +ssh_desc=Šīs SSH atslēgas ir piesaistītas Jūsu kontam. Ir svarīgi pārliecināties, ka visas atpazīstat, jo tās ļauj piekļūt Jūsu repozitorijiem. +gpg_desc=Šīs publiskās GPG atslēgas ir saistītas ar Jūsu kontu. Paturiet privātās atslēgas drošībā, jo tās ļauj parakstīt revīzijas. ssh_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību kā izveidot jaunu SSH atslēgu vai atrisinātu biežāk sastopamās problēmas ar kurām varat saskarties, izmantojot SSH. gpg_helper=Vajadzīga palīdzība? Iepazīstieties ar GitHub pamācību par GPG. add_new_key=Pievienot SSH atslēgu add_new_gpg_key=Pievienot GPG atslēgu +ssh_key_been_used=SSH atslēga jau ir pievienota kādam kontam. +ssh_key_name_used=Publiskā atslēga ar šādu nosaukumu jau eksistē Jūsu kontā. +gpg_key_id_used=Publiskā GPG atslēga ar šādu ID jau eksistē. +gpg_no_key_email_found=Jūsu kontam nav piesaistīta neviena no šīs GPG atslēgas e-pasta adresēm. subkeys=Apakšatslēgas key_id=Atslēgas ID key_name=Atslēgas nosaukums key_content=Saturs +add_key_success=SSH atslēga '%s' tika pievienota. +add_gpg_key_success=GPG atslēga '%s' tika pievienota. +delete_key=Noņemt +ssh_key_deletion=Noņemt SSH atslēgu +gpg_key_deletion=Noņemt GPG atslēgu +ssh_key_deletion_desc=Dzēšot šo SSH atslēgu, ar to vairs nebūs iespējams autorizēties Jūsu kontā. Vai turpināt? +gpg_key_deletion_desc=Noņemot GPG atslēgu, ar to parakstītās revīzijas vairs netiks attēlotas kā verificētas. Vai turpināt? +ssh_key_deletion_success=SSH atslēga tika izdzēsta. +gpg_key_deletion_success=GPG atslēga tika izdzēsta. add_on=Pievienota valid_until=Derīga līdz valid_forever=Derīgs mūžīgi @@ -225,40 +427,95 @@ key_state_desc=Šī atslēga ir izmantota pēdējo 7 dienu laikā token_state_desc=Šis talons ir izmantots pēdējo 7 dienu laikā show_openid=Rādīt profilā hide_openid=Paslēpt no profila +ssh_disabled=SSH atspējots manage_social=Pārvaldīt piesaistītos sociālos kontus +social_desc=Šis ir saraksts ar Jūsu Gitea kontam piesaistītajiem sociālajiem kontiem. Drošības nolūkos, pārliecinieties, ka atpazīstat visus no tiem, jo tos var izmantot, lai pieslēgtos Jūsu Gitea kontam. +unbind=Atsaistīt +unbind_success=Sociālais konts tika atsaistīts no Jūsu Gitea konta. +manage_access_token=Pārvaldīt piekļuves talonus generate_new_token=Ģenerēt jaunu talonu +tokens_desc=Ar šiem taloniem ir iespējams piekļūt Jūsu kontam, izmantojot, Gitea API. +new_token_desc=Lietojumprogrammām, izmantojot talonus, ir pilna piekļuve Jūsu kontam. token_name=Talona nosaukums generate_token=Ģenerēt talonu +generate_token_success=Piekļuves talons tika veiksmīgi uzģenerēts! Nokopējiet to tagad, jo vēlāk to vairs nebūs iespējams redzēt. delete_token=Dzēst +access_token_deletion=Dzēst piekļuves talonu +access_token_deletion_desc=Dzēšot piekļuves talonu tiks liegta piekļuve visām aplikācijām, kas to izmanto. Vai turpināt? +delete_token_success=Piekļuves talons tika noņemts. Neaizmirstiet atjaunot informāciju lietojumprogrammās, kas izmantoja šo talonu. +twofa_desc=Divu faktoru autentifikācija uzlabo Jūsu konta drošību. twofa_is_enrolled=Kontam ir ieslēgta divu faktoru autentifikācija. twofa_not_enrolled=Jūsu kontam nav ieslēgta divu faktoru autentifikācija. +twofa_disable=Atslēgt divu faktoru autentifikāciju +twofa_scratch_token_regenerate=Ģenerēt jaunu vienreizējo kodu +twofa_scratch_token_regenerated=Tagad Jūsu vienreizējais kods ir %s. Saglabājiet to drošā vietā. +twofa_enroll=Ieslēgt divu faktoru autentifikāciju +twofa_disable_note=Nepieciešamības gadījumā divu faktoru autentifikāciju ir iespējams atslēgt. +twofa_disable_desc=Atslēdzot divu faktoru autentifikāciju Jūsu konts vairs nebūs tik drošs. Vai turpināt? +regenerate_scratch_token_desc=Ja esat aizmirsis vienreizējo kodu vai jau esat to izmantojis, lai autorizētos, atjaunojiet to šeit. twofa_disabled=Divu faktoru autentifikācija ir atslēgta. scan_this_image=Noskenējiet šo attēlu ar autentifikācijas lietojumprogrammu: or_enter_secret=Vai ievadiet šo noslēpumu: %s - - +then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas: +passcode_invalid=Nederīgs piekļuves kods. Mēģiniet ievadīt atkārtoti. +twofa_enrolled=Kontam tagad ir ieslēgta divu faktoru autentifikācija. Saglabājiet savu vienreizējo kodu (%s), jo tas vairāk netiks parādīts! + +u2f_desc=Drošības atslēgas ir aparatūras ierīces, kas satur kriptogrāfiskās atslēgas. Tās var tikt izmantotas, lai nodrošinātu divu faktoru autentifikāciju. Drošības atslēgām ir jāatbalsta FIDO U2F standarts. +u2f_require_twofa=Jābūt iespējotai divu faktoru autentifikācija, lai varētu izmantot drošības atslēgas. +u2f_register_key=Pievienot drošības atslēgu +u2f_nickname=Segvārds +u2f_press_button=Nospiediet pogu uz Jūsu drošības atslēgas, lai to reģistrētu. +u2f_delete_key=Noņemt drošības atslēgu +u2f_delete_key_desc=Noņemot drošības atslēgu ar to vairs nebūs iespējams autorizēties. Vai turpināt? + +manage_account_links=Pārvaldīt saistītos kontus +manage_account_links_desc=Šādi ārējie konti ir piesaistīti Jūsu Gitea kontam. +account_links_not_available=Pašlaik nav neviena ārējā konta piesaistīta šim kontam. +remove_account_link=Noņemt saistīto kontu +remove_account_link_desc=Noņemot saistīto kontu, tam tiks liegta piekļuve Jūsu Gitea kontam. Vai turpināt? +remove_account_link_success=Saistītais konts tika noņemts. orgs_none=Jūs neesat nevienas organizācijas biedrs. repos_none=Jums nepieder neviens repozitorijs delete_account=Dzēst savu kontu +delete_prompt=Šī darbība pilnībā izdzēsīs Jūsu kontu, kā arī tā ir NEATGRIEZENISKA. confirm_delete_account=Apstiprināt dzēšanu +delete_account_title=Dzēst lietotāja kontu +delete_account_desc=Vai tiešām vēlaties dzēst šo kontu? [repo] owner=Īpašnieks repo_name=Repozitorija nosaukums +repo_name_helper=Labi repozitorija nosaukumi ir īsi, unikāli un tādi, ko viegli atcerēties. visibility=Redzamība +visiblity_helper=Padarīt repozitoriju privātu +visiblity_helper_forced=Jūsu sistēmas administrators ir noteicis, ka visiem no jauna izveidotajiem repozitorijiem ir jābūt privātiem. +visiblity_fork_helper=(Šīs vērtības maiņa ietekmēs arī visus atdalītos repozitorijus) +clone_helper=Nepieciešama palīdzība kā veikt klonēšana? Apmeklējiet Palīdzība lapu. fork_repo=Atdalīt repozitoriju fork_from=Atdalīt no +fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību. repo_desc=Apraksts repo_lang=Valoda +repo_gitignore_helper=Izvēlieties .gitignore sagatavi. license=Licence +license_helper=Izvēlieties licences failu. +readme=LASIMANI +readme_helper=Izvēlieties LASIMANI faila sagatavi. +auto_init=Inicializēt repozitoriju (Pievieno .gitignore, licenci un README) create_repo=Izveidot repozitoriju default_branch=Noklusējuma atzars mirror_prune=Izmest +mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā vairs neeksistē +mirror_interval=Spoguļošanas intervāls (derīgās laika vienības ir "h", "m" un "s") +mirror_interval_invalid=Nekorekts spoguļošanas intervāls. +mirror_address=Spoguļa adrese +mirror_address_desc=Lūdzu iekļaujiet adresē, ja nepieciešams, arī lietotājvārdu un paroli. +mirror_last_synced=Pēdējo reizi sinhronizēts watchers=Novērotāji stargazers=Zvaigžņdevēji forks=Atdalītie repozitoriji @@ -267,22 +524,33 @@ reactions_more=un vēl %d form.reach_limit_of_creation=Ir sasniegts Jums noteiktais %d repozitoriju ierobežojums. form.name_reserved=Repozitorija nosaukums '%s' ir jau rezervēts. +form.name_pattern_not_allowed=Repozitorija nosaukums '%s' nav atļauts. +need_auth=Nepieciešama autorizācija migrate_type=Migrācijas veids migrate_type_helper=Šis repozitorijs būs spogulis migrate_repo=Migrēt repozitoriju +migrate.clone_address=Klonēšanas adrese +migrate.clone_address_desc=Tā var būt HTTP(S) adrese vai Git 'clone' URL eksistējošam repozitorijam +migrate.clone_local_path=vai servera lokālais ceļš migrate.permission_denied=Jums nav tiesību importēt lokālu repozitoriju. +migrate.invalid_local_path=Nederīgs lokālais ceļš. Tas neeksistē vai nav direktorija. migrate.failed=Migrācija neizdevās: %v +migrate.lfs_mirror_unsupported=LFS objektu spoguļošana netiek atbalstīta - tā vietā izmantojiet 'git lfs fetch --all' un 'git lfs push --all'. mirror_from=spogulis no forked_from=atdalīts no +fork_from_self=Nav iespējams atdalīt repozitoriju, kuram esat īpašnieks. copy_link=Kopēt +copy_link_success=Saite nokopēta +copy_link_error=Izmantojiet ⌘C vai Ctrl+C, lai nokopētu copied=Kopēšana notikusi veiksmīgi unwatch=Nevērot watch=Vērot unstar=Noņemt zvaigznīti star=Pievienot zvaigznīti fork=Atdalīts +download_archive=Lejupielādēt repozitoriju no_desc=Nav apraksta quick_guide=Īsa pamācība @@ -292,6 +560,7 @@ push_exist_repo=Nosūtīt izmaiņas no komandrindas eksistējošam repozitorijam bare_message=Repozitorijs ir tukšs. code=Kods +code.desc=Piekļūt pirmkodam, failiem, revīzijām un atzariem. branch=Atzars tree=Koks filter_branch_and_tag=Filtrēt atzarus vai tagus @@ -308,11 +577,26 @@ file_raw=Neapstrādāts file_history=Vēsture file_view_raw=Rādīt neapstrādātu file_permalink=Patstāvīgā saite +file_too_large=Šis fails ir par lielu, lai to parādītu. +video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video. stored_lfs=Saglabāts Git LFS +commit_graph=Revīziju grafs +editor.new_file=Jauna datne +editor.upload_file=Augšupielādēt failu +editor.edit_file=Labot failu editor.preview_changes=Priekšskatīt izmaiņas +editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes. +editor.edit_this_file=Labot failu +editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam. +editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju. +editor.delete_this_file=Dzēst failu +editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam. +editor.file_delete_success=Fails '%s' tika izdzēsts. editor.name_your_file=Ievadiet faila nosaukumu… +editor.filename_help=Lai pievienotu direktoriju, ierakstiet tās nosaukumu un slīpsvītru ('/'). Lai noņemtu direktoriju, ielieciet kursoru pirms faila nosaukuma un nospiediet atpakaļatkāpes taustiņu. editor.or=vai +editor.cancel_lower=Atcelt editor.commit_changes=Pabeigt revīziju editor.add_tmpl=Pievienot '%s/' editor.add=Pievienot '%s' @@ -323,22 +607,38 @@ editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā editor.create_new_branch=Izveidot jaunu atzaru un izmaiņu pieprasījumu šai revīzijai. editor.new_branch_name_desc=Jaunā atzara nosaukums… editor.cancel=Atcelt +editor.filename_cannot_be_empty=Faila nosaukums nevar būt tukšs. editor.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē. +editor.directory_is_a_file=Ieraksts '%s' vecāka ceļā ir fails nevis direktorija šajā repozitorijā. +editor.file_is_a_symlink=Fails '%s' ir norāde, kuru nav iespējams labot no tīmekļa redaktora +editor.filename_is_a_directory=Faila nosaukums '%s' sakrīt ar direktorijas nosaukumu šajā repozitorijā. +editor.file_editing_no_longer_exists=Fails '%s', ko labojat, vairs neeksistē šajā repozitorijā. +editor.file_changed_while_editing=Faila saturs ir mainījies kopš sākāt to labot. Noklikšķiniet šeit, lai apskatītu, vai Nosūtiet izmaiņas atkārtoti, lai pārrakstītu. +editor.file_already_exists=Fails ar nosaukumu '%s' šajā repozitorijā jau eksistē. editor.no_changes_to_show=Nav izmaiņu, ko rādīt. editor.fail_to_update_file=Neizdevās izmainīt/izveidot failu '%s', kļūda: %v +editor.add_subdir=Pievienot direktoriju… editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju '%s', kļūda: %v editor.upload_files_to_dir=Augšupielādēt failus uz direktoriju '%s' +editor.cannot_commit_to_protected_branch=Nav atļauts veikt izmaiņas aizsargātam atzaram '%s'. +commits.desc=Pārlūkot pirmkoda izmaiņu vēsturi. commits.commits=Revīzijas +commits.search=Meklēt revīzijas… commits.find=Meklēt +commits.search_all=Visi atzari commits.author=Autors commits.message=Ziņojums commits.date=Datums commits.older=Vecāki commits.newer=Jaunāki commits.signed_by=Parakstījis +commits.gpg_key_id=GPG atslēgas ID +ext_issues=Ārējās problēmas +ext_issues.desc=Saite uz ārējo problēmu sekotāju. +issues.desc=Organizēt kļūdu ziņojumus, uzdevumus un atskaites punktus. issues.new=Jauna problēma issues.new.labels=Etiķetes issues.new.no_label=Nav etiķešu @@ -348,12 +648,19 @@ issues.new.no_milestone=Nav atskaites punktu issues.new.clear_milestone=Notīrīt atskaites punktus issues.new.open_milestone=Atvērtie atskaites punktus issues.new.closed_milestone=Aizvērtie atskaites punkti +issues.new.assignees=Atbildīgie +issues.new.clear_assignees=Noņemt atbildīgo +issues.new.no_assignees=Nav atbildīgā issues.no_ref=Nav norādīts atzars/tags issues.create=Pieteikt problēmu issues.new_label=Jauna etiķete +issues.new_label_placeholder=Etiķetes nosaukums +issues.new_label_desc_placeholder=Apraksts issues.create_label=Izveidot etiķeti issues.label_templates.title=Ielādēt sākotnēji noteikto etiķešu kopu +issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes: issues.label_templates.helper=Izvēlieties etiķešu kopu +issues.label_templates.use=Izmantot etiķešu kopu issues.label_templates.fail_to_load_file=Neizdevās ielādēt etiķetes sagataves failu '%s': %v issues.add_label_at=pievienoja etiķeti
%s
%s issues.remove_label_at=noņēma etiķeti
%s
%s @@ -369,8 +676,11 @@ issues.delete_branch_at=`izdzēsts atzars %s %s` issues.open_tab=%d atvērti issues.close_tab=%d aizvērti issues.filter_label=Etiķete +issues.filter_label_no_select=Visas etiķetes issues.filter_milestone=Atskaites punkts +issues.filter_milestone_no_select=Visi atskaites punkti issues.filter_assignee=Atbildīgais +issues.filter_assginee_no_select=Visi atbildīgie issues.filter_type=Veids issues.filter_type.all_issues=Visas problēmas issues.filter_type.assigned_to_you=Piešķirtās Jums @@ -383,6 +693,10 @@ issues.filter_sort.recentupdate=Nesen atjaunotās issues.filter_sort.leastupdate=Vissenāk atjaunotās issues.filter_sort.mostcomment=Visvairāk komentētās issues.filter_sort.leastcomment=Vismazāk komentētās +issues.filter_sort.moststars=Visvairāk atzīmētie +issues.filter_sort.feweststars=Vismazāk atzīmētie +issues.filter_sort.mostforks=Visvairāk atdalītie +issues.filter_sort.fewestforks=Vismazāk atdalītie issues.action_open=Atvērt issues.action_close=Aizvērt issues.action_label=Etiķete @@ -401,7 +715,9 @@ issues.commented_at=` komentēja %s` issues.delete_comment_confirm=Vai patiešām vēlaties dzēst šo komentāru? issues.no_content=Vēl nav satura. issues.close_issue=Aizvērt +issues.close_comment_issue=Komentēt un aizvērt issues.reopen_issue=Atvērt atkārtoti +issues.reopen_comment_issue=Komentēt un atvērt atkārtoti issues.create_comment=Komentēt issues.closed_at=`aizvērts %[2]s` issues.reopened_at=`atvērts atkārtoti %[2]s` @@ -420,6 +736,10 @@ issues.label_count=%d etiķetes issues.label_open_issues=%d atvērtas problēmas issues.label_edit=Labot issues.label_delete=Dzēst +issues.label_modify=Labot etiķeti +issues.label_deletion=Dzēst etiķeti +issues.label_deletion_desc=Dzēšot etiķeti, tā tiks noņemta no visām problēmām un izmaiņu pieprasījumiem. Vai turpināt? +issues.label_deletion_success=Etiķete tika izdzēsta. issues.label.filter_sort.alphabetically=Alfabētiski issues.label.filter_sort.reverse_alphabetically=Pretēji alfabētiski issues.label.filter_sort.by_size=Izmērs @@ -429,32 +749,70 @@ issues.attachment.open_tab=`Noklikšķiniet, lai apskatītos "%s" jaunā logā` issues.attachment.download=`Noklikšķiniet, lai lejupielādētu "%s"` issues.subscribe=Abonēt issues.unsubscribe=Atrakstīties +issues.tracker=Laika uzskaite issues.start_tracking_short=Sākt +issues.start_tracking=Uzsākt laika uzskaiti issues.start_tracking_history=` uzsāka darbu %s` issues.tracking_already_started=`Jums jau ir iesākta laika uzskaite pie citas problēmas!` issues.stop_tracking=Beigt issues.stop_tracking_history=` beidza strādāt %s` +issues.add_time=Manuāli pievienot laiku +issues.add_time_short=Pievienot laiku issues.add_time_cancel=Atcelt issues.add_time_history=` pievienoja patērēto laiku %s` issues.add_time_hours=Stundas issues.add_time_minutes=Minūtes +issues.add_time_sum_to_small=Nav norādīts laiks. issues.cancel_tracking=Atcelt issues.cancel_tracking_history=` atcēla laika uzskaiti %s` - +issues.time_spent_total=Kopējais patērētais laiks +issues.time_spent_from_all_authors=`Kopējais patērētais laiks: %s` +issues.due_date=Izpildes termiņš +issues.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. +issues.error_modifying_due_date=Neizdevās izmainīt izpildes termiņu. +issues.error_removing_due_date=Neizdevās noņemt izpildes termiņu. +issues.due_date_form=yyyy-mm-dd +issues.due_date_form_add=Pievienot izpildes termiņu +issues.due_date_form_update=Atjaunot izpildes termiņu +issues.due_date_form_remove=Noņemt izpildes termiņu +issues.due_date_not_writer=Jums ir nepieciešamas rakstīšanas tiesības uz šo repozitoriju, lai mainītu izpildes termiņu. +issues.due_date_not_set=Izpildes termiņš nav uzstādīts. +issues.due_date_added=pievienoja izpildes termiņu %s %s +issues.due_date_modified=mainīja izpildes termiņu uz %s no %s %s +issues.due_date_remove=noņēma izpildes termiņu %s %s +issues.due_date_overdue=Nokavēts + +pulls.desc=Izmaiņu pieprasījumi ļauj veikt koda pārskatīšanu un sapludināt izmaiņas. pulls.new=Jauns izmaiņu pieprasījums +pulls.compare_changes=Jauns izmaiņu pieprasījums +pulls.compare_changes_desc=Izvēlieties atzaru, kurā sapludināt izmaiņas un atzaru, no kura tās saņemt. +pulls.compare_base=pamata +pulls.compare_compare=salīdzināmais pulls.filter_branch=Filtrēt atzarus pulls.no_results=Nekas netika atrasts. +pulls.nothing_to_compare=Nav ko salīdzināt, jo bāzes un salīdzināmie atzari ir vienādi. +pulls.has_pull_request=`Jau eksistē izmaiņu pieprasījums starp šiem diviem atzariem: %[2]s#%[3]d` pulls.create=Izveidot izmaiņu pieprasījumu pulls.title_desc=vēlas sapludināt %[1]d revīzijas no %[2]s uz %[3]s pulls.merged_title_desc=sapludināja %[1]d revīzijas no %[2]s uz %[3]s %[4]s pulls.tab_conversation=Saruna pulls.tab_commits=Revīzijas +pulls.tab_files=Izmainītie faili pulls.reopen_to_merge=Atkārtoti atveriet izmaiņu pieprasījumu, lai veiktu sapludināšanu. pulls.merged=Sapludināts +pulls.has_merged=Šis izmaiņu pieprasījums tika veiksmīgi sapludināts. +pulls.data_broken=Izmaiņu pieprasījums ir bojāts, jo dzēsta informācija no atdalītā repozitorija. +pulls.is_checking=Notiek konfliktu pārbaude, mirkli uzgaidiet un atjaunojiet lapu. pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski sapludināt. +pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski sapludināts konfliktu dēļ. +pulls.cannot_auto_merge_helper=Sapludiniet manuāli, lai atrisinātu konfliktus. +pulls.no_merge_desc=Šo izmaiņu pieprasījumu nav iespējams sapludināt, jo nav atļauts neviens sapludināšanas veids. +pulls.no_merge_helper=Lai sapludinātu šo izmaiņu pieprasījumu, iespējojiet vismaz vienu sapludināšanas veidu repozitorija iestatījumos vai sapludiniet to manuāli. pulls.merge_pull_request=Izmaiņu pieprasījuma sapludināšana pulls.rebase_merge_pull_request=Pārbāzēt un sapludināt pulls.squash_merge_pull_request=Saspiest un sapludināt +pulls.invalid_merge_option=Nav iespējams izmantot šādu sapludināšanas veidu šim izmaiņu pieprasījumam. +pulls.open_unmerged_pull_exists=`Jūs nevarat veikt atkārtotas atvēršanas darbību, jo jau eksistē izmaiņu pieprasījums (#%d) ar šādu sapludināšanas informāciju.` milestones.new=Jauns atskaites punkts milestones.open_tab=%d atvērti @@ -463,13 +821,22 @@ milestones.closed=Aizvērts %s milestones.no_due_date=Bez termiņa milestones.open=Atvērta milestones.close=Aizvērt +milestones.new_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam. milestones.create=Izveidot atskaites punktu milestones.title=Virsraksts milestones.desc=Apraksts milestones.due_date=Termiņš (neobligāts) milestones.clear=Notīrīt +milestones.invalid_due_date_format=Izpildes termiņam ir jābūt formāta 'yyyy-mm-dd'. +milestones.create_success=Atskaites punkts '%s' tika veiksmīgi izveidots. milestones.edit=Labot atskaites punktu +milestones.edit_subheader=Atskaites punkti, ļauj organizēt problēmas un sekot to progresam. milestones.cancel=Atcelt +milestones.modify=Labot atskaites punktu +milestones.edit_success=Izmaiņas atskaites punktā '%s' tika veiksmīgi saglabātas. +milestones.deletion=Dzēst atskaites punktu +milestones.deletion_desc=Dzēšot šo atskaites punktu, tas tiks noņemts no visām saistītajām problēmām un izmaiņu pieprasījumiem. Vai turpināt? +milestones.deletion_success=Atskaites punkts tika veiksmīgi izdzēsts. milestones.filter_sort.closest_due_date=Tuvākais termiņš milestones.filter_sort.furthest_due_date=Tālākais termiņš milestones.filter_sort.least_complete=Vismazāk pabeigtais @@ -477,17 +844,26 @@ milestones.filter_sort.most_complete=Visvairāk pabeigtais milestones.filter_sort.most_issues=Visvairāk problēmu milestones.filter_sort.least_issues=Vismazāk problēmu +ext_wiki=Ārējā vikivietne +ext_wiki.desc=Ārējā vikivietne norāda uz ārējo vikivietnes adresi. wiki=Vikivietne +wiki.welcome=Laipni lūgti vikivietnē. +wiki.welcome_desc=Vikivietne ļauj Jums un Jūsu līdzstrādniekiem viegli dokumentēt projektu. +wiki.desc=Vikivietne ir vieta, kur uzglabāt dokumentāciju. +wiki.create_first_page=Izveidot pirmo lapu wiki.page=Lapa wiki.filter_page=Meklēt lapu +wiki.new_page=Lapa wiki.default_commit_message=Ierakstiet piezīmes par šīs lapas izmaiņām (neobligāts). wiki.save_page=Saglabāt lapu wiki.last_commit_info=%s laboja lapu %s wiki.edit_page_button=Labot wiki.new_page_button=Jauna lapa wiki.delete_page_button=Dzēst lapu +wiki.delete_page_notice_1=Šī darbība izdzēsīs vikivietnes lapu '%s'. Vai turpināt? wiki.page_already_exists=Vikivietnes lapa ar šādu nosaukumu jau eksistē. +wiki.reserved_page=Vikivietnes lapas nosaukums '%s' ir rezervēts. wiki.pages=Lapas wiki.last_updated=Pēdējo reizi labota %s @@ -524,6 +900,9 @@ activity.closed_issue_label=Slēgta activity.new_issues_count_1=Jauna problēma activity.new_issues_count_n=Jaunas problēmas activity.new_issue_label=Atvērta +activity.title.unresolved_conv_1=%d neatrisināta diskusija +activity.title.unresolved_conv_n=%d neatrisinātas diskusijas +activity.unresolved_conv_desc=Saraksts ar visām problēmām un izmaiņu pieprasījumiem, kas nesen mainīti un vēl nav atrisināti. activity.unresolved_conv_label=Atvērts activity.title.releases_1=%d versiju activity.title.releases_n=%d versijas @@ -536,6 +915,9 @@ search.results=Meklēšanas rezultāti nosacījumam "%s" repozitorijā tīmekļa āķu rokasgrāmatā. +settings.webhook_deletion=Noņemt tīmekļa āķi +settings.webhook_deletion_desc=Noņemot tīmekļa āķi, tiks dzēsti visi tā iestatījumi un piegādes vēsture. Vai turpināt? +settings.webhook_deletion_success=Tīmekļa āķis tika noņemts. settings.webhook.test_delivery=Testa piegāde +settings.webhook.test_delivery_desc=Veikt viltus push-notikuma piegādi, lai notestētu Jūsu tīmekļa āķa iestatījumus. +settings.webhook.test_delivery_success=Pārbaudes tīmekļa āķis tika veiksmīgi pievienots piegādes rindai. Var paiet vairākas sekundes līdz tas parādās piegādes vēsturē. settings.webhook.request=Pieprasījums settings.webhook.response=Atbilde settings.webhook.headers=Galvenes +settings.webhook.payload=Saturs settings.webhook.body=Saturs +settings.githooks_desc=Git āķus apstrādā pats Git. Jūs varat labot atbalstīto āku failus sarakstā zemāk, lai veiktu pielāgotas darbības. settings.githook_edit_desc=Ja āķis nav aktīvs, tiks attēlots piemērs kā to izmantot. Atstājot āķa saturu tukšu, tas tiks atspējots. settings.githook_name=Āķa nosaukums settings.githook_content=Āķa saturs settings.update_githook=Labot āķi +settings.add_webhook_desc=Uz norādīto URL tiks nosūtīts POST pieprasījums ar notikuma datiem. Detalizētāku informāciju ir iespējams uzzināt tīmekļa āķu rokasgrāmatā. +settings.payload_url=Saņēmēja URL +settings.content_type=POST satura tips settings.secret=Noslēpums settings.slack_username=Lietotājvārds settings.slack_icon_url=Ikonas URL settings.discord_username=Lietotāja vārds settings.discord_icon_url=Ikonas URL settings.slack_color=Krāsa +settings.event_desc=Izsaukt notikumiem: +settings.event_push_only=Izmaiņu nosūtīšanas notikumi +settings.event_send_everything=Visus notikumus +settings.event_choose=Izvēlēties notikumus… settings.event_create=Izveidot +settings.event_create_desc=Atzara vai taga izveidošana. +settings.event_delete=Dzēst +settings.event_delete_desc=Atzars vai tags izdzēsts +settings.event_fork=Atdalīts +settings.event_fork_desc=Repozitorijs atdalīts +settings.event_issues=Problēmas +settings.event_issues_desc=Problēmas atvērtas, aizvērtas, atkārtoti atvērtas, labotas, pievienots vai noņemts atbildīgais, pievienota etiķete, noņemta etiķete, pievienots vai noņemts atskaites punkts. +settings.event_issue_comment=Problēmas komentārs +settings.event_issue_comment_desc=Problēmas komentārs pievienots, labots vai dzēsts. +settings.event_release=Laidiens +settings.event_release_desc=Publicēts, atjaunots vai dzēsts laidiens repozitorijā. settings.event_pull_request=Izmaiņu pieprasījums +settings.event_pull_request_desc=Atvērts, aizvērts, atkāroti atvērts, labots, piešķirts vai noņemts izmaiņu pieprasījums, vai mainīta etiķete, vai veikta sinhronizācija. settings.event_push=Izmaiņu nosūtīšana +settings.event_push_desc=Git izmaiņu nosūtīšana uz repozitoriju. settings.event_repository=Repozitorijs +settings.event_repository_desc=Repozitorijs izveidots vai dzēsts. +settings.active=Iekļaut notikuma detaļas +settings.active_helper=Pievienot pieprasījumam informāciju par notikuma izcelsmi. +settings.add_hook_success=Tīmekļa āķis tika pievienots. settings.update_webhook=Mainīt tīmekļa āķi +settings.update_hook_success=Tīmekļa āķis tika atjaunots. +settings.delete_webhook=Noņemt tīmekļa āķi settings.recent_deliveries=Pēdējās piegādes settings.hook_type=Āķa veids +settings.add_slack_hook_desc=Integrēt Slack repozitorijā. settings.slack_token=Talons settings.slack_domain=Domēns settings.slack_channel=Kanāls +settings.add_discord_hook_desc=Integrēt Discord repozitorijā. +settings.add_dingtalk_hook_desc=Integrēt Dingtalk repozitorijā. settings.deploy_keys=Izvietot atslēgas settings.add_deploy_key=Pievienot izvietošanas atslēgu +settings.deploy_key_desc=Izvietošanas atslēgām ir lasīšanas piekļuve repozitorijam. +settings.is_writable=Iespējot rakstīšanas piekļuvi +settings.is_writable_info=Atļaut šai izvietošanas atslēgai nosūtīt izmaiņas uz repozitoriju. +settings.no_deploy_keys=Pagaidām nav nevienas izvietošanas atslēgas. settings.title=Virsraksts settings.deploy_key_content=Saturs +settings.key_been_used=Izvietošanas atslēga ar šādu saturu jau ir pievienota. +settings.key_name_used=Izvietošanas atslēga ar šādu nosaukumu jau eksistē. +settings.add_key_success=Izvietošanas atslēga '%s' tika pievienota. +settings.deploy_key_deletion=Noņemt izvietošanas atslēgu +settings.deploy_key_deletion_desc=Noņemot izvietošanas atslēgu, tai tiks liegta piekļuve šim repozitorija. Vai turpināt? +settings.deploy_key_deletion_success=Izvietošanas atslēga tika noņemta. settings.branches=Atzari settings.protected_branch=Atzaru aizsargāšana settings.protected_branch_can_push=Atļaut izmaiņu nosūtīšanu? settings.protected_branch_can_push_yes=Jūs varat nosūtīt izmaiņas settings.protected_branch_can_push_no=Jūs nevarat nosūtīt izmaiņas +settings.branch_protection=Atzara aizsardzība atzaram '%s' +settings.protect_this_branch=Iespējot atzara aizsardzību +settings.protect_this_branch_desc=Neļauj dzēšanu un piespiedu Git izmaiņu nosūtīšanu uz atzaru. +settings.protect_whitelist_committers=Iespējot izmaiņu nosūtīšanas ierobežojumus +settings.protect_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām apiet izmaiņu nosūtīšanas ierobežojumus. +settings.protect_whitelist_users=Lietotāji, kas var veikt izmaiņu nosūtīšanu: +settings.protect_whitelist_search_users=Meklēt lietotājus… +settings.protect_whitelist_teams=Komandas, kas var veikt izmaiņu nosūtīšanu: +settings.protect_whitelist_search_teams=Meklēt komandas… +settings.protect_merge_whitelist_committers=Iespējot sapludināšanas ierobežošanu +settings.protect_merge_whitelist_committers_desc=Atļaut tikai noteiktiem lietotājiem vai komandām sapludināt izmaiņu pieprasījumus šajā atzarā. +settings.protect_merge_whitelist_users=Lietotāji, kas var veikt izmaiņu sapludināšanu: +settings.protect_merge_whitelist_teams=Komandas, kas var veikt izmaiņu sapludināšanu: settings.add_protected_branch=Iespējot aizsargāšanu settings.delete_protected_branch=Atspējot aizsargāšanu +settings.update_protect_branch_success=Atzara aizsardzība atzaram '%s' tika saglabāta. +settings.remove_protected_branch_success=Atzara aizsardzība atzaram '%s' tika atspējota. +settings.protected_branch_deletion=Atspējot atzara aizsardzību +settings.protected_branch_deletion_desc=Atspējojot atzara aizsardzību, ļaus lietotājiem ar rakstīšanas tiesībām nosūtīt izmaiņas uz atzaru. Vai turpināt? +settings.default_branch_desc=Norādiet noklusēto repozitorija atzaru izmaiņu pieprasījumiem un koda revīzijām: settings.choose_branch=Izvēlieties atzaru… +settings.no_protected_branch=Nav neviena aizsargātā atzara. diff.browse_source=Pārlūkot izejas kodu diff.parent=vecāks @@ -609,6 +1111,7 @@ diff.view_file=Parādīt failu diff.file_suppressed=Failā izmaiņas netiks attēlotas, jo tās ir par lielu diff.too_many_files=Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels +releases.desc=Pārvaldiet projekta versijas un lejupielādes. release.releases=Laidieni release.new_release=Jauns laidiens release.draft=Melnraksts @@ -617,31 +1120,60 @@ release.stable=Stabila release.edit=labot release.ahead=%d revīzijas atzarā %s kopš šī laidiena release.source_code=Izejas kods +release.new_subheader=Laidieni palīdz organizēt projekta versijas. +release.edit_subheader=Laidieni palīdz organizēt projekta versijas. release.tag_name=Taga nosaukums release.target=Mērķis +release.tag_helper=Izvēlieties jau esošu tagu vai izveidojiet jaunu. release.title=Virsraksts release.content=Saturs release.write=Rakstīt release.preview=Priekšskatītījums release.loading=Notiek ielāde… +release.prerelease_desc=Atzīmēt kā pirmslaidiena versiju +release.prerelease_helper=Atzīmēt, ka šo laidienu nav ieteicams lietot produkcijā. release.cancel=Atcelt release.publish=Publicēt laidienu release.save_draft=Saglabāt melnrakstu +release.edit_release=Labot laidienu +release.delete_release=Dzēst laidienu +release.deletion=Dzēst laidienu +release.deletion_desc=Dzēšot šo laidienu tiks izdzēsts arī attiecīgais Git tags. Repozitorija saturs un vēsture paliks nemainīta. Vai turpināt? release.deletion_success=Laidiens tika izdzēsts. +release.tag_name_already_exist=Laidiens ar šādu taga nosaukumu jau eksistē. +release.tag_name_invalid=Nekorekts taga nosaukums. release.downloads=Lejupielādes +branch.name=Atzara nosaukums branch.search=Meklēt atzarus +branch.already_exists=Atzars ar nosaukumu '%s' jau eksistē. branch.delete_head=Dzēst +branch.delete=Dzēst atzaru '%s' branch.delete_html=Dzēst atzaru +branch.delete_desc=Atzara dzēšana ir neatgriezeniska, kā arī tā ir NEATGRIEZENISKA. Vai turpināt? +branch.deletion_success=Atzars '%s' tika izdzēsts. +branch.deletion_failed=Neizdevās izdzēst atzaru '%s'. +branch.delete_branch_has_new_commits=Atzars '%s' nevar tik dzēsts, jo pēc sapludināšanas, tam ir pievienotas jaunas revīzijas. branch.create_branch=Izveidot atzaru %s branch.create_from=no '%s' +branch.create_success=Tika izveidots atzars '%s'. branch.branch_already_exists=Atzars '%s' šajā repozitorijā jau eksistē. +branch.branch_name_conflict=Atzara nosaukums '%s' konfliktē ar jau esošu atzaru '%s' šajā repozitorijā. +branch.tag_collision=Atzaru '%s' nevar izveidot, jo repozitorijā eksistē tags ar tādu pašu nosaukumu. branch.deleted_by=Izdzēsa %s +branch.restore_success=Tika atjaunots atzars '%s'. +branch.restore_failed=Neizdevās atjaunot atzaru '%s'. +branch.protected_deletion_failed=Atzars '%s' ir aizsargāts. To nevar izdzēst. +topic.manage_topics=Pārvaldīt tēmas +topic.done=Gatavs +topic.count_prompt=Nevar pievienot vairāk kā 25 tēmas +topic.format_prompt=Tēmas nosaukumam ir jāsākas ar burtu vai ciparu, tas var saturēt defisi(-), kā arī tas nevar būt garāks par 35 simboliem [org] org_name_holder=Organizācijas nosaukums org_full_name_holder=Organizācijas pilnais nosaukums +org_name_helper=Organizāciju nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties. create_org=Izveidot organizāciju repo_updated=Atjaunināts people=Personas @@ -653,20 +1185,37 @@ create_team=Izveidot komandu org_desc=Apraksts team_name=Komandas nosaukums team_desc=Apraksts +team_name_helper=Komandu nosaukumiem vēlams būt īsiem un tādiem, ko viegli atcerēties. +team_desc_helper=Aprakstiet komandas mērķi vai lomu. +team_permission_desc=Atļauja +team_unit_desc=Atļaut piekļuvi repozitorija sadaļām +form.name_reserved=Organizācijas nosaukums '%s' ir rezervēts. +form.name_pattern_not_allowed=Organizācijas nosaukums '%s' nav atļauts. +form.create_org_not_allowed=Jums nav tiesību veidot jauno organizāciju. settings=Iestatījumi +settings.options=Organizācija settings.full_name=Pilns vārds, uzvārds settings.website=Mājas lapa settings.location=Atrašanās vieta settings.update_settings=Mainīt iestatījumus settings.update_setting_success=Organizācijas iestatījumi tika saglabāti. +settings.change_orgname_prompt=Ņemiet vērā: Mainot organizācijas nosaukumu tiks izmainītas šīs organizācijas saites. +settings.update_avatar_success=Organizācijas attēls tika saglabāts. settings.delete=Dzēst organizāciju settings.delete_account=Dzēst šo organizāciju +settings.delete_prompt=Šī darbība pilnībā dzēsīs šo organizāciju, kā arī tā ir NEATGRIEZENISKA! settings.confirm_delete_account=Apstiprināt dzēšanu +settings.delete_org_title=Dzēst organizāciju +settings.delete_org_desc=Organizācija tiks dzēsta neatgriezeniski. Vai turpināt? settings.hooks_desc=Pievienot tīmekļa āķus, kas nostrādās visiem repozitorijiem šajā organizācijā. members.membership_visibility=Dalībnieka redzamība: +members.public=Redzams +members.public_helper=padarīt slēptu +members.private=Slēpts +members.private_helper=padarīt redzemu members.member_role=Dalībnieka loma: members.owner=Īpašnieks members.member=Biedri @@ -678,13 +1227,24 @@ members.invite_now=Uzaicināt tagad teams.join=Pievienoties teams.leave=Atstāt teams.read_access=Lasīšanas piekļuve +teams.read_access_helper=Komanda varēs skatīties un klonēt šīs organizācijas repozitorijus. teams.write_access=Rakstīšanas piekļuve +teams.write_access_helper=Šī komanda varēs lasīt un nosūtīt izmaiņas uz tās repozitorijiem. +teams.admin_access=Administratora piekļuve +teams.admin_access_helper=Šī komanda varēs nosūtīt un saņemt izmaiņas no tās repozitorijiem, kā arī pievienot tiem citus līdzstrādniekus. teams.no_desc=Komandai nav apraksta teams.settings=Iestatījumi +teams.owners_permission_desc=Īpašniekiem ir pilna piekļuve visiem repozitorijiem un ir organizācijas administratora tiesības. teams.members=Komandas biedri teams.update_settings=Saglabāt iestatījumus +teams.delete_team=Dzēst komandu teams.add_team_member=Pievienot komandas biedru +teams.delete_team_title=Dzēst komandu +teams.delete_team_desc=Dzēšot komandu, tās biedri var zaudēt piekļuvi dažiem vai pat visiem repozitorijiem. Vai turpināt? teams.delete_team_success=Komanda tika izdzēsta. +teams.read_permission_desc=Šai komandai ir lasīšanas tiesības: dalībnieki var skatīties un klonēt komandas repozitorijus. +teams.write_permission_desc=Šai komandai ir rakstīšanas tiesības: dalībnieki var lasīt un nosūtīt izmaiņas repozitorijiem. +teams.admin_permission_desc=Šai komandai ir administratora tiesības: dalībnieki var lasīt, rakstīt un pievienot citus dalībniekus komandas repozitorijiem. teams.repositories=Komandas repozitoriji teams.search_repo_placeholder=Meklēt repozitorijā… teams.add_team_repository=Pievienot komandas repozitoriju @@ -693,8 +1253,10 @@ teams.add_nonexistent_repo=Repozitorijs, kuram Jūs mēģinat pievienot neeksist [admin] dashboard=Infopanelis +users=Lietotāju konti organizations=Organizācijas repositories=Repozitoriji +authentication=Autentificēšanas avoti config=Konfigurācija notices=Sistēmas paziņojumi monitor=Uzraudzība @@ -702,6 +1264,10 @@ first_page=Pirmā last_page=Pēdējā total=Kopā: %d +dashboard.statistic=Kopsavilkums +dashboard.operations=Uzturēšanas darbības +dashboard.system_status=Sistēmas statuss +dashboard.statistic_info=Gitea datu bāze satur %d lietotājus, %d organizācijas, %d publiskās atslēgas, %d repozitorijus, %d vērošanas, %d atzīmētas zvaigznītes, %d darbības, %d piekļuves, %d problēmas, %d komentārus, %d sociālos kontus, %d sekošanas, %d spoguļošanas, %d izlaides, %d autorizācijas avotus, %d tīmekļa āķus, %d starpposmus, %d etiķetes, %d āķu uzdevumus, %d komandas, %d labotus uzdevumus, %d pielikumus. dashboard.operation_name=Darbības nosaukums dashboard.operation_switch=Pārslēgt dashboard.operation_run=Palaist @@ -709,16 +1275,30 @@ dashboard.clean_unbind_oauth=Notīrīt nepiesaistītos OAuth savienojumus dashboard.clean_unbind_oauth_success=Visi nepiesaistītie OAuth savienojumu tika izdzēsti. dashboard.delete_inactivate_accounts=Dzēst visus neaktīvos kontus dashboard.delete_inactivate_accounts_success=Visi neaktīvie konti tika izdzēsti. +dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus +dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika izdzēsti. +dashboard.delete_missing_repos=Dzēst visus repozitorijus, kam trūkst Git failu +dashboard.delete_missing_repos_success=Visi repozitoriji, kam trūka Git failu, tika pilnībā dzēsti. +dashboard.git_gc_repos=Veikt atkritumu uzkopšanas darbus visiem repozitorijiem +dashboard.git_gc_repos_success=Atkritumu uzkopšanas darbi visiem repozitorijiem pabeigti. +dashboard.resync_all_sshkeys=Pārrakstīt '.ssh/authorized_keys' failu ar Gitea SSH atslēgām. (To nav nepieciešams darīt, ja izmantojat iebūvēto SSH serveri.) +dashboard.resync_all_sshkeys_success=Visas Gitea kontrolētās publiskās atslēgas tika pārrakstītas. +dashboard.resync_all_hooks=Pārsinhronizēt pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķus visiem repozitorijiem. +dashboard.resync_all_hooks_success=Visu repozitoriju pirms-saņemšanas, atjaunošanas un pēc-saņemšanas āķi tika atjaunoti. dashboard.reinit_missing_repos=Atkārtoti inicializēt visus pazaudētos Git repozitorijus par kuriem eksistē ieraksti dashboard.reinit_missing_repos_success=Visi pazaudētie Git repozitoriji, par kuriem eksistēja ieraksti, tika atkārtoti inicializēti. dashboard.sync_external_users=Sinhronizēt ārējo lietotāju datus +dashboard.sync_external_users_started=Uzsākta ārējo lietotāju sinhronizācija. dashboard.git_fsck=Izpildīt korektuma pārbaudes visiem repozoitorijiem +dashboard.git_fsck_started=Repozitorija veselības pārbaudes uzsāktas. dashboard.server_uptime=Servera darbības laiks dashboard.current_goroutine=Izmantotās Gorutīnas dashboard.current_memory_usage=Pašreiz izmantotā atmiņa dashboard.total_memory_allocated=Kopējā piešķirtā atmiņa dashboard.memory_obtained=Iegūtā atmiņa dashboard.pointer_lookup_times=Rādītāju meklēšanas reizes +dashboard.memory_allocate_times=Atmiņas piešķiršanas reizes +dashboard.memory_free_times=Atmiņas atbrīvošanas reizes dashboard.current_heap_usage=Pašreizējā kaudzes izmantošana dashboard.heap_memory_obtained=Iegūtā kaudzes atmiņa dashboard.heap_memory_idle=Neizmantotā kaudzes atmiņa @@ -741,18 +1321,43 @@ dashboard.total_gc_pause=Kopējais GC izpildes laiks dashboard.last_gc_pause=Pedējās GC izpildes laiks dashboard.gc_times=GC reizes +users.user_manage_panel=Lietotāju kontu pārvaldība +users.new_account=Izveidot lietotāja kontu +users.name=Lietotājvārds users.activated=Aktivizēts users.admin=Administrators users.repos=Repozitoriji users.created=Izveidots +users.last_login=Pēdējā autorizācija +users.never_login=Nekad nav autorizējies +users.send_register_notify=Nosūtīt lietotājam reģistrācijas paziņojumu +users.new_success=Lietotāja konts '%s' tika izveidots. users.edit=Labot users.auth_source=Autentificēšanas avots users.local=Iebūvētā +users.auth_login_name=Autentifikācijas pieteikšanās vārds +users.password_helper=Atstājiet paroli tukšu, ja nevēlaties mainīt. +users.update_profile_success=Lietotāja konts tika atjaunots. +users.edit_account=Labot lietotāja kontu +users.max_repo_creation=Maksimāls repozitoriju skaits +users.max_repo_creation_desc=(Ievadiet -1 lai izmantotu noklusēto globālo ierobežojumu) +users.is_activated=Lietotāja konts ir aktivizēts +users.prohibit_login=Atspējota pieslēgšanās +users.is_admin=Administratora tiesības +users.allow_git_hook=Atļaut veidot git āķus +users.allow_import_local=Atļauts importēt lokālus repozitorijus +users.allow_create_organization=Atļauts veidot organizācijas +users.update_profile=Mainīt lietotāja kontu +users.delete_account=Dzēst lietotāja kontu +users.still_own_repo=Lietotājam pieder repozitoriji, tos sākumā ir nepieciešams izdzēst vai mainīt to īpašnieku. +users.still_has_org=Šis lietotājs ir vienas vai vairāku organizāciju biedrs, lietotāju sākumā ir nepieciešams pamest šīs organizācijas vai viņu no tām ir jāizdzēš. +users.deletion_success=Lietotāja konts veiksmīgi izdzēsts. orgs.org_manage_panel=Organizāciju pārvaldība orgs.name=Nosaukums orgs.teams=Komandas orgs.members=Dalībnieki +orgs.new_orga=Jauna organizācija repos.repo_manage_panel=Repozitoriju pārvaldība repos.owner=Īpašnieks @@ -760,12 +1365,16 @@ repos.name=Nosaukums repos.private=Privāts repos.watches=Vērošana repos.stars=Atzīmētās zvaigznītes +repos.forks=Atdalītie repos.issues=Problēmas repos.size=Izmērs +auths.auth_manage_panel=Autentifikācijas avotu pārvaldība +auths.new=Pievienot autentifikācijas avotu auths.name=Nosaukums auths.type=Veids auths.enabled=Iespējots +auths.syncenabled=Iespējot lietotāju sinhronizāciju auths.updated=Atjaunināta auths.auth_type=Autentifikācijas tips auths.auth_name=Autentifikācijas nosaukums @@ -775,8 +1384,18 @@ auths.host=Resursdators auths.port=Ports auths.bind_dn=Saistīšanas DN auths.bind_password=Saistīšanas parole +auths.bind_password_helper=Brīdinājums: Šī parole tiks glabāta nešifrētā veidā. Ieteicams izmantot kontu ar tikai lasīšanas tiesībām. auths.user_base=Lietotāja pamatnosacījumi auths.user_dn=Lietotāja DN +auths.attribute_username=Lietotājvārda atribūts +auths.attribute_username_placeholder=Atstājiet tukšu, ja vēlaties, lai tiek izmantots Gitea ievadītais lietotājvārds. +auths.attribute_name=Vārda atribūts +auths.attribute_surname=Uzvārda atribūts +auths.attribute_mail=E-pasta atribūts +auths.attribute_ssh_public_key=Publiskās SSH atslēgas atribūts +auths.attributes_in_bind=Nolasīt atribūtus no saistīšanas DN konteksta +auths.use_paged_search=Izmantot, dalīto pa lapām, meklēšanu +auths.search_page_size=Lapas izmērs auths.filter=Lietotāju filts auths.admin_filter=Administratoru filtrs auths.ms_ad_sa=MS AD meklēšanas atribūti @@ -784,6 +1403,7 @@ auths.smtp_auth=SMTP autentifikācijas tips auths.smtphost=SMTP resursdators auths.smtpport=SMTP ports auths.allowed_domains=Atļautie domēni +auths.allowed_domains_helper=Atstājiet tukšu, lai atļautu visus domēnus. Lai norādītu vairākus domēnus, tos var atdalīt ar komatu (','). auths.enable_tls=Iespējot TLS šifrēšanu auths.skip_tls_verify=Izlaist TLS pārbaudi auths.pam_service_name=PAM servisa nosaukums @@ -791,6 +1411,7 @@ auths.oauth2_provider=OAuth2 pakalpojuma sniedzējs auths.oauth2_clientID=Klienta ID (atslēga) auths.oauth2_clientSecret=Klienta noslēpums auths.openIdConnectAutoDiscoveryURL=OpenID Connect automātiskās atklāšanas URL +auths.oauth2_use_custom_url=Noklusēto URL vietā izmantot pielāgotos URL auths.oauth2_tokenURL=Talona URL auths.oauth2_authURL=Autorizācijas URL auths.oauth2_profileURL=Profila URL @@ -800,27 +1421,48 @@ auths.tips=Padomi auths.tips.oauth2.general=OAuth2 autentifikācija auths.tips.oauth2.general.tip=Reģistrējot jaunu OAuth2 autentifikāciju, atsauces/pārsūtīšanas URL ir jābūt: /user/oauth2//callback auths.tip.oauth2_provider=OAuth2 pakalpojuma sniedzējs +auths.tip.bitbucket=Reģistrējiet jaunu OAuth klientu adresē https://bitbucket.org/account/user//oauth-consumers/new un piešķiriet tam "Account" - "Read" tiesības auths.tip.dropbox=Izveidojiet jaunu aplikāciju adresē https://www.dropbox.com/developers/apps auths.tip.facebook=Reģistrējiet jaunu aplikāciju adresē https://developers.facebook.com/apps un pievienojiet produktu "Facebook Login auths.tip.github=Reģistrējiet jaunu aplikāciju adresē https://github.com/settings/applications/new auths.tip.gitlab=Reģistrējiet jaunu aplikāciju adresē https://gitlab.com/profile/applications +auths.tip.google_plus=Iegūstiet OAuth2 klienta pilnvaru no Google API konsoles adresē https://console.developers.google.com/ auths.tip.openid_connect=Izmantojiet OpenID pieslēgšanās atklāšanas URL (/.well-known/openid-configuration), lai norādītu galapunktus +auths.tip.twitter=Dodieties uz adresi https://dev.twitter.com/apps, izveidojiet aplikāciju un pārliecinieties, ka ir atzīmēts “Allow this application to be used to Sign in with Twitter” +auths.edit=Labot autentifikācijas avotu +auths.activated=Autentifikācijas avots ir atkivizēts auths.new_success=Jauna autentifikācija'%s' tika pievienota. +auths.update_success=Autentifikācijas avots tika atjaunots. +auths.update=Atjaunot autentifikācijas avotu +auths.delete=Dzēst autentifikācijas avotu auths.delete_auth_title=Dzēst autentifikācijas avotu +auths.delete_auth_desc=Izdzēšot autentifikācijas avotu, tā lietotājiem nebūs iespējams autorizēties. Vai turpināt? +auths.still_in_used=Šo autentificēšanās avotu joprojām izmanto viens vai vairāki lietotāji, tos nepieciešams izdzēst vai pārvietot uz citu autentificēšanās avotu. +auths.deletion_success=Autentifikācijas avots tika atjaunots. +auths.login_source_exist=Autentifikācijas avots ar nosaukumu '%s' jau eksistē. config.server_config=Servera konfigurācija +config.app_name=Vietnes nosaukums +config.app_ver=Gitea versija +config.app_url=Gitea pamata URL config.custom_conf=Konfigurācijas faila ceļš +config.domain=SSH servera domēns +config.offline_mode=Bezsaistes režīms config.disable_router_log=Atspējot maršrutētāja žurnalizēšanu +config.run_user=Izpildes lietotājs config.run_mode=Izpildes režīms config.git_version=Git versija config.repo_root_path=Repozitoriju glabāšanas vieta config.lfs_root_path=LFS saknes ceļš config.static_file_root_path=Statisko failu atrašanās vieta +config.log_file_root_path=Žurnalizēšanas ceļš config.script_type=Skripta veids config.reverse_auth_user=Reversā lietotāja autentifikācija config.ssh_config=SSH konfigurācija config.ssh_enabled=Iespējots +config.ssh_start_builtin_server=Izmantot iebūvēto serveri +config.ssh_domain=Servera domēns config.ssh_port=Ports config.ssh_listen_port=Klausīšanās ports config.ssh_root_path=Saknes ceļš @@ -833,19 +1475,36 @@ config.db_config=Datu bāzes konfigurācija config.db_type=Veids config.db_host=Resursdators config.db_name=Nosaukums +config.db_user=Lietotājvārds +config.db_ssl_mode=SSL config.db_path=Ceļš config.service_config=Pakalpojuma konfigurācija +config.register_email_confirm=Reģistrējoties pieprasīt apstiprināt e-pasta adresi +config.disable_register=Atspējot lietotāju reģistrāciju +config.allow_only_external_registration=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus +config.enable_openid_signup=Iespējot reģistrāciju, izmantojot OpenID +config.enable_openid_signin=Iespējot OpenID autorizāciju config.show_registration_button=Rādīt reģistrēšanās pogu +config.require_sign_in_view=Iespējot nepieciešamību autorizēties, lai aplūkotu lapas +config.mail_notify=Iespējot e-pasta paziņojumus config.disable_key_size_check=Atspējot atslēgas minimālā garuma pārbaudi +config.enable_captcha=Iespējot drošības kodu config.active_code_lives=Aktīvā koda ilgums config.reset_password_code_lives=Atjaunot paroles koda derīguma laiku +config.default_keep_email_private=Pēc noklusējuma slēpt e-pasta adreses +config.default_allow_create_organization=Pēc noklusējuma ļaut veidot organizācijas +config.enable_timetracking=Iespējot laika uzskaiti +config.default_enable_timetracking=Pēc noklusējuma iespējot laika uzskaiti +config.default_allow_only_contributors_to_track_time=Atļaut tikai dalībniekiem uzskaitīt laiku +config.no_reply_address=Neatbildēt e-pasta adreses domēns config.webhook_config=Tīkla āķu konfigurācija config.queue_length=Rindas garums config.deliver_timeout=Piegādes noildze config.skip_tls_verify=Izlaist TLS pārbaudi +config.mailer_config=SMTP sūtītāja konfigurācija config.mailer_enabled=Iespējota config.mailer_disable_helo=Atspējot HELO config.mailer_name=Nosaukums @@ -853,6 +1512,10 @@ config.mailer_host=Resursdators config.mailer_user=Lietotājs config.mailer_use_sendmail=Izmantot Sendmail config.mailer_sendmail_path=Ceļš līdz sendmail programmai +config.mailer_sendmail_args=Papildus Sendmail komandrindas argumenti +config.send_test_mail=Nosūtīt pārbaudes e-pastu +config.test_mail_failed=Neizdevās nosūtīt pārbaudes e-pastu uz '%s': %v +config.test_mail_sent=Pārbaudes e-pasts tika nosūtīts uz '%s'. config.oauth_config=OAuth konfigurācija config.oauth_enabled=Iespējots @@ -872,6 +1535,7 @@ config.session_life_time=Sesijas ilgums config.https_only=Tikai HTTPS config.cookie_life_time=Sīkdatņu glabāšanas ilgums +config.picture_config=Attēlu un profila bilžu konfigurācija config.picture_service=Lokāli attēli config.disable_gravatar=Atspējot Gravatar config.enable_federated_avatar=Iespējot apvienotās profila bildes @@ -896,6 +1560,7 @@ monitor.name=Nosaukums monitor.schedule=Grafiks monitor.next=Nākošās izpildes laiks monitor.previous=Pēdējās izpildes laiks +monitor.execute_times=Izpildes monitor.process=Darbojošies procesi monitor.desc=Apraksts monitor.start=Sākuma laiks @@ -956,6 +1621,8 @@ raw_seconds=sekundes raw_minutes=minūtes [dropzone] +default_message=Ievelciet failus vai nospiediet šeit, lai augšupielādētu. +invalid_input_type=Šādus failus nav iespējams augšupielādēt. file_too_big=Faila izmērs ({{filesize}} MB) pārsniedz maksimāli atļauto izmēru ({{maxFilesize}} MB). remove_file=Noņemt failu @@ -963,6 +1630,8 @@ remove_file=Noņemt failu notifications=Paziņojumi unread=Neizlasītie read=Izlasītie +no_unread=Nav nelasītu paziņojumu. +no_read=Nav izlasītu paziņojumu. pin=Piespraust paziņojumu mark_as_read=Atzīmēt kā izlasītu mark_as_unread=Atzīmēt kā nelasītu @@ -971,8 +1640,12 @@ mark_all_as_read=Atzīmēt visus kā izlasītus [gpg] error.extract_sign=Neizdevās izgūt parakstu error.generate_hash=Neizdevās uzģenerēt revīzijas jaucējkodu +error.no_committer_account=Revīzijas autora e-pasta adrese nav piesaistīta nevienam kontam error.no_gpg_keys_found=Šim parakstam datu bāzē netika atrasta zināma atslēga error.not_signed_commit=Nav parakstīta revīzija +error.failed_retrieval_gpg_keys=Neizdevās saņemt nevienu atslēgu, kas ir piesaistīta revīzijas autora kontam [units] +error.no_unit_allowed_repo=Jums nav tiesību aplūkot nevienu šī repozitorija sadaļu. +error.unit_not_allowed=Jums nav tiesību piekļūt šai repozitorija sadaļai. diff --git a/options/locale/locale_nb-NO.ini b/options/locale/locale_nb-NO.ini index ad90df481220..c1813c92facd 100644 --- a/options/locale/locale_nb-NO.ini +++ b/options/locale/locale_nb-NO.ini @@ -61,11 +61,17 @@ smtp_host=SMTP-vert admin_password=Passord [home] +password_holder=Passord [explore] +users=Brukere [auth] +register_helper_msg=Har du allerede en konto? Logg inn nå! +remember_me=Husk meg +forgot_password_title=Glemt passord +forgot_password=Glemt passord? [mail] diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 64db50357b9e..576de0d25ae5 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -1,11 +1,15 @@ +app_desc=Een eenvoudige, self-hosted Git service home=Beginscherm dashboard=Overzicht explore=Verkennen help=Help sign_in=Inloggen +sign_in_with=Inloggen met sign_out=Uitloggen +sign_up=Registreren link_account=Account Koppelen +link_account_signin_or_signup=Login met een bestaande gebruikersnaam/wachtwoord om een bestaand account te koppelen aan dit account, of maak een nieuw account aan. register=Registreren website=Website version=Versie @@ -14,12 +18,29 @@ template=Sjabloon language=Taal notifications=Meldingen create_new=Maken… +user_profile_and_more=Profiel en instellingen… signed_in_as=Aangemeld als +enable_javascript=Deze website werkt beter met JavaScript. username=Gebruikersnaam +email=E-mail adres password=Wachtwoord +re_type=Typ uw wachtwoord opnieuw in +captcha=CAPTCHA +twofa=Twee factor authenticatie +twofa_scratch=Eenmalige twee factor authenticatie code passcode=PIN +u2f_insert_key=Uw beveiligingssleutel invoegen +u2f_sign_in=Druk op de knop op uw beveiligingssleutel. Als u een knop niet kunt vinden, deze opnieuw invoegen. +u2f_press_button=Druk op de knop op uw beveiligingssleutel… +u2f_use_twofa=Gebruik een twee-factor code van uw telefoon +u2f_error=Wij kunnen niet uw beveiligingssleutel lezen! +u2f_unsupported_browser=Uw browser geen ondersteund U2F keys. Probeer een andere browser. +u2f_error_1=Er is een onbekende fout opgetreden. Probeer het opnieuw. +u2f_error_2=Zorg voor een versleutelde verbinding (https://) en een bezoek aan de juiste URL. +u2f_error_3=De server kan uw aanvraag niet verhandelen. +u2f_reload=Herladen repository=Repository organization=Organisatie @@ -32,6 +53,8 @@ new_org=Nieuwe organisatie manage_org=Beheer organisaties account_settings=Accountinstellingen settings=Instellingen +your_profile=Profiel +your_settings=Instellingen all=Alles sources=Bronnen @@ -47,21 +70,36 @@ cancel=Annuleren [install] install=Installatie +title=Initiële configuratie +docker_helper=Als u gebruik maakt van Gitea in Docker, lees dan de documentatie voordat u iets verandert op deze pagina. +requite_db_desc=Gitea vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB. db_title=Database-instellingen db_type=Database-type host=Server +user=Gebruikersnaam password=Wachtwoord db_name=Database naam +ssl_mode=SSL path=Pad +err_empty_db_path=Het SQLite3 of TiDB database pad mag niet leeg zijn. +err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn. +general_title=Algemene Instellingen repo_path=Repositories basis map +lfs_path=Git LFS root pad +app_url=Gitea base URL log_root_path=Log-pad optional_title=Optionele instellingen +email_title=E-mail instellingen smtp_host=SMTP host +smtp_from=E-mails versturen als +mailer_user=SMTP gebruikersnaam +mailer_password=SMTP wachtwoord federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. openid_signin=OpenID-inloggen inschakelen enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker. +admin_name=Admin gebruikersnaam admin_password=Wachtwoord confirm_password=Verifieer wachtwoord install_btn_confirm=Installeer Gitea @@ -95,6 +133,8 @@ forgot_password=Wachtwoord vergeten? confirmation_mail_sent_prompt=Een nieuwe bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om je registratie te voltooien. reset_password_mail_sent_prompt=Een bevestigingsmail is gestuurd naar %s. De mail moet binnen %s worden bevestigd om wachtwoord reset proces te voltooien. active_your_account=Activeer uw account +prohibit_login=Inloggen niet toegestaan +prohibit_login_desc=Je mag met dit account niet inloggen, neem contact op met de beheerder van de site. has_unconfirmed_mail=Beste %s, u heeft een onbevestigd e-mailadres (%s). Als u nog geen bevestiging heeft ontvangen, of u een nieuwe aanvraag wilt doen, klik dan op de onderstaande knop. resend_mail=Klik hier om uw activatie mail nog een keer te verzenden email_not_associate=Dit emailadres is niet gekoppeld aan een account. @@ -150,6 +190,8 @@ url_error=is niet een valide URL. include_error=` moet substring '%s' bevatten.` unknown_error=Onbekende fout: +username_been_taken=Deze naam is al in gebruik. +username_password_incorrect=Gebruikersnaam of wachtwoord is onjuist. user_not_exist=De gebruiker bestaat niet. auth_failed=Verificatie mislukt: %v @@ -186,6 +228,7 @@ website=Website location=Locatie update_profile=Profiel bijwerken update_profile_success=Je profiel is bijgewerkt. +change_username=Je gebruikersnaam is gewijzigd. continue=Doorgaan cancel=Annuleren @@ -709,6 +752,7 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.gc_times=GC verwerkingen +users.name=Gebruikersnaam users.activated=Geactiveerd users.admin=Beheerder users.repos=Repos @@ -783,6 +827,7 @@ config.db_config=Databaseconfiguratie config.db_type=Type config.db_host=Host config.db_name=Naam +config.db_user=Gebruikersnaam config.db_path=Pad config.service_config=Serviceconfiguratie diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 3dcb05082526..59de43ec955d 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -1,10 +1,13 @@ +app_desc=Bezbolesna usługa Git na własnym serwerze home=Strona główna dashboard=Pulpit explore=Odkrywaj help=Pomoc sign_in=Zaloguj się +sign_in_with=Zaloguj się za pomocą sign_out=Wyloguj +sign_up=Zarejestruj link_account=Powiąż konto register=Zarejestruj się website=Strona @@ -13,12 +16,21 @@ page=Strona template=Szablon language=Język notifications=Powiadomienia +create_new=Utwórz… +user_profile_and_more=Profil i ustawienia… signed_in_as=Zalogowany jako +enable_javascript=Strona działa najlepiej z włączonym JavaScript. username=Nazwa użytkownika +email=Adres e-mail password=Hasło +re_type=Wpisz ponownie hasło +captcha=CAPTCHA +twofa=Autoryzacja dwuskładnikowa +twofa_scratch=Kod jednorazowy weryfikacji dwuetapowej passcode=Kod dostępu +u2f_reload=Odśwież repository=Repozytorium organization=Organizacja @@ -29,8 +41,12 @@ new_mirror=Nowa kopia lustrzana new_fork=Nowy fork repozytorium new_org=Nowa organizacja manage_org=Zarządzaj organizacjami +admin_panel=Administracja stron account_settings=Ustawienia konta settings=Ustawienia +your_profile=Profil +your_starred=Z gwiazdką +your_settings=Ustawienia all=Wszystko sources=Źródła @@ -46,34 +62,61 @@ cancel=Anuluj [install] install=Instalacja +title=Wstępna konfiguracja db_title=Ustawienia bazy danych db_type=Typ bazy danych host=Serwer +user=Nazwa użytkownika password=Hasło db_name=Nazwa bazy danych +ssl_mode=SSL path=Ścieżka +err_empty_db_path=Ścieżka do bazy danych SQLite3 lub TiDB nie może być pusta. +err_empty_admin_password=Hasło administratora nie może być puste. +general_title=Ustawienia ogólne +app_name=Tytuł witryny +app_name_helper=Wprowadź nazwę firmy. repo_path=Katalog repozytoriów +lfs_path=Ścieżka główna Git LFS +run_user=Uruchom jako nazwa użytkownika +domain=Domena serwera SSH +ssh_port=Port serwera SSH +app_url=Podstawowy adres URL Gitea log_root_path=Ścieżka dla logów optional_title=Ustawienia opcjonalne +email_title=Ustawienia e-mail smtp_host=Serwer SMTP +smtp_from=Wyślij e-mail jako +mailer_user=Nazwa użytkownika SMTP +mailer_password=Hasło SMTP +register_confirm=Wymagają potwierdzenia e-mail przy rejestracji +mail_notify=Włącz powiadomienia e-mail +disable_gravatar=Wyłącz Gravatar federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Wyłącz rejestrację dwuskładnikową openid_signin=Włącz logowanie za pomocą OpenID +enable_captcha=Włącz CAPTCHA enable_captcha_popup=Wymagaj walidacji CAPTCHA przy samodzielnej rejestracji użytkownika. admin_password=Hasło confirm_password=Potwierdź hasło +admin_email=Adres e-mail install_btn_confirm=Zainstaluj Gitea test_git_failed=Nie udało się przetestować polecenia „git”: %v save_config_failed=Nie udało się zapisać konfiguracji: %v [home] +uname_holder=Nazwa użytkownika lub adres email password_holder=Hasło switch_dashboard_context=Przełącz kontekst pulpitu +my_repos=Repozytoria +show_more_repos=Pokaż więcej repozytoriów… collaborative_repos=Wspólne repozytoria my_orgs=Moje organizacje my_mirrors=Moje kopie lustrzane view_home=Zobacz %s +search_repos=Znajdź repozytorium… issues.in_your_repos=W Twoich repozytoriach @@ -82,12 +125,20 @@ repos=Repozytoria users=Użytkownicy organizations=Organizacje search=Wyszukiwanie +code=Kod +repo_no_results=Nie znaleziono pasujących repozytoriów. +user_no_results=Nie znaleziono pasującego użytkowników. +org_no_results=Nie znaleziono pasujących organizacji. +code_search_results=Wyniki wyszukiwania dla '%s' [auth] +create_new_account=Zarejestruj konto register_helper_msg=Masz już konto? Zaloguj się teraz! +social_register_helper_msg=Masz już konto? Powiąż je teraz! remember_me=Zapamiętaj mnie forgot_password_title=Zapomniałem hasła forgot_password=Zapomniałeś hasła? +sign_up_now=Potrzebujesz konta? Zarejestruj się teraz. confirmation_mail_sent_prompt=Nowy email aktywacyjny został wysłany na adres %s. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces rejestracji. reset_password_mail_sent_prompt=Email potwierdzający został wysłany na adres %s. Sprawdź swoją skrzynkę odbiorczą w ciągu %s aby zakończyć proces resetowania hasła. active_your_account=Aktywuj swoje konto @@ -102,6 +153,7 @@ scratch_code=Kod jednorazowy use_scratch_code=Użyj kodu jednorazowego twofa_scratch_used=Użyłeś/aś swojego kodu jednorazowego. Przekierowano Cię do strony z ustawieniami autoryzacji dwuetapowej, gdzie możesz usunąć swoje urządzenie lub wygenerować nowy kod jednorazowy. twofa_scratch_token_incorrect=Twój kod jednorazowy jest niepoprawny. +login_userpass=Zaloguj się login_openid=OpenID openid_connect_submit=Połącz openid_connect_title=Połącz z istniejącym kontem @@ -117,12 +169,14 @@ register_notify=Witamy w Gitea [modal] yes=Tak no=Nie +modify=Aktualizuj [form] UserName=Nazwa użytkownika RepoName=Nazwa repozytorium Email=Adres e-mail Password=Hasło +Retype=Wpisz ponownie hasło SSHTitle=Nazwa klucza SSH HttpsUrl=HTTPS URL PayloadUrl=URL do wywołania @@ -145,7 +199,13 @@ email_error=` nie jest poprawnym adresem e-mail.` url_error=` nie jest poprawnym adresem URL.` include_error=`musi zawierać tekst '%s'.` unknown_error=Nieznany błąd: +captcha_incorrect=Kod CAPTCHA jest nieprawidłowy. +password_not_match=Hasła nie są identyczne. +username_been_taken=Ta nazwa użytkownika jest już zajęta. +repo_name_been_taken=Nazwa repozytorium jest już zajęta. +org_name_been_taken=Nazwa organizacji jest już zajęta. +team_name_been_taken=Nazwa zespołu jest już zajęta. user_not_exist=Użytkownik nie istnieje. auth_failed=Uwierzytelnienie się nie powiodło: %v @@ -154,6 +214,7 @@ auth_failed=Uwierzytelnienie się nie powiodło: %v target_branch_not_exist=Gałąź docelowa nie istnieje. [user] +change_avatar=Zmień swój awatar… join_on=Dołączył repositories=Repozytoria activity=Publiczna aktywność @@ -166,15 +227,21 @@ form.name_reserved=Nazwa użytkownika '%s' jest zarezerwowana. [settings] profile=Profil +account=Konto password=Hasło security=Bezpieczeństwo avatar=Awatar ssh_gpg_keys=Klucze SSH / GPG social=Konta społecznościowe +applications=Aplikacje +orgs=Zarządzaj organizacjami repos=Repozytoria delete=Usuń konto twofa=Autoryzacja dwuetapowa +account_link=Powiązane Konta +organization=Organizacje uid=UID +u2f=Klucze bezpieczeństwa public_profile=Profil publiczny full_name=Imię i nazwisko @@ -182,20 +249,33 @@ website=Strona location=Lokalizacja update_profile=Zaktualizuj profil update_profile_success=Twój profil został zaktualizowany. +change_username=Twój nick został zmieniony. continue=Kontynuuj cancel=Anuluj +language=Język federated_avatar_lookup=Wyszukiwanie zewnętrznych awatarów enable_custom_avatar=Włącz niestandardowe awatary choose_new_avatar=Wybierz nowy avatar +update_avatar=Aktualizuj awatar delete_current_avatar=Usuń obecny Avatar +uploaded_avatar_not_a_image=Załadowany plik nie jest obrazem. +update_avatar_success=Twój awatar został zmieniony. +change_password=Aktualizuj hasło old_password=Aktualne hasło new_password=Nowe hasło +retype_new_password=Powtórz nowe hasło +password_incorrect=Bieżące hasło nie jest prawidłowe. emails=Adresy e-mail +manage_emails=Zarządzaj adresami e-mail email_desc=Twój podstawowy adres e-mail będzie używany do powiadomień i innych działań. primary=Podstawowy +delete_email=Usuń +email_deletion=Usuń adres email +add_new_email=Dodaj nowy e-mail +add_email=Dodaj adres e-mail add_openid=Dodaj OpenID URI manage_ssh_keys=Zarządzaj kluczami SSH @@ -209,6 +289,11 @@ subkeys=Podklucze key_id=ID klucza key_name=Nazwa klucza key_content=Treść +delete_key=Usuń +ssh_key_deletion=Usuń klucz SSH +gpg_key_deletion=Usuń klucz GPG +ssh_key_deletion_success=Klucz SSH został usunięty. +gpg_key_deletion_success=Klucz GPG został usunięty. add_on=Dodano valid_until=Ważne do valid_forever=Ważne bezterminowo @@ -220,8 +305,10 @@ key_state_desc=Ten klucz był użyty w ciągu ostatnich 7 dni token_state_desc=Ten token był użyty w ciągu ostatnich 7 dni show_openid=Pokaż w profilu hide_openid=Ukryj w profilu +ssh_disabled=SSH jest wyłączony manage_social=Zarządzaj powiązanymi kontami społecznościowymi +unbind=Rozłącz generate_new_token=Wygeneruj nowy token token_name=Nazwa tokena @@ -230,6 +317,7 @@ delete_token=Usuń twofa_is_enrolled=Twoje konto ma obecnie włączoną autoryzację dwuetapową. twofa_not_enrolled=Twoje konto obecnie nie ma włączonej autoryzacji dwuetapowej. +twofa_disable=Wyłącz weryfikację dwuetapową twofa_disabled=Dwuetapowa autoryzacja została wyłączona. scan_this_image=Zeskanuj ten obraz za pomocą swojej aplikacji uwierzytelniającej: or_enter_secret=Lub wprowadź sekret: %s @@ -241,6 +329,7 @@ repos_none=Nie posiadasz żadnych repozytoriów delete_account=Usuń swoje konto confirm_delete_account=Potwierdź usunięcie +delete_account_title=Usuń swoje konto [repo] owner=Właściciel @@ -250,7 +339,10 @@ fork_repo=Sforkowane fork_from=Forkuj z repo_desc=Opis repo_lang=Język +repo_gitignore_helper=Wybierz szablony pliku .gitignore. license=Licencja +license_helper=Wybierz plik licencji. +readme=README create_repo=Utwórz repozytorium default_branch=Domyślna gałąź mirror_prune=Wyczyść @@ -272,12 +364,14 @@ migrate.failed=Migracja nie powiodła się: %v mirror_from=kopia lustrzana forked_from=sklonowany z copy_link=Kopiuj +copy_link_success=Link został skopiowany copied=Skopiowano unwatch=Przestań obserwować watch=Obserwuj unstar=Usuń gwiazdkę star=Gwiazdka fork=Forkuj +download_archive=Pobierz repozytorium no_desc=Brak opisu quick_guide=Skrócona instrukcja @@ -305,30 +399,45 @@ file_view_raw=Zobacz czysty file_permalink=Bezpośredni odnośnik stored_lfs=Przechowane za pomocą Git LFS +editor.new_file=Nowy plik +editor.upload_file=Wyślik plik +editor.edit_file=Edytuj plik editor.preview_changes=Podgląd zmian +editor.edit_this_file=Edytuj plik +editor.delete_this_file=Usuń plik +editor.file_delete_success=Plik %s został usunięty. +editor.name_your_file=Nazwij plik… editor.or=lub +editor.cancel_lower=Anuluj editor.commit_changes=Zatwierdź zmiany editor.add_tmpl=Dodaj '%s/' editor.add=Dodaj '%s' editor.update=Zaktualizuj '%s' editor.delete=Usuń '%s' +editor.commit_message_desc=Dodaj dodatkowy rozszerzony opis… editor.commit_directly_to_this_branch=Zmieniaj bezpośrednio gałąź %s. editor.create_new_branch=Stwórz nową gałąź dla tego commita i rozpocznij pull request. +editor.new_branch_name_desc=Nazwa nowej gałęzi… editor.cancel=Anuluj +editor.filename_cannot_be_empty=Nazwa pliku nie może być pusta. editor.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. editor.no_changes_to_show=Brak zmian do pokazania. editor.fail_to_update_file=Tworzenie/aktualizacja pliku '%s' nie powiodła się z błędem: %v +editor.add_subdir=Dodaj katalog… editor.unable_to_upload_files=Wysyłanie plików do '%s' nie powiodło się z błędem: %v editor.upload_files_to_dir=Prześlij pliki do '%s' commits.commits=Commity +commits.search=Przeszukaj commity… commits.find=Szukaj +commits.search_all=Wszystkie gałęzie commits.author=Autor commits.message=Wiadomość commits.date=Data commits.older=Starsze commits.newer=Nowsze commits.signed_by=Podpisane przez +commits.gpg_key_id=ID klucza GPG issues.new=Nowy problem @@ -343,6 +452,8 @@ issues.new.closed_milestone=Zamknięte kamienie milowe issues.no_ref=Nie określono gałęzi/etykiety issues.create=Utwórz problem issues.new_label=Nowa etykieta +issues.new_label_placeholder=Nazwa etykiety +issues.new_label_desc_placeholder=Opis issues.create_label=Utwórz etykietę issues.label_templates.title=Załaduj wstępnie przygotowany zestaw etykiet issues.label_templates.helper=Wybierz zestaw etykiet @@ -361,6 +472,7 @@ issues.delete_branch_at=`usunął gałąź %s %s` issues.open_tab=Otwarte %d issues.close_tab=Zamknięte %d issues.filter_label=Etykieta +issues.filter_label_no_select=Wszystkie etykiety issues.filter_milestone=Kamień milowy issues.filter_assignee=Przypisany issues.filter_type=Typ @@ -411,6 +523,8 @@ issues.label_count=Etykiety %d issues.label_open_issues=Otwarte problemy %d issues.label_edit=Edytuj issues.label_delete=Usuń +issues.label_modify=Edytuj etykietę +issues.label_deletion=Usuń etykietę issues.label.filter_sort.alphabetically=Alfabetycznie issues.label.filter_sort.reverse_alphabetically=Alfabetycznie odwrotnie issues.label.filter_sort.by_size=Rozmiar @@ -420,17 +534,20 @@ issues.attachment.open_tab=`Kliknij, aby zobaczyć „%s” w nowej karcie` issues.attachment.download=`Kliknij, aby pobrać „%s”` issues.subscribe=Subskrybuj issues.unsubscribe=Anuluj subskrypcję +issues.tracker=Śledzenie czasu issues.start_tracking_short=Rozpocznij issues.start_tracking_history=`rozpoczął pracę nad %s` issues.tracking_already_started=`Już śledzisz czas pracy nad tą sprawą!` issues.stop_tracking=Zatrzymaj issues.stop_tracking_history=`zakończył pracę nad %s` +issues.add_time_short=Dodaj czas issues.add_time_cancel=Anuluj issues.add_time_history=`dodano spędzony czas %s` issues.add_time_hours=Godziny issues.add_time_minutes=Minuty issues.cancel_tracking=Anuluj issues.cancel_tracking_history=`anulowanie śledzenie czasu %s` +issues.due_date_form=yyyy-mm-dd pulls.new=Nowy pull request pulls.filter_branch=Filtruj branch @@ -471,6 +588,7 @@ milestones.filter_sort.least_issues=Najmniej problemów wiki=Wiki wiki.page=Strona wiki.filter_page=Filtruj stronę +wiki.new_page=Strona wiki.default_commit_message=Opisz tę zmianę (opcjonalne). wiki.save_page=Zapisz stronę wiki.last_commit_info=%s edytuje tę stronę %s @@ -526,6 +644,7 @@ search.results=Wyniki wyszukiwania dla "%s" w %s settings=Ustawienia settings.desc=Ustawienia to miejsce, w którym możesz zmieniać parametry repozytorium +settings.options=Repozytorium settings.collaboration.write=Zapis settings.collaboration.read=Odczyt settings.collaboration.undefined=Niezdefiniowany @@ -533,6 +652,8 @@ settings.hooks=Webhooki settings.githooks=Hooki Git settings.basic_settings=Ustawienia podstawowe settings.mirror_settings=Kopia lustrzana ustawień +settings.sync_mirror=Synchronizuj teraz +settings.site=Strona settings.update_settings=Aktualizuj ustawienia settings.advanced_settings=Ustawienia zaawansowane settings.external_wiki_url=Adres URL zewnętrznego Wiki @@ -546,11 +667,15 @@ settings.transfer=Przeniesienie własności settings.delete=Usuń to repozytorium settings.delete_notices_1=- Ta operacja NIE MOŻE zostać cofnięta. settings.transfer_owner=Nowy właściciel +settings.confirm_delete=Usuń repozytorium +settings.delete_collaborator=Usuń +settings.search_user_placeholder=Szukaj użytkownika… settings.add_webhook=Dodaj webhooka settings.webhook.test_delivery=Testuj dostawę settings.webhook.request=Żądanie settings.webhook.response=Odpowiedź settings.webhook.headers=Nagłówki +settings.webhook.payload=Zawartość settings.webhook.body=Treść settings.githook_edit_desc=Jeśli hook jest nieaktywny, zaprezentowana zostanie przykładowa treść. Pozostawienie pustej wartości wyłączy ten hook. settings.githook_name=Nazwa hooka @@ -583,6 +708,7 @@ settings.protected_branch_can_push_yes=Możesz wysyłać settings.protected_branch_can_push_no=Nie możesz wysyłać settings.add_protected_branch=Włącz ochronę settings.delete_protected_branch=Wyłącz ochronę +settings.choose_branch=Wybierz gałąź… diff.browse_source=Przeglądaj źródła diff.parent=rodzic @@ -611,6 +737,7 @@ release.title=Tytuł release.content=Treść release.write=Napisz release.preview=Podgląd +release.loading=Ładowanie… release.cancel=Anuluj release.publish=Publikuj wersję release.save_draft=Zapisz szkic @@ -625,6 +752,7 @@ branch.create_from=z '%s' branch.branch_already_exists=Gałąź '%s' już istnieje w tym repozytorium. branch.deleted_by=Usunięta przez %s +topic.done=Gotowe [org] org_name_holder=Nazwa organizacji @@ -635,12 +763,16 @@ people=Ludzie teams=Zespoły lower_members=członkowie lower_repositories=repozytoria +create_new_team=Nowy zespół +create_team=Utwórz zespół org_desc=Opis team_name=Nazwa zespołu team_desc=Opis +team_permission_desc=Uprawnienie settings=Ustawienia +settings.options=Organizacja settings.full_name=Imię i nazwisko settings.website=Strona settings.location=Lokalizacja @@ -649,9 +781,12 @@ settings.update_setting_success=Ustawienia organizacji zostały zaktualizowane. settings.delete=Usuń organizację settings.delete_account=Usuń tą organizację settings.confirm_delete_account=Potwierdź usunięcie +settings.delete_org_title=Usuń organizację settings.hooks_desc=Dodaj webhooki, uruchamiane dla wszystkich repozytoriów w tej organizacji. members.membership_visibility=Widoczność członkostwa: +members.public=Widoczny +members.private=Ukryty members.member_role=Rola: members.owner=Właściciel members.member=Członek @@ -668,15 +803,19 @@ teams.no_desc=Ten zespół nie ma opisu teams.settings=Ustawienia teams.members=Członkowie zespołu teams.update_settings=Aktualizuj ustawienia +teams.delete_team=Usuń zespół teams.add_team_member=Dodaj członka zespołu +teams.delete_team_title=Usuń zespół teams.delete_team_success=Zespół został usunięty. teams.repositories=Repozytoria zespołu +teams.search_repo_placeholder=Szukaj repozytorium… teams.add_team_repository=Dodaj repozytorium zespołu teams.remove_repo=Usuń teams.add_nonexistent_repo=Repozytorium, które próbujesz dodać, nie istnieje. Proszę je najpierw utworzyć. [admin] dashboard=Pulpit +users=Konta użytkownika organizations=Organizacje repositories=Repozytoria config=Konfiguracja @@ -686,6 +825,8 @@ first_page=Pierwsza last_page=Ostatnia total=Ogółem: %d +dashboard.statistic=Podsumowanie +dashboard.system_status=Status strony dashboard.operation_name=Nazwa operacji dashboard.operation_switch=Przełącz dashboard.operation_run=Uruchom @@ -724,6 +865,7 @@ dashboard.total_gc_pause=Sumaryczny czas wstrzymania przez GC dashboard.last_gc_pause=Ostatnie wstrzymanie przez GC dashboard.gc_times=Ilość wywołań GC +users.name=Nazwa użytkownika users.activated=Aktywowany users.admin=Administrator users.repos=Repozytoria @@ -731,11 +873,14 @@ users.created=Utworzony users.edit=Edytuj users.auth_source=Źródło uwierzytelniania users.local=Lokalny +users.update_profile=Zaktualizuj konto użytkownika +users.delete_account=Usuń konto użytkownika orgs.org_manage_panel=Zarządzanie organizacją orgs.name=Nazwa orgs.teams=Zespoły orgs.members=Członkowie +orgs.new_orga=Nowa organizacja repos.repo_manage_panel=Zarządzanie repozytoriami repos.owner=Właściciel @@ -760,6 +905,7 @@ auths.bind_dn=DN powiązania auths.bind_password=Hasło Bind auths.user_base=Baza wyszukiwania auths.user_dn=DN użytkownika +auths.search_page_size=Rozmiar strony auths.filter=Filtr użytkownika auths.admin_filter=Filtr administratora auths.ms_ad_sa=Atrybuty wyszukiwania MS AD @@ -791,6 +937,8 @@ auths.new_success=Uwierzytelnienie '%s' zostało dodane. auths.delete_auth_title=Usuń źródło uwierzytelniania config.server_config=Konfiguracja serwera +config.app_name=Tytuł strony +config.app_ver=Wersja Gitea config.custom_conf=Ścieżka do pliku konfiguracyjnego config.disable_router_log=Wyłącz dziennik routera config.run_mode=Tryb uruchamienia @@ -798,11 +946,13 @@ config.git_version=Wersja Git config.repo_root_path=Ścieżka główna repozytoriów config.lfs_root_path=Ścieżka główna katalogu LFS config.static_file_root_path=Ścieżka główna plików statycznych +config.log_file_root_path=Ścieżka dla logów config.script_type=Typ skryptu config.reverse_auth_user=Użytkownik odwrotnego proxy config.ssh_config=Konfiguracja SSH config.ssh_enabled=Włączone +config.ssh_domain=Domena serwera config.ssh_port=Port config.ssh_listen_port=Port nasłuchiwania config.ssh_root_path=Ścieżka do katalogu głównego @@ -815,11 +965,13 @@ config.db_config=Konfiguracja bazy danych config.db_type=Typ config.db_host=Serwer config.db_name=Nazwa +config.db_ssl_mode=SSL config.db_path=Ścieżka config.service_config=Konfiguracja usługi config.show_registration_button=Pokazuj przycisk rejestracji config.disable_key_size_check=Wyłącz sprawdzanie minimalnego rozmiaru klucza +config.enable_captcha=Włącz CAPTCHA config.active_code_lives=Ważność kodów aktywacyjnych config.reset_password_code_lives=Czas wygaśnięcia kodu resetowania hasła diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 14d6335d8a29..dae81d2ccfd5 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -102,6 +102,7 @@ lfs_path_helper=У цій папці будуть зберігатися фай run_user=Запуск від імені Користувача run_user_helper=Введіть ім'я користувача операційної системи, під яким працює Gitea. Зверніть увагу, що цей користувач повинен бути доступ до кореневого шляху репозиторія. domain=Домен SSH сервера +domain_helper=Домен або хост-адреса для клонування через SSH - впливає на URL-адресу. ssh_port=Порт SSH сервера ssh_port_helper=Номер порту, який використовує SSH сервер. Залиште порожнім, щоб вимкнути SSH. http_port=Gitea HTTP порт @@ -149,6 +150,7 @@ test_git_failed=Не в змозі перевірити 'git' команду: %v sqlite3_not_available=Ця версія Gitea не підтримує SQLite3. Будь ласка, завантажте офіційну бінарну версію з %s (не версію gobuild). invalid_db_setting=Налаштування бази даних є некоректними: %v invalid_repo_path=Помилковий шлях до кореня репозиторію: %v +run_user_not_match=Ім'я користувача 'run as' не є поточним ім'ям користувача: %s -> %s save_config_failed=Не в змозі зберегти конфігурацію: %v invalid_admin_setting=Неприпустимі налаштування облікового запису адміністратора: %v install_success=Ласкаво просимо! Дякуємо вам за вибір Gitea. Розважайтеся, і будьте обережні! @@ -342,6 +344,7 @@ location=Місцезнаходження update_profile=Оновити профіль update_profile_success=Профіль успішно оновлено. change_username=Ваше Ім'я кристувача було змінено. +change_username_prompt=Примітка. Зміни в імені також змінюють URL-адресу облікового запису. continue=Продовжити cancel=Відмінити language=Мова @@ -371,8 +374,10 @@ primary=Основний primary_email=Зробити основним delete_email=Видалити email_deletion=Видалити адресу електронної пошти +email_deletion_desc=Електронна адреса та пов'язана з нею інформація буде видалена з вашого облікового запису. Git коміти, здійснені через цю електронну адресу, залишиться без змін. Продовжити? email_deletion_success=Адресу електронної пошти було видалено. openid_deletion=Видалити адресу OpenID +openid_deletion_desc=Видалення цієї OpenID-адреси з вашого облікового запису забороняє вам входити з ним. Продовжити? openid_deletion_success=Адреса OpenID була видалена. add_new_email=Додати нову адресу електронної пошти add_new_openid=Додати новий OpenID URI @@ -383,6 +388,7 @@ add_email_success=Додано нову адресу електронної по add_openid_success=Нова адреса OpenID була додана. keep_email_private=Приховати адресу електронної пошти keep_email_private_popup=Вашу адресу електронної пошти буде приховано від інших користувачів. +openid_desc=OpenID дозволяє делегувати аутентифікацію зовнішньому постачальнику послуг. manage_ssh_keys=Керувати SSH ключами manage_gpg_keys=Керувати GPG ключами @@ -396,6 +402,7 @@ add_new_gpg_key=Додати GPG ключ ssh_key_been_used=Цей ключ SSH вже додано до вашого облікового запису. ssh_key_name_used=Ключ SSH з таким самим ім'ям вже додано до вашого облікового запису. gpg_key_id_used=Публічний ключ GPG з таким самим ідентифікатором вже існує. +gpg_no_key_email_found=Цей ключ GPG непридатний для використання з будь-якою електронною адресою, що пов'язана з вашим обліковим записом. subkeys=Підключі key_id=ID ключа key_name=Ім'я ключа @@ -407,7 +414,7 @@ ssh_key_deletion=Видалити SSH ключ gpg_key_deletion=Видалити GPG ключ ssh_key_deletion_desc=Видалення ключа SSH скасовує доступ до вашого облікового запису. Продовжити? gpg_key_deletion_desc=Видалення GPG ключа скасовує перевірку підписаних ним комітів. Продовжити? -ssh_key_deletion_success=SSH було видалено. +ssh_key_deletion_success=SSH ключ був видалений. gpg_key_deletion_success=GPG було видалено. add_on=Додано valid_until=Дійсний до @@ -423,7 +430,9 @@ hide_openid=Не показувати у профілі ssh_disabled=SSH вимкнено manage_social=Керувати зв'язаними обліковими записами соціальних мереж +social_desc=Ці адреси соціальних мереж пов'язані з вашим обліковим записом Gitea. Переконайтеся, що ви їх впізнаєте, оскільки вони можуть бути використані для входу в обліковий запис Gitea. unbind=Від'єднати +unbind_success=Зв'язаний зовнішній обліковий запис було видалено. manage_access_token=Керування токенами доступу generate_new_token=Згенерувати новий токен @@ -431,30 +440,43 @@ tokens_desc=Ці токени надають доступ до вашого об new_token_desc=Додатки, що використовують токен, мають повний доступ до вашого облікового запису. token_name=Ім'я токену generate_token=Згенерувати токен +generate_token_success=Ваш новий токен був створений. Скопіюйте його зараз, оскільки він не буде показаний знову. delete_token=Видалити access_token_deletion=Видалити токен доступу +access_token_deletion_desc=Видалення токена скасовує доступ до вашого облікового запису для програм, що використовують його. Продовжити? +delete_token_success=Токен був знищений. Програми, що використовують його, більше не мають доступу до вашого облікового запису. twofa_desc=Двофакторна автентифікація підвищує безпеку вашого облікового запису. twofa_is_enrolled=Ваш обліковий запис на даний час використовує двофакторну автентифікацію. twofa_not_enrolled=Ваш обліковий запис наразі не використовує двофакторну автентифікаціїю. twofa_disable=Вимкнути двофакторну автентифікацію twofa_scratch_token_regenerate=Перестворити токен одноразового пароля +twofa_scratch_token_regenerated=Ваш новий scratch-токен %s. Зберігайте його в безпечному місці. twofa_enroll=Увімкнути двофакторну автентифікацію twofa_disable_note=При необхідності можна відключити двофакторну автентифікацію. +twofa_disable_desc=Вимкнення двофакторної автентифікації зробить ваш обліковий запис менш безпечним. Продовжити? regenerate_scratch_token_desc=Якщо ви втратили свій токен одноразового пароля або вже використовували його для входу, ви можете скинути його тут. twofa_disabled=Двофакторна автентифікація вимкнена. scan_this_image=Проскануйте це зображення вашим додатком для двуфакторної автентифікації: or_enter_secret=Або введіть секрет: %s +then_enter_passcode=І введіть пароль, який відображається в додатку: passcode_invalid=Некоректний пароль. Спробуй ще раз. +twofa_enrolled=Для вашого облікового запису було включена двофакторна автентифікація. Зберігайте свій scratch-токен (%s) у безпечному місці, оскільки він показується лише один раз! u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. +u2f_require_twofa=Для використання ключів безпеки необхідно зареєструвати двофакторну аутентифікацію. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім +u2f_press_button=Натисніть кнопку на ключі безпеки, щоб зареєструвати його. u2f_delete_key=Видалити ключ безпеки +u2f_delete_key_desc=Якщо ви видалите ключ безпеки, ви не зможете використати його для входу. Ти впевнені? manage_account_links=Керування обліковими записами manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. +account_links_not_available=Наразі немає зовнішніх облікових записів, пов'язаних із вашим обліковим записом Gitea. remove_account_link=Видалити облікові записи +remove_account_link_desc=Видалення пов'язаного облікового запису відкликає його доступ до вашого облікового запису Gitea. Продовжити? +remove_account_link_success=Зв'язаний обліковий запис видалено. orgs_none=Ви не є учасником будь-якої організації. repos_none=У вас немає власних репозиторіїв @@ -463,12 +485,15 @@ delete_account=Видалити ваш обліковий запис delete_prompt=Ця операція остаточно видалить обліковий запис користувача. Це НЕ МОЖЛИВО відмінити. confirm_delete_account=Підтвердження видалення delete_account_title=Видалити цей обліковий запис +delete_account_desc=Ви впевнені, що хочете остаточно видалити цей обліковий запис? [repo] owner=Власник repo_name=Назва репозиторію +repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. visibility=Видимість visiblity_helper=Зробити репозиторій приватним +visiblity_helper_forced=Адміністратор вашого сайту налаштував параметри нових репозиторіїв: всі нові репозиторії будуть приватними. visiblity_fork_helper=(Зміна цього вплине на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте Допомогу. fork_repo=Форкнути репозиторій @@ -485,9 +510,11 @@ auto_init=Ініціалізувати репозиторій (Додає .gitig create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити +mirror_prune_desc=Видалення застарілих посилань які ви відслідковуєте mirror_interval=Інтервал дзеркалювання (доступні значення 'h', 'm', 's') mirror_interval_invalid=Інтервал дзеркалювання є неприпустимим. mirror_address=Клонування з URL-адреси +mirror_address_desc=Включіть необхідні облікові дані в URL-адресу. mirror_last_synced=Остання синхронізація watchers=Спостерігачі stargazers=Зацікавлені @@ -497,6 +524,7 @@ reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. form.name_reserved=Назву репозиторію '%s' зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві сховища. need_auth=Клонувати з авторизацією migrate_type=Тип міграції @@ -506,6 +534,7 @@ migrate.clone_address=Міграція / клонувати з URL-адреси migrate.clone_address_desc=URL-адреса HTTP(S) або Git "clone" існуючого репозиторія migrate.clone_local_path=або шлях до локального серверу migrate.permission_denied=Вам не дозволено імпортувати локальні репозиторії. +migrate.invalid_local_path=Локальний шлях недійсний. Він не існує або не є каталогом. migrate.failed=Міграція не вдалася: %v migrate.lfs_mirror_unsupported=Дзеркалювання LFS об'єктів не підтримується - використовуйте 'git lfs fetch --all' і 'git lfs push --all' вручну. @@ -531,6 +560,7 @@ push_exist_repo=Опублікувати існуючий репозиторій bare_message=Цей репозиторій порожній. code=Код +code.desc=Доступ до коду, файлів, комітів та гілок. branch=Гілка tree=Дерево filter_branch_and_tag=Фільтрувати гілку або тег @@ -564,6 +594,7 @@ editor.delete_this_file=Видалити файл editor.must_have_write_access=Ви повинні мати доступ на запис щоб запропонувати зміни до цього файлу. editor.file_delete_success=Файл '%s' видалено. editor.name_your_file=Дайте назву файлу… +editor.filename_help=Щоб додати каталог, наберіть його назву, а потім - косу риску ('/'). Щоб видалити каталог, перейдіть до початку поля і натисніть backspace. editor.or=або editor.cancel_lower=Скасувати editor.commit_changes=Закомітити зміни @@ -579,13 +610,19 @@ editor.cancel=Відмінити editor.filename_cannot_be_empty=Ім'я файлу не може бути порожнім. editor.branch_already_exists=Гілка '%s' вже присутня в репозиторії. editor.directory_is_a_file=Ім'я каталогу "%s" уже використовується як ім'я файлу в цьому репозиторії. +editor.file_is_a_symlink='%s' є символічним посиланням. Символічні посилання не можливо редагувати в веб-редакторі +editor.filename_is_a_directory=Назва файлу '%s' вже використовується як ім'я каталогу в цьому репозиторії. +editor.file_editing_no_longer_exists=Редагований файл '%s' більше не існує в цьому репозиторії. +editor.file_changed_while_editing=Зміст файлу змінився з моменту початку редагування. Натисніть тут , щоб переглянути що було змінено, або Прийняти зміни ще раз , щоб записати свої зміни. editor.file_already_exists=Файл з назвою "%s" уже існує у цьому репозиторію. editor.no_changes_to_show=Нема змін для показу. editor.fail_to_update_file=Не вдалося оновити/створити файл '%s' через помилку: %v editor.add_subdir=Додати каталог… editor.unable_to_upload_files=Не вдалося завантажити файли до '%s' через помилку: %v editor.upload_files_to_dir=Завантажувати файли до '%s' +editor.cannot_commit_to_protected_branch=Заборонено вносити коміт до захищеної гілки '%s'. +commits.desc=Переглянути історію зміни коду. commits.commits=Коміти commits.search=Знайти коміт… commits.find=Пошук @@ -601,6 +638,7 @@ commits.gpg_key_id=Ідентифікатор GPG ключа ext_issues=Зов. Проблеми ext_issues.desc=Посилання на зовнішню систему відстеження проблем. +issues.desc=Організація звітів про помилки, завдань та етапів. issues.new=Нова проблема issues.new.labels=Мітки issues.new.no_label=Без мітки @@ -620,12 +658,17 @@ issues.new_label_placeholder=Назва мітки issues.new_label_desc_placeholder=Опис issues.create_label=Створити мітку issues.label_templates.title=Завантажити визначений набір міток +issues.label_templates.info=Ще немає міток. Натисніть 'Нова мітка' або використовуйте попередньо визначений набір міток: issues.label_templates.helper=Оберіть набір міток issues.label_templates.use=Використовувати набір міток issues.label_templates.fail_to_load_file=Не вдалося завантажити файл шаблона мітки '%s': %v issues.add_label_at=додав(ла) мітку
%s
%s +issues.remove_label_at=видалив(ла) метку
%s
%s issues.add_milestone_at=`додав(ла) до %s етапу %s` +issues.change_milestone_at=`змінено цільової етап з %s на %s %s` +issues.remove_milestone_at=`видалено з етапу%s %s` issues.deleted_milestone=`(видалено)` +issues.self_assign_at=`самонавчался %s` issues.add_assignee_at=`був призначений %s %s` issues.remove_assignee_at=`видалили із призначених %s` issues.change_title_at=`змінив(ла) заголовок з %s на %s %s` @@ -695,6 +738,7 @@ issues.label_edit=Редагувати issues.label_delete=Видалити issues.label_modify=Редагувати мітку issues.label_deletion=Видалити мітку +issues.label_deletion_desc=Видалення мітки видаляє її з усіх обговорень. Продовжити? issues.label_deletion_success=Мітку було видалено. issues.label.filter_sort.alphabetically=За алфавітом issues.label.filter_sort.reverse_alphabetically=З кінця алфавіту @@ -726,21 +770,28 @@ issues.time_spent_from_all_authors=`Загальний витрачений ча issues.due_date=Дата завершення issues.invalid_due_date_format=Дата закінчення має бути в форматі 'ррр-мм-дд'. issues.error_modifying_due_date=Не вдалося змінити дату завершення. +issues.error_removing_due_date=Не вдалося видалити дату завершення. issues.due_date_form=рррр-мм-дд issues.due_date_form_add=Додати дату завершення issues.due_date_form_update=Оновити дату завершення issues.due_date_form_remove=Видалити дату завершення +issues.due_date_not_writer=Вам потрібен доступ до запису в репозиторії, щоб оновити дату завершення проблем. issues.due_date_not_set=Термін виконання не встановлений. issues.due_date_added=додав(ла) дату завершення %s %s +issues.due_date_modified=термін змінено з %s %s на %s +issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено +pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. pulls.new=Новий запит на злиття pulls.compare_changes=Новий запит на злиття +pulls.compare_changes_desc=Порівняти дві гілки і створити запит на злиття для змін. pulls.compare_base=злити в pulls.compare_compare=pull з pulls.filter_branch=Фільтр по гілці pulls.no_results=Результатів не знайдено. pulls.nothing_to_compare=Ці гілки однакові. Немає необхідності створювати запитів на злиття. +pulls.has_pull_request=`Вже існує запит на злиття між двома цілями: %[2]s#%[3]d` pulls.create=Створити запит на злиття pulls.title_desc=хоче злити %[1]d комітів з %[2]s до %[3]s pulls.merged_title_desc=злито %[1]d комітів з %[2]s до %[3]s %[4]s @@ -750,6 +801,8 @@ pulls.tab_files=Змінені файли pulls.reopen_to_merge=Будь ласка перевідкрийте цей запит щоб здіснити операцію злиття. pulls.merged=Злито pulls.has_merged=Запит на злиття було об'єднано. +pulls.data_broken=Вміст цього запиту було порушено внаслідок видалення інформації ФОРКОМ. +pulls.is_checking=Триває перевірка конфліктів, будь ласка обновіть сторінку дещо пізніше. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. pulls.cannot_auto_merge_helper=Злийте вручну для вирішення конфліктів. @@ -758,6 +811,8 @@ pulls.no_merge_helper=Увімкніть параметри злиття в на pulls.merge_pull_request=Об'єднати запит на злиття pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити +pulls.invalid_merge_option=Цей параметр злиття не можна використовувати для цього Pull Request'а. +pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж сховища з тією ж інформацією про злиття і в очікуванні.` milestones.new=Новий етап milestones.open_tab=%d відкрито @@ -766,17 +821,26 @@ milestones.closed=Закрито %s milestones.no_due_date=Немає дати завершення milestones.open=Відкрити milestones.close=Закрити +milestones.new_subheader=Створюйте етапи для організації ваших завдань. milestones.create=Створити етап milestones.title=Заголовок milestones.desc=Опис milestones.due_date=Дата завершення (опціонально) milestones.clear=Очистити +milestones.invalid_due_date_format=Дата завершення має бути в форматі 'рррр-мм-дд'. +milestones.create_success=Етап '%s' створений. milestones.edit=Редагувати етап +milestones.edit_subheader=Використовуйте кращий опис контрольної точки, щоб уникнути нерозуміння з боку інших людей. milestones.cancel=Відмінити milestones.modify=Оновити етап +milestones.edit_success=Етап '%s' був оновлений. milestones.deletion=Видалити етап +milestones.deletion_desc=Видалення етапу призведе до його видалення з усіх пов'язаних завдань. Продовжити? +milestones.deletion_success=Етап успішно видалено. milestones.filter_sort.closest_due_date=Найближче за датою milestones.filter_sort.furthest_due_date=Далі за датою +milestones.filter_sort.least_complete=Менш повне +milestones.filter_sort.most_complete=Більш повне milestones.filter_sort.most_issues=Найбільш проблем milestones.filter_sort.least_issues=Найменш проблем @@ -785,16 +849,21 @@ ext_wiki.desc=Посилання на зовнішню вікі. wiki=Вікі wiki.welcome=Ласкаво просимо до Вікі. +wiki.welcome_desc=Wiki дозволяє писати та ділитися документацією з співавторами. +wiki.desc=Пишіть та обмінюйтеся документацією із співавторами. wiki.create_first_page=Створити першу сторінку wiki.page=Сторінка wiki.filter_page=Фільтр сторінок wiki.new_page=Сторінка +wiki.default_commit_message=Напишіть примітку про оновлення цієї сторінки (необов'язково). wiki.save_page=Зберегти сторінку wiki.last_commit_info=%s редагував цю сторінку %s wiki.edit_page_button=Редагувати wiki.new_page_button=Нова сторінка wiki.delete_page_button=Видалити сторінку +wiki.delete_page_notice_1=Видалення сторінки вікі '%s' не може бути скасовано. Продовжити? wiki.page_already_exists=Вікі-сторінка з таким самим ім'ям вже існує. +wiki.reserved_page=Назва сторінки вікі '%s' зарезервована. wiki.pages=Сторінки wiki.last_updated=Останні оновлення %s @@ -832,6 +901,8 @@ activity.new_issues_count_1=Нова Проблема activity.new_issues_count_n=%d Проблем activity.new_issue_label=Відкриті activity.title.unresolved_conv_1=%d Незавершене обговорення +activity.title.unresolved_conv_n=%d Незавершених обговорень +activity.unresolved_conv_desc=Список всіх старих тікетів і Pull Request'ів з недавньої активністю, але ще не закритих або прийнятих. activity.unresolved_conv_label=Відкрити activity.title.releases_1=%d Реліз activity.title.releases_n=%d Релізів @@ -840,8 +911,10 @@ activity.published_release_label=Опубліковано search=Пошук search.search_repo=Пошук репозиторію +search.results=Результати пошуку для "%s" в %s settings=Налаштування +settings.desc=У налаштуваннях ви можете змінювати різні параметри цього сховища settings.options=Репозиторій settings.collaboration=Співавтори settings.collaboration.admin=Адміністратор @@ -853,6 +926,7 @@ settings.githooks=Git хуки settings.basic_settings=Базові налаштування settings.mirror_settings=Налаштування дзеркала settings.sync_mirror=Синхронізувати зараз +settings.mirror_sync_in_progress=Синхронізуються репозиторії-дзеркала. Зачекайте хвилину і обновіть сторінку. settings.site=Веб-сайт settings.update_settings=Оновити налаштування settings.advanced_settings=Додаткові налаштування @@ -860,15 +934,24 @@ settings.wiki_desc=Увімкнути репозиторії Вікі settings.use_internal_wiki=Використовувати вбудовані Вікі settings.use_external_wiki=Використовувати зовнішні Вікі settings.external_wiki_url=URL зовнішньої вікі +settings.external_wiki_url_error=Зовнішня URL-адреса wiki не є допустимою URL-адресою. +settings.external_wiki_url_desc=Відвідувачі будуть перенаправлені на URL-адресу, коли вони клацають по вкладці. settings.issues_desc=Увімкнути відстеження проблем в репозиторію settings.use_internal_issue_tracker=Використовувати вбудовану систему відстеження проблем +settings.use_external_issue_tracker=Використовувати зовнішню систему обліку завдань settings.external_tracker_url=URL зовнішньої системи відстеження проблем +settings.external_tracker_url_error=URL зовнішнього баг-трекера не є допустимою URL-адресою. +settings.external_tracker_url_desc=Відвідувачі перенаправляються на зовнішню URL-адресу, коли натискають вкладку 'Проблеми'. settings.tracker_url_format=Формат URL зовнішнього трекера задач +settings.tracker_issue_style=Формат номеру для зовнішньої системи обліку задач settings.tracker_issue_style.numeric=Цифровий settings.tracker_issue_style.alphanumeric=Буквено-цифровий +settings.tracker_url_format_desc=Використовуйте шаблони {user}, {repo} та {index} для імені користувача, репозиторію та номеру задічі. settings.enable_timetracker=Увімкнути відстеження часу +settings.allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу settings.pulls_desc=Увімкнути запити на злиття в репозиторій settings.pulls.ignore_whitespace=Ігнорувати пробіл у конфліктах +settings.pulls.allow_merge_commits=Дозволити коміти злиття settings.pulls.allow_rebase_merge=Увімкнути Rebasing коміти перед злиттям settings.pulls.allow_squash_commits=Увімкнути об'єднувати коміти перед злиттям settings.admin_settings=Налаштування адміністратора @@ -877,36 +960,60 @@ settings.danger_zone=Небезпечна зона settings.new_owner_has_same_repo=Новий власник вже має репозиторій з такою назвою. Будь ласка, виберіть інше ім'я. settings.convert=Перетворити на звичайний репозиторій settings.convert_desc=Ви можете сконвертувати це дзеркало у звичайний репозиторій. Це не може бути скасовано. +settings.convert_notices_1=Ця операція перетворить дзеркало у звичайний репозиторій і не може бути скасована. settings.convert_confirm=Перетворити репозиторій +settings.convert_succeed=Репозиторій успішно перетворений в звичайний. settings.transfer=Передати новому власнику +settings.transfer_desc=Передати репозиторій користувачеві або організації, де ви маєте права адміністратора. +settings.transfer_notices_1=- Ви втратите доступ до сховища, якщо ви переведете його окремому користувачеві. +settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_form_title=Введіть ім'я репозиторія як підтвердження: settings.wiki_delete=Видалити вікі-дані +settings.wiki_delete_desc=Будьте уважні! Як тільки ви видалите Вікі - шляху назад не буде. +settings.wiki_delete_notices_1=- Це назавжди знищить і відключить wiki для %s. settings.confirm_wiki_delete=Видалити Вікі-дані +settings.wiki_deletion_success=Дані wiki були видалені. settings.delete=Видалити цей репозиторій +settings.delete_desc=Будьте уважні! Як тільки ви видалите репозиторій - шляху назад не буде. settings.delete_notices_1=- Цю операцію НЕ МОЖНА відмінити. +settings.delete_notices_2=- Ця операція назавжди видалить все з репозиторію %s, включаючи дані Git, пов'язані з ним завдання, коментарі і права доступу для співробітників. +settings.delete_notices_fork_1=- Всі форки стануть незалежними репозиторіями після видалення. settings.deletion_success=Репозиторій успішно видалено. settings.update_settings_success=Налаштування репозиторію було оновлено. settings.transfer_owner=Новий власник settings.make_transfer=Здіснити перенесення +settings.transfer_succeed=Репозиторій був перенесений. settings.confirm_delete=Видалити репозиторій settings.add_collaborator=Додати співавтора settings.add_collaborator_success=Додано співавтора. settings.delete_collaborator=Видалити settings.collaborator_deletion=Видалити співавтора +settings.collaborator_deletion_desc=Цей користувач більше не матиме доступу для спільної роботи в цьому репозиторії після видалення. Ви хочете продовжити? +settings.remove_collaborator_success=Співавтор видалений. settings.search_user_placeholder=Пошук користувача… +settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. +settings.user_is_org_member=Користувач є членом організації, члени якої не можуть бути додані в якості співавтора. settings.add_webhook=Додати веб-хук +settings.hooks_desc=Webhooks автоматично робить HTTP POST-запити на сервер, коли відбуваються певні події Gitea. Дізнайтеся більше в керівництві веб-вузла . settings.webhook_deletion=Видалити веб-хук +settings.webhook_deletion_desc=Видалення цього веб-хука призведе до видалення всієї пов'язаної з ним інформації, включаючи історію. Бажаєте продовжити? +settings.webhook_deletion_success=Webhook видалено. settings.webhook.test_delivery=Перевірити доставку settings.webhook.test_delivery_desc=Перевірте цей веб-хук з підробленою подією. +settings.webhook.test_delivery_success=Тест веб-хука був доданий в чергу доставки. Це може зайняти кілька секунд, перш ніж він відобразиться в історії доставки. settings.webhook.request=Запит settings.webhook.response=Відповідь settings.webhook.headers=Заголовки settings.webhook.payload=Зміст settings.webhook.body=Тіло +settings.githooks_desc=Git-хукі надаються Git самим по собі, ви можете змінювати файли підтримуваних хуков зі списку нижче щоб виконувати зовнішні операції. +settings.githook_edit_desc=Якщо хук неактивний, буде представлено зразок вмісту. Порожнє значення у цьому полі призведе до вимкнення хуку. settings.githook_name=Ім'я хуку settings.githook_content=Зміст хука settings.update_githook=Оновити хук +settings.add_webhook_desc=Gitea буде відправляти POST запити на вказану URL адресу, з інформацією про події, що відбуваються. Подробиці на сторінці інструкції по використанню webhooks . settings.payload_url=Цільова URL-адреса +settings.content_type=Тип вмісту settings.secret=Секрет settings.slack_username=Ім'я кристувача settings.slack_icon_url=URL іконки @@ -928,6 +1035,7 @@ settings.event_issues_desc=Проблему відкрито, закрито, п settings.event_issue_comment=Коментар проблеми settings.event_issue_comment_desc=Коментар проблеми створено, видалено чи відредаговано. settings.event_release=Реліз +settings.event_release_desc=Випуск опубліковано, оновлено чи видалено в сховища. settings.event_pull_request=Запити до злиття settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито, змінено, призначено, знято, мітку оновлено, мітку прибрано або синхронізовано. settings.event_push=Push @@ -935,6 +1043,7 @@ settings.event_push_desc=Git push до репозиторію. settings.event_repository=Репозиторій settings.event_repository_desc=Репозиторій створений або видалено. settings.active=Додавати інформацію про події +settings.active_helper=Також буде відправлена ​​інформація про подію, що відбулася. settings.add_hook_success=Веб-хук було додано. settings.update_webhook=Оновити веб-хук settings.update_hook_success=Веб-хук було оновлено. @@ -949,27 +1058,50 @@ settings.add_discord_hook_desc=Інтеграція Discord у settings.add_dingtalk_hook_desc=Інтеграція Dingtalk у ваш репозиторії. settings.deploy_keys=Ключі для розгортування settings.add_deploy_key=Додати ключ для розгортування +settings.deploy_key_desc=Ключі розгортання доступні тільки для читання. Це не те ж саме що і SSH-ключі аккаунта. settings.is_writable=Увімкнути доступ для запису +settings.is_writable_info=Чи може цей ключ бути використаний для виконання push в репозиторій? Ключі розгортання завжди мають доступ на pull. +settings.no_deploy_keys=Ви не додавали ключі розгортання. settings.title=Заголовок settings.deploy_key_content=Зміст +settings.key_been_used=Вміст ключа розгортання вже використовується. +settings.key_name_used=Ключ розгортання з таким заголовком вже існує. +settings.add_key_success=Новий ключ розгортання '%s' успішно доданий. settings.deploy_key_deletion=Видалити ключ для розгортування +settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до сховища з його допомогою. Ви впевнені? settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки settings.protected_branch_can_push=Дозволити push? settings.protected_branch_can_push_yes=Ви можете виконувати push settings.protected_branch_can_push_no=Ви не можете виконувати push +settings.branch_protection=Захист гілки %s +settings.protect_this_branch=Захистити цю гілку +settings.protect_this_branch_desc=Вимкнути примусовий push і захистити від видалення. +settings.protect_whitelist_committers=Білий список тих, хто може робити push в цю гілку +settings.protect_whitelist_committers_desc=Додати користувачів або команди в білий список гілки. На них не будуть поширюватися звичайні обмеження на push. +settings.protect_whitelist_users=Користувачі, які можуть робити push в цю гілку: settings.protect_whitelist_search_users=Пошук користувачів… +settings.protect_whitelist_teams=Команди, члени яких можуть робити push в цю гілку: settings.protect_whitelist_search_teams=Пошук команд… +settings.protect_merge_whitelist_committers=Обмежити право на прийняття Pull Request'ів в цю гілку списком +settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати Pull Request'и. В іншому випадку будь-хто з правами запису до головного сховища буде володіти такою можливістю. +settings.protect_merge_whitelist_users=Користувачі з правом на прийняття Pull Request'ів в цю гілку: +settings.protect_merge_whitelist_teams=Команди, члени яких мають право на прийняття Pull Request'ів в цю гілку: settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист +settings.update_protect_branch_success=Налаштування захисту гілки '%s' були успішно змінені. +settings.remove_protected_branch_success=Захист гілки '%s' був успішно відключений. settings.protected_branch_deletion=Відключити захист гілки +settings.protected_branch_deletion_desc=Будь-який користувач з дозволами на запис зможе виконувати push в цю гілку. Ви впевнені? +settings.default_branch_desc=Головна гілка є 'базовою' для вашого сховища, на яку за замовчуванням спрямовані всі Pull Request'и і яка є обличчям вашого сховища. Перше, що побачить відвідувач - це вміст головною гілки. Виберіть її з уже існуючих: settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. diff.browse_source=Переглянути джерело diff.parent=джерело diff.commit=коміт +diff.data_not_available=Різниця недоступна diff.show_diff_stats=Показати статистику Diff diff.show_split_view=Розділений перегляд diff.show_unified_view=Об'єднаний перегляд @@ -979,6 +1111,7 @@ diff.view_file=Переглянути файл diff.file_suppressed=Різницю між файлами не показано, бо вона завелика diff.too_many_files=Деякі файли не було показано, через те що забагато файлів було змінено +releases.desc=Відслідковувати версії проекту (релізи) та завантаження. release.releases=Релізи release.new_release=Новий реліз release.draft=Чернетка @@ -987,6 +1120,8 @@ release.stable=Стабільний release.edit=редагувати release.ahead=%d комітів %s після цього релізу release.source_code=Код +release.new_subheader=Публікація релізів допоможе зберігати чітку історію розвитку вашого проекту. +release.edit_subheader=Публікація релізів допоможе зберігати чітку історію розвитку вашого проекту. release.tag_name=Назва тегу release.target=Ціль release.tag_helper=Виберіть існуючий тег або створіть новий. @@ -1003,25 +1138,37 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз +release.deletion_desc=Видалення релізу видаляє Git-тег зі сховищ. Вміст сховища і історія залишаться незмінними. Продовжити? release.deletion_success=Реліз, було видалено. +release.tag_name_already_exist=Реліз з цим ім'ям мітки вже існує. release.tag_name_invalid=Неприпустиме ім'я тега. release.downloads=Завантажити branch.name=Ім'я гілки branch.search=Пошук гілок +branch.already_exists=Гілка з ім'ям '%s' вже існує. branch.delete_head=Видалити branch.delete=Видалити гілку '%s' branch.delete_html=Видалити гілку +branch.delete_desc=Видалення гілки НЕЗВОРОТНЕ. Дію не можна скасувати. Продовжити? branch.deletion_success=Гілка '%s' видалена. branch.deletion_failed=Не вдалося видалити гілку "%s". +branch.delete_branch_has_new_commits=Гілку '%s' не можна видалити, оскільки після злиття були додані нові коміти. +branch.create_branch=Створити гілку %s branch.create_from=з '%s' branch.create_success=Створено гілку "%s". branch.branch_already_exists=Гілка '%s' вже присутня в репозиторії. +branch.branch_name_conflict=Ім'я гілки '%s' конфліктує з уже існуючою гілкою '%s'. +branch.tag_collision=Гілка '%s' не може бути створена, так як вже існує тег з таким ім'ям. branch.deleted_by=Видалено %s branch.restore_success=Гілку "%s" відновлено. +branch.restore_failed=Не вдалося відновити гілку '%s'. +branch.protected_deletion_failed=Гілка '%s' захищена. Її не можна видалити. topic.manage_topics=Керувати тематичними мітками topic.done=Готово +topic.count_prompt=Ви не можете вибрати більше 25 тем +topic.format_prompt=Теми мають починатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів [org] org_name_holder=Назва організації @@ -1044,6 +1191,8 @@ team_permission_desc=Права доступу team_unit_desc=Дозволити доступ до розділів репозиторію form.name_reserved=Назву організації '%s' зарезервовано. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві організації. +form.create_org_not_allowed=Вам не дозволено створювати організації. settings=Налаштування settings.options=Організація @@ -1056,8 +1205,11 @@ settings.change_orgname_prompt=Ця зміна змінить посилання settings.update_avatar_success=Аватар організації оновлений. settings.delete=Видалити організацію settings.delete_account=Видалити цю організацію +settings.delete_prompt=Організація буде остаточно видалена. Це НЕ МОЖЛИВО відмінити! settings.confirm_delete_account=Підтвердіть видалення settings.delete_org_title=Видалити організацію +settings.delete_org_desc=Ця організація буде безповоротно видалена. Продовжити? +settings.hooks_desc=Додайте webhooks, який буде викликатися для всіх репозиторіїв якими володіє ця організація. members.membership_visibility=Видимість учасника: members.public=Показувати @@ -1075,8 +1227,11 @@ members.invite_now=Запросити зараз teams.join=Приєднатися teams.leave=Покинути teams.read_access=Доступ для читання +teams.read_access_helper=Учасники можуть переглядати та клонувати репозиторії команд. teams.write_access=Доступ на запис +teams.write_access_helper=Учасники можуть читати і виконувати push в репозиторії команд. teams.admin_access=Доступ адміністратора +teams.admin_access_helper=Учасники можуть виконувати pull, push в репозиторії команд і додавати співавторів в команду. teams.no_desc=Ця команда не має опису teams.settings=Налаштування teams.owners_permission_desc=Власник має повний доступ до усіх репозиторіїв та має права адміністратора організації. @@ -1085,6 +1240,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду +teams.delete_team_desc=Видалення команди скасовує доступ до сховища для її членів. Продовжити? teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. @@ -1111,13 +1267,30 @@ total=Разом: %d dashboard.statistic=Підсумок dashboard.operations=Технічне обслуговування dashboard.system_status=Статус системи +dashboard.statistic_info=У базі даних Gitea записано %d користувачів, %d організацій, %d публічних ключів, %d репозиторіїв, %d підписок на репозиторії, %d додавань в обране, %d дій, %d доступів, %d задач, %d коментарів, %d соціальних облікових записів, %d підписок на користувачів, %d зеркал, %d релізів, %d джерел входу, %d веб-хуків, %d етапів, %d міток, %d задач хуків, %d команд, %d задач по оновленню, %d приєднаних файлів. dashboard.operation_name=Назва операції dashboard.operation_switch=Перемкнути dashboard.operation_run=Запустити +dashboard.clean_unbind_oauth=Очистити список незавершених авторизацій OAuth +dashboard.clean_unbind_oauth_success=Всі незавершені зв'язки OAuth були видалені. dashboard.delete_inactivate_accounts=Видалити всі неактивні облікові записи dashboard.delete_inactivate_accounts_success=Усі неактивні облікові записи успішно видалено. dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв +dashboard.delete_repo_archives_success=Всі архіви репозиторіїв були видалені. +dashboard.delete_missing_repos=Видалити всі записи про репозиторії з відсутніми файлами Git +dashboard.delete_missing_repos_success=Всі записи про репозиторії з відсутніми файлами Git видалені. +dashboard.git_gc_repos=Виконати очистку сміття для всіх репозиторіїв dashboard.git_gc_repos_success=Всі репозиторії завершили збирання сміття. +dashboard.resync_all_sshkeys=Перезаписати файл '.ssh/authorized_keys' для SSH ключів Gitea. (Не потрібно для вбудованого SSH сервера.) +dashboard.resync_all_sshkeys_success=Всі відкриті ключі були перезаписані. +dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях. +dashboard.resync_all_hooks_success=Були пересинхронізовані всі pre-receive, update і post-receive Git хуки. +dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено +dashboard.reinit_missing_repos_success=Усі репозитрії git-файли яких втрачено, успішно переініціалізовано. +dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів +dashboard.sync_external_users_started=Запущена синхронізація зовнішніх користувачів. +dashboard.git_fsck=Запустити перевірку даних всіх репозиторіїв (git fsck) +dashboard.git_fsck_started=Перевірка даних репозиторіїв запущена. dashboard.server_uptime=Uptime серверу dashboard.current_goroutine=Поточна кількість Goroutines dashboard.current_memory_usage=Поточне використання пам'яті @@ -1125,6 +1298,7 @@ dashboard.total_memory_allocated=Виділено пам'яті загалом dashboard.memory_obtained=Отримано пам'яті dashboard.pointer_lookup_times=Пошуків вказівника dashboard.memory_allocate_times=Виділення пам'яті +dashboard.memory_free_times=Звільнень пам'яті dashboard.current_heap_usage=Поточне використання динамічної пам'яті dashboard.heap_memory_obtained=Отримано динамічної пам'яті dashboard.heap_memory_idle=Не використовується динамічною пам'яттю @@ -1161,6 +1335,8 @@ users.new_success=Обліковий запис '%s' створений. users.edit=Редагувати users.auth_source=Джерело автентифікації users.local=Локальні +users.auth_login_name=Логін для авторизації +users.password_helper=Залиште пароль порожнім, щоб не змінювати його. users.update_profile_success=Обліковий запис користувача було оновлено. users.edit_account=Редагувати обліковий запис users.max_repo_creation=Максимальна кількість репозиторіїв @@ -1173,6 +1349,8 @@ users.allow_import_local=Може імпортувати локальні реп users.allow_create_organization=Може створювати організацій users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис +users.still_own_repo=Ваш обліковий запис все ще володіє одним або кількома репозиторіями, спочатку вам потрібно видалити або передати їх. +users.still_has_org=Цей обліковий запис все ще є членом однієї або декількох організацій. Для продовження, покиньте або видаліть організації. users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями @@ -1206,22 +1384,34 @@ auths.host=Хост auths.port=Порт auths.bind_dn=Прив'язати DN auths.bind_password=Прив'язати пароль +auths.bind_password_helper=Попередження: цей пароль зберігається у вигляді простого тексту. Використовуйте обліковий запис тільки для читання, якщо це можливо. auths.user_base=База пошуку користувачів auths.user_dn=DN користувача auths.attribute_username=Атрибут імені користувача +auths.attribute_username_placeholder=Залиште порожнім, щоб використовувати ім'я користувача для реєстрації. +auths.attribute_name=Атрибут імені +auths.attribute_surname=Атрибут Surname +auths.attribute_mail=Атрибут Email +auths.attribute_ssh_public_key=Атрибут Відкритий SSH ключ +auths.attributes_in_bind=Витягувати атрибути в контексті Bind DN +auths.use_paged_search=Використовувати посторінковий пошук auths.search_page_size=Розмір сторінки auths.filter=Користувацький фільтр auths.admin_filter=Фільтр адміністратора +auths.ms_ad_sa=Атрибути пошуку MS AD auths.smtp_auth=Тип автентифікації SMTP auths.smtphost=SMTP хост auths.smtpport=SMTP порт auths.allowed_domains=Дозволені домени +auths.allowed_domains_helper=Залиште порожнім, щоб дозволити всі домени. Розділіть кілька доменів за допомогою коми (','). auths.enable_tls=Увімкнути TLS-шифрування auths.skip_tls_verify=Пропустити перевірку TLS auths.pam_service_name=Ім'я служби PAM auths.oauth2_provider=Постачальник OAuth2 auths.oauth2_clientID=ID клієнта (ключ) auths.oauth2_clientSecret=Ключ клієнта +auths.openIdConnectAutoDiscoveryURL=OpenID Connect URL для автоматизації входу +auths.oauth2_use_custom_url=Використовувати для користувача URL замість URL за замовчуванням auths.oauth2_tokenURL=URL токену auths.oauth2_authURL=URL авторизації auths.oauth2_profileURL=URL профілю @@ -1231,15 +1421,25 @@ auths.tips=Поради auths.tips.oauth2.general=OAuth2 автентифікація auths.tips.oauth2.general.tip=При додаванні нового OAuth2 провайдера, URL адреса переадресації по завершенні автентифікації повинена виглядати так:/user/oauth2//callback auths.tip.oauth2_provider=Постачальник OAuth2 +auths.tip.bitbucket=Створіть OAuth URI на сторінці https://bitbucket.org/account/user//oauth-consumers/new і додайте права 'Account' - 'Read' auths.tip.dropbox=Додайте новий додаток на https://www.dropbox.com/developers/apps auths.tip.facebook=Створіть новий додаток на https://developers.facebook.com/apps і додайте модуль "Facebook Login auths.tip.github=Додайте OAuth додаток на https://github.com/settings/applications/new auths.tip.gitlab=Додайте новий додаток на https://gitlab.com/profile/applications +auths.tip.google_plus=Отримайте облікові дані клієнта OAuth2 в консолі Google API на сторінці https://console.developers.google.com/ auths.tip.openid_connect=Використовуйте OpenID Connect Discovery URL (/.well-known/openid-configuration) для автоматичної настройки входу OAuth +auths.tip.twitter=Перейдіть на https://dev.twitter.com/apps, створіть програму і переконайтеся, що включена опція «Дозволити цю програму для входу в систему за допомогою Twitter» auths.edit=Редагувати джерело автентифікації +auths.activated=Ця аутентифікація активована +auths.new_success=Метод аутентифікації '%s' був доданий. +auths.update_success=Параметри аутентифікації оновлені. auths.update=Оновити джерело автентифікації auths.delete=Видалити джерело автентифікації auths.delete_auth_title=Видалити джерело автентифікації +auths.delete_auth_desc=Це джерело аутентифікації буде видалене, ви впевнені, що ви хочете продовжити? +auths.still_in_used=Ця перевірка справжності досі використовується деякими користувачами. Видаліть або змініть для цих користувачів тип входу в систему. +auths.deletion_success=Канал аутентифікації успішно знищений. +auths.login_source_exist=Джерело входу '%s' вже існує. config.server_config=Конфігурація сервера config.app_name=Назва сайту @@ -1257,6 +1457,7 @@ config.lfs_root_path=Кореневої шлях LFS config.static_file_root_path=Повний шлях до статичного файлу config.log_file_root_path=Шлях до лог файлу config.script_type=Тип скрипта +config.reverse_auth_user=Ім'я користувача для авторизації на reverse proxy config.ssh_config=Конфігурація SSH config.ssh_enabled=Увімкнено @@ -1281,6 +1482,7 @@ config.db_path=Шлях config.service_config=Конфігурація сервісу config.register_email_confirm=Потрібно підтвердити електронну пошту для реєстрації config.disable_register=Вимкнути самостійну реєстрацію +config.allow_only_external_registration=Включити реєстрацію тільки через сторонні сервіси config.enable_openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID config.enable_openid_signin=Увімкнути реєстрацію за допомогою OpenID config.show_registration_button=Показувати кнопку "Реєстрація @@ -1289,10 +1491,12 @@ config.mail_notify=Увімкнути сповіщення електронно config.disable_key_size_check=Вимкнути перевірку мінімального розміру ключа config.enable_captcha=Увімкнути CAPTCHA config.active_code_lives=Час актуальності кода підтвердження +config.reset_password_code_lives=Час життя коду на скидання пароля config.default_keep_email_private=Приховати адресу електронної пошти за замовчуванням config.default_allow_create_organization=Дозволити створення організацій за замовчуванням config.enable_timetracking=Увімкнути відстеження часу config.default_enable_timetracking=Увімкнути відстеження часу за замовчуванням +config.default_allow_only_contributors_to_track_time=Враховувати тільки учасників розробки в підрахунку часу config.no_reply_address=Прихований домен електронної пошти config.webhook_config=Конфігурація web-хуків @@ -1300,6 +1504,7 @@ config.queue_length=Довжина черги config.deliver_timeout=Затримка доставки config.skip_tls_verify=Пропустити перевірку TLS +config.mailer_config=Конфігурація SMTP-сервера config.mailer_enabled=Увімкнено config.mailer_disable_helo=Вимкнути HELO config.mailer_name=Ім'я @@ -1307,7 +1512,9 @@ config.mailer_host=Хост config.mailer_user=Користувач config.mailer_use_sendmail=Використовувати Sendmail config.mailer_sendmail_path=Шлях до Sendmail +config.mailer_sendmail_args=Додаткові аргументи до Sendmail config.send_test_mail=Відправити тестового листа +config.test_mail_failed=Не вдалося відправити тестовий лист на «%s»: %v config.test_mail_sent=Тестового листа було відправлено до '%s'. config.oauth_config=Конфігурація OAuth @@ -1431,8 +1638,14 @@ mark_as_unread=Позначити як непрочитане mark_all_as_read=Позначити всі як прочитані [gpg] +error.extract_sign=Не вдалося витягти підпис error.generate_hash=Не вдалося згенерувати хеш коміту +error.no_committer_account=Аккаунт користувача з таким Email не знайдено +error.no_gpg_keys_found=Не вдалося знайти GPG ключ що відповідає даному підпису error.not_signed_commit=Непідписаний коміт +error.failed_retrieval_gpg_keys=Не вдалося отримати відповідний GPG ключ користувача [units] +error.no_unit_allowed_repo=У вас немає доступу до жодного розділу цього репозитория. +error.unit_not_allowed=У вас немає доступу до жодного розділу цього репозитория. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 4e59ed08ea03..1484e6a8f012 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -1167,6 +1167,8 @@ branch.protected_deletion_failed=分支 '%s' 已被保护,不可删除。 topic.manage_topics=管理主题 topic.done=保存 +topic.count_prompt=您最多选择25个主题 +topic.format_prompt=主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符 [org] org_name_holder=组织名称 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 8a6914af2df1..dece41485c26 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -1,11 +1,15 @@ +app_desc=一個無痛、自託管的 Git 服務 home=首頁 dashboard=控制面版 explore=探索 help=說明 sign_in=登入 +sign_in_with=登入方式 sign_out=登出 +sign_up=註冊 link_account=連結帳戶 +link_account_signin_or_signup=使用現有的帳戶登入以連結到此帳號,或註冊新帳戶 register=註冊 website=網站 version=版本 @@ -13,12 +17,32 @@ page=頁面 template=樣板 language=語言 notifications=訊息 +create_new=建立... +user_profile_and_more=設定檔和設置... signed_in_as=已登入用戶 +enable_javascript=本網站在啟用 JavaScript 的情況下可以運作的更好。 username=用戶名稱 +email=電子郵件地址 password=密碼 +re_type=再次輸入密碼 +captcha=驗證碼 +twofa=兩步驟驗證 +twofa_scratch=兩步驟驗證備用碼 passcode=驗證碼 +u2f_insert_key=插入安全金鑰 +u2f_sign_in=按下安全金鑰上的按鈕。如果找不到按鈕, 請重新插入。 +u2f_press_button=請按下安全金鑰上的按鈕… +u2f_use_twofa=使用來自手機的兩步驟驗證碼 +u2f_error=找不到您的安全金鑰! +u2f_unsupported_browser=您的瀏覽器不支援 U2F 二步驟驗證技術。請嘗試其他瀏覽器。 +u2f_error_1=發生未知的錯誤,請重試。 +u2f_error_2=請確保您使用的是加密連接 (https://) 並且 URL 是正確的。 +u2f_error_3=伺服器無法執行您的請求。 +u2f_error_4=所提交的金鑰不符合此請求。如果您嘗試註冊它, 請確保該金鑰尚未註冊。 +u2f_error_5=在讀取金鑰之前已逾時,請重新載入以重試。 +u2f_reload=重新載入 repository=儲存庫 organization=組織 @@ -29,8 +53,12 @@ new_mirror=新鏡像 new_fork=Fork 新的儲存庫 new_org=新增組織 manage_org=管理組織 +admin_panel=網站管理 account_settings=帳號設定 settings=設定 +your_profile=個人訊息 +your_starred=標記星號 +your_settings=設定 all=所有 sources=來源 @@ -46,34 +74,105 @@ cancel=取消 [install] install=安裝頁面 +title=初始設定 +docker_helper=如果您正在使用 Docker 容器運行 Gitea,請務必先仔細閱讀官方文件後再對本頁面進行填寫。 +requite_db_desc=Gitea 需要安裝 MySQL、PostgreSQL、SQLite3、MSSQL 或 TiDB 其中一項。 db_title=資料庫設定 db_type=資料庫類型 host=主機 +user=使用者名稱 password=密碼 db_name=資料庫名稱 +db_helper=MySQL 使用者注意: 請使用 InnoDB 儲存引擎和 "utf8_general_ci" 字元集。 +ssl_mode=SSL path=資料庫文件路徑 - +sqlite_helper=SQLite3 或 TiDB 資料庫的檔路徑。如果將 Gitea 作為服務運行,
請輸入絕對路徑。 +err_empty_db_path=SQLite3 或 TiDB 的資料庫路徑不能為空。 +err_invalid_tidb_name=TiDB 資料庫名稱不能包含 "." 和 "-" 字元。 +no_admin_and_disable_registration=您不能夠在未建立管理員使用者的情況下禁止註冊。 +err_empty_admin_password=管理員密碼不能為空。 + +general_title=一般設定 +app_name=網站標題 +app_name_helper=您可以在此輸入您的公司名稱。 repo_path=儲存庫的根目錄 +repo_path_helper=所有遠端 Git 儲存庫會儲存到此目錄。 +lfs_path=Git LFS 根目錄 +lfs_path_helper=以 Git LFS 儲存檔案時會被儲存在此目錄中。請留空以停用 LFS 功能。 +run_user=以使用者名稱執行 +run_user_helper=輸入 Gitea 運行的作業系統使用者名稱。請注意, 此使用者必須具有對存儲庫根目錄的存取權限。 +domain=SSH 伺服器域名 +domain_helper=用於 SSH 複製的域名或主機位置。 +ssh_port=SSH 伺服器埠 +ssh_port_helper=SSH 伺服器使用的埠號,留空以停用此設定。 +http_port=Gitea HTTP 埠 +http_port_helper=Giteas web 伺服器將偵聽的埠號。 +app_url=Gitea 基本 URL。 +app_url_helper=用於 HTTP(S) 複製和電子郵件通知的基本地址。 log_root_path=日誌路徑 +log_root_path_helper=日誌檔將寫入此目錄。 optional_title=可選設定 +email_title=電子郵件設定 smtp_host=SMTP 主機 +smtp_from=電子郵件寄件者 +smtp_from_helper=Gitea 將會使用的電子郵件地址,輸入一個普通的電子郵件地址或使用 "名稱" 格式。 +mailer_user=SMTP 帳號 +mailer_password=SMTP 密碼 +register_confirm=要求註冊時確認電子郵件 +mail_notify=啟用郵件通知 +server_service_title=伺服器和其他服務設定 +offline_mode=啟用本地模式 +offline_mode_popup=停用其他服務並在本地提供所有資源。 +disable_gravatar=禁用 Gravatar 大頭貼 +disable_gravatar_popup=禁用 Gravatar 和其他大頭貼服務。除非使用者在本地上傳大頭貼, 否則將使用預設的大頭貼。 +federated_avatar_lookup=開啟聯合大頭貼 federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務 +disable_registration=關閉註冊功能 +disable_registration_popup=關閉註冊功能,只有管理員可以新增帳號。 +allow_only_external_registration_popup=僅允許通過外部服務註冊。 openid_signin=啟用 OpenID 登入 +openid_signin_popup=啟用 OpenID 登入 +openid_signup=啟用 OpenID 註冊 +openid_signup_popup=啟用基於 OpenID 的註冊 +enable_captcha=啟用驗證碼 enable_captcha_popup=要求在用戶註冊時輸入驗證碼 +require_sign_in_view=需要登錄才能查看頁面 +require_sign_in_view_popup=限制對使用者的頁面存取權限,未登入的使用者只會看到“登錄”和註冊頁面。 +admin_setting_desc=建立管理員帳號是選用的。 第一個註冊的使用者將自動成為管理員。 +admin_title=管理員帳號設定 +admin_name=管理員使用者名稱 admin_password=管理員密碼 confirm_password=確認密碼 +admin_email=電子郵件地址 install_btn_confirm=立即安裝 test_git_failed=無法識別 'git' 命令:%v +sqlite3_not_available=您目前的版本不支援 SQLite3,請從 %s 下載官方的預先編譯版本(不是 gobuild 版本)。 +invalid_db_setting=資料庫設定不正確: %v +invalid_repo_path=儲存庫根目錄設定不正確:%v save_config_failed=儲存設定失敗:%v +invalid_admin_setting=管理員帳戶設定不正確:%v +install_success=歡迎!非常感謝您選擇 Gitea,祝你一切順利。 +invalid_log_root_path=日誌根目錄設定不正確: %v +default_keep_email_private=預設隱藏電子郵件地址 +default_keep_email_private_popup=預設隱藏新使用者的電子郵件地址。 +default_allow_create_organization=預設允許建立組織 +default_allow_create_organization_popup=預設允許新使用者建立組織 +default_enable_timetracking=預設啟用時間追蹤 +default_enable_timetracking_popup=預設情況下啟用新存儲庫的時間跟蹤。 +no_reply_address=隱藏電子郵件域名 [home] +uname_holder=使用者名稱或電子郵件地址 password_holder=密碼 switch_dashboard_context=切換控制面版用戶 +my_repos=儲存庫 +show_more_repos=顯示更多儲存庫... collaborative_repos=參與協作的儲存庫 my_orgs=我的組織 my_mirrors=我的鏡像 view_home=訪問 %s +search_repos=搜尋儲存庫... issues.in_your_repos=屬於該用戶儲存庫的 @@ -82,30 +181,50 @@ repos=儲存庫 users=用戶 organizations=組織 search=搜尋 +code=程式碼 +repo_no_results=沒有找到符合的儲存庫。 +user_no_results=沒有找到符合的使用者。 +org_no_results=沒有找到符合的組織。 +code_search_results=搜尋結果:'%s' [auth] +create_new_account=註冊帳號 register_helper_msg=已經註冊?立即登錄! +social_register_helper_msg=已有帳號?立即連結! +disable_register_prompt=註冊功能已停用。 請聯繫您的網站管理員。 remember_me=記住登錄 forgot_password_title=忘記密碼 forgot_password=忘記密碼? +sign_up_now=還沒有帳戶?馬上註冊。 confirmation_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成確認註冊操作。 reset_password_mail_sent_prompt=一封新的確認郵件已發送至 %s。請檢查您的收件箱並在 %s 小時內完成重設密碼操作。 active_your_account=啟用您的帳戶 +prohibit_login=禁止登錄 +prohibit_login_desc=您的帳號被禁止登入,請聯繫網站管理員 +resent_limit_prompt=抱歉,您請求發送驗證電子郵件太過頻繁,請等待 3 分鐘後再試一次。 has_unconfirmed_mail=%s 您好,您有一封發送至( %s) 但未被確認的郵件。如果您未收到啟用郵件,或需要重新發送,請單擊下方的按鈕。 resend_mail=單擊此處重新發送確認郵件 email_not_associate=此電子郵件地址未與任何帳戶連結 send_reset_mail=點選此處重發您的密碼重製郵件 reset_password=重置密碼 +invalid_code=您的確認代碼無效或已過期。 reset_password_helper=單擊此處重置密碼 +non_local_account=非本機帳號無法透過 Gitea 的網頁介面更改密碼 verify=驗證 scratch_code=備用碼 use_scratch_code=使用備用碼 twofa_scratch_used=你已經使用了你的備用碼。你將會被轉到兩步驟驗證設定頁面以便移除你已註冊設備或重新產生新的備用碼。 +twofa_passcode_incorrect=你的驗證碼不正確。如果您遺失設備,請使用您的備用碼登入。 twofa_scratch_token_incorrect=您的備用碼不正確 +login_userpass=登入 login_openid=OpenID openid_connect_submit=連接 openid_connect_title=連接到現有帳戶 +openid_connect_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 openid_register_title=建立新帳戶 +openid_register_desc=所選的 OpenID URI 未知。在這裡連結一個新帳戶。 +openid_signin_desc=輸入您的 OpenID URI。例如: https://anne.me、bob.openid.org.cn 或 gnusocial.net/carry。 +disable_forgot_password_mail=註冊功能已停用。 請聯繫您的網站管理員。 [mail] activate_account=請啟用您的帳戶 @@ -117,12 +236,14 @@ register_notify=歡迎來到 Gitea [modal] yes=確認操作 no=取消操作 +modify=更新 [form] UserName=用戶名 RepoName=儲存庫名稱 Email=郵箱地址 Password=密碼 +Retype=再次輸入密碼 SSHTitle=SSH 金鑰名稱 HttpsUrl=HTTPS URL 地址 PayloadUrl=推送地址 @@ -138,6 +259,8 @@ TreeName=檔案路徑 Content=內容 require_error=不能為空。 +alpha_dash_error=`應該只包含英文字母、數字、破折號 ("-")、和底線 ("_") 字元。` +alpha_dash_dot_error=`應該只包含英文字母、數字、破折號 ("-")、下底線("_")和小數點 (".") 字元。` size_error=長度必須為 %s。 min_size_error=長度最小為 %s 個字符。 max_size_error=長度最大為 %s 個字符。 @@ -145,19 +268,40 @@ email_error=不是一個有效的郵箱地址。 url_error=不是一個有效的 URL。 include_error=必須包含子字符串 '%s'。 unknown_error=未知錯誤: - +captcha_incorrect=驗證碼不正確。 +password_not_match=密碼錯誤。 + +username_been_taken=使用者名稱已被使用 +repo_name_been_taken=儲存庫名稱已被使用。 +org_name_been_taken=組織名稱已被使用。 +team_name_been_taken=團隊名稱已被使用。 +email_been_used=此電子信箱已被使用 +openid_been_used=OpenID 位址 '%s' 已被使用。 +username_password_incorrect=使用者名稱或密碼不正確 +enterred_invalid_repo_name=輸入的儲存庫名稱不正確。 +enterred_invalid_owner_name=新的擁有者名稱無效。 +enterred_invalid_password=輸入的密碼不正確。 user_not_exist=該用戶名不存在 +cannot_add_org_to_team=組織不能被新增為團隊成員。 +invalid_ssh_key=無法驗證您的 SSH 密鑰:%s +invalid_gpg_key=無法驗證您的 GPG 密鑰:%s +unable_verify_ssh_key=無法驗證 SSH 密鑰; 請再次檢查是否有錯誤。 auth_failed=授權認證失敗:%v +still_own_repo=此帳戶仍然擁有一個或多個儲存庫,您必須先刪除或轉移它們。 +still_has_org=此帳戶仍是一個或多個組織的成員,您必須先離開它們。 +org_still_own_repo=該組織仍然是某些儲存庫的擁有者,您必須先轉移或刪除它們才能執行刪除組織! target_branch_not_exist=目標分支不存在 [user] +change_avatar=更改大頭貼... join_on=加入於 repositories=儲存庫列表 activity=公開活動 followers=關註者 +starred=已收藏 following=關註中 follow=關注 unfollow=取消關注 @@ -166,15 +310,21 @@ form.name_reserved=用戶名 '%s' 是被保留的。 [settings] profile=個人訊息 +account=帳號 password=修改密碼 security=安全性 avatar=頭像 ssh_gpg_keys=SSH / GPG 金鑰 social=社交帳號綁定 +applications=應用程式 +orgs=管理組織 repos=儲存庫 delete=刪除帳戶 twofa=兩步驟驗證 +account_link=已連結帳號 +organization=組織 uid=用戶 ID +u2f=安全密鑰 public_profile=公開訊息 full_name=自定義名稱 @@ -182,21 +332,51 @@ website=個人網站 location=所在地區 update_profile=更新訊息 update_profile_success=您的個人資料已被更新 +change_username=您的使用者名稱已更改。 +change_username_prompt=注意:使用者名更改也會更改您的帳戶的 URL。 continue=繼續操作 cancel=取消操作 +language=語言 +lookup_avatar_by_mail=以電子郵件查找大頭貼 federated_avatar_lookup=Federated Avatar 查詢 enable_custom_avatar=啟動自定義頭像 choose_new_avatar=選擇新的頭像 +update_avatar=更新大頭貼 delete_current_avatar=刪除當前頭像 +uploaded_avatar_not_a_image=上傳的文件不是圖片 +update_avatar_success=您的大頭貼已更新 +change_password=更新密碼 old_password=當前密碼 new_password=新的密碼 +retype_new_password=重新輸入新的密碼 +password_incorrect=輸入的密碼不正確! +change_password_success=您的密碼已更新。 從現在起使用您的新密碼登錄。 +password_change_disabled=非本機帳號無法透過 Gitea 的網頁介面更改密碼 emails=電子郵件地址 +manage_emails=管理電子郵件地址 +manage_openid=管理 OpenID 位址 email_desc=您的主要邮箱地址将被用于通知提醒和其它操作。 primary=主要 +primary_email=設為主要 +delete_email=移除 +email_deletion=移除電子郵件地址 +email_deletion_desc=電子郵件地址和相關資訊將從您的帳戶中刪除,此電子郵件地址所提交的 Git 將保持不變,繼續執行? +email_deletion_success=該電子郵件地址已被刪除 +openid_deletion=移除 OpenID 位址 +openid_deletion_desc=從您的帳戶刪除此 OpenID 位址將會無法使用它進行登入。你確定要繼續嗎? +openid_deletion_success=該 OpenID 已被刪除 +add_new_email=新增電子郵件地址 +add_new_openid=新增 OpenID URI +add_email=新增電子郵件地址 add_openid=新增 OpenID URI +add_email_confirmation_sent=一封新的確認郵件已發送至 '%s',請檢查您的收件匣並在 %s 內確認您的電郵地址。 +add_email_success=該電子郵件地址已添加。 +add_openid_success=該 OpenID 已添加。 +keep_email_private=隱藏電子郵件地址 +keep_email_private_popup=您的電子郵件地址將對其他使用者隱藏。 manage_ssh_keys=管理 SSH 金鑰 manage_gpg_keys=管理 GPG 金鑰 @@ -209,6 +389,13 @@ subkeys=次金鑰 key_id=金鑰 ID key_name=金鑰名稱 key_content=金鑰內容 +add_key_success=SSH 金鑰 "%s" 已被添加。 +add_gpg_key_success=GPG 金鑰 "%s" 已被添加。 +delete_key=移除 +ssh_key_deletion=移除 SSH 金鑰 +gpg_key_deletion=移除 GPG 金鑰 +ssh_key_deletion_success=SSH 金鑰已被移除。 +gpg_key_deletion_success=GPG 金鑰已被移除。 add_on=增加於 valid_until=有效期至 valid_forever=永遠有效 @@ -220,63 +407,112 @@ key_state_desc=該金鑰在 7 天內被使用過 token_state_desc=此 token 在過去七天內曾經被使用過 show_openid=在設定檔顯示 hide_openid=從設定檔隱藏 +ssh_disabled=已停用 SSH manage_social=管理關聯社交帳戶 +unbind=解除連結 +manage_access_token=管理訪問權杖 generate_new_token=生成新的令牌 token_name=令牌名稱 generate_token=生成令牌 delete_token=删除令牌 +access_token_deletion=刪除訪問權杖 twofa_is_enrolled=您的帳號已經啟用兩步驟驗證。 twofa_not_enrolled=您的帳號目前尚未啟用兩步驟驗證。 +twofa_disable=停用兩步驟驗證 +twofa_scratch_token_regenerate=重新產生備用碼 +twofa_enroll=啟用兩步驟驗證 +twofa_disable_note=如有需要,您可以停用兩步驟驗證。 +twofa_disable_desc=關閉兩步驟驗證會使您的帳號安全性降低,繼續執行? +regenerate_scratch_token_desc=如果您遺失了臨時令牌或已經使用它登錄,您可以在此處重置。 twofa_disabled=兩步驟驗證已經被關閉。 scan_this_image=使用您的授權應用程式來掃瞄圖片: or_enter_secret=或者輸入密碼: %s - - +then_enter_passcode=然後輸入應用程序中顯示的驗證碼: +passcode_invalid=無效的驗證碼,請重試。 + +u2f_desc=安全密鑰是包含加密密鑰的硬體設備。 它們可以用於兩步驟認證。 安全密鑰必須符合 FIDO U2F 標準。 +u2f_require_twofa=必須先開啟兩步驟驗證才能使用安全密鑰。 +u2f_register_key=新增安全密鑰 +u2f_nickname=暱稱 +u2f_press_button=按下安全密鑰上的密碼進行註冊。 +u2f_delete_key=移除安全密鑰 +u2f_delete_key_desc=如果您移除安全密鑰,則無法再使用它登錄。 確定嗎? + +manage_account_links=管理已連結的帳號 +manage_account_links_desc=這些外部帳號與您的 Gitea 帳號相關聯。 +account_links_not_available=目前沒有連結到您的 Gitea 帳號的外部帳號 +remove_account_link=刪除連結的帳號 +remove_account_link_success=已取消連結帳號。 orgs_none=您尚未成為任一組織的成員。 repos_none=您不擁有任何存儲庫 delete_account=刪除當前帳戶 +delete_prompt=此動作將永久刪除您的帳號,而且無法復原。 confirm_delete_account=確認刪除帳戶 +delete_account_title=刪除使用者帳號 +delete_account_desc=您是否確定要永久刪除此帳號? [repo] owner=擁有者 repo_name=儲存庫名稱 +repo_name_helper=好的儲存庫名稱通常是簡短的、好記的、且獨特的。 visibility=可見度 +visiblity_helper=將儲存庫設為私人 +visiblity_helper_forced=您的網站管理員強制新的存儲庫必需設定為私人。 +visiblity_fork_helper=(修改該值將會影響到所有派生倉庫) +clone_helper=不知道如何操作?瀏覽 幫助 ! fork_repo=複製儲存庫 fork_from=複製自 repo_desc=儲存庫描述 repo_lang=儲存庫語言 +repo_gitignore_helper=選擇 .gitignore 範本 license=授權許可 +license_helper=請選擇授權許可文件 +readme=讀我 +readme_helper=選擇讀我檔案範本。 +auto_init=初始化儲存庫(建立 .gitignore、授權許可文件和讀我檔案) create_repo=建立儲存庫 default_branch=默認分支 mirror_prune=裁減 +mirror_interval_invalid=鏡像周期無效 +mirror_address=由 URL 複製 +mirror_last_synced=上次同步 watchers=關注者 stargazers=稱讚者 forks=複製儲存庫 pick_reaction=選擇你的表情反應 +reactions_more=再多添加 %d個 form.reach_limit_of_creation=您已經達到了儲存庫 %d 的上限。 form.name_reserved=儲存庫名稱 '%s' 是預留的。 +form.name_pattern_not_allowed=儲存庫名稱無法使用 "%s"。 +need_auth=複製授權驗證 migrate_type=遷移類型 migrate_type_helper=該儲存庫將是一個鏡像 migrate_repo=遷移儲存庫 +migrate.clone_local_path=或者是本地端伺服器路徑 migrate.permission_denied=您並沒有導入本地儲存庫的權限。 +migrate.invalid_local_path=無效的本地路徑,該路徑不存在或不是一個目錄! migrate.failed=遷移失敗:%v mirror_from=镜像来自 forked_from=複製自 +fork_from_self=您無法複製您的儲存庫! copy_link=複製連結 +copy_link_success=已複製連結 +copy_link_error=請按下 ⌘-C 或 Ctrl-C 複製 copied=複製成功 unwatch=取消關注 watch=關注 unstar=取消收藏 star=收藏 fork=複製 +download_archive=下载此儲存庫 no_desc=暫無描述 quick_guide=快速幫助 @@ -302,10 +538,23 @@ file_raw=原始文件 file_history=歷史記錄 file_view_raw=查看原始文件 file_permalink=永久連結 +file_too_large=檔案太大,無法顯示。 +video_not_supported_in_browser=您的瀏覽器不支援使用 HTML5 播放影片。 stored_lfs=儲存到到 Git LFS +commit_graph=提交線圖 +editor.new_file=新增文件 +editor.upload_file=上傳文件 +editor.edit_file=編輯文件 editor.preview_changes=預覽更改 +editor.cannot_edit_non_text_files=網站介面不能編輯二進位檔案 +editor.edit_this_file=編輯文件 +editor.must_be_on_a_branch=你必須在一個分支或提出對此檔的更改。 +editor.delete_this_file=刪除檔案 +editor.file_delete_success=文件 %s 已刪除。 +editor.name_your_file=命名您的檔案... editor.or=或 +editor.cancel_lower=取消 editor.commit_changes=提交更改嗎? editor.add_tmpl=新增 %s/' editor.add=新增 '%s' @@ -313,7 +562,9 @@ editor.update=更新 '%s' editor.delete=刪除 '%s' editor.commit_directly_to_this_branch=直接提交到 %s 分支。 editor.create_new_branch=建立 新的分支 為此提交和開始合併請求。 +editor.new_branch_name_desc=新的分支名稱... editor.cancel=取消 +editor.filename_cannot_be_empty=檔案名稱不能為空。 editor.branch_already_exists='%s' 已存在於此存儲庫。 editor.no_changes_to_show=沒有可以顯示的變更。 editor.fail_to_update_file=上傳/建立檔案 '%s' 失敗, 錯誤訊息: %v @@ -321,14 +572,18 @@ editor.unable_to_upload_files=上傳檔案失敗到 '%s', 錯誤訊息: %v editor.upload_files_to_dir=上傳檔案到 '%s' commits.commits=次程式碼提交 +commits.search=搜尋提交歷史... commits.find=搜尋 +commits.search_all=所有分支 commits.author=作者 commits.message=備註 commits.date=提交日期 commits.older=更舊的提交 commits.newer=更新的提交 commits.signed_by=簽署人 +commits.gpg_key_id=GPG 金鑰 ID +ext_issues=外部問題 issues.new=建立問題 issues.new.labels=標籤 @@ -339,12 +594,18 @@ issues.new.no_milestone=未選擇里程碑 issues.new.clear_milestone=清除已選取里程碑 issues.new.open_milestone=開啟中的里程碑 issues.new.closed_milestone=已關閉的里程碑 +issues.new.assignees=指派成員 +issues.new.clear_assignees=取消指派成員 +issues.new.no_assignees=未指派成員 issues.no_ref=未指定分支或標籤 issues.create=建立問題 issues.new_label=建立標籤 +issues.new_label_placeholder=標籤名稱 +issues.new_label_desc_placeholder=描述 issues.create_label=建立標籤 issues.label_templates.title=載入一組預定義的標籤 issues.label_templates.helper=選擇一個標籤集 +issues.label_templates.use=使用標籤集 issues.label_templates.fail_to_load_file=載入標籤範本檔案 '%s' 失敗: %v issues.add_label_at=加上了
%s
標籤 %s issues.remove_label_at=刪除了
%s
標籤 %s @@ -360,8 +621,11 @@ issues.delete_branch_at=`刪除分支 %s %s` issues.open_tab=%d 個開啓中 issues.close_tab=%d 個已關閉 issues.filter_label=標籤篩選 +issues.filter_label_no_select=所有標籤 issues.filter_milestone=里程碑篩選 +issues.filter_milestone_no_select=所有里程碑 issues.filter_assignee=指派人篩選 +issues.filter_assginee_no_select=所有指派成員 issues.filter_type=類型篩選 issues.filter_type.all_issues=所有問題 issues.filter_type.assigned_to_you=指派給您的 @@ -374,6 +638,10 @@ issues.filter_sort.recentupdate=最近更新 issues.filter_sort.leastupdate=最少更新 issues.filter_sort.mostcomment=最多評論 issues.filter_sort.leastcomment=最少評論 +issues.filter_sort.moststars=最多收藏 +issues.filter_sort.feweststars=最少收藏 +issues.filter_sort.mostforks=最多複製 +issues.filter_sort.fewestforks=最少複製 issues.action_open=開啟 issues.action_close=關閉 issues.action_label=標籤 @@ -392,7 +660,9 @@ issues.commented_at=` 評論 %s` issues.delete_comment_confirm=您確定要刪除該條評論嗎? issues.no_content=尚未有任何內容 issues.close_issue=關閉 +issues.close_comment_issue=評論並關閉 issues.reopen_issue=重新開啟 +issues.reopen_comment_issue=重新開啟並評論 issues.create_comment=評論 issues.closed_at=`於 %[2]s 關閉` issues.reopened_at=`於 %[2]s 重新開啟` @@ -405,11 +675,16 @@ issues.edit=編輯 issues.cancel=取消 issues.save=儲存 issues.label_title=標籤名稱 +issues.label_description=標籤描述 issues.label_color=標籤顏色 issues.label_count=%d 個標籤 issues.label_open_issues=%d 個開啓的問題 issues.label_edit=編輯 issues.label_delete=刪除 +issues.label_modify=編輯標籤 +issues.label_deletion=刪除標籤 +issues.label_deletion_desc=刪除標籤會將其從所有問題中刪除,繼續? +issues.label_deletion_success=標籤已刪除。 issues.label.filter_sort.alphabetically=按字母顺序排序 issues.label.filter_sort.reverse_alphabetically=按字母反向排序 issues.label.filter_sort.by_size=大小 @@ -419,19 +694,43 @@ issues.attachment.open_tab=`在新的標籤頁中查看 '%s'` issues.attachment.download=`點擊下載 '%s'` issues.subscribe=訂閱 issues.unsubscribe=取消訂閱 +issues.tracker=時間追蹤 issues.start_tracking_short=開始 +issues.start_tracking=開始時間追蹤 issues.start_tracking_history=`開始工作 %s` issues.tracking_already_started=`您已經開始時間追蹤這個 問題!` issues.stop_tracking=停止 issues.stop_tracking_history=`結束工作 %s` +issues.add_time=手動新增時間 +issues.add_time_short=新增時間 issues.add_time_cancel=取消 issues.add_time_history=`加入了花費時間 %s` issues.add_time_hours=小時 issues.add_time_minutes=分鐘 +issues.add_time_sum_to_small=沒有輸入時間。 issues.cancel_tracking=取消 issues.cancel_tracking_history=`取消時間追蹤 %s` - +issues.time_spent_total=總花費時間 +issues.time_spent_from_all_authors=`總花費時間:%s` +issues.due_date=截止日期 +issues.invalid_due_date_format=截止日期的格式錯誤,必須是 "yyyy-mm-dd" 的形式。 +issues.error_modifying_due_date=無法修改截止日期。 +issues.error_removing_due_date=無法移除截止日期。 +issues.due_date_form=yyyy年mm月dd日 +issues.due_date_form_add=新增截止日期 +issues.due_date_form_update=更改截止日期 +issues.due_date_form_remove=移除截止日期 +issues.due_date_not_writer=您需要儲存庫寫入權限來更改問題的截止日。 +issues.due_date_not_set=未設定截止日期。 +issues.due_date_added=已新增截止日期 %s %s +issues.due_date_modified=已將截止日期修改為 %s ,原截止日期: %s %s +issues.due_date_remove=已移除截止日期 %s %s +issues.due_date_overdue=逾期 + +pulls.desc=啟用合併請求及程式碼審核 pulls.new=建立合併請求 +pulls.compare_changes=建立合併請求 +pulls.compare_base=合併到 pulls.filter_branch=過濾分支 pulls.no_results=未找到結果 pulls.create=建立合併請求 @@ -439,8 +738,10 @@ pulls.title_desc=請求將 %[1]d 次程式碼提交從 %[2]s 合併 pulls.merged_title_desc=於 %[4]s 將 %[1]d 次代碼提交從 %[2]s合併至 %[3]s pulls.tab_conversation=對話內容 pulls.tab_commits=程式碼提交 +pulls.tab_files=檔案變動 pulls.reopen_to_merge=請重新開啟合併請求來完成合併操作。 pulls.merged=已合併 +pulls.has_merged=合併請求已合併。 pulls.can_auto_merge_desc=這個拉請求可以自動合併。 pulls.merge_pull_request=合併請求 pulls.rebase_merge_pull_request=Rebase 合併 @@ -460,6 +761,10 @@ milestones.due_date=截止日期(可選) milestones.clear=清除 milestones.edit=編輯里程碑 milestones.cancel=取消 +milestones.modify=更新里程碑 +milestones.edit_success=里程碑 '%s' 已更新。 +milestones.deletion=刪除里程碑 +milestones.deletion_success=里程碑已刪除 milestones.filter_sort.closest_due_date=到期日由近到遠 milestones.filter_sort.furthest_due_date=到期日由遠到近 milestones.filter_sort.least_complete=完成度由低到高 @@ -467,10 +772,17 @@ milestones.filter_sort.most_complete=完成度由高到低 milestones.filter_sort.most_issues=問題由多到少 milestones.filter_sort.least_issues=問題由少到多 +ext_wiki=外部 Wiki +ext_wiki.desc=連結外部 Wiki。 wiki=Wiki +wiki.welcome=歡迎使用 Wiki! +wiki.welcome_desc=Wiki 允許你撰寫和與協作者分享文件 +wiki.desc=撰寫與和協作者分享文件。 +wiki.create_first_page=建立第一個頁面 wiki.page=頁面 wiki.filter_page=過濾頁面 +wiki.new_page=頁面 wiki.default_commit_message=關於此次頁面修改的說明(非必要)。 wiki.save_page=儲存頁面 wiki.last_commit_info=%s 於 %s 修改了此頁面 @@ -478,6 +790,7 @@ wiki.edit_page_button=修改 wiki.new_page_button=新的頁面 wiki.delete_page_button=刪除頁面 wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。 +wiki.reserved_page=Wiki 頁面名稱 "%s" 是被保留的。 wiki.pages=所有頁面 wiki.last_updated=最後更新於 %s @@ -496,6 +809,9 @@ activity.title.user_n=%d 使用者 activity.title.prs_1=%d 合併請求 activity.title.prs_n=%d 合併請求 activity.merged_prs_label=已合併 +activity.opened_prs_label=提案 +activity.active_issues_count_1=%d 個問題 +activity.active_issues_count_n=%d 個問題 activity.closed_issues_count_1=已關閉的 Issue activity.closed_issues_count_n=已關閉的 Issue activity.title.issues_1=%d Issue @@ -506,6 +822,9 @@ activity.closed_issue_label=已關閉 activity.new_issues_count_1=建立問題 activity.new_issues_count_n=建立問題 activity.new_issue_label=已開啟 +activity.title.unresolved_conv_1=%d 未解決的對話 +activity.title.unresolved_conv_n=%d 未解決的對話 +activity.unresolved_conv_desc=這些最近更改的問題和合併請求尚未解決。 activity.unresolved_conv_label=打開 activity.title.releases_1=%d 版本發佈 activity.title.releases_n=%d 版本發佈 @@ -518,6 +837,9 @@ search.results=在 %s 中搜尋 "%s" 的结果 settings=儲存庫設定 settings.desc=設定是您可以管理儲存庫設定的地方 +settings.options=儲存庫 +settings.collaboration=協作者 +settings.collaboration.admin=管理員 settings.collaboration.write=可寫權限 settings.collaboration.read=可讀權限 settings.collaboration.undefined=未定義 @@ -525,24 +847,47 @@ settings.hooks=管理 Webhooks settings.githooks=管理 Git Hooks settings.basic_settings=基本設定 settings.mirror_settings=鏡像設定 +settings.sync_mirror=現在同步 +settings.mirror_sync_in_progress=鏡像同步正在進行中。 請稍後再回來看看。 +settings.site=網站 settings.update_settings=更新儲存庫設定 settings.advanced_settings=高級設定 +settings.wiki_desc=啟用儲存庫 Wiki +settings.use_internal_wiki=使用內建 Wiki +settings.use_external_wiki=使用外部 Wiki settings.external_wiki_url=外部 Wiki 連結 +settings.external_wiki_url_error=外部 Wiki 網址不是有效的網址。 +settings.external_wiki_url_desc=點擊問題標籤時,使用者會被導向到外部 Wiki URL。 settings.external_tracker_url=外部 Issue 追蹤網址 settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style.numeric=數字 settings.tracker_issue_style.alphanumeric=字母及數字 +settings.enable_timetracker=啟用時間追蹤 settings.danger_zone=危險操作區 settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! +settings.convert=轉換為普通儲存庫 +settings.convert_desc=您可以將此鏡像轉成普通儲存庫。此動作不可恢復。 +settings.convert_confirm=轉換儲存庫 +settings.convert_succeed=鏡像儲存庫已成功轉換為一般儲存庫。 settings.transfer=轉移儲存庫所有權 settings.delete=刪除本儲存庫 settings.delete_notices_1=- 此操作 不可以 被回滾。 settings.transfer_owner=新擁有者 +settings.confirm_delete=刪除儲存庫 +settings.add_collaborator=增加協作者 +settings.add_collaborator_success=成功增加協作者! +settings.delete_collaborator=移除 +settings.collaborator_deletion=移除協作者 +settings.remove_collaborator_success=已移除協作者。 +settings.search_user_placeholder=搜尋使用者... settings.add_webhook=建立 Webhook +settings.webhook_deletion=刪除 Webhook +settings.webhook_deletion_success=Webhook 已刪除。 settings.webhook.test_delivery=測試推送 settings.webhook.request=請求內容 settings.webhook.response=響應內容 settings.webhook.headers=標題 +settings.webhook.payload=內容 settings.webhook.body=響應內容 settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中的內容。如果想要刪除某個 Hook,則提交空白文本即可。 settings.githook_name=Hook 名稱 @@ -554,11 +899,26 @@ settings.slack_icon_url=圖標 URL settings.discord_username=使用者名稱 settings.discord_icon_url=Icon URL settings.slack_color=顏色代碼 +settings.event_desc=觸發條件: +settings.event_push_only=推送事件 +settings.event_send_everything=所有事件 +settings.event_choose=自訂事件... settings.event_create=建立 +settings.event_create_desc=建立分支或標籤 +settings.event_delete=刪除 +settings.event_delete_desc=分支或標籤已刪除 +settings.event_fork=複製 +settings.event_issues=問題 +settings.event_issues_desc=問題被開啟,關閉,重新開啟,編輯,指派,取消指派,更新標籤,清除標籤,設置里程碑或取消設置里程碑。 +settings.event_issue_comment=問題評論 +settings.event_issue_comment_desc=已經建立、編輯或刪除的問題評論。 settings.event_pull_request=合併請求 settings.event_push=推送 settings.event_repository=儲存庫 +settings.add_hook_success=Webhook 新增成功! settings.update_webhook=更新 Webhook +settings.update_hook_success=Webhook 更新成功! +settings.delete_webhook=刪除 Webhook settings.recent_deliveries=最近推送記錄 settings.hook_type=Hook 類型 settings.slack_token=令牌 @@ -573,8 +933,11 @@ settings.protected_branch=分支保護 settings.protected_branch_can_push=允許推送? settings.protected_branch_can_push_yes=你可以推送 settings.protected_branch_can_push_no=你不能推送 +settings.protect_whitelist_search_users=搜尋使用者... +settings.protect_whitelist_search_teams=搜尋團隊... settings.add_protected_branch=啟用保護 settings.delete_protected_branch=停用保護 +settings.choose_branch=選擇一個分支... diff.browse_source=瀏覽代碼 diff.parent=父節點 @@ -603,19 +966,34 @@ release.title=標題 release.content=內容 release.write=內容編輯 release.preview=效果預覽 +release.loading=載入中… +release.prerelease_helper=標記此版本不適合生產使用。 release.cancel=取消 release.publish=發佈版本 release.save_draft=儲存草稿 +release.edit_release=編輯發佈訊息 +release.delete_release=刪除發佈 +release.deletion=刪除發佈 release.deletion_success=已刪除此版本發佈。 +release.tag_name_already_exist=已經存在使用相同標籤的發佈版本。 +release.tag_name_invalid=標籤名稱無效。 release.downloads=下載附件 +branch.name=分支名稱 branch.search=搜尋分支 +branch.already_exists=分支名稱 ”%s“ 已經存在 branch.delete_head=刪除 +branch.delete=刪除分支 '%s' branch.delete_html=刪除分支 +branch.delete_desc=刪除分支是永久的。 此動作無法復原,繼續? +branch.deletion_success=分支 '%s' 已被刪除。 +branch.deletion_failed=刪除分支 '%s' 失敗。 branch.create_branch=建立分支 %s +branch.create_from=從 '%s' branch.branch_already_exists=分支 '%s' 已存在此儲存庫 branch.deleted_by=刪除人: %s +topic.done=完成 [org] org_name_holder=組織名稱 @@ -626,23 +1004,37 @@ people=組織成員 teams=組織團隊 lower_members=名成員 lower_repositories=個儲存庫 +create_new_team=建立團隊 +create_team=建立新的團隊 org_desc=組織描述 team_name=團隊名稱 team_desc=團隊描述 +team_permission_desc=權限 +form.name_reserved=組織名稱 '%s' 是被保留的。 +form.name_pattern_not_allowed=儲存庫名稱無法使用 "%s"。 +form.create_org_not_allowed=此帳號禁止建立組織。 settings=組織設定 +settings.options=組織 settings.full_name=組織全名 settings.website=官方網站 settings.location=所在地區 settings.update_settings=更新組織設定 settings.update_setting_success=組織設定已更新。 +settings.change_orgname_prompt=注意:修改組織名稱將會同時修改對應的 URL。 +settings.update_avatar_success=組織大頭貼已經更新。 settings.delete=刪除組織 settings.delete_account=刪除當前組織 settings.confirm_delete_account=確認刪除組織 +settings.delete_org_title=刪除組織 settings.hooks_desc=新增 webhooks 將觸發在這個組織下 全部的儲存庫 。 members.membership_visibility=成員可見性: +members.public=可見 +members.public_helper=隱藏 +members.private=隱藏 +members.private_helper=顯示 members.member_role=成員角色: members.owner=管理員 members.member=普通成員 @@ -654,22 +1046,30 @@ members.invite_now=立即邀請 teams.join=加入團隊 teams.leave=離開團隊 teams.read_access=讀取權限 +teams.read_access_helper=成員可以查看和複製團隊儲存庫。 teams.write_access=寫入權限 +teams.write_access_helper=成員可以查看和推送到團隊儲存庫。 +teams.admin_access=管理員權限 teams.no_desc=該團隊暫無描述 teams.settings=團隊設定 teams.members=團隊成員 teams.update_settings=更新團隊設定 +teams.delete_team=刪除團隊 teams.add_team_member=新增團隊成員 +teams.delete_team_title=刪除團隊 teams.delete_team_success=該團隊已被刪除。 teams.repositories=團隊儲存庫 +teams.search_repo_placeholder=搜尋儲存庫... teams.add_team_repository=新增團隊儲存庫 teams.remove_repo=移除儲存庫 teams.add_nonexistent_repo=您嘗試新增到團隊的儲存庫不存在,請先建立儲存庫! [admin] dashboard=控制面版 +users=使用者帳號 organizations=組織管理 repositories=儲存庫管理 +authentication=認證來源 config=應用設定管理 notices=系統提示管理 monitor=應用監控面版 @@ -677,6 +1077,10 @@ first_page=首頁 last_page=末頁 total=總計:%d +dashboard.statistic=摘要 +dashboard.operations=維護操作 +dashboard.system_status=系統狀態 +dashboard.statistic_info=Gitea 資料庫統計:%d 位使用者,%d 個組織,%d 個公鑰,%d 個儲存庫,%d 個儲存庫關注,%d 個讚,%d 次行為,%d 條權限記錄,%d 個問題,%d 次評論,%d 個社交帳號,%d 個用戶關註,%d 個鏡像,%d 個版本發佈,%d 個登錄源,%d 個 Webhook ,%d 個里程碑,%d 個標籤,%d 個 Hook 任務,%d 個團隊,%d 個更新任務,%d 個附件。 dashboard.operation_name=操作名稱 dashboard.operation_switch=開關 dashboard.operation_run=執行 @@ -684,6 +1088,12 @@ dashboard.clean_unbind_oauth=清理未綁定OAuth的連結 dashboard.clean_unbind_oauth_success=所有未綁定 OAuth 的連結已刪除。 dashboard.delete_inactivate_accounts=刪除所有未啟用帳戶 dashboard.delete_inactivate_accounts_success=成功清除所有未啟用帳號! +dashboard.delete_repo_archives=刪除所有儲存庫存檔 +dashboard.delete_repo_archives_success=所有儲存庫存檔已刪除。 +dashboard.delete_missing_repos=刪除所有遺失 Git 檔案的儲存庫記錄 +dashboard.delete_missing_repos_success=所有缺少 Git 檔案的儲存庫記錄均已刪除。 +dashboard.git_gc_repos=對儲存庫進行垃圾回收 +dashboard.git_gc_repos_success=所有儲存庫的垃圾回收已完成執行。 dashboard.reinit_missing_repos=重新初始化所有遺失具已存在記錄的Git 儲存庫 dashboard.reinit_missing_repos_success=所有遺失具已存在記錄的Git 儲存庫已重新初始化。 dashboard.sync_external_users=同步外部使用者資料 @@ -693,6 +1103,8 @@ dashboard.current_memory_usage=當前內存使用量 dashboard.total_memory_allocated=所有被分配的內存 dashboard.memory_obtained=內存佔用量 dashboard.pointer_lookup_times=指針查找次數 +dashboard.memory_allocate_times=記憶體分配次數 +dashboard.memory_free_times=記憶體釋放次數 dashboard.current_heap_usage=當前 Heap 內存使用量 dashboard.heap_memory_obtained=Heap 內存佔用量 dashboard.heap_memory_idle=Heap 內存空閒量 @@ -715,18 +1127,35 @@ dashboard.total_gc_pause=垃圾收集暫停時間總量 dashboard.last_gc_pause=上次垃圾收集暫停時間 dashboard.gc_times=垃圾收集執行次數 +users.user_manage_panel=帳號管理 +users.new_account=建立新帳號 +users.name=使用者名稱 users.activated=已啟用 users.admin=管理員 users.repos=儲存庫數 users.created=建立時間 +users.last_login=上次登入 +users.never_login=從未登入 users.edit=編輯 users.auth_source=認證源 users.local=本地 +users.edit_account=編輯帳號 +users.max_repo_creation=最大儲存庫數量 +users.max_repo_creation_desc=(設定 -1 使用全域預設限制) +users.is_activated=該使用者帳號已被啟用 +users.prohibit_login=停用登入 +users.is_admin=是管理員 +users.allow_import_local=允許匯入本地儲存庫 +users.allow_create_organization=允許建立組織 +users.update_profile=更新帳號 +users.delete_account=刪除帳號 +users.deletion_success=使用者帳號已被刪除。 orgs.org_manage_panel=組織管理 orgs.name=組織名稱 orgs.teams=團隊數 orgs.members=成員數 +orgs.new_orga=新增組織 repos.repo_manage_panel=儲存庫管理 repos.owner=所有者 @@ -734,12 +1163,15 @@ repos.name=儲存庫名稱 repos.private=私有庫 repos.watches=關註數 repos.stars=讚好數 +repos.forks=複製 repos.issues=問題數 repos.size=由小到大 +auths.new=新增認證來源 auths.name=認證名稱 auths.type=認證類型 auths.enabled=已啟用 +auths.syncenabled=啟用使用者同步 auths.updated=最後更新時間 auths.auth_type=認證類型 auths.auth_name=認證名稱 @@ -749,8 +1181,15 @@ auths.host=主機地址 auths.port=主機端口 auths.bind_dn=綁定DN auths.bind_password=綁定密碼 +auths.bind_password_helper=警告:此密碼以明文存儲。 如果可能請使用只讀帳號。 auths.user_base=用戶搜尋基準 auths.user_dn=用戶 DN +auths.attribute_username=使用者名稱屬性 +auths.attribute_username_placeholder=留空將使用「Gitea」作為使用者名稱 +auths.attribute_name=名字屬性 +auths.attribute_surname=姓氏屬性 +auths.attribute_mail=電子郵件屬性 +auths.search_page_size=頁面大小 auths.filter=使用者篩選器 auths.admin_filter=管理者篩選器 auths.ms_ad_sa=MS AD 搜尋屬性 @@ -765,6 +1204,7 @@ auths.oauth2_provider=OAuth2 提供者 auths.oauth2_clientID=用戶端 ID (金鑰) auths.oauth2_clientSecret=用戶端金鑰 auths.openIdConnectAutoDiscoveryURL=OpenID 連接自動探索 URL +auths.oauth2_use_custom_url=使用自定義 URL 而不是預設 URL auths.oauth2_tokenURL=Token URL auths.oauth2_authURL=授權 URL auths.oauth2_profileURL=個人訊息 URL @@ -779,22 +1219,35 @@ auths.tip.facebook=在 https://developers.facebook.com/apps 註冊一個新的 auths.tip.github=在 https://github.com/settings/applications/new 註冊一個新的 OAuth 應用程式 auths.tip.gitlab=在 https://gitlab.com/profile/applications 註冊一個新的應用程式 auths.tip.openid_connect=使用 OpenID 連接探索 URL (/.well-known/openid-configuration) 來指定節點 +auths.edit=修改認證來源 +auths.activated=該授權來源已啟用 auths.new_success=已增加認證'%s'。 +auths.update_success=認證來源已更新。 +auths.update=更新驗證來源 +auths.delete=刪除驗證來源 auths.delete_auth_title=刪除認證來源 config.server_config=伺服器設定 +config.app_name=網站標題 +config.app_ver=Gitea 版本 +config.app_url=Gitea 基本 URL config.custom_conf=設定檔案路徑 +config.domain=SSH 伺服器域名 +config.offline_mode=本地模式 config.disable_router_log=關閉路由日誌 config.run_mode=執行模式 config.git_version=Git 版本 config.repo_root_path=儲存庫目錄 config.lfs_root_path=LFS 根目錄 config.static_file_root_path=靜態檔案目錄 +config.log_file_root_path=日誌路徑 config.script_type=腳本類型 config.reverse_auth_user=反向代理認證 config.ssh_config=SSH 設定 config.ssh_enabled=已啟用 +config.ssh_start_builtin_server=使用內建的伺服器 +config.ssh_domain=伺服器域名 config.ssh_port=連接埠 config.ssh_listen_port=監聽埠 config.ssh_root_path=根路徑 @@ -807,13 +1260,28 @@ config.db_config=資料庫設定 config.db_type=資料庫類型 config.db_host=主機地址 config.db_name=資料庫名稱 +config.db_user=使用者名稱 +config.db_ssl_mode=SSL config.db_path=資料庫路徑 config.service_config=服務設定 +config.register_email_confirm=要求註冊時確認電子郵件 +config.disable_register=關閉註冊功能 +config.allow_only_external_registration=僅允許通過外部服務註冊 +config.enable_openid_signup=啟用 OpenID 註冊 +config.enable_openid_signin=啟用 OpenID 登入 config.show_registration_button=顯示註冊按鈕 +config.require_sign_in_view=啓用登錄瀏覽限制 +config.mail_notify=啟用郵件通知 config.disable_key_size_check=禁用金鑰最小長度檢查 +config.enable_captcha=啟用驗證碼 config.active_code_lives=啟用用戶連結有效期 config.reset_password_code_lives=重設密碼代碼過期時間 +config.default_keep_email_private=預設隱藏電子郵件地址 +config.default_allow_create_organization=預設允許新增組織 +config.enable_timetracking=啟用時間追蹤 +config.default_enable_timetracking=預設啟用時間追蹤 +config.no_reply_address=隱藏電子郵件域名 config.webhook_config=Webhook 設定 config.queue_length=隊列長度 @@ -827,6 +1295,9 @@ config.mailer_host=郵件主機地址 config.mailer_user=發送者帳號 config.mailer_use_sendmail=使用 Sendmail config.mailer_sendmail_path=Sendmail 路徑 +config.send_test_mail=傳送測試郵件 +config.test_mail_failed=傳送測試郵件到 '%s' 時失敗:'%v +config.test_mail_sent=測試郵件已發送到 '%s' config.oauth_config=社交帳號設定 config.oauth_enabled=啟用服務 @@ -846,6 +1317,7 @@ config.session_life_time=Session 生命周期 config.https_only=僅限 HTTPS config.cookie_life_time=Cookie 生命周期 +config.picture_config=圖片和大頭貼設定 config.picture_service=圖片服務 config.disable_gravatar=禁用 Gravatar 頭像 config.enable_federated_avatar=開啟聯合頭像 @@ -870,6 +1342,7 @@ monitor.name=任務名稱 monitor.schedule=任務安排 monitor.next=下次執行時間 monitor.previous=上次執行時間 +monitor.execute_times=執行時間 monitor.process=執行中進程 monitor.desc=進程描述 monitor.start=開始時間 @@ -928,6 +1401,7 @@ raw_seconds=秒 raw_minutes=分鐘 [dropzone] +invalid_input_type=您無法上傳此類型的檔案 file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB) remove_file=移除文件 @@ -935,6 +1409,8 @@ remove_file=移除文件 notifications=訊息 unread=未讀 read=已讀 +no_unread=沒有未讀通知 +no_read=沒有通知 pin=固定通知 mark_as_read=標記為已讀 mark_as_unread=標記為未讀 From bcb9d23f058d350f4d9481bdeb28b617be47e310 Mon Sep 17 00:00:00 2001 From: Alexey Terentyev Date: Sun, 1 Jul 2018 09:02:18 +0300 Subject: [PATCH 052/447] Add myself as a maintainer (#4345) --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index 5deb40961fd7..020a44c517b0 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -23,3 +23,4 @@ Matti Ranta (@techknowlogick) Michael Lustfield (@MTecknology) Jonas Franz (@JonasFranzDEV) Flynn Lufmons (@flufmonster) +Alexey Terentyev (@axifive) From 74f9d1d385a17c35fa27c3eaebd665bcb13eda65 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 1 Jul 2018 06:03:32 +0000 Subject: [PATCH 053/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_it-IT.ini | 920 +++++++++++++++++++++++++++++++- 1 file changed, 905 insertions(+), 15 deletions(-) diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index d3aa6c609a89..49414166759c 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -1,11 +1,15 @@ +app_desc=Un servizio auto-ospitato per Git pronto all'uso home=Home dashboard=Pannello di controllo explore=Esplora help=Aiuto sign_in=Accedi +sign_in_with=Accedi con sign_out=Esci +sign_up=Registrati link_account=Collega account +link_account_signin_or_signup=Effettua il login con le credenziali esistenti per collegare il tuo account esistente con questo; oppure crea un nuovo account. register=Registrati website=Sito Web version=Versione @@ -13,12 +17,32 @@ page=Pagina template=Template language=Lingua notifications=Notifiche +create_new=Crea… +user_profile_and_more=Profilo ed Impostazioni… signed_in_as=Accesso effettuato come +enable_javascript=Il sito funziona meglio con JavaScript. username=Nome utente +email=Indirizzo Email password=Password +re_type=Reinserisci la password +captcha=CAPTCHA +twofa=Verifica in due passaggi +twofa_scratch=Codice di recupero per la verifica in due passaggi passcode=Codice di sicurezza +u2f_insert_key=Inserisci la chiave di sicurezza +u2f_sign_in=Premi il pulsante sulla tua chiave di sicurezza. Se non riesci a trovare alcun pulsante, reinseriscilo. +u2f_press_button=Si prega di premere il pulsante sulla tua chiave di sicurezza… +u2f_use_twofa=Usa un codice di verifica in due passaggi dal tuo telefono +u2f_error=Non riusciamo a leggere la tua chiave di sicurezza! +u2f_unsupported_browser=Il tuo browser non supporta le chiavi U2F. Si prega di provare un altro browser. +u2f_error_1=Si è verificato un errore sconosciuto. Si prega di riprovare. +u2f_error_2=Si prega di assicurarsi che si sta utilizza una connessione crittografata (https://) e visitando l'URL corretto. +u2f_error_3=Il server non ha potuto eseguire la richiesta. +u2f_error_4=La chiave data non è idonea per questa richiesta. Se stai provando a registrarla, assicurati che la chiave non sia già stata registrata. +u2f_error_5=Timeout raggiunto prima che la tua chiave potesse essere letta. Si prega di ricaricare per riprovare. +u2f_reload=Ricarica repository=Repository organization=Organizzazione @@ -29,8 +53,12 @@ new_mirror=Nuovo Mirror new_fork=Nuovo Fork new_org=Nuova organizzazione manage_org=Gestisci le organizzazioni +admin_panel=Amministrazione Sito account_settings=Impostazioni dell'account settings=Impostazioni +your_profile=Profilo +your_starred=Repository votate +your_settings=Impostazioni all=Tutti sources=Sorgenti @@ -46,34 +74,107 @@ cancel=Annulla [install] install=Installazione +title=Configurazione Iniziale +docker_helper=Se stai usando Gitea con Docker, si prega di leggere la documentazione prima di cambiare qualsiasi impostazione. +requite_db_desc=Gitea necessita di MySQL, PostgreSQL, MSSQL, SQLite3 o TiDB. db_title=Impostazioni Database db_type=Tipo di database host=Host +user=Nome utente password=Password db_name=Nome del database +db_helper=Nota agli utenti MySQL: si prega di utilizza l'engine InnoDB ed il carattere di tipo 'utf8_general_ci'. +ssl_mode=SSL path=Percorso - +sqlite_helper=Percorso del file per il SQLite3 o TiDB.
Inserisci un percorso assoluto se stai usando Gitea come un servizio. +err_empty_db_path=Il percorso per il database SQLite3 o TiDB non può essere vuoto. +err_invalid_tidb_name=Il nome del database TiDB non può contenere i caratteri '.' e '-'. +no_admin_and_disable_registration=Non puoi disabilitare l'auto-registrazione degli utenti senza creare un account amministratore. +err_empty_admin_password=La password dell'amministratore non può essere vuota. + +general_title=Impostazioni Generali +app_name=Titolo del Sito +app_name_helper=Qui puoi inserire il nome della tua società. repo_path=Percorso Root del Repository +repo_path_helper=Le Remote Git repositories saranno salvate in questa directory. +lfs_path=Percorso radice di Git LFS +lfs_path_helper=I file trovati da Git LFS saranno salvati in questa directory. Lasciare vuoto per disattivare. +run_user=Esegui come Nome utente +run_user_helper=Inserisci il nome utente del sistema operativo su cui Gitea viene eseguito. Nota che l'utente deve avere accesso al percorso radice dei repository. +domain=Dominio Server SSH +domain_helper=Dominio o nome host per SSH clone URLs. +ssh_port=Porta Server SSH +ssh_port_helper=Numero di porta in ascolto sul server SSH. Lasciare vuoto per disattivare. +http_port=Porta in ascolto HTTP Gitea +http_port_helper=Numero della porta sul quale i server web Gitea ascolteranno. +app_url=URL di base di Gitea +app_url_helper=URL di base per gli HTTP(S) clone URLs e notifiche email. log_root_path=Percorso dei log +log_root_path_helper=I file di log saranno scritti in questa directory. optional_title=Impostazioni Facoltative +email_title=Impostazioni Email smtp_host=Host SMTP +smtp_from=Invia Email come +smtp_from_helper=Indirizzo Email che Gitea utilizzerà. Enter a plain email address o usa il formato "Name" . +mailer_user=Nome utente SMTP +mailer_password=Password SMTP +register_confirm=Richiedere la conferma Email per registrarsi +mail_notify=Attila le notifiche Email +server_service_title=Impostazioni Server e Servizi di Terza Parte +offline_mode=Attiva la Modalità in Locale +offline_mode_popup=Disattivila le reti di distribuzione dei contenuti di terze parti and serve all resources locally. +disable_gravatar=Disattiva Gravatar +disable_gravatar_popup=Disattiva Gravatar e le fonti di avatar di terze parti. Verrà usato un avatar predefinito almeno che un utente non carichi un avatar in locale. +federated_avatar_lookup=Attiva i Federated Avatar federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Disattiva Self-Registration +disable_registration_popup=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account. +allow_only_external_registration_popup=Attiva la registrazione solo tramite servizi esterni. openid_signin=Attiva l'accesso OpenID +openid_signin_popup=Attiva registrazione utente via OpenID. +openid_signup=Attiva OpenID Self-Registration +openid_signup_popup=Attiva OpenID-based user self-registration. +enable_captcha=Attiva CAPTCHA enable_captcha_popup=Richiedi convalida captcha per i nuovi utenti. +require_sign_in_view=Richiedi l'accesso per visualizzare le pagine +require_sign_in_view_popup=Limita l'accesso alle pagine agli utenti che hanno eseguito l'accesso. I visitatori visualizzeranno solamente le pagine di accesso e registrazione. +admin_setting_desc=Creare un account amministratore è opzionale. Il primo utente registrato sarà automaticamente un amministratore. +admin_title=Impostazioni Account Amministratore +admin_name=Nome utente dell'Amministratore admin_password=Password confirm_password=Conferma Password +admin_email=Indirizzo Email install_btn_confirm=Installare Gitea test_git_failed=Fallito il test del comando git: %v +sqlite3_not_available=Questa versione di Gitea non supporta SQLite3. Si prega di scaricare la versione binaria ufficiale da %s (not the 'gobuild' version). +invalid_db_setting=Le impostazioni del database sono invalide: %v +invalid_repo_path=Il percorso radice del Repository è invalido: %v +run_user_not_match=Il nome utente 'esegui come' non è il nome utente attuale: %s -> %s save_config_failed=Salvataggio della configurazione non riuscito: %v +invalid_admin_setting=Le impostazioni dell'account amministratore sono invalide: %v +install_success=Benvenuto! Grazie per aver scelto Gitea. Attenzione e buon divertimento! +invalid_log_root_path=Il percorso del log è invalido: %v +default_keep_email_private=Nascondi Indirizzo Email di Default +default_keep_email_private_popup=Nasconi l'indirizzo email dei nuovi account utente di default. +default_allow_create_organization=Consenti la Creazione di Organizzazioni di Default +default_allow_create_organization_popup=Consenti ai nuovi account utente di creare organizzazioni di default. +default_enable_timetracking=Attiva il cronografo di Default +default_enable_timetracking_popup=Attiva il cronografo per le nuove repositories di default. +no_reply_address=Dominio email nascosto +no_reply_address_helper=Nome dominio per utenti con un indirizzo email nascosto. Ad esempio, il nome utente 'joe' accederà a Git come 'joe@noreply.example.org' se il dominio email nascosto è impostato a 'noreply.example.org'. [home] +uname_holder=Nome utente o Indirizzo Email password_holder=Password switch_dashboard_context=Cambia Dashboard Context +my_repos=Repositories +show_more_repos=Mostra altre repositories… collaborative_repos=Repository Condivisi my_orgs=Le mie Organizzazioni my_mirrors=I miei Mirror view_home=Vedi %s +search_repos=Trova un repository… issues.in_your_repos=Nei tuoi repository @@ -82,30 +183,53 @@ repos=Repository users=Utenti organizations=Organizzazioni search=Cerca +code=Codice +repo_no_results=Nessuna repository corrispondente. +user_no_results=Nessun utente corrispondente. +org_no_results=Nessun'organizzazione corrispondente trovata. +code_no_results=Nessun codice sorgente corrispondente ai termini di ricerca. +code_search_results=Risultati di ricerca per '%s' [auth] +create_new_account=Registra un account register_helper_msg=Hai già un account? Accedi ora! +social_register_helper_msg=Hai già un account? Accedi ora! +disable_register_prompt=La registrazione è disabilitata. Si prega di contattare l'amministratore del sito. +disable_register_mail=Email di conferma per la registrazione disabilitata. remember_me=Ricordami forgot_password_title=Password Dimenticata forgot_password=Password dimenticata? +sign_up_now=Hai bisogno di un account? Registrati adesso. confirmation_mail_sent_prompt=Una nuova email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di registrazione. reset_password_mail_sent_prompt=Una email di conferma è stata inviata a %s. Per favore controlla la tua posta in arrivo nelle prossime %s per completare il processo di reset della password. active_your_account=Attiva il tuo Account +prohibit_login=Accesso proibito +prohibit_login_desc=Al tuo account è vietato l'accesso, si prega di contattare l'amministratore del sito. +resent_limit_prompt=Hai già richiesto un'e-mail d'attivazione recentemente. Si prega di attenere 3 minuti e poi riprovare. has_unconfirmed_mail=Ciao %s, hai un indirizzo di posta elettronica non confermato (%s). Se non hai ricevuto una e-mail di conferma o vuoi riceverla nuovamente, fare clic sul pulsante qui sotto. resend_mail=Clicca qui per inviare nuovamente l'e-mail di attivazione email_not_associate=L'indirizzo email non è associato ad alcuna conta. send_reset_mail=Clicca qui per inviare nuovamente la tua email di reimpostazione della password reset_password=Reimposta la tua Password +invalid_code=Il tuo codice di conferma è invalido oppure è scaduto. reset_password_helper=Clicca qui per reimpostare la password +password_too_short=La lunghezza della password non può essere minore di %d caratteri. +non_local_account=Gli utenti non locali non possono cambiare la loro password attraverso l'interfaccia web. verify=Verifica scratch_code=Codice Gratta e Vinci use_scratch_code=Utilizza un codice di zero twofa_scratch_used=Hai usato il tuo codice zero. Sei stato reindirizzato alla pagina di configurazione a due fattori quindi puoi rimuovere la registrazione dal dispositivo o generare un nuovo codice zero. +twofa_passcode_incorrect=Il tuo passcode non è corretto. Se hai smarrito il tuo dispositivo, utilizza il tuo scratch code per accedere. twofa_scratch_token_incorrect=I tuo codice scratch non è corretto. +login_userpass=Accedi login_openid=OpenID openid_connect_submit=Connetti openid_connect_title=Connetti a una conta esistente +openid_connect_desc=L'URI OpenID scelto è sconosciuto. Qui puoi associarlo a un nuovo account. openid_register_title=Crea Nuovo Account +openid_register_desc=L'URI OpenID scelto è sconosciuto. Qui puoi associarlo a un nuovo account. +openid_signin_desc=Inserisci il tuo URI OpenID. Ad esempio: https://anne.me, bob.openid.org.cn o gnusocial.net/carry. +disable_forgot_password_mail=La reimpostazione della password è disabilitata. Si prega di contattare l'amministratore del sito. [mail] activate_account=Per favore attiva il tuo account @@ -117,12 +241,14 @@ register_notify=Benvenuto su Gitea [modal] yes=Sì no=No +modify=Aggiorna [form] UserName=Nome utente RepoName=Nome Repository Email=Indirizzo E-mail Password=Password +Retype=Reinserisci la password SSHTitle=Nome chiave SSH HttpsUrl=URL HTTPS PayloadUrl=URL Payload @@ -138,6 +264,9 @@ TreeName=Percorso del file Content=Contenuto require_error=` non può essere vuoto.` +alpha_dash_error=` può contenere solo caratteri alfanumerici, dash ('-') e underscore ('_').` +alpha_dash_dot_error=` può contenere solo caratteri alfanumerici, dash ('-'), underscore ('_') e dot ('.').` +git_ref_name_error=` deve essere un Git reference name ben formato.` size_error='deve essere %s.' min_size_error=` deve contenere almeno %s caratteri.` max_size_error=` deve contenere massimo %s caratteri.` @@ -145,70 +274,148 @@ email_error=` non è un indirizzo e-mail valido.` url_error=` non è un URL valido.` include_error=` deve contenere la stringa '%s'.` unknown_error=Errore sconosciuto: - +captcha_incorrect=Il codice CAPTCHA non è corretto. +password_not_match=Le password non corrispondono. + +username_been_taken=Il Nome utente esiste già. +repo_name_been_taken=Il nome del repository esiste già. +org_name_been_taken=Il nome della organizzazione esiste già. +team_name_been_taken=Il nome del team esiste già. +team_no_units_error=Consenti l'accesso ad almeno una sezione del repository. +email_been_used=L'indirizzo email è già in uso. +openid_been_used=L'indirizzo OpenID '%s' è già in uso. +username_password_incorrect=Nome utente o password non corretti. +enterred_invalid_repo_name=Il nome del repository inserito non è corretto. +enterred_invalid_owner_name=Il nuovo nome del proprietario non è valido. +enterred_invalid_password=La password inserita non è corretta. user_not_exist=L'utente non esiste. +last_org_owner=Non è possibile rimuovere l'ultimo utente del team 'proprietari'. Deve esserci almeno un proprietario in qualsiasi team specificato. +cannot_add_org_to_team=Un'organizzazione non può essere aggiunto come membro del team. +invalid_ssh_key=Impossibile verificare la tua chiave SSH: %s +invalid_gpg_key=Impossibile verificare la tua chiave GPG: %s +unable_verify_ssh_key=Impossibile verificare la tua chiave SSH; si prega di ricontrollarla per verificare eventuali errori. auth_failed=Autenticazione non riuscita: %v +still_own_repo=Il tuo account possiede una o più repositories; rimuovile o trasferiscile per proseguire. +still_has_org=Il tuo account è un membro di una o più organizzazioni; abbandonali prima di proseguire. +org_still_own_repo=Questa organizzazione possiede ancora una o più repositories, rimuoverle o trasferirle per continuare. target_branch_not_exist=Il ramo (branch) di destinazione non esiste. [user] +change_avatar=Modifica il tuo avatar… join_on=Si è unito il repositories=Repository activity=Attività pubblica followers=Seguaci +starred=Repositories votate following=Seguiti follow=Segui unfollow=Non seguire più form.name_reserved=L'username '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di un utente. [settings] profile=Profilo +account=Account password=Password security=Sicurezza avatar=Avatar ssh_gpg_keys=Chiavi SSH / GPG social=Account Sociali +applications=Applicazioni +orgs=Gestisci le organizzazioni repos=Repository delete=Elimina account twofa=Verifica in due passaggi +account_link=Account collegati +organization=Organizzazioni uid=Uid +u2f=Chiavi di sicurezza public_profile=Profilo pubblico +profile_desc=Il tuo indirizzo email sarà utilizzato per le notifiche e altre operazioni. +password_username_disabled=Gli utenti non locali non hanno il permesso di cambiare il proprio nome utente. per maggiori dettagli si prega di contattare l'amministratore del sito. full_name=Nome Completo website=Sito web location=Posizione update_profile=Aggiorna Profilo update_profile_success=Il tuo profilo è stato aggiornato. +change_username=Il tuo nome utente è stato modificato. +change_username_prompt=Nota: i cambiamenti al nome utente vanno a modificare anche l'URL del tuo account. continue=Continua cancel=Annulla +language=Lingua +lookup_avatar_by_mail=Cerca Avatar per indirizzo Email federated_avatar_lookup=Ricerca per avatar federata enable_custom_avatar=Abilita avatar personalizzato choose_new_avatar=Scegli un nuovo avatar +update_avatar=Aggiorna Avatar delete_current_avatar=Elimina Avatar attuale +uploaded_avatar_not_a_image=Il file caricato non è un'immagine. +update_avatar_success=Il tuo avatar è stato aggiornato. +change_password=Aggiorna Password old_password=Password attuale new_password=Nuova Password +retype_new_password=Digitare nuovamente la nuova Password +password_incorrect=La password attuale non è corretta. +change_password_success=La password è stata aggiornata. Utilizza la nuova password la prossima volta che effettui il login. +password_change_disabled=Gli utenti non locali non possono cambiare la loro password attraverso l'interfaccia web. emails=Indirizzi e-mail +manage_emails=Gestisci indirizzi email +manage_openid=Gestisci gli indirizzi OpenID email_desc=Il tuo indirizzo e-mail primario sarà usato per le notifiche e altre operazioni. primary=Primario +primary_email=Rendi primario +delete_email=Rimuovi +email_deletion=Rimuovi indirizzo Email +email_deletion_desc=L'indirizzo email e le relativa informazioni verranno rimosse dal tuo account. I Git commits di questa email rimarranno invariati. Continuare? +email_deletion_success=L'indirizzo email è stato eliminato. +openid_deletion=Rimuovi Indirizzo OpenID +openid_deletion_desc=La rimozione di questo indirizzo OpenID della tua conta ti impedirà di accedere con esso. Sei sicuro di voler continuare? +openid_deletion_success=L'indirizzo OpenID è stato eliminato. +add_new_email=Aggiungi nuovo indirizzo email +add_new_openid=Aggiungi nuovo URI OpenID +add_email=Aggiungi indirizzo email add_openid=Aggiungere OpenID URI +add_email_confirmation_sent=Una nuova email di conferma è stata inviata a '%s'. Si prega di controllare la tua casella di posta entro il prossimo %s per confermare la tua email. +add_email_success=Il nuovo indirizzo email è stato aggiunto. +add_openid_success=Il nuovo indirizzo OpenID è stato aggiunto. +keep_email_private=Nascondi indirizzo email +keep_email_private_popup=Il tuo indirizzo email sarà nascosto agli altri utenti. +openid_desc=OpenID consente di delegare l'autenticazione ad un provider esterno. manage_ssh_keys=Gestisci chiavi SSH manage_gpg_keys=Gestisci Chiavi GPG add_key=Aggiungi Chiave +ssh_desc=Queste chiavi SSH pubbliche sono associate con il tuo account. Le corrispondenti chiavi private consentono l'accesso completo alle tue repositories. +gpg_desc=Queste chiavi GPG pubbliche sono associate con il tuo account. Proteggi le tue chiavi private perché permettono di verificare i commits. ssh_helper= Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub percrea le tue chiavi SSH o risolvere problemi comuni che potresti trovare utilizzando SSH. gpg_helper=Hai bisogno di aiuto? Dai un'occhiata alla guida di GitHub riguardo il GPG. add_new_key=Aggiungi Chiave SSH add_new_gpg_key=Aggiungi Chiave GPG +ssh_key_been_used=Questa chiave SSH è stata già aggiunta al tuo account. +ssh_key_name_used=Una chiave SSH con lo stesso nome è stata già aggiunta al tuo account. +gpg_key_id_used=Esiste già una chiave GPG pubblica con lo stesso ID. +gpg_no_key_email_found=Questa chiave GPG non è utilizzabile con nessun indirizzo email associato al tuo account. subkeys=Sottochiavi key_id=ID chiave key_name=Nome della Chiave key_content=Contenuto +add_key_success=La chiave SSH '%s' è stata aggiunta. +add_gpg_key_success=La chiave GPG %s' è stata aggiunta. +delete_key=Rimuovi +ssh_key_deletion=Rimuovi chiave SSH +gpg_key_deletion=Rimuovi chiave GPG +ssh_key_deletion_desc=Rimuovere una chiave SSH ne revoca l'accesso al tuo account. Continuare? +gpg_key_deletion_desc=La rimozione di una chiave GPG invalida i commits firmati da essa. Continuare? +ssh_key_deletion_success=La chiave SSH è stata rimossa. +gpg_key_deletion_success=La chiave GPG è stata rimossa. add_on=Aggiunto il valid_until=Valido fino al valid_forever=Valido per sempre @@ -220,100 +427,219 @@ key_state_desc=Questa chiave è stata utilizzata negli ultimi 7 giorni token_state_desc=Questo token è stato utilizzato negli ultimi 7 giorni show_openid=Mostra nel profilo hide_openid=Nascondi dal profilo +ssh_disabled=SSH disabilitato manage_social=Gestisci gli Account Sociali Associati +social_desc=Questi account sociali sono collegati al tuo account Gitea. Assicurati di riconoscerli tutti in quanto possono essere usati per effettuare il login con il tuo account Gitea. +unbind=Rimuovi il collegamento +unbind_success=L'account sociale è stato scollegato dal tuo account Gitea. +manage_access_token=Gestisci i tokens di accesso generate_new_token=Genera Nuovo Token +tokens_desc=Questi tokens garantiscono l'accesso al tuo account utilizzando l'API di Gitea. +new_token_desc=Le applicazioni che utilizzano un token hanno accesso completo al tuo account. token_name=Nome Token generate_token=Genera Token +generate_token_success=Il nuovo token è stato generato. Copia ora in quanto non verrà mostrato nuovamente. delete_token=Elimina - +access_token_deletion=Elimina token di accesso +access_token_deletion_desc=Eliminare un token revocherà l'accesso al tuo account alle applicazioni che lo utilizzano. Continuare? +delete_token_success=Il token è stato eliminato. Le applicazioni che lo utilizzavano non hanno più accesso al tuo account. + +twofa_desc=L'autenticazione a due fattori migliora la sicurezza del tuo account. +twofa_is_enrolled=La verifica in due passaggi è attualmente abilitata sul tuo account. +twofa_not_enrolled=La verifica in due passaggi al momento non è abilitata sul tuo account. +twofa_disable=Disattiva la verifica in due passaggi +twofa_scratch_token_regenerate=Rigenera il token di sicurezza +twofa_scratch_token_regenerated=Ora il tuo token di sicurezza è %s. Conservalo in un posto sicuro. +twofa_enroll=Iscriviti alla verifica in due passaggi +twofa_disable_note=Se necessario, è possibile disattivare la verifica in due passaggi. +twofa_disable_desc=Disattivare la verifica in due passaggi renderà il tuo account meno sicuro. Continuare? +regenerate_scratch_token_desc=Se hai smarrito il tuo token di sicurezza o lo hai già utilizzato per effettuare il login è possibile resettarlo qui. twofa_disabled=L'autenticazione a due fattori è stata disattivata. +scan_this_image=Scannerizza questa immagine con l'applicazione di autenticazione: or_enter_secret=O immettere il segreto: %s - - - +then_enter_passcode=E immetti il codice di accesso indicato nell'applicazione: +passcode_invalid=Il codice di accesso non è corretto. Riprova. +twofa_enrolled=Il tuo account è stato registrato alla verifica in due passaggi. Conserva il token di sicurezza (%s) in un luogo sicuro in quanto viene visualizzato sono una volta! + +u2f_desc=Le chiavi di sicurezza sono dispositivi hardware contenenti chiavi crittografiche. Potrebbero essere usate per la verifica in due passaggi. +La chiave di sicurezza deve supportare lo standard FIDO U2F. +u2f_require_twofa=La verifica in due passaggi deve essere attiva per poter utilizzare le chiavi di protezione. +u2f_register_key=Aggiungi chiave di sicurezza +u2f_nickname=Nickname +u2f_press_button=Premi il pulsante sulla tua chiave di sicurezza per registrarla. +u2f_delete_key=Rimuovi chiave di sicurezza +u2f_delete_key_desc=Se si rimuove una chiave di sicurezza non sarà più possibile effettuare l'accesso con essa. Sei sicuro? + +manage_account_links=Gestisci gli account collegati +manage_account_links_desc=Questi account esterni sono collegati al tuo account Gitea. +account_links_not_available=Attualmente non è collegato alcun account esterno al tuo account Gitea. +remove_account_link=Rimuovi account collegato +remove_account_link_desc=Rimuovere un account collegato ne revoca l'accesso al tuo account Gitea. Continuare? +remove_account_link_success=L'account collegato è stato rimosso. + +orgs_none=Non sei membro di alcuna organizzazione. repos_none=Non possiedi alcun repository delete_account=Elimina Account +delete_prompt=Questa operazione eliminerà permanentemente il tuo account utente. NON PUÒ essere annullata. confirm_delete_account=Conferma Eliminazione +delete_account_title=Elimina account utente +delete_account_desc=Sei sicuro di voler rimuovere questo account utente permanentemente? [repo] owner=Proprietario repo_name=Nome Repository +repo_name_helper=Un buon nome per un repository è costituito da parole chiave corte, facili da ricordare e uniche. visibility=Visibilità +visiblity_helper=Rendi il repository privato +visiblity_helper_forced=L'amministratore del sito impone che le nuove repositories siano private. +visiblity_fork_helper=(Questa modifica avrà effetto su tutti i fork) +clone_helper=Hai bisogno di aiuto per la clonazione? Visita Aiuto. fork_repo=Forka Repository fork_from=Forka da +fork_visiblity_helper=La visibilità di un repository forkato non può essere modificata. repo_desc=Descrizione repo_lang=Lingua +repo_gitignore_helper=Seleziona i templates di .gitignore. license=Licenza +license_helper=Seleziona un file di licenza. +readme=LEGGIMI +readme_helper=Seleziona un template per il file LEGGIMI. +auto_init=Inizializza Repository (Aggiungi .gitignore, Licenza e LEGGIMI) create_repo=Crea Repository default_branch=Ramo (Branch) predefinito mirror_prune=Rimuovi +mirror_prune_desc=Rimuovi i riferimenti di puntamento-remoto obsoleti +mirror_interval=Intervallo di aggiornamento dei mirror (le unità di tempo valide sono 'h', 'm', 's') +mirror_interval_invalid=L'intervallo di aggiornamento dei mirror non è valido. +mirror_address=Clona da URL +mirror_address_desc=Includere eventuali credenziali di autorizzazione necessarie nell'URL. +mirror_last_synced=Ultima sincronizzazione watchers=Osservatori stargazers=Fan forks=Fork +pick_reaction=Scegli la tua reazione reactions_more=e %d più form.reach_limit_of_creation=Hai già raggiunto il tuo limite %d repository. +form.name_reserved=Il nome repository '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di un repository. +need_auth=Autorizzazione clone migrate_type=Tipo di migrazione migrate_type_helper=Questo repository sarà un mirror migrate_repo=Migra Repository +migrate.clone_address=Migra / Clona da URL +migrate.clone_address_desc=URL HTTP (S) o Git 'clone' di un repository esistente +migrate.clone_local_path=o un percorso del server locale migrate.permission_denied=Non è consentito importare repository locali. +migrate.invalid_local_path=Percorso locale non valido, non esiste o non è una cartella. migrate.failed=Migrazione non riuscita: %v +migrate.lfs_mirror_unsupported=La duplicazione di oggetti LFS non è supportata - usa ' git lfs fetch --all e 'git lfs push --all' invece. mirror_from=mirror da forked_from=forkato da +fork_from_self=Non puoi forkare il tuo stesso repository. copy_link=Copia +copy_link_success=Il link è stato copiato +copy_link_error=Premere ⌘-C o Ctrl-C per copiare copied=OK copiato unwatch=Non seguire più watch=Segui unstar=Togli il voto star=Vota fork=Forka +download_archive=Scarica Repository no_desc=Nessuna descrizione quick_guide=Guida rapida clone_this_repo=Clona questo repository +create_new_repo_command=Creazione di un nuovo repository da riga di comando +push_exist_repo=Push di un repository esistente da riga di comando +bare_message=Questo repository non contiene alcun contenuto. code=Codice +code.desc=Accedi al codice sorgente, file, commits e branches. branch=Ramo (Branch) tree=Albero (Tree) filter_branch_and_tag=Filtra per branch o tag branches=Rami (Branch) tags=Tag issues=Problemi +pulls=Pull Requests labels=Etichette milestones=Traguardi commits=Commit +commit=Commit releases=Rilasci file_raw=Originale file_history=Cronologia file_view_raw=Vedi originale - +file_permalink=Permalink +file_too_large=Il file è troppo grande per essere visualizzato. +video_not_supported_in_browser=Il tuo browser non supporta i tag "video" di HTML5. +stored_lfs=Memorizzati con Git LFS +commit_graph=Grafico dei commit + +editor.new_file=Nuovo file +editor.upload_file=Carica File +editor.edit_file=Modifica File editor.preview_changes=Anteprima modifiche +editor.cannot_edit_non_text_files=I file binari non possono essere modificati tramite interfaccia web. +editor.edit_this_file=Modifica file +editor.must_be_on_a_branch=È necessario essere in un branch per eseguire o proporre modifiche su questo file. +editor.fork_before_edit=È necessario forkare questo repository per eseguire o proporre modifiche su questo file. +editor.delete_this_file=Elimina file +editor.must_have_write_access=È necessaria l'autorizzazione di scrittura per eseguire o proporre modifiche su questo file. +editor.file_delete_success=Il file '%s' è stato eliminato. +editor.name_your_file=Dai un nome al file… +editor.filename_help=Aggiungi una directory digitando il suo nome nome seguito da il carattere slash ('/'). Rimuovi una directory digitando backspace all'inizio del campo di input. editor.or=o +editor.cancel_lower=Annulla editor.commit_changes=Apporta le modifiche editor.add_tmpl=Aggiungi '%s/' editor.add=Aggiungi '%s' editor.update=Aggiornare '%s' editor.delete=Eliminare '%s' +editor.commit_message_desc=Aggiungi una descrizione estesa facoltativa… editor.commit_directly_to_this_branch=Impegnarsi direttamente con il %s branch. editor.create_new_branch=Creare un nuovo branch per questo commit e inizia una pull request. +editor.new_branch_name_desc=Nome del nuovo branch… editor.cancel=Cancellare +editor.filename_cannot_be_empty=Il nome del file non può essere vuoto. editor.branch_already_exists=Il branch '%s' esiste già in questo repository. +editor.directory_is_a_file=Il nome di directory '%s' è già utilizzato come nome di un file in questo repository. +editor.file_is_a_symlink='%s' è un collegamento simbolico. I collegamenti simbolici non possono essere modificati nell'editor web +editor.filename_is_a_directory=Il nome di file '%s' è già utilizzato come nome di una directory in questo repository. +editor.file_editing_no_longer_exists=Il file in fase di modifica, '%s', non esiste più in questo repository. +editor.file_changed_while_editing=I contenuti di questo file hanno subito dei cambiamento da quando hai iniziato la modifica. Clicca qui per visualizzarli o Committa nuovemente i Cambiamenti per sovrascriverli. +editor.file_already_exists=Un file di nome '%s' esiste già in questo repository. editor.no_changes_to_show=Non ci sono cambiamenti da mostrare. editor.fail_to_update_file=Errore durante l'aggiornamento/ creazione del file '%s' con errore: %v +editor.add_subdir=Aggiungi una directory… editor.unable_to_upload_files=Impossibile caricare i file su '%s' con errore:%v - +editor.upload_files_to_dir=Carica file su '%s' +editor.cannot_commit_to_protected_branch=Impossibile eseguire un commit sul branch protetto '%s'. + +commits.desc=Sfoglia la cronologia di modifiche del codice rogente. +commits.commits=Commit +commits.search=Ricerca commits… +commits.find=Cerca +commits.search_all=Tutti i branch commits.author=Autore commits.message=Messaggio commits.date=Data commits.older=Più vecchio commits.newer=Più recente +commits.signed_by=Firmato da +commits.gpg_key_id=ID Chiave GPG +ext_issues=Issue esterne +ext_issues.desc=Collegamento al puntatore di una issue esterna. +issues.desc=Organizza le segnalazioni di bug, attività e pietre miliari. issues.new=Nuovo Problema issues.new.labels=Etichette issues.new.no_label=Nessuna etichetta @@ -323,14 +649,39 @@ issues.new.no_milestone=Nessuna milestone issues.new.clear_milestone=Milestone pulita issues.new.open_milestone=Apri Milestone issues.new.closed_milestone=Milestone chiuse +issues.new.assignees=Assegnatari +issues.new.clear_assignees=Cancella assegnatari +issues.new.no_assignees=Nessuno assegnato +issues.no_ref=Nessun Branch/Tag specificato issues.create=Crea Problema issues.new_label=Nuova etichetta +issues.new_label_placeholder=Nome etichetta +issues.new_label_desc_placeholder=Descrizione issues.create_label=Crea Etichetta +issues.label_templates.title=Carica un set predefinito di etichette +issues.label_templates.info=Non esistono etichette. Crea una etichetta con 'Nuova Etichetta' o usa un set predefinito di etichette: +issues.label_templates.helper=Scegli un set di etichette +issues.label_templates.use=Usa Set Etichette +issues.label_templates.fail_to_load_file=Impossibile caricare il file template di etichetta '%s': %v +issues.add_label_at=aggiunta l'etichetta
%s
%s +issues.remove_label_at=rimossa l'etichetta
%s
%s +issues.add_milestone_at=`aggiunta alle pietre miliari %s %s` +issues.change_milestone_at=`pietra miliare modificata da %s a %s %s` +issues.remove_milestone_at=`rimossa dalle pietre miliari %s %s` +issues.deleted_milestone='(rimosso)' +issues.self_assign_at=`%s auto-assegnato` +issues.add_assignee_at=`è stato assegnato da %s %s` +issues.remove_assignee_at=`rimossa la loro assegnazione %s` +issues.change_title_at=' titolo modificato da %s a %s %s ' +issues.delete_branch_at=`branch %s eliminato %s` issues.open_tab=%d Aperti issues.close_tab=%d Chiusi issues.filter_label=Etichetta +issues.filter_label_no_select=Tutte le etichette issues.filter_milestone=Traguardo +issues.filter_milestone_no_select=Tutte le pietre miliari issues.filter_assignee=Assegnatario +issues.filter_assginee_no_select=Tutte le assegnazioni issues.filter_type=Tipo issues.filter_type.all_issues=Tutti i problemi issues.filter_type.assigned_to_you=Assegnati a te @@ -343,6 +694,10 @@ issues.filter_sort.recentupdate=Aggiornati di recente issues.filter_sort.leastupdate=Aggiornati tempo fa issues.filter_sort.mostcomment=I più commentati issues.filter_sort.leastcomment=I meno commentati +issues.filter_sort.moststars=Più favoriti +issues.filter_sort.feweststars=Meno favoriti +issues.filter_sort.mostforks=Maggior numero di fork +issues.filter_sort.fewestforks=Minor numero di fork issues.action_open=Aperto issues.action_close=Chiuso issues.action_label=Etichetta @@ -357,40 +712,108 @@ issues.next=Pagina successiva issues.open_title=Aperto issues.closed_title=Chiuso issues.num_comments=%d commenti +issues.commented_at=`%s ha commentato` +issues.delete_comment_confirm=Sei sicuro/a di voler eliminare questo commento? issues.no_content=Non ci sono ancora contenuti. issues.close_issue=Chiudi +issues.close_comment_issue=Commenta e Chiudi issues.reopen_issue=Riapri +issues.reopen_comment_issue=Commenta e Riapri issues.create_comment=Commento issues.closed_at=`chiuso %[2]s` issues.reopened_at=`riaperto %[2]s` +issues.commit_ref_at=`ha fatto riferimento a questa issue dal commit %[2]s` issues.poster=Autore issues.collaborator=Collaboratori issues.owner=Proprietario +issues.sign_in_require_desc=Effettua l'accesso per partecipare alla conversazione. issues.edit=Modifica issues.cancel=Annulla issues.save=Salva issues.label_title=Nome etichetta +issues.label_description=Descrizione etichetta issues.label_color=Colore etichetta issues.label_count=%d etichette issues.label_open_issues=%d problemi aperti issues.label_edit=Modifica issues.label_delete=Elimina +issues.label_modify=Modifica Etichetta +issues.label_deletion=Elimina Etichetta +issues.label_deletion_desc=Eliminare un'etichetta la rimuove da tutte le issue. Continuare? +issues.label_deletion_success=L'etichetta è stata eliminata. +issues.label.filter_sort.alphabetically=In ordine alfabetico +issues.label.filter_sort.reverse_alphabetically=In ordine alfabetico inverso +issues.label.filter_sort.by_size=Dimensione +issues.label.filter_sort.reverse_by_size=Inverti dimensione issues.num_participants=%d Partecipanti - +issues.attachment.open_tab=`Clicca per vedere "%s" in una nuova scheda` +issues.attachment.download=`Clicca qui per scaricare "%s"` +issues.subscribe=Iscriviti +issues.unsubscribe=Annulla iscrizione +issues.tracker=Cronografo +issues.start_tracking_short=Inizio +issues.start_tracking=Avvia cronografo +issues.start_tracking_history='ha iniziato a lavorare %s` +issues.tracking_already_started=`Hai già avviato il cronografo su questa issue!` +issues.stop_tracking=Interrompi +issues.stop_tracking_history=`ha smesso di funzionare %s` +issues.add_time=Aggiungi Tempo manualmente +issues.add_time_short=Aggiungi tempo +issues.add_time_cancel=Annulla +issues.add_time_history=`aggiunto tempo trascorso %s` +issues.add_time_hours=Ore +issues.add_time_minutes=Minuti +issues.add_time_sum_to_small=Non è stato inserito alcun tempo. +issues.cancel_tracking=Annulla +issues.cancel_tracking_history=`ha cancellato il cronografo %s` +issues.time_spent_total=Tempo totale trascorso +issues.time_spent_from_all_authors=`Totale tempo trascorso: %s` +issues.due_date=Data di scadenza +issues.invalid_due_date_format=Il formato della data di scadenza deve essere 'yyyy-mm-dd'. +issues.error_modifying_due_date=Impossibile modificare la data di scadenza. +issues.error_removing_due_date=Impossibile rimuovere la data di scadenza. +issues.due_date_form=yyyy-mm-dd +issues.due_date_form_add=Aggiungi data di scadenza +issues.due_date_form_update=Aggiorna data di scadenza +issues.due_date_form_remove=Rimuovi data di scadenza +issues.due_date_not_writer=E' necessario l'accesso di scrittura del repository per aggiornare la data di una sua issue. +issues.due_date_not_set=Nessuna data di scadenza impostata. +issues.due_date_added=la data di scadenza %s è stata aggiunta %s +issues.due_date_modified=data di scadenza modificata da %s a %s %s +issues.due_date_remove=rimossa la data di scadenza %s %s +issues.due_date_overdue=Scaduto + +pulls.desc=Attiva le richieste di merge e le recensioni di codice. pulls.new=Nuova Pull Request +pulls.compare_changes=Nuova Pull Request +pulls.compare_changes_desc=Selezione il branch su cui eseguire il merge e il branch da cui eseguire il pull. +pulls.compare_base=unisci a +pulls.compare_compare=esegui un pull da pulls.filter_branch=Filtra branch pulls.no_results=Nessun risultato trovato. +pulls.nothing_to_compare=Questi rami sono uguali. Non c'è alcuna necessità di creare una pull request. +pulls.has_pull_request=`Una pull request tra questi rami già esiste: %[2]s#%[3]d` pulls.create=Crea Pull Request pulls.title_desc=vorrebbe unire %[1]d commit da %[2]s a %[3]s pulls.merged_title_desc=ha unito %[1]d commit da %[2]s a %[3]s %[4]s pulls.tab_conversation=Conversazione pulls.tab_commits=Commit +pulls.tab_files=File modificati pulls.reopen_to_merge=Riapri questa pull request per effettuare l'unione. pulls.merged=Unito +pulls.has_merged=La pull request è stata unita. +pulls.data_broken=Questa pull request è rovinata a causa di informazioni mancanti del fork. +pulls.is_checking=Verifica dei conflitti di merge in corso. Riprova tra qualche istante. pulls.can_auto_merge_desc=La pull request non può essere mergiata automaticamente. +pulls.cannot_auto_merge_desc=Questa pull request non può essere unita automaticamente a causa di conflitti. +pulls.cannot_auto_merge_helper=Unire manualmente per risolvere i conflitti. +pulls.no_merge_desc=Questa pull request non può essere unita perché tutte le opzioni di merge del repository sono disattivate. +pulls.no_merge_helper=Attiva le opzioni di merge nelle impostazioni del repository o unisci la pull request manualmente. pulls.merge_pull_request=Unisci Pull Request pulls.rebase_merge_pull_request=Fai rebase e unisci pulls.squash_merge_pull_request=Fai squash e unisci +pulls.invalid_merge_option=Non puoi utilizzare questa opzione di merge per questa pull request. +pulls.open_unmerged_pull_exists=`Non è possibile riaprire questa pull request perché ne esiste un'altra (#%d) con proprietà identiche.` milestones.new=Nuova Milestone milestones.open_tab=%d Aperti @@ -399,73 +822,297 @@ milestones.closed=Chiuso %s milestones.no_due_date=Nessuna data di scadenza milestones.open=Apri milestones.close=Chiudi +milestones.new_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso. milestones.create=Crea Milestone milestones.title=Titolo milestones.desc=Descrizione milestones.due_date=Data di scadenza (opzionale) milestones.clear=Pulisci +milestones.invalid_due_date_format=Il formato della data di scadenza deve essere 'yyyy-mm-dd'. +milestones.create_success=La pietra miliare '%s' è stata creata. milestones.edit=Modifica Milestone +milestones.edit_subheader=Le pietre miliari organizzano le issue e tengono conto del progresso. milestones.cancel=Annulla - - +milestones.modify=Aggiorna pietra miliare +milestones.edit_success=La pietra miliare '%s' è stata aggiornata. +milestones.deletion=Elimina pietra miliare +milestones.deletion_desc=Eliminare una pietra miliare la rimuove da tutte le relative issue. Continuare? +milestones.deletion_success=La pietra miliare è stata eliminata. +milestones.filter_sort.closest_due_date=Data di scadenza più vicina +milestones.filter_sort.furthest_due_date=Data di scadenza più lontana +milestones.filter_sort.least_complete=Meno completato +milestones.filter_sort.most_complete=Più completato +milestones.filter_sort.most_issues=Più problemi +milestones.filter_sort.least_issues=Meno problemi + +ext_wiki=Wiki esterna +ext_wiki.desc=Collegamento a una wiki esterna. + +wiki=Wiki +wiki.welcome=Benvenuti nella Wiki. +wiki.welcome_desc=La wiki ti permette di scrivere e condividere documentazione con i collaboratori. +wiki.desc=Scrivi e condividi documentazione con i collaboratori. +wiki.create_first_page=Crea la prima pagina wiki.page=Pagina wiki.filter_page=Filtra pagina +wiki.new_page=Pagina +wiki.default_commit_message=Scrivi una nota riguardo l'aggiornamento di questa pagina (opzionale). wiki.save_page=Salva pagina wiki.last_commit_info=%s ha modificato questa pagina %s wiki.edit_page_button=Modifica wiki.new_page_button=Nuova pagina wiki.delete_page_button=Cancella Pagina +wiki.delete_page_notice_1=Eliminare la pagina wiki '%s' è una operazione che non può essere annullata. Continuare? wiki.page_already_exists=Esiste già una pagina Wiki con questo stesso nome. +wiki.reserved_page=Il nome della pagina wiki '%s' è riservato. wiki.pages=Pagine wiki.last_updated=Ultimo aggiornamento: %s +activity=Attività +activity.period.filter_label=Periodo: +activity.period.daily=1 giorno +activity.period.halfweekly=3 giorni +activity.period.weekly=1 settimana +activity.period.monthly=1 mese +activity.overview=Riepilogo +activity.active_prs_count_1=%d Pull Request attiva +activity.active_prs_count_n=%d Pull Request attive activity.merged_prs_count_1=Pull Request Unita activity.merged_prs_count_n=Pull request unite +activity.opened_prs_count_1=Pull Request proposta +activity.opened_prs_count_n=Pull Request proposte +activity.title.user_1=%d utente +activity.title.user_n=%d utenti +activity.title.prs_1=%d Pull request +activity.title.prs_n=%d Pull request activity.title.prs_merged_by=%s unita da %s +activity.title.prs_opened_by=%s proposta da %s activity.merged_prs_label=Unite - +activity.opened_prs_label=Proposta +activity.active_issues_count_1=%d Issue attiva +activity.active_issues_count_n=%d Issue attive +activity.closed_issues_count_1=Issue chiusa +activity.closed_issues_count_n=Issue chiuse +activity.title.issues_1=%d Issue +activity.title.issues_n=%d Issue +activity.title.issues_closed_by=%s chiusa da %s +activity.title.issues_created_by=%s creata da %s +activity.closed_issue_label=Chiusa +activity.new_issues_count_1=Nuova issue +activity.new_issues_count_n=Nuove issue +activity.new_issue_label=Aperta +activity.title.unresolved_conv_1=%d Conversazione non risolta +activity.title.unresolved_conv_n=%d Conversazioni non risolte +activity.unresolved_conv_desc=Queste issue e pull request cambiate di recente non sono ancora state risolte. +activity.unresolved_conv_label=Aperta +activity.title.releases_1=%d Release +activity.title.releases_n=%d Release +activity.title.releases_published_by=%s pubblicata da %s +activity.published_release_label=Pubblicata + +search=Ricerca +search.search_repo=Ricerca repository +search.results=Risultati della ricerca per "%s" in %s settings=Impostazioni +settings.desc=Impostazioni ti permette di gestire le impostazioni del repository +settings.options=Repository +settings.collaboration=Collaboratori +settings.collaboration.admin=Amministratore +settings.collaboration.write=Scrittura +settings.collaboration.read=Lettura +settings.collaboration.undefined=Non definito +settings.hooks=Webhooks +settings.githooks=Git Hooks settings.basic_settings=Impostazioni di Base +settings.mirror_settings=Impostazioni di mirror +settings.sync_mirror=Sincronizza ora +settings.mirror_sync_in_progress=Sincronizzazione del mirror in corso. Torna tra qualche minuto. +settings.site=Sito web settings.update_settings=Aggiorna Impostazioni settings.advanced_settings=Opzioni avanzate +settings.wiki_desc=Abilita Wiki Repository +settings.use_internal_wiki=Utilizza la wiki incorporata +settings.use_external_wiki=Usa Wiki esterna settings.external_wiki_url=URL Wiki esterno +settings.external_wiki_url_error=L'URL della wiki esterna non è un URL valido. +settings.external_wiki_url_desc=I visitatori verranno reindirizzati all'URL della wiki esterna cliccando sulla scheda di wiki. +settings.issues_desc=Abilità il tracciatore delle issue del repository +settings.use_internal_issue_tracker=Usa il tracciatore di issue incorporato +settings.use_external_issue_tracker=Usa un tracciatore di issue esterno +settings.external_tracker_url=URL del tracciatore di issue esterno +settings.external_tracker_url_error=L'URL del tracciatore di issue esterno non è un URL valido. +settings.external_tracker_url_desc=I visitatori verranno reindirizzati all'URL del tracciatore di issue esterno cliccando sulla scheda delle issue. settings.tracker_url_format=Formato URL Gestore Problemi Esterno +settings.tracker_issue_style=Formato numerico del tracciatore di issue esterno +settings.tracker_issue_style.numeric=Numerico +settings.tracker_issue_style.alphanumeric=Alfanumerico +settings.tracker_url_format_desc=Usa i segnaposto {user}, {repo} e {index} per il nome utente, il nome del repository e l'indice delle issue. +settings.enable_timetracker=Abilita il cronografo +settings.allow_only_contributors_to_track_time=Consenti soltanto ai contributori di utilizzare il cronografo +settings.pulls_desc=Abilita le pull request del repository +settings.pulls.ignore_whitespace=Ignora gli spazi bianchi per evitare conflitti +settings.pulls.allow_merge_commits=Abilita il merging dei commit +settings.pulls.allow_rebase_merge=Abilita l'unione dei commit mediante riassegnazione +settings.pulls.allow_squash_commits=Abilita lo Squashing per unire i commits via merge +settings.admin_settings=Impostazioni amministratore +settings.admin_enable_health_check=Abilita verifica dell'integrità del repository (git fsck) settings.danger_zone=Zona Pericolosa settings.new_owner_has_same_repo=Il nuovo proprietario ha già un repository con lo stesso nome. Per favore scegli un altro nome. +settings.convert=Converti in un repository regolare +settings.convert_desc=È possibile convertire questo mirror in un repository regolare. Questa operazione non può essere annullata. +settings.convert_notices_1=- Questa operazione convertirà questo mirror in una repository regolare e non potrà essere annullata. +settings.convert_confirm=Converti Repository +settings.convert_succeed=Il mirror è stato convertito in un repository regolare. settings.transfer=Trasferisci proprietà +settings.transfer_desc=Trasferisci questo repository a un altro utente o a un'organizzazione nella quale hai diritti d'amministratore. +settings.transfer_notices_1=-Si perderà l'accesso al repository se lo si trasferisce ad un utente singolo. +settings.transfer_notices_2=-Si manterrà l'accesso al repository se si trasferisce in un'organizzazione che possiedi (o condividi con qualcun'altro). +settings.transfer_form_title=Inserisci il nome del repository come conferma: +settings.wiki_delete=Elimina dati Wiki +settings.wiki_delete_desc=L'eliminazione dei dati della wiki del repository è permanente e non può essere annullata. +settings.wiki_delete_notices_1=-Questa operazione eliminerà permanentemente e disabiliterà la wiki repository per %s. +settings.confirm_wiki_delete=Elimina dati Wiki +settings.wiki_deletion_success=I dati della repository wiki sono stati eliminati. settings.delete=Elimina questo repository +settings.delete_desc=L'eliminazione di un repository è un'operazione permanente e non può essere annullata. settings.delete_notices_1=-Questa operazione NON PUÒ essere annullata. +settings.delete_notices_2=-Questa operazione eliminerà definitivamente il repository %s inclusi codice, issue, commenti, dati wiki e impostazioni collaboratore. +settings.delete_notices_fork_1=-I fork di questo repository diventeranno indipendenti dopo la cancellazione. +settings.deletion_success=Il repository è stato eliminato. +settings.update_settings_success=Le impostazioni del repository sono state aggiornate. settings.transfer_owner=Nuovo Proprietario +settings.make_transfer=Esegui trasferimento +settings.transfer_succeed=Il repository è stato trasferito. +settings.confirm_delete=Elimina repository +settings.add_collaborator=Aggiungi collaboratore +settings.add_collaborator_success=Il collaboratore è stato aggiunto. +settings.delete_collaborator=Rimuovi +settings.collaborator_deletion=Rimuovi collaboratore +settings.collaborator_deletion_desc=Rimuovere un collaboratore revocherà l'accesso a questo repository. Continuare? +settings.remove_collaborator_success=Il collaboratore è stato rimosso. +settings.search_user_placeholder=Ricerca utente… +settings.org_not_allowed_to_be_collaborator=Le organizzazioni non possono essere aggiunte come un collaboratore. +settings.user_is_org_member=L'utente è un membro di organizzazione che non può essere aggiunto come un collaboratore. settings.add_webhook=Aggiungi Webhook +settings.hooks_desc=I Webhook effettuano automaticamente richieste HTTP POST ad un server quando si verificano determinati eventi Gitea. Per saperne di più leggi la guida ai webhooks. +settings.webhook_deletion=Rimuovi Webhook +settings.webhook_deletion_desc=Rimuovere un webhook rimuove le sue impostazioni e la sua cronologia di consegna. Continuare? +settings.webhook_deletion_success=Il webhook è stato rimosso. settings.webhook.test_delivery=Test di consegna +settings.webhook.test_delivery_desc=Prova questo webhook con un evento falso. +settings.webhook.test_delivery_success=Un evento falso è stato aggiunto alla coda di consegna. Potrebbe richiedere qualche secondo prima che appaia nella cronologia di consegna. settings.webhook.request=Richiesta settings.webhook.response=Risposta +settings.webhook.headers=Intestazioni +settings.webhook.payload=Contenuto +settings.webhook.body=Corpo +settings.githooks_desc=Gli Hooks di Git sono una funzionalità di Git stesso. Puoi modificare i file degli hooks supportati nell'elenco qui sotto per compiere azioni personalizzate. settings.githook_edit_desc=Se l'hook è inattivo, sarà presentato un contenuto esempio. Lasciando il contenuto vuoto disattiverai questo hook. settings.githook_name=Nome hook settings.githook_content=Contenuto hook settings.update_githook=Aggiorna Hook +settings.add_webhook_desc=Gitea enverra des requêtes POST avec un type de contenu donné à l'URL cible. Apprenez-en plus dans le guide webhooks. +settings.payload_url=URL di destinazione +settings.content_type=Tipo di contenuto POST +settings.secret=Segreto settings.slack_username=Nome utente settings.slack_icon_url=URL icona +settings.discord_username=Nome utente +settings.discord_icon_url=URL icona settings.slack_color=Colore +settings.event_desc=Attivato su: +settings.event_push_only=Pusha eventi +settings.event_send_everything=Tutti gli eventi +settings.event_choose=Eventi personalizzati… settings.event_create=Crea +settings.event_create_desc=Branch o tag creato. +settings.event_delete=Elimina +settings.event_delete_desc=Branch o tag eliminato +settings.event_fork=Fork +settings.event_fork_desc=Repository forkato +settings.event_issues=Issues +settings.event_issues_desc=Issue aperta, chiusa, riaperta, modificata, assegnata, non assegnata, etichetta aggiornata, etichetta cancellata, con pietra miliare o senza pietra miliare. +settings.event_issue_comment=Commento Issue +settings.event_issue_comment_desc=Commento issue creato, modificato o rimosso. +settings.event_release=Release +settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository. +settings.event_pull_request=Pull Request +settings.event_pull_request_desc=Pull request aperta, chiusa, riaperta, modificata, assegnata, non assegnata, etichetta aggiornata, etichetta cancellata o sincronizzata. +settings.event_push=Push +settings.event_push_desc=Git push in un repository. +settings.event_repository=Repository +settings.event_repository_desc=Repository creato o eliminato. +settings.active=Includi dettagli evento +settings.active_helper=Aggiunge alle richieste informazioni riguardo la causa. +settings.add_hook_success=Il webhook è stato aggiunto. settings.update_webhook=Aggiorna Webhook +settings.update_hook_success=Il webhook è stato aggiornato. +settings.delete_webhook=Rimuovi Webhook settings.recent_deliveries=Recenti Deliveries settings.hook_type=Tipo di Hook +settings.add_slack_hook_desc=Integra Slack nel tuo repository. +settings.slack_token=Gettone settings.slack_domain=Dominio settings.slack_channel=Canale +settings.add_discord_hook_desc=Integra Discord nel tuo repository. +settings.add_dingtalk_hook_desc=Integra Dingtalk nel tuo repository. settings.deploy_keys=Dispiega Chiavi settings.add_deploy_key=Aggiungi Deploy Key +settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository. +settings.is_writable=Abilita accesso scrittura +settings.is_writable_info=Permetti a questa deploy key di pushare nella repository. +settings.no_deploy_keys=Non sono ancora presenti deploy key. settings.title=Titolo settings.deploy_key_content=Contenuto +settings.key_been_used=Una deploy key con contenuto identico è già in uso. +settings.key_name_used=Esiste già una deploy key con questo nome. +settings.add_key_success=La deploy key '%s' è stata aggiunta. +settings.deploy_key_deletion=Rimuovi deploy key +settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revocherà l'accesso a questo repository. Continuare? +settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa. +settings.branches=Branches +settings.protected_branch=Protezione branch +settings.protected_branch_can_push=Consentire push? +settings.protected_branch_can_push_yes=Puoi pushare +settings.protected_branch_can_push_no=Non puoi pushare +settings.branch_protection=Protezione branch per il branch '%s' +settings.protect_this_branch=Attiva protezione branch +settings.protect_this_branch_desc=Impedisci l'eliminazione e disabilita i push forzati di Git nel branch. +settings.protect_whitelist_committers=Attiva la whitelist per i push +settings.protect_whitelist_committers_desc=Consenti agli utenti o ai team nella whitelist di ignorare le restrizioni di push. +settings.protect_whitelist_users=Utenti nella whitelist per pushare: +settings.protect_whitelist_search_users=Cerca utenti… +settings.protect_whitelist_teams=Team nella whitelist per pushare: +settings.protect_whitelist_search_teams=Ricerca team… +settings.protect_merge_whitelist_committers=Attiva la whitelist per i merge +settings.protect_merge_whitelist_committers_desc=Consentire soltanto agli utenti o ai team in whitelist il permesso di unire le pull request di questo branch. +settings.protect_merge_whitelist_users=Utenti nella whitelist per il merging: +settings.protect_merge_whitelist_teams=Team nella whitelist per il merging: +settings.add_protected_branch=Attiva protezione +settings.delete_protected_branch=Disattiva protezione +settings.update_protect_branch_success=La protezione branch per il branch '%s' è stata aggiornata. +settings.remove_protected_branch_success=La protezione branch per il branch '%s' è stata disattivata. +settings.protected_branch_deletion=Disattiva protezione branch +settings.protected_branch_deletion_desc=Disattivare la protezione branch permette agli utenti con permesso di scrittura di pushare sul branch. Continuare? +settings.default_branch_desc=Seleziona un branch del repository predefinito per le pull request ed i commit di codice: +settings.choose_branch=Scegli un branch… +settings.no_protected_branch=Non ci sono branch protetti. diff.browse_source=Sfoglia il codice sorgente +diff.parent=parent +diff.commit=commit +diff.data_not_available=Dati Diff non disponibili diff.show_diff_stats=Mostra Diff Stats diff.show_split_view=Visualizzazione separata diff.show_unified_view=Visualizzazione unificata diff.stats_desc=%d ha cambiato i file con %d aggiunte e %d eliminazioni +diff.bin=BIN diff.view_file=Vedi File +diff.file_suppressed=File diff soppresso perché troppo grande +diff.too_many_files=Dato che sono stati cambiati molti file in questo diff, alcuni di essi non verranno mostrati +releases.desc=Tenere traccia di versioni e download del progetto. release.releases=Rilasci release.new_release=Nuovo Rilascio release.draft=Bozza @@ -474,42 +1121,102 @@ release.stable=Stabile release.edit=modifica release.ahead=%d commits da %s da questo rilascio release.source_code=Codice Sorgente +release.new_subheader=Le release organizzano le versioni del progetto. +release.edit_subheader=Le release organizzano le versioni del progetto. release.tag_name=Nome tag release.target=Obbiettivo +release.tag_helper=Scegli un tag esistente o crea un nuovo tag. release.title=Titolo release.content=Contenuto release.write=Scrivi release.preview=Anteprima +release.loading=Caricamento… +release.prerelease_desc=Contrassegna come pre-release +release.prerelease_helper=Contrassegna questa release come inadatta per l'uso di produzione. release.cancel=Annulla release.publish=Pubblica Rilascio release.save_draft=Salva Bozza +release.edit_release=Aggiorna release +release.delete_release=Elimina release +release.deletion=Elimina release +release.deletion_desc=Eliminare una release rimuove il suo tag Git dal repository. Il contenuto e la cronologia del repository rimarranno invariati. Continuare? +release.deletion_success=La release è stata eliminata. +release.tag_name_already_exist=Una release con questo nome tag esiste già. +release.tag_name_invalid=Il nome tag non è valido. release.downloads=Download - +branch.name=Nome branch +branch.search=Cerca branch +branch.already_exists=Un branch di nome '%s' esiste già. +branch.delete_head=Elimina +branch.delete=Elimina branch '%s' +branch.delete_html=Elimina branch +branch.delete_desc=L'eliminazione di un branch è definitiva. E' un'operazione che NON PUÒ essere annullata. Continuare? +branch.deletion_success=Il branch '%s' è stato eliminato. +branch.deletion_failed=Impossibile eliminare il branch '%s'. +branch.delete_branch_has_new_commits=Il branch '%s' non può essere eliminato perché sono stati aggiunti nuovi commit dopo il merging. +branch.create_branch=Crea branch %s +branch.create_from=da '%s' +branch.create_success=Il branch '%s' è stato creato. +branch.branch_already_exists=Il branch '%s' esiste già in questo repository. +branch.branch_name_conflict=Il nome del branch '%s' è in conflitto con il branch già esistente '%s'. +branch.tag_collision=Il branch '%s' non può essere creato in quanto esiste già un tag con lo stesso nome in questo repository. +branch.deleted_by=Eliminato da %s +branch.restore_success=Il branch '%s' è stato ripristinato. +branch.restore_failed=Impossibile ripristinare il branch '%s '. +branch.protected_deletion_failed=Il branch '%s' è protetto. Non può essere eliminato. + +topic.manage_topics=Gestisci argomenti +topic.done=Fatto +topic.count_prompt=Non puoi selezione più di 25 argomenti +topic.format_prompt=Gli argomenti devono iniziare con una lettera o un numero, possono includere il carattere hiphens(-) e non possono essere più lunghi di 35 caratteri [org] org_name_holder=Nome dell'Organizzazione org_full_name_holder=Nome completo dell'organizzazione +org_name_helper=I nomi delle organizzazioni devono essere brevi e semplici da ricordare. create_org=Crea Organizzazione repo_updated=Aggiornato people=Utenti teams=Team lower_members=membri lower_repositories=repository +create_new_team=Nuovo Team +create_team=Crea Team org_desc=Descrizione team_name=Nome Team team_desc=Descrizione +team_name_helper=I nomi dei team devono essere brevi e semplici da ricordare. +team_desc_helper=Descrivi lo scopo o il ruolo del team. +team_permission_desc=Autorizzazione +team_unit_desc=Consentire l'accesso a sezioni di Repository +form.name_reserved=Il nome dell'organizzazione '%s' è riservato. +form.name_pattern_not_allowed=Il modello '%s' non è consentito come nome di una organizzazione. +form.create_org_not_allowed=Non disponi dell'autorizzazione per creare un organizzazione. settings=Impostazioni +settings.options=Organizzazione settings.full_name=Nome Completo settings.website=Sito Web settings.location=Residenza settings.update_settings=Aggiorna Impostazioni +settings.update_setting_success=Le impostazioni dell'organizzazione sono state aggiornate. +settings.change_orgname_prompt=Nota: cambiare il nome dell'organizzazione cambia anche il relativo URL. +settings.update_avatar_success=L'avatar dell'organizzazione è stato aggiornato. settings.delete=Elimina organizzazione settings.delete_account=Elimina questa organizzazione +settings.delete_prompt=L'organizzazione verrà rimossa definitivamente. Questa operazione NON PUÒ essere annullata! settings.confirm_delete_account=Conferma Eliminazione - +settings.delete_org_title=Elimina organizzazione +settings.delete_org_desc=Questa organizzazione verrà eliminata definitivamente. Continuare? +settings.hooks_desc=Aggiungi i webhooks che verranno attivati per tutti i repository sotto questa organizzazione. + +members.membership_visibility=Visibilità appartenenza: +members.public=Visibile +members.public_helper=nascondi +members.private=Nascosto +members.private_helper=rendi visibile members.member_role=Ruolo del membro: members.owner=Proprietario members.member=Membro @@ -521,21 +1228,36 @@ members.invite_now=Invita ora teams.join=Iscriviti teams.leave=Abbandona teams.read_access=Accesso di Lettura +teams.read_access_helper=I membri possono visualizzare e clonare i repository del team. teams.write_access=Accesso di Scrittura +teams.write_access_helper=I membri possono leggere e pushare sui repository del team. +teams.admin_access=Accesso amministratore +teams.admin_access_helper=I membri possono pullare e pushare sulle repository del team e anche aggiungere collaboratori. teams.no_desc=Questo team non ha alcuna descrizione teams.settings=Impostazioni +teams.owners_permission_desc=I proprietari hanno pieno accesso a tutti i repository e hanno diritti di amministratore nell'organizzazione. teams.members=Membri del Team teams.update_settings=Aggiorna Impostazioni +teams.delete_team=Elimina team teams.add_team_member=Aggiungi un Membro al Team +teams.delete_team_title=Elimina team +teams.delete_team_desc=Eliminare un team revocherà l'accesso al repository da parte dei suoi membri. Continuare? +teams.delete_team_success=Il team è stato eliminato. +teams.read_permission_desc=Questo team concede l'accesso di lettura: i membri possono visualizzare e clonare i repository del team. +teams.write_permission_desc=Questo team concede l'accesso di Scrittura: i membri possono leggere da e pushare sui repository del team. +teams.admin_permission_desc=Questo team concede l'accesso di Amministratore: i membri possono leggere da, pushare su e aggiungere collaboratori ai repository del team. teams.repositories=Repository di Squadra +teams.search_repo_placeholder=Ricerca repository… teams.add_team_repository=Aggiungere Repository di Squadra teams.remove_repo=Rimuovi teams.add_nonexistent_repo=Il repository che stai tentando di aggiungere non esiste, crealo prima. [admin] dashboard=Pannello di Controllo +users=Account utenti organizations=Organizzazioni repositories=Repository +authentication=Fonti di autenticazione config=Configurazione notices=Avvisi di sistema monitor=Monitoraggio @@ -543,16 +1265,41 @@ first_page=Prima last_page=Ultima total=Totale: %d +dashboard.statistic=Riepilogo +dashboard.operations=Operazioni di manutenzione +dashboard.system_status=Stato del sistema +dashboard.statistic_info=Il database di Gitea contiene %d utenti, %d organizzazioni, %d chiavi pubbliche, %d repository, %d visualizzazioni, %d voti, %d azioni, %d accessi, %d issue, %d commenti, %d account social, %d follow, %d mirror, %d release, %d fonti di autenticazione, %d webhook, %d pietre miliari, %d etichette, %d richieste di hook, %d team, %d richieste di aggiornamento, %d allegati. dashboard.operation_name=Nome Operazione dashboard.operation_switch=Cambia dashboard.operation_run=Esegui +dashboard.clean_unbind_oauth=Elimina connessione OAuth slegate +dashboard.clean_unbind_oauth_success=Tutte le connessione OAuth slegate sono state eliminate. dashboard.delete_inactivate_accounts=Elimina tutti gli account inattivi +dashboard.delete_inactivate_accounts_success=Tutti gli account inattivi sono stati eliminati. +dashboard.delete_repo_archives=Elimina tutti gli archivi dei repository +dashboard.delete_repo_archives_success=Tutti gli archivi del repository sono stati eliminati. +dashboard.delete_missing_repos=Elimina tutti i repository mancanti dei loro file Git +dashboard.delete_missing_repos_success=Tutti i repository ai quali mancavano i file Git sono stati eliminati. +dashboard.git_gc_repos=Esegui la garbage collection su tutti i repository +dashboard.git_gc_repos_success=Tutti i repository hanno terminato l'operazione di garbage collection. +dashboard.resync_all_sshkeys=Aggiorna il file '.ssh/authorized_keys' con le chiavi SSH di Gitea. (Non è necessario per il server SSH incorporato) +dashboard.resync_all_sshkeys_success=Le chiavi SSH pubbliche controllate da Gitea sono state aggiornate. +dashboard.resync_all_hooks=Sincronizza nuovamente gli hook di pre-ricezione, di aggiornamento e di post-ricezione di tutti i repository. +dashboard.resync_all_hooks_success=Tutti gli hook di pre-ricezione, di aggiornamento e di post-ricezione sono stati sincronizzati. +dashboard.reinit_missing_repos=Reinizializza tutti i repository Git mancanti per i quali esistono cambiamenti registrati esistenti +dashboard.reinit_missing_repos_success=Tutti i repository Git mancanti per i quali esistono cambiamenti registrati esistenti sono stati reinizializzati. +dashboard.sync_external_users=Sincronizza dati utente esterno +dashboard.sync_external_users_started=La sincronizzazione dei dati utente esterno è iniziata. +dashboard.git_fsck=Esegui controlli di integrità su tutti i repository +dashboard.git_fsck_started=La verifica di integrità dei repository è iniziata. dashboard.server_uptime=Tempo in Attività del Server dashboard.current_goroutine=Goroutine Correnti dashboard.current_memory_usage=Utilizzo di Memoria Corrente dashboard.total_memory_allocated=Memoria Allocata Totale dashboard.memory_obtained=Memoria Ottenuta dashboard.pointer_lookup_times=Ricerche del Puntatore +dashboard.memory_allocate_times=Allocazioni di memoria +dashboard.memory_free_times=Rilasci di memoria dashboard.current_heap_usage=Utilizzo Heap Corrente dashboard.heap_memory_obtained=Memoria Heap Ottenuta dashboard.heap_memory_idle=Memoria Heap Inattiva @@ -575,57 +1322,148 @@ dashboard.total_gc_pause=Pausa Totale della GC dashboard.last_gc_pause=Ultima pausa della GC dashboard.gc_times=Esecuzioni GC +users.user_manage_panel=Gestione account utente +users.new_account=Crea account utente +users.name=Nome utente users.activated=Attivato users.admin=Amministratore users.repos=Repo users.created=Creato +users.last_login=Ultimo accesso +users.never_login=Mai effettuato l'accesso +users.send_register_notify=Invia notifica di registrazione utente +users.new_success=L'account utente '%s' è stato creato. users.edit=Modifica +users.auth_source=Fonte di autenticazione users.local=Locale - +users.auth_login_name=Nome utente per l'autenticazione +users.password_helper=Lascia la password vuota per non modificarla. +users.update_profile_success=L'account utente è stato aggiornato. +users.edit_account=Modifica account utente +users.max_repo_creation=Numero massimo di repository +users.max_repo_creation_desc=(Inserire -1 per utilizzare il limite predefinito globale.) +users.is_activated=Account utente attivato +users.prohibit_login=Disattiva login +users.is_admin=È amministratore +users.allow_git_hook=Può creare Git Hook +users.allow_import_local=Può importare repository locali +users.allow_create_organization=Può creare organizzazioni +users.update_profile=Aggiorna account utente +users.delete_account=Elimina account utente +users.still_own_repo=Questo utente possiede ancora una o più repository. Eliminare o trasferire questi repository prima di continuare. +users.still_has_org=Questo utente è membro di un'organizzazione. Rimuovi l'utente da tutte le organizzazioni prima di proseguire. +users.deletion_success=L'account utente è stato eliminato. + +orgs.org_manage_panel=Gestione Organizzazione orgs.name=Nome orgs.teams=Team orgs.members=Membri +orgs.new_orga=Nuova Organizzazione +repos.repo_manage_panel=Gestione Repository repos.owner=Proprietario repos.name=Nome repos.private=Privati repos.watches=Segue repos.stars=Voti +repos.forks=Fork repos.issues=Problemi +repos.size=Dimensione +auths.auth_manage_panel=Gestione fonti di autenticazione +auths.new=Aggiungi fonte di autenticazione auths.name=Nome auths.type=Tipo auths.enabled=Attivo +auths.syncenabled=Abilita sincronizzazione utenti auths.updated=Aggiornato auths.auth_type=Tipo di autenticazione auths.auth_name=Nome di autenticazione +auths.security_protocol=Protocollo di sicurezza auths.domain=Dominio +auths.host=Host auths.port=Porta auths.bind_dn=Binda DN auths.bind_password=Binda Password +auths.bind_password_helper=Attenzione: La password è memorizzata in testo normale. Se possibile, utilizzare un account di sola lettura. +auths.user_base=Base ricerca utente auths.user_dn=DN dell'utente +auths.attribute_username=Attributo nome utente +auths.attribute_username_placeholder=Lasciare vuoto per utilizzare il nome utente inserito in Gitea. +auths.attribute_name=Attributo nome +auths.attribute_surname=Attributo cognome +auths.attribute_mail=Attributo email +auths.attribute_ssh_public_key=Attributo chiave SSH pubblica +auths.attributes_in_bind=Estrai Attributi dal Contesto Bind DN +auths.use_paged_search=Utilizza ricerca per pagina +auths.search_page_size=Dimensioni pagina auths.filter=Fitro utente auths.admin_filter=Filtro Amministratore +auths.ms_ad_sa=Attributi di ricerca AD MS auths.smtp_auth=Tipo di autenticazione SMTP auths.smtphost=Host SMTP auths.smtpport=Porta SMTP auths.allowed_domains=Domini consentiti +auths.allowed_domains_helper=Lasciare vuoto per ammettere tutti i domini. Separare più domini con una virgola (','). auths.enable_tls=Abilitare Crittografia TLS auths.skip_tls_verify=Salta verifica TLS auths.pam_service_name=Nome del Servizio PAM +auths.oauth2_provider=OAuth2 Provider +auths.oauth2_clientID=ID Client (Chiave) +auths.oauth2_clientSecret=Segreto del client +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery URL +auths.oauth2_use_custom_url=Utilizzare URL personalizzati anziché URL predefiniti +auths.oauth2_tokenURL=URL token +auths.oauth2_authURL=Autorizza URL +auths.oauth2_profileURL=URL profilo +auths.oauth2_emailURL=URL email auths.enable_auto_register=Abilitare Registrazione Automatica auths.tips=Consigli +auths.tips.oauth2.general=Autenticazione OAuth2 +auths.tips.oauth2.general.tip=Quando si registra una nuova autenticazione OAuth2, l'URL di callback/reindirizzamento deve essere:/user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 Provider +auths.tip.bitbucket=Registra un nuovo cliente OAuth su https://bitbucket.org/account/user//oauth-consumers/new e aggiungi il permesso 'Account' - 'Read' +auths.tip.dropbox=Crea una nuova applicazione su https://www.dropbox.com/developers/apps +auths.tip.facebook=Registra una nuova applicazione su https://developers.facebook.com/apps e aggiungi il prodotto "Facebook Login +auths.tip.github=Registra una nuova applicazione OAuth su https://github.com/settings/applications/new +auths.tip.gitlab=Registra una nuova applicazione su https://gitlab.com/profile/applications +auths.tip.google_plus=Ottieni le credenziali del client OAuth2 dalla console API di Google su https://console.developers.google.com/ +auths.tip.openid_connect=Utilizza l'OpenID Connect Discovery URL (/.well-known/openid-configuration) per specificare gli endpoint +auths.tip.twitter=Vai su https://dev.twitter.com/apps, crea una applicazione e assicurati che l'opzione "Allow this application to be used to Sign In with Twitter" sia abilitata +auths.edit=Modifica fonte di autenticazione +auths.activated=Questa fonte di autenticazione è attiva +auths.new_success=L'autenticazione '%s' è stata aggiunta. +auths.update_success=La fonte d'autenticazione è stata aggiornata. +auths.update=Aggiorna fonte di autenticazione +auths.delete=Elimina fonte di autenticazione +auths.delete_auth_title=Elimina fonte di autenticazione +auths.delete_auth_desc=L'eliminazione di una fonte di autenticazione impedisce agli utenti di utilizzarla per accedere. Continuare? +auths.still_in_used=La fonte di autenticazione è ancora in uso. Convertire o eliminare gli utenti che utilizzano questa fonte di autenticazione prima di continuare. +auths.deletion_success=La fonte d'autenticazione è stata eliminata. +auths.login_source_exist=La fonte di autenticazione '%s' esiste già. config.server_config=Configurazione Server +config.app_name=Titolo del Sito +config.app_ver=Versione Gitea +config.app_url=URL di base di Gitea +config.custom_conf=Percorso file di configurazione +config.domain=Dominio Server SSH +config.offline_mode=Modalità locale config.disable_router_log=Disattivare Log del Router +config.run_user=Esegui come Nome utente config.run_mode=Modalità Esecuzione +config.git_version=Versione Git config.repo_root_path=Percorso radice del Repository +config.lfs_root_path=Percorso file LFS config.static_file_root_path=Percorso Root del File Statico +config.log_file_root_path=Percorso dei log config.script_type=Tipo di Script config.reverse_auth_user=Autenticazione Utente Inversa config.ssh_config=Configurazione SSH config.ssh_enabled=Attivo +config.ssh_start_builtin_server=Usa il server integrato +config.ssh_domain=Dominio Server config.ssh_port=Porta config.ssh_listen_port=Porta in ascolto config.ssh_root_path=Percorso Root @@ -636,23 +1474,49 @@ config.ssh_minimum_key_sizes=Dimensioni minime della chiave config.db_config=Configurazione Database config.db_type=Tipo +config.db_host=Host config.db_name=Nome +config.db_user=Nome utente +config.db_ssl_mode=SSL config.db_path=Percorso config.service_config=Configurazione Servizio +config.register_email_confirm=Richiedere la conferma Email per registrarsi +config.disable_register=Disattiva Self-Registration +config.allow_only_external_registration=Attiva la registrazione solo tramite servizi esterni +config.enable_openid_signup=Attiva OpenID Self-Registration +config.enable_openid_signin=Attiva l'accesso tramite OpenID config.show_registration_button=Mostra Pulsane Registrazione +config.require_sign_in_view=Richiedi l'accesso per visualizzare le pagine +config.mail_notify=Attila le notifiche Email config.disable_key_size_check=Disabilita controllo sulle dimensioni minime della chiave +config.enable_captcha=Attiva CAPTCHA config.active_code_lives=Attiva Vita del Codice +config.reset_password_code_lives=Resetta il tempo di scadenza del codice password +config.default_keep_email_private=Nascondi Indirizzo Email di Default +config.default_allow_create_organization=Consenti la Creazione di Organizzazioni di Default +config.enable_timetracking=Abilita il cronografo +config.default_enable_timetracking=Attiva il cronografo di Default +config.default_allow_only_contributors_to_track_time=Consenti soltanto ai contributori di utilizzare il cronografo +config.no_reply_address=Dominio email nascosto config.webhook_config=Configurazione Webhook config.queue_length=Lunghezza della coda config.deliver_timeout=Tempo Limite di Consegna +config.skip_tls_verify=Salta autenticazione TLS +config.mailer_config=Configurazione Mailer SMTP config.mailer_enabled=Attivo config.mailer_disable_helo=Disattiva HELO config.mailer_name=Nome config.mailer_host=Host config.mailer_user=Utente +config.mailer_use_sendmail=Utilizza Sendmail +config.mailer_sendmail_path=Percorso Sendmail +config.mailer_sendmail_args=Argomenti aggiuntivi per Sendmail +config.send_test_mail=Invia email di prova +config.test_mail_failed=Impossibile inviare mail di prova a '%s': %v +config.test_mail_sent=Una mail di prova è stata inviata a '%s'. config.oauth_config=Configurazione OAuth config.oauth_enabled=Attivo @@ -672,15 +1536,22 @@ config.session_life_time=Durata Sessione config.https_only=Solo HTTPS config.cookie_life_time=Durata Cookie +config.picture_config=Configurazione Immagine profilo e Avatar config.picture_service=Servizio foto config.disable_gravatar=Disabilita Gravatar +config.enable_federated_avatar=Attiva i Federated Avatar +config.git_config=Configurazione Git +config.git_disable_diff_highlight=Disattiva evidenziatore Diff Syntax config.git_max_diff_lines=Numero massimo di righe di diff (per singolo file) config.git_max_diff_line_characters=Numero massimo di caratteri di diff (per singola riga) config.git_max_diff_files=Numero massimo di file diff mostrati config.git_gc_args=Parametri GC config.git_migrate_timeout=Timeout per la migrazione config.git_mirror_timeout=Timeout per l'aggiornamento del mirror +config.git_clone_timeout=Tempo limite operazione di clone +config.git_pull_timeout=Tempo limite operazione di pull +config.git_gc_timeout=Timeout operazione GC config.log_config=Configurazione Log config.log_mode=Modalità Log @@ -690,12 +1561,14 @@ monitor.name=Nome monitor.schedule=Agenda monitor.next=La Prossima Volta monitor.previous=La Scorsa Volta +monitor.execute_times=Esecuzioni monitor.process=Processi in Esecuzione monitor.desc=Descrizione monitor.start=Orario Avvio monitor.execute_time=Tempo di Esecuzione notices.system_notice_list=Avvisi di Sistema +notices.view_detail_header=Visualizza dettagli dell'avviso notices.actions=Azioni notices.select_all=Seleziona tutto notices.deselect_all=Deseleziona tutto @@ -703,7 +1576,10 @@ notices.inverse_selection=Inverti selezione notices.delete_selected=Elimina selezionati notices.delete_all=Elimina tutti gli avvisi notices.type=Tipo +notices.type_1=Repository notices.desc=Descrizione +notices.op=Op. +notices.delete_success=Gli avvisi di sistema sono stati eliminati. [action] create_repo=ha creato il repository %s @@ -746,17 +1622,31 @@ raw_seconds=secondi raw_minutes=minuti [dropzone] +default_message=Trascina i file o clicca qui per caricare. +invalid_input_type=Non è possibile caricare file di questo tipo. file_too_big=La dimensione del file ({{filesize}} MB) supera la dimensione massima ({{maxFilesize}} MB). remove_file=Rimuovi file [notification] notifications=Notifiche +unread=Non lette +read=Lette +no_unread=Nessuna notifica da leggere. +no_read=Nessuna notifica letta. +pin=Appunta notifica mark_as_read=Segna come letto mark_as_unread=Segna come non letto mark_all_as_read=Segna tutti come letti [gpg] +error.extract_sign=Impossibile ricavare la firma +error.generate_hash=Impossibile generare hash del commit +error.no_committer_account=Nessun account collegato all'indirizzo email del committer error.no_gpg_keys_found=Non sono state trovate chiavi note per questa firma nel database +error.not_signed_commit=Commit non firmato +error.failed_retrieval_gpg_keys=Impossibile recuperare le chiavi associate all'account del committer [units] +error.no_unit_allowed_repo=Non possiedi il permesso di accedere ad alcuna sezione di questo repository. +error.unit_not_allowed=Non possiedi il permesso di accedere a questa sezione di repository. From 41b126b163a1cfb3d9d5b4403c573c7908fd3e0f Mon Sep 17 00:00:00 2001 From: Guilhem Marion Date: Mon, 2 Jul 2018 14:42:28 +0200 Subject: [PATCH 054/447] Update TRANSLATORS (#4349) --- options/locale/TRANSLATORS | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/TRANSLATORS b/options/locale/TRANSLATORS index ed04c22d1382..02b9858ad7c9 100644 --- a/options/locale/TRANSLATORS +++ b/options/locale/TRANSLATORS @@ -27,6 +27,7 @@ Enrico Testori hypertesto AT gmail DOT com Ezequiel Gonzalez Rial Gabriel Dugny Gregor Santner +Guilhem Marion Halil Kaya Hamid Feizabadi Hilton Wichwski Silva From 2169e5e1410d049e652d064bccd1e5042830876e Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Mon, 2 Jul 2018 12:43:33 +0000 Subject: [PATCH 055/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 97 +++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index ca3d703f12b7..43532164894f 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -347,6 +347,8 @@ issues.create_label=Skapa Etikett issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter issues.label_templates.helper=Markera en uppsättning etiketter issues.label_templates.fail_to_load_file=Laddning av etikettmallen '%s' misslyckades: %v +issues.add_label_at=lade till etiketten
%s
%s +issues.remove_label_at=tog bort etiketten
%s
%s issues.add_milestone_at=`lade till denna till milstolpe %s %s` issues.change_milestone_at='modifierade milstolpen från %s till %s %s' issues.remove_milestone_at='tog bort denna från milstolpen %s %s' @@ -420,8 +422,15 @@ issues.subscribe=Prenumerera issues.unsubscribe=Avsluta prenumerationen issues.start_tracking_short=Starta issues.start_tracking_history=`började arbeta %s` +issues.tracking_already_started=`Du har redan påbörjat tidredovisning på detta ärende!` +issues.stop_tracking=Stoppa +issues.stop_tracking_history=`slutade arbeta %s` +issues.add_time_cancel=Avbryt +issues.add_time_history=`la till tillbringad tid %s` issues.add_time_hours=Timmar issues.add_time_minutes=Minuter +issues.cancel_tracking=Avfärda +issues.cancel_tracking_history=”avbröt tidredovisning %s' pulls.new=Ny Pull-Förfrågan pulls.filter_branch=Filtrera gren @@ -431,9 +440,12 @@ pulls.title_desc=vill sammanfoga %[1]d incheckningar från s[2]s in pulls.merged_title_desc=sammanfogade %[1]d incheckningar från %[2]s in i %[3]s %[4]s pulls.tab_conversation=Konversation pulls.tab_commits=Incheckningar +pulls.reopen_to_merge=Vänligen återöppna denna Pull-förfrågan igen för att utföra sammanfogningen. pulls.merged=Sammanfogat pulls.can_auto_merge_desc=Denna pull-förfrågan kan sammanfogas automatiskt. pulls.merge_pull_request=Sammanfoga Pull-förfrågan +pulls.rebase_merge_pull_request=Rebase och sammanfogning +pulls.squash_merge_pull_request=Squasha och sammanfogning milestones.new=Ny milstolpe milestones.open_tab=%d Öppna @@ -470,14 +482,27 @@ wiki.page_already_exists=Wiki-sida med samma namn finns redan. wiki.pages=Sidor wiki.last_updated=Senast uppdaterad %s +activity=Aktiviteter activity.period.filter_label=Period: activity.period.daily=1 dag activity.period.halfweekly=3 dagar activity.period.weekly=1 vecka activity.period.monthly=1 månad activity.overview=Översikt +activity.active_prs_count_1=%d Aktiv Pull begäran +activity.active_prs_count_n=%d Aktiva Pull begärelser +activity.merged_prs_count_1=Sammanfogad Pull-förfrågan +activity.merged_prs_count_n=Sammanfogade Pull-förfrågningar +activity.opened_prs_count_1=Föreslagen Pull begäran +activity.opened_prs_count_n=Föreslagna Pull-begärelser activity.title.user_1=%d användare activity.title.user_n=%d användare +activity.title.prs_1=%d Pull-begäran +activity.title.prs_n=%d Pull begärelser +activity.title.prs_merged_by=%s sammanfogad av %s +activity.title.prs_opened_by=%s föreslås av %s +activity.merged_prs_label=Sammanfogad +activity.opened_prs_label=Föreslagen activity.active_issues_count_1=%d Aktivt ärende activity.active_issues_count_n=%d Aktiva ärenden activity.closed_issues_count_1=Stängt ärende @@ -488,9 +513,20 @@ activity.title.issues_closed_by=%s stängd av %s activity.title.issues_created_by=%s skapad av %s activity.closed_issue_label=Stängd activity.new_issues_count_1=Nytt ärende +activity.new_issues_count_n=Nya ärenden +activity.new_issue_label=Öppnad +activity.unresolved_conv_label=Öppna +activity.title.releases_1=%d release +activity.title.releases_n=%d releaser +activity.title.releases_published_by=%s publicerad av %s +activity.published_release_label=Publicerad +search=Sök +search.search_repo=Sök utvecklingskatalog +search.results=Sökresultat för ”%s” i %s settings=Inställningar +settings.desc=Inställningarna är där du kan hantera inställningar för utvecklingskatalogen settings.collaboration.write=Skriva settings.collaboration.read=Läsa settings.collaboration.undefined=Odefinierad @@ -541,10 +577,18 @@ settings.deploy_keys=Driftsättningsnycklar settings.add_deploy_key=Lägg till driftsättningsnyckel settings.title=Titel settings.deploy_key_content=Innehåll +settings.branches=Brancher +settings.protected_branch=Branchskydd +settings.protected_branch_can_push=Tillåt push? +settings.protected_branch_can_push_yes=Du kan pusha +settings.protected_branch_can_push_no=Du kan inte pusha +settings.add_protected_branch=Aktivera skydd +settings.delete_protected_branch=Inaktivera skydd diff.browse_source=Bläddra i källkod diff.parent=förälder diff.commit=incheckning +diff.data_not_available=Diff Content ej tillgänglig diff.show_diff_stats=Visa Diff Statistik diff.show_split_view=Delad Vy diff.show_unified_view=Unifierad Vy @@ -571,8 +615,16 @@ release.preview=Förhandsgranska release.cancel=Avbryt release.publish=Publicera Släpp release.save_draft=Spara Utkast +release.deletion_success=Releasen har blivit raderad. release.downloads=Nedladdningar +branch.search=Sök brancher +branch.delete_head=Radera +branch.delete_html=Radera branch +branch.create_branch=Skapa branchen %s +branch.create_from=från '%s' +branch.branch_already_exists=Branch '%s' existerar redan i denna utvecklingskatalog. +branch.deleted_by=Raderad av %s [org] @@ -598,6 +650,7 @@ settings.update_setting_success=Organisationsinställningarna har uppdaterats. settings.delete=Tag bort organisation settings.delete_account=Tag bort denna organisation settings.confirm_delete_account=Bekräfta borttagning +settings.hooks_desc=Lägg till webbhook som triggas för alla utvecklingskataloger under denna organisationen. members.membership_visibility=Synlighet för medlemskap: members.member_role=Medlemsroll: @@ -617,6 +670,7 @@ teams.settings=Inställningar teams.members=Teammedlemmar teams.update_settings=Uppdatera inställningar teams.add_team_member=Lägg till teammedlem +teams.delete_team_success=Teamet har blivit borttaget. teams.repositories=Teamförråd teams.add_team_repository=Lägg till teamförråd teams.remove_repo=Ta bort @@ -636,7 +690,13 @@ total=Totalt: %d dashboard.operation_name=Operationsnamn dashboard.operation_switch=Byt till dashboard.operation_run=Kör +dashboard.clean_unbind_oauth=Rena obundna OAuth anslutningar +dashboard.clean_unbind_oauth_success=Alla obundna OAuth anslutningar har raderats. dashboard.delete_inactivate_accounts=Ta bort alla inaktiva konton +dashboard.delete_inactivate_accounts_success=Alla inaktiva konton har tagits bort. +dashboard.reinit_missing_repos=Återinitialisera alla saknade utvecklingskataloger som vi känner till +dashboard.reinit_missing_repos_success=Alla utvecklingskataloger som det saknades filer från har blivit återinitaliserade. +dashboard.sync_external_users=Synkronisera extern användardata dashboard.server_uptime=Serverns upptid dashboard.current_goroutine=Aktuella Goroutiner dashboard.current_memory_usage=Nuvarande Minnesanvändning @@ -655,6 +715,7 @@ dashboard.mspan_structures_usage=MSpan strukturanvändning dashboard.mspan_structures_obtained=MSpan strukturer som erhållits dashboard.mcache_structures_usage=MCache strukturanvändning dashboard.mcache_structures_obtained=MCache-strukturer som erhållits +dashboard.profiling_bucket_hash_table_obtained=Profilering av Bucket Hash Table erhållen dashboard.gc_metadata_obtained=Metainformation om Skräpsamlaren Ihopsamlad dashboard.other_system_allocation_obtained=Övriga Systemallokeringar dashboard.next_gc_recycle=Nästa Skräpsamlarrunda @@ -677,6 +738,7 @@ orgs.name=Namn orgs.teams=Team orgs.members=Medlemmar +repos.repo_manage_panel=Utvecklingskatalogshantering repos.owner=Ägare repos.name=Namn repos.private=Privat @@ -694,11 +756,14 @@ auths.auth_name=Autentiseringsnamn auths.security_protocol=Säkerhetsprotokoll auths.domain=Domän auths.host=Värd +auths.port=Port +auths.bind_dn=Bind DN auths.bind_password=Bind Lösenord auths.user_base=Användarsökbas auths.user_dn=Användarnas DN auths.filter=Användarfilter auths.admin_filter=Administratörsfilter +auths.ms_ad_sa=MS AD sökattribut auths.smtp_auth=SMTP Autentiseringstyp auths.smtphost=SMTP-server auths.smtpport=SMTP-port @@ -706,26 +771,41 @@ auths.allowed_domains=Tillåtna Domäner auths.enable_tls=Aktivera TLS-kryptering auths.skip_tls_verify=Skippa verifikation av TLS auths.pam_service_name=PAM Tjänstnamn +auths.oauth2_provider=OAuth2 leverantör +auths.oauth2_clientID=Klient ID (Nyckel) +auths.oauth2_clientSecret=Klienthemlighet +auths.openIdConnectAutoDiscoveryURL=OpenID Connect Auto Discovery länk +auths.oauth2_tokenURL=Tokenlänk +auths.oauth2_authURL=Auktoriseringslänk auths.oauth2_profileURL=Profil-URL auths.oauth2_emailURL=E-post URL auths.enable_auto_register=Aktivera Automatisk Registrering +auths.tips=Tips +auths.tips.oauth2.general=OAuth2 Autensiering +auths.tips.oauth2.general.tip=När man registrerar en ny OAuth2-autentisering, så skall callback/redirect-länken vara: /user/oauth2//callback +auths.tip.oauth2_provider=OAuth2 leverantör auths.tip.dropbox=Skapa en ny applikation på https://www.dropbox.com/developers/apps auths.tip.facebook=Registrera en ny appliaktion på https://developers.facebook.com/apps och lägg till produkten ”Facebook-inloggning” auths.tip.github=Registrera en ny OAuth applikation på https://github.com/settings/applications/new auths.tip.gitlab=Registrera en ny applikation på https://gitlab.com/profile/applications +auths.tip.openid_connect=Använd OpenID Connect Discovery länken (/.well-known/openid-configuration) för att ange slutpunkterna auths.new_success=Autentisering '%s' har lagts till. +auths.delete_auth_title=Tag bort denna autentisering config.server_config=Server-konfiguration config.custom_conf=Konfigurationsfil config.disable_router_log=Avaktivera Router Loggning config.run_mode=Exekveringsläge +config.git_version=Git version config.repo_root_path=Rotsökväg för utvecklingskatalog config.lfs_root_path=LFS Rotsökväg config.static_file_root_path=Rotsökväg för Statiska Filer config.script_type=Script-typ +config.reverse_auth_user=Motsatt autentiserings användare config.ssh_config=SSH-konfiguration config.ssh_enabled=Aktiverad +config.ssh_port=Port config.ssh_listen_port=Lyssningsport config.ssh_root_path=Rotsökväg config.ssh_key_test_path=Testsökväg för nyckel @@ -743,16 +823,20 @@ config.service_config=Tjänstkonfiguration config.show_registration_button=Visa registreringsknapp config.disable_key_size_check=Avaktivera kontroll av minsta tillåtna nyckelstorlek config.active_code_lives=Aktivera livstid för koder +config.reset_password_code_lives=Återställ giltighetstid för passerkod config.webhook_config=Webbkrokskonfiguration config.queue_length=Kölängd config.deliver_timeout=Tidsfrist för leverans +config.skip_tls_verify=Skippa TLS verifiering config.mailer_enabled=Aktiverad config.mailer_disable_helo=Avaktivera HELO config.mailer_name=Namn config.mailer_host=Server config.mailer_user=Användare +config.mailer_use_sendmail=Använd Sendmail +config.mailer_sendmail_path=Sendmail sökväg config.oauth_config=OAuth-konfiguration config.oauth_enabled=Aktiverad @@ -777,6 +861,7 @@ config.disable_gravatar=Inaktivera Gravatar config.enable_federated_avatar=Aktivera Förenad Uppslaging av Profilbilder config.git_config=Git-konfiguration +config.git_disable_diff_highlight=Inaktivera Diff Syntax Highlight config.git_max_diff_lines=Max Diff-rader (per fil) config.git_max_diff_line_characters=Max Diff-tecken (per rad) config.git_max_diff_files=Max Diff-filer (att visa) @@ -811,6 +896,8 @@ notices.delete_all=Ta Bort Alla Notiser notices.type=Typ notices.type_1=Utvecklingskatalog notices.desc=Beskrivning +notices.op=Op. +notices.delete_success=Systemnotifikationer har blivit raderade. [action] create_repo=skapade utvecklingskatalog %s @@ -826,11 +913,15 @@ comment_issue=`kommenterade på ärende %s#%[2]s` merge_pull_request=`sammanslog pull-request %s#%[2]s` transfer_repo=överförde utvecklingskalatogen %s till %s push_tag=laddade upp taggen %[2]s till %[3]s +delete_tag=tog bort taggen %[2]s från %[3]s +delete_branch=tog bort branchen %[2]s from %[3]s +compare_commits=Jämför %d commits [tool] ago=%s sedan from_now=%s från och med nu now=nu +future=framtiden 1s=1 sekund 1m=1 minut 1h=1 timme @@ -849,17 +940,23 @@ raw_seconds=sekunder raw_minutes=minuter [dropzone] +file_too_big=Filstorleken ({{filesize}} MB) överskrider maxstorleken ({{maxFilesize}} MB). remove_file=Ta bort fil [notification] notifications=Notiser unread=Olästa read=Lästa +pin=Pinna notifiering mark_as_read=Markera som läst mark_as_unread=Markera som oläst +mark_all_as_read=Markera alla som lästa [gpg] error.extract_sign=Det gick inte att extrahera signatur +error.generate_hash=Misslyckades att generera hashsumma av commiten +error.no_gpg_keys_found=Ingen känd nyckel hittad för denna signaturen i databasen +error.not_signed_commit=Inte en signerad commit [units] From fd47649c177f7f7e0dd22d08273847c37ed8bf22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20=22BKC=22=20Carlb=C3=A4cker?= Date: Tue, 3 Jul 2018 05:56:32 +0200 Subject: [PATCH 056/447] Limit uploaded avatar image-size to 4096x3072 by default (#4353) --- custom/conf/app.ini.sample | 4 ++++ models/user.go | 11 +++++++++++ modules/setting/setting.go | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index f823f68e4f26..774a1df59887 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -402,6 +402,10 @@ SESSION_LIFE_TIME = 86400 [picture] AVATAR_UPLOAD_PATH = data/avatars +; Max Width and Height of uploaded avatars. This is to limit the amount of RAM +; used when resizing the image. +AVATAR_MAX_WIDTH = 4096 +AVATAR_MAX_HEIGHT = 3072 ; Chinese users can choose "duoshuo" ; or a custom avatar source, like: http://cn.gravatar.com/avatar/ GRAVATAR_SOURCE = gravatar diff --git a/models/user.go b/models/user.go index 653e99426322..5ac86587966a 100644 --- a/models/user.go +++ b/models/user.go @@ -433,6 +433,17 @@ func (u *User) IsPasswordSet() bool { // UploadAvatar saves custom avatar for user. // FIXME: split uploads to different subdirs in case we have massive users. func (u *User) UploadAvatar(data []byte) error { + imgCfg, _, err := image.DecodeConfig(bytes.NewReader(data)) + if err != nil { + return fmt.Errorf("DecodeConfig: %v", err) + } + if imgCfg.Width > setting.AvatarMaxWidth { + return fmt.Errorf("Image width is to large: %d > %d", imgCfg.Width, setting.AvatarMaxWidth) + } + if imgCfg.Height > setting.AvatarMaxHeight { + return fmt.Errorf("Image height is to large: %d > %d", imgCfg.Height, setting.AvatarMaxHeight) + } + img, _, err := image.Decode(bytes.NewReader(data)) if err != nil { return fmt.Errorf("Decode: %v", err) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index cf9f59853bb6..a5f4457f3337 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -341,6 +341,8 @@ var ( // Picture settings AvatarUploadPath string + AvatarMaxWidth int + AvatarMaxHeight int GravatarSource string GravatarSourceURL *url.URL DisableGravatar bool @@ -1024,6 +1026,8 @@ func NewContext() { if !filepath.IsAbs(AvatarUploadPath) { AvatarUploadPath = path.Join(AppWorkPath, AvatarUploadPath) } + AvatarMaxWidth = sec.Key("AVATAR_MAX_WIDTH").MustInt(4096) + AvatarMaxHeight = sec.Key("AVATAR_MAX_HEIGHT").MustInt(3072) switch source := sec.Key("GRAVATAR_SOURCE").MustString("gravatar"); source { case "duoshuo": GravatarSource = "http://gravatar.duoshuo.com/avatar/" From 376f422f18f7ac9e8cf9879212f73b85eba929ab Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 03:57:42 +0000 Subject: [PATCH 057/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index dae81d2ccfd5..7db2d24818cf 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -524,7 +524,7 @@ reactions_more=додати %d більше form.reach_limit_of_creation=Ви досягли максимальної кількості %d створених репозиторіїв. form.name_reserved=Назву репозиторію '%s' зарезервовано. -form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві сховища. +form.name_pattern_not_allowed=Шаблон '%s' не дозволено в назві репозиторія. need_auth=Клонувати з авторизацією migrate_type=Тип міграції @@ -812,7 +812,7 @@ pulls.merge_pull_request=Об'єднати запит на злиття pulls.rebase_merge_pull_request=Зробити Rebase і злити pulls.squash_merge_pull_request=Об'єднати (Squash) і злити pulls.invalid_merge_option=Цей параметр злиття не можна використовувати для цього Pull Request'а. -pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж сховища з тією ж інформацією про злиття і в очікуванні.` +pulls.open_unmerged_pull_exists=`Ви не можете знову відкрити, оскільки вже існує запит на злиття (%d) з того ж репозиторія з тією ж інформацією про злиття і в очікуванні.` milestones.new=Новий етап milestones.open_tab=%d відкрито @@ -914,7 +914,7 @@ search.search_repo=Пошук репозиторію search.results=Результати пошуку для "%s" в %s settings=Налаштування -settings.desc=У налаштуваннях ви можете змінювати різні параметри цього сховища +settings.desc=У налаштуваннях ви можете змінювати різні параметри цього репозиторія settings.options=Репозиторій settings.collaboration=Співавтори settings.collaboration.admin=Адміністратор @@ -965,7 +965,7 @@ settings.convert_confirm=Перетворити репозиторій settings.convert_succeed=Репозиторій успішно перетворений в звичайний. settings.transfer=Передати новому власнику settings.transfer_desc=Передати репозиторій користувачеві або організації, де ви маєте права адміністратора. -settings.transfer_notices_1=- Ви втратите доступ до сховища, якщо ви переведете його окремому користувачеві. +settings.transfer_notices_1=- Ви втратите доступ до репозиторія, якщо ви переведете його окремому користувачеві. settings.transfer_notices_2=- Ви збережете доступ, якщо новим власником стане організація, власником якої ви є. settings.transfer_form_title=Введіть ім'я репозиторія як підтвердження: settings.wiki_delete=Видалити вікі-дані @@ -992,7 +992,7 @@ settings.collaborator_deletion_desc=Цей користувач більше н settings.remove_collaborator_success=Співавтор видалений. settings.search_user_placeholder=Пошук користувача… settings.org_not_allowed_to_be_collaborator=Організації не можуть бути додані як співавтори. -settings.user_is_org_member=Користувач є членом організації, члени якої не можуть бути додані в якості співавтора. +settings.user_is_org_member=Користувач є учасником організації, учасники якої не можуть бути додані в якості співавтора. settings.add_webhook=Додати веб-хук settings.hooks_desc=Webhooks автоматично робить HTTP POST-запити на сервер, коли відбуваються певні події Gitea. Дізнайтеся більше в керівництві веб-вузла . settings.webhook_deletion=Видалити веб-хук @@ -1035,7 +1035,7 @@ settings.event_issues_desc=Проблему відкрито, закрито, п settings.event_issue_comment=Коментар проблеми settings.event_issue_comment_desc=Коментар проблеми створено, видалено чи відредаговано. settings.event_release=Реліз -settings.event_release_desc=Випуск опубліковано, оновлено чи видалено в сховища. +settings.event_release_desc=Реліз опублікований, оновлений або видалений з репозиторія. settings.event_pull_request=Запити до злиття settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито, змінено, призначено, знято, мітку оновлено, мітку прибрано або синхронізовано. settings.event_push=Push @@ -1068,7 +1068,7 @@ settings.key_been_used=Вміст ключа розгортання вже ви settings.key_name_used=Ключ розгортання з таким заголовком вже існує. settings.add_key_success=Новий ключ розгортання '%s' успішно доданий. settings.deploy_key_deletion=Видалити ключ для розгортування -settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до сховища з його допомогою. Ви впевнені? +settings.deploy_key_deletion_desc=Видалення ключа розгортки унеможливить доступ до репозиторія з його допомогою. Ви впевнені? settings.deploy_key_deletion_success=Ключі розгортання було видалено. settings.branches=Гілки settings.protected_branch=Захист гілки @@ -1082,19 +1082,19 @@ settings.protect_whitelist_committers=Білий список тих, хто м settings.protect_whitelist_committers_desc=Додати користувачів або команди в білий список гілки. На них не будуть поширюватися звичайні обмеження на push. settings.protect_whitelist_users=Користувачі, які можуть робити push в цю гілку: settings.protect_whitelist_search_users=Пошук користувачів… -settings.protect_whitelist_teams=Команди, члени яких можуть робити push в цю гілку: +settings.protect_whitelist_teams=Команди, учасники яких можуть робити push в цю гілку: settings.protect_whitelist_search_teams=Пошук команд… settings.protect_merge_whitelist_committers=Обмежити право на прийняття Pull Request'ів в цю гілку списком -settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати Pull Request'и. В іншому випадку будь-хто з правами запису до головного сховища буде володіти такою можливістю. +settings.protect_merge_whitelist_committers_desc=Ви можете додавати користувачів або цілі команди в 'білий' список цієї гілки. Тільки присутні в списку зможуть приймати запити на злиття. В іншому випадку будь-хто з правами запису до головного репозиторію буде володіти такою можливістю. settings.protect_merge_whitelist_users=Користувачі з правом на прийняття Pull Request'ів в цю гілку: -settings.protect_merge_whitelist_teams=Команди, члени яких мають право на прийняття Pull Request'ів в цю гілку: +settings.protect_merge_whitelist_teams=Команди, яким дозволено злиття: settings.add_protected_branch=Увімкнути захист settings.delete_protected_branch=Вимкнути захист settings.update_protect_branch_success=Налаштування захисту гілки '%s' були успішно змінені. settings.remove_protected_branch_success=Захист гілки '%s' був успішно відключений. settings.protected_branch_deletion=Відключити захист гілки settings.protected_branch_deletion_desc=Будь-який користувач з дозволами на запис зможе виконувати push в цю гілку. Ви впевнені? -settings.default_branch_desc=Головна гілка є 'базовою' для вашого сховища, на яку за замовчуванням спрямовані всі Pull Request'и і яка є обличчям вашого сховища. Перше, що побачить відвідувач - це вміст головною гілки. Виберіть її з уже існуючих: +settings.default_branch_desc=Головна гілка є 'базовою' для вашого репозиторія, на яку за замовчуванням спрямовані всі запити на злиття і яка є обличчям вашого репозиторія. Перше, що побачить відвідувач - це зміст головної гілки. Виберіть її з уже існуючих: settings.choose_branch=Оберіть гілку… settings.no_protected_branch=Немає захищених гілок. @@ -1138,7 +1138,7 @@ release.save_draft=Зберегти чернетку release.edit_release=Оновити реліз release.delete_release=Видалити реліз release.deletion=Видалити реліз -release.deletion_desc=Видалення релізу видаляє Git-тег зі сховищ. Вміст сховища і історія залишаться незмінними. Продовжити? +release.deletion_desc=Видалення релізу видаляє Git-тег з репозиторіїв. Зміст репозиторія і історія залишаться незмінними. Продовжити? release.deletion_success=Реліз, було видалено. release.tag_name_already_exist=Реліз з цим ім'ям мітки вже існує. release.tag_name_invalid=Неприпустиме ім'я тега. @@ -1240,7 +1240,7 @@ teams.update_settings=Оновити налаштування teams.delete_team=Видалити команду teams.add_team_member=Додати учасника команди teams.delete_team_title=Видалити команду -teams.delete_team_desc=Видалення команди скасовує доступ до сховища для її членів. Продовжити? +teams.delete_team_desc=Видалення команди скасовує доступ до репозиторія для її учасників. Продовжити? teams.delete_team_success=Команду було видалено. teams.read_permission_desc=Ця команда має доступ для читання: учасники можуть переглядати та клонувати репозиторії. teams.write_permission_desc=Ця команда надає доступ на запис: учасники можуть отримувати й виконувати push команди до репозитрію. @@ -1350,7 +1350,7 @@ users.allow_create_organization=Може створювати організац users.update_profile=Оновити обліковий запис users.delete_account=Видалити цей обліковий запис users.still_own_repo=Ваш обліковий запис все ще володіє одним або кількома репозиторіями, спочатку вам потрібно видалити або передати їх. -users.still_has_org=Цей обліковий запис все ще є членом однієї або декількох організацій. Для продовження, покиньте або видаліть організації. +users.still_has_org=Цей обліковий запис все ще є учасником однієї або декількох організацій. Для продовження, покиньте або видаліть організації. users.deletion_success=Обліковий запис користувача було видалено. orgs.org_manage_panel=Керування організаціями From 9877bab0f318fbbe1e55f3eb47cf2981ac98e7fe Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 3 Jul 2018 15:37:07 -0400 Subject: [PATCH 058/447] Add changelog for 1.5.0-RC1 (#4324) --- CHANGELOG.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b31730a09910..e6bd82dbb1ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,54 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-06-27 +* SECURITY + * Limit uploaded avatar image-size to 4096x3072 by default (#4353) + * Do not allow to reuse TOTP passcode (#3878) +* FEATURE + * Add cli commands to regen hooks & keys (#3979) + * Add support for FIDO U2F (#3971) + * Added user language setting (#3875) + * LDAP Public SSH Keys synchronization (#1844) + * Add topic support (#3711) + * Multiple assignees (#3705) + * Add protected branch whitelists for merging (#3689) + * Global code search support (#3664) + * Add label descriptions (#3662) + * Add issue search via API (#3612) + * Add repository setting to enable/disable health checks (#3607) + * Emoji Autocomplete (#3433) + * Implements generator cli for secrets (#3531) +* ENHANCEMENT + * Add more webhooks support and refactor webhook templates directory (#3929) + * Add new option to allow only OAuth2/OpenID user registration (#3910) + * Add option to use paged LDAP search when synchronizing users (#3895) + * Symlink icons (#1416) + * Improve release page UI (#3693) + * Add admin dashboard option to run health checks (#3606) + * Add branch link in branch list (#3576) + * Reduce sql query times in retrieveFeeds (#3547) + * Option to enable or disable swagger endpoints (#3502) + * Add missing licenses (#3497) + * Reduce repo indexer disk usage (#3452) + * Enable caching on assets and avatars (#3376) + * Add repository search ordered by stars/forks. Forks column in admin repo list (#3969) + * Add Environment Variables to Docker template (#4012) + * LFS: make HTTP auth period configurable (#4035) + * Add config path as an optionial flag when changing pass via CLI (#4184) + * Refactor User Settings sections (#3900) + * Allow square brackets in external issue patterns (#3408) + * Add Attachment API (#3478) + * Add EnableTimetracking option to app settings (#3719) + * Add config option to enable or disable log executed SQL (#3726) + * Shows total tracked time in issue and milestone list (#3341) +* TRANSLATION + * Improve English grammar and consistency (#3614) +* DEPLOYMENT + * Allow Gitea to run as different USER in Docker (#3961) + * Provide compressed release binaries (#3991) + * Sign release binaries (#4188) + ## [1.4.3](https://github.com/go-gitea/gitea/releases/tag/v1.4.3) - 2018-06-26 * SECURITY * HTML-escape plain-text READMEs (#4192) (#4214) From 1b65aabcb4c6bb856ef21f9a152d2483049fc456 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 19:38:06 +0000 Subject: [PATCH 059/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 68 ++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index 43532164894f..de7f3c835ac1 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -1,11 +1,15 @@ +app_desc=En smidig, självhostad Git-tjänst home=Startsida dashboard=Instrumentpanel explore=Utforska help=Hjälp sign_in=Logga in +sign_in_with=Logga in med sign_out=Logga ut +sign_up=Registrera link_account=Länka konto +link_account_signin_or_signup=Logga in med befintliga inloggningsuppgifter för att länka samman det kontot till detta kontot. Eller registrera ett nytt. register=Registrera dig website=Webbplats version=Version @@ -13,12 +17,32 @@ page=Sida template=Mall language=Språk notifications=Notiser +create_new=Skapa… +user_profile_and_more=Profil och Inställningar… signed_in_as=Inloggad som +enable_javascript=Denna sida fungerar bättre med Javascript igång. username=Användarnamn +email=E-postadress password=Lösenord +re_type=Upprepa lösenordet +captcha=CAPTCHA +twofa=Tvåfaktorsautentisering +twofa_scratch=Tvåfaktorsskrapkod passcode=Kod +u2f_insert_key=Sätt i din säkerhetsnyckel +u2f_sign_in=Tryck på knappen på din säkerhetsnyckel. Om du inte kan hitta en knapp, dra ur och sätt i nyckeln igen. +u2f_press_button=Vänligen tryck på knappen på din säkerhetsnyckel… +u2f_use_twofa=Använd en tvåfaktorskod från din telefon +u2f_error=Vi kan inte läsa din säkerhetsnyckel! +u2f_unsupported_browser=Din webbläsare stödjer inte U2F-nycklar. Vänligen prova en annan webbläsare. +u2f_error_1=Ett okänt fel uppstod. Vänligen försök igen. +u2f_error_2=Kontrollera att du använder en krypterad anslutning (https://) och besöker korrekt länk. +u2f_error_3=Servern kunde inte hantera din förfrågan. +u2f_error_4=Den givna nyckeln är inte behörig för denna förfrågan. Om du försöker registrera den, se till att den inte redan är registrerad. +u2f_error_5=Timeout uppnådd innan nyckeln kunde bli läst. Vänligen ladda om sidan och för att försök igen. +u2f_reload=Ladda om repository=Utvecklingskatalog organization=Organisation @@ -29,8 +53,12 @@ new_mirror=Ny Spegling new_fork=Ny förgrening av utvecklingskatalog new_org=Ny organisation manage_org=Hantera organisationer +admin_panel=Sidadministration account_settings=Kontoinställningar settings=inställningar +your_profile=Profil +your_starred=Stjärnmärkt +your_settings=Inställningar all=Alla sources=Källor @@ -46,14 +74,37 @@ cancel=Avbryt [install] install=Installation +title=Ursprunglig konfiguration +docker_helper=Om du kör Gitea inuti Docker, vänligen läs dokumentationen noggrant innan du ändrar några inställningar. +requite_db_desc=Gitea behöver MySQL, PostgreSQL, MSSQL, SQLite3 eller TiDB. db_title=Databasinställningar db_type=Databastyp host=Server +user=Användarnamn password=Lösenord db_name=Databasens namn +db_helper=Notis för MySQL-användare: Använd InnoDB-lagringsmotorn och teckenuppsättning 'utf8_general_ci'. +ssl_mode=SSL path=Filväg - +sqlite_helper=Sökväg för SQLite3 eller TiDB databasen.
Ange en absolut sökväg om du kör Gitea som en systemtjänst. +err_empty_db_path=Sökvägen till SQLite3- eller TiDB-databasen kan inte vara tom. +err_invalid_tidb_name=TiDB-databases namn får inte innehålla '.'- eller '-'-tecken. +no_admin_and_disable_registration=Du kan inte inaktivera självregistrering utan att skapa ett administratörskonto. +err_empty_admin_password=Administratörslösenordet kan inte vara tomt. + +general_title=Allmänna inställningar +app_name=Sajtens namn +app_name_helper=Du kan ange ditt företagsnamn här. repo_path=Rotsökväg för utvecklingskatalog +repo_path_helper=Fjärrutvecklingskataloger kommer att sparas i denna katalog. +lfs_path=LFS Rotsökväg +lfs_path_helper=Filer hanterade av Git LFS kommer att sparas i denna mapp. Lämna tom för att avaktivera. +run_user=Kör som användarnamn +run_user_helper=Ange operativsystemets användarnamn som Gitea ska köras under. Denna användare måste ha tillgång till utvecklingskatalogens rotsökväg. +domain=SSH-Serverdomän +domain_helper=Domän- eller hostadress för SSH-kloningslänkar. +ssh_port=SSH-serverport +ssh_port_helper=Portnumret som din SSH-server lyssnar på. Lämna tom för att inaktivera. log_root_path=Loggsökväg optional_title=Övriga inställningar @@ -65,7 +116,14 @@ admin_password=Lösenord confirm_password=Bekräfta lösenord install_btn_confirm=Installera Gitea test_git_failed=Misslyckades att testa 'git' kommando: %v +invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v save_config_failed=Misslyckades att spara konfigurationen: %v +install_success=Välkommen! Tack för att du valt Gitea. Ha det så roligt, väl mött! +invalid_log_root_path=Sökvägen för loggar är ogiltig: %v +default_allow_create_organization=Tillåt skapandet utav organisationer som standard +default_allow_create_organization_popup=Tillåt nya användarkonton att skapa organisationer som standard. +default_enable_timetracking=Aktivera tidredovisning som Standard +default_enable_timetracking_popup=Aktivera tidsredovisning för nya utvecklingskataloger som standard. [home] password_holder=Lösenord @@ -154,26 +212,34 @@ auth_failed=Autentisering misslyckades: %v target_branch_not_exist=Målgrenen finns inte. [user] +change_avatar=Byt din avatar… join_on=Gick med repositories=Utvecklingskataloger activity=Offentlig Aktivitet followers=Följare +starred=Stjärnmärkta Utvecklingskataloger following=Följer follow=Följ unfollow=Sluta följa form.name_reserved=Användarnamnet '%s' är reserverat. +form.name_pattern_not_allowed=Mönstret '%s' är otillåtet i ett användarnamn. [settings] profile=Profil +account=Konto password=Lösenord security=Säkerhet avatar=Visningsbild ssh_gpg_keys=SSH / GPG-nycklar social=Sociala konton +applications=Applikationer +orgs=Hantera Organisationer repos=Utvecklingskataloger delete=Radera konto twofa=Tvåfaktorsautentisering +account_link=Länkade Konton +organization=Organisationer uid=AnvändarID public_profile=Offentlig profil From a6066d035fcd0133f29dc70fd8e0a97eb57a1107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 22:57:59 +0300 Subject: [PATCH 060/447] Change 1.5.0 RC1 release date in changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bd82dbb1ea..a015fbd63a70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). -## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-06-27 +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-03 * SECURITY * Limit uploaded avatar image-size to 4096x3072 by default (#4353) * Do not allow to reuse TOTP passcode (#3878) From c413f891069faeec23e87f3d2778c109e800b0aa Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 19:58:30 +0000 Subject: [PATCH 061/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index de7f3c835ac1..f0ce1addbeac 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -117,21 +117,31 @@ confirm_password=Bekräfta lösenord install_btn_confirm=Installera Gitea test_git_failed=Misslyckades att testa 'git' kommando: %v invalid_repo_path=Utvecklingskatalogens rotsökväg är ogiltig: %v +run_user_not_match=Systemtjänstanvändaren är inte den nuvarande användaren: %s -> %s save_config_failed=Misslyckades att spara konfigurationen: %v +invalid_admin_setting=Inställning för administartörskontot är ogiltig: %v install_success=Välkommen! Tack för att du valt Gitea. Ha det så roligt, väl mött! invalid_log_root_path=Sökvägen för loggar är ogiltig: %v +default_keep_email_private=Dölj mailadresser som standard +default_keep_email_private_popup=Dölj mailadresser för nya användarkonton som standard. default_allow_create_organization=Tillåt skapandet utav organisationer som standard default_allow_create_organization_popup=Tillåt nya användarkonton att skapa organisationer som standard. default_enable_timetracking=Aktivera tidredovisning som Standard default_enable_timetracking_popup=Aktivera tidsredovisning för nya utvecklingskataloger som standard. +no_reply_address=Dold mejldomän +no_reply_address_helper=Domännamn för användare med en dold mailadress. Exempelvis kommer användarnamnet 'joe' att loggas i Git som 'joe@noreply.example.org' om dold maildomän är satt till 'noreply.example.org'. [home] +uname_holder=Användarnamn eller Mejladress password_holder=Lösenord switch_dashboard_context=Växla Visad Instrumentpanel +my_repos=Utvecklingskataloger +show_more_repos=Visa flera utvecklingskataloger… collaborative_repos=Kollaborativa Utvecklingskataloger my_orgs=Mina organisationer my_mirrors=Mina speglar view_home=Visa %s +search_repos=Hitta en utvecklingskatalog… issues.in_your_repos=I dina utvecklingskataloger @@ -140,9 +150,18 @@ repos=Utvecklingskataloger users=Användare organizations=Organisationer search=Sök +code=Kod +repo_no_results=Inga matchande utvecklingskataloger hittades. +user_no_results=Inga matchande användare hittades. +org_no_results=Inga matchande organisationer hittades. +code_no_results=Ingen källkod hittades som matchar din sökterm. +code_search_results=Söktresultat för '%s' [auth] +create_new_account=Registrera Konto register_helper_msg=Har du redan ett konto? Logga in nu! +social_register_helper_msg=Har du redan ett konto? Länka det nu! +disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. remember_me=Kom ihåg mig forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? @@ -160,6 +179,7 @@ scratch_code=Skrapkod use_scratch_code=Använd en skrapkod twofa_scratch_used=Du har använt din skrapkod. Du har blivit omdirigerad till tvåfaktorsinställningarna så att du kan ta bort din aktiverade enhet eller generera en ny skrapkod. twofa_scratch_token_incorrect=Din skrapkod är ogiltlig. +login_userpass=Logga in login_openid=OpenID openid_connect_submit=Anslut openid_connect_title=Anslut ett existerande konto @@ -204,6 +224,7 @@ url_error=Den givna URL-adressen är inte valid include_error=` måste innehålla texten '%s'.` unknown_error=Okänt fel: +repo_name_been_taken=Namnet för utvecklingskatalogen är upptaget. user_not_exist=Användaren finns inte. auth_failed=Autentisering misslyckades: %v @@ -406,6 +427,7 @@ issues.new.no_milestone=Ingen Milsten issues.new.clear_milestone=Rensa milstenar issues.new.open_milestone=Öppna Milstenar issues.new.closed_milestone=Stängda Milstenar +issues.new.no_assignees=Ingen tilldelad issues.no_ref=Ingen branch/Tag specificerad issues.create=Skapa Ärende issues.new_label=Ny etikett From cde1906aa26ce5d5c8621fa32533b58876df9ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 23:21:44 +0300 Subject: [PATCH 062/447] Change 1.5.0 RC1 release date in changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a015fbd63a70..add1d4e26e41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). -## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-03 +## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-04 * SECURITY * Limit uploaded avatar image-size to 4096x3072 by default (#4353) * Do not allow to reuse TOTP passcode (#3878) From a94f631aeca85c2018646e028477e28d972daaaa Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 3 Jul 2018 20:23:00 +0000 Subject: [PATCH 063/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index f0ce1addbeac..89103ea4887e 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -162,6 +162,7 @@ create_new_account=Registrera Konto register_helper_msg=Har du redan ett konto? Logga in nu! social_register_helper_msg=Har du redan ett konto? Länka det nu! disable_register_prompt=Registrering inaktiverad. Vänligen kontakta din sidadministratör. +disable_register_mail=Bekräftelsemejl vid registrering är inaktiverad. remember_me=Kom ihåg mig forgot_password_title=Glömt lösenord forgot_password=Glömt lösenord? @@ -431,6 +432,8 @@ issues.new.no_assignees=Ingen tilldelad issues.no_ref=Ingen branch/Tag specificerad issues.create=Skapa Ärende issues.new_label=Ny etikett +issues.new_label_placeholder=Etikettsnamn +issues.new_label_desc_placeholder=Beskrivning issues.create_label=Skapa Etikett issues.label_templates.title=Ladda en fördefinierad uppsättning etiketter issues.label_templates.helper=Markera en uppsättning etiketter @@ -463,6 +466,10 @@ issues.filter_sort.recentupdate=Nyligen uppdaterade issues.filter_sort.leastupdate=Äldst uppdaterad issues.filter_sort.mostcomment=Mest kommenterade issues.filter_sort.leastcomment=Minst kommenterade +issues.filter_sort.moststars=Flest stjärnor +issues.filter_sort.feweststars=Minst stjärnor +issues.filter_sort.mostforks=Flest forks +issues.filter_sort.fewestforks=Minst forks issues.action_open=Öppna issues.action_close=Stäng issues.action_label=Etikett @@ -481,7 +488,9 @@ issues.commented_at=`kommenterad %s` issues.delete_comment_confirm=Är du säker på att du vill ta bort den här kommentaren? issues.no_content=Det finns inget innehåll än. issues.close_issue=Stäng +issues.close_comment_issue=Kommentera och stäng issues.reopen_issue=Återöppna +issues.reopen_comment_issue=Kommentera och återöppna issues.create_comment=Kommentera issues.closed_at=`stängde %[2]s` issues.reopened_at=`återöppnade %[2]s` @@ -494,11 +503,16 @@ issues.edit=Redigera issues.cancel=Avbryt issues.save=Spara issues.label_title=Etikettsnamn +issues.label_description=Etikettbeskrivning issues.label_color=Etikettsfärg issues.label_count=%d etiketter issues.label_open_issues=%d öppna ärenden issues.label_edit=Redigera issues.label_delete=Radera +issues.label_modify=Redigera etikett +issues.label_deletion=Ta bort etikett +issues.label_deletion_desc=Bottagning av en etikett tar bort den från alla ärenden. Fortsätta? +issues.label_deletion_success=Etiketten har tagits bort. issues.label.filter_sort.alphabetically=Alfabetiskt A-Ö issues.label.filter_sort.reverse_alphabetically=Alfabetiskt Ö-A issues.label.filter_sort.by_size=Storlek @@ -508,11 +522,15 @@ issues.attachment.open_tab=`Klicka för att se "%s" i en ny flik` issues.attachment.download=`Klicka för att hämta "%s"` issues.subscribe=Prenumerera issues.unsubscribe=Avsluta prenumerationen +issues.tracker=Tidsredovisning issues.start_tracking_short=Starta +issues.start_tracking=Starta tidsredovisning issues.start_tracking_history=`började arbeta %s` issues.tracking_already_started=`Du har redan påbörjat tidredovisning på detta ärende!` issues.stop_tracking=Stoppa issues.stop_tracking_history=`slutade arbeta %s` +issues.add_time=Lägg till tid manuellt +issues.add_time_short=Lägg till tid issues.add_time_cancel=Avbryt issues.add_time_history=`la till tillbringad tid %s` issues.add_time_hours=Timmar From 7380f8650ea121a58be09bb6dd7a0398c4927e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lauris=20Buk=C5=A1is-Haberkorns?= Date: Tue, 3 Jul 2018 23:24:15 +0300 Subject: [PATCH 064/447] Update changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Lauris Bukšis-Haberkorns --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index add1d4e26e41..03ea5ec2cf44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ been added to each release, please refer to the [blog](https://blog.gitea.io). ## [1.5.0-RC1](https://github.com/go-gitea/gitea/releases/tag/v1.5.0-rc1) - 2018-07-04 * SECURITY - * Limit uploaded avatar image-size to 4096x3072 by default (#4353) + * Limit uploaded avatar image-size to 4096px x 3072px by default (#4353) * Do not allow to reuse TOTP passcode (#3878) * FEATURE * Add cli commands to regen hooks & keys (#3979) From 1528f8e1f85149a378d78235db8f73f84d0db03f Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Tue, 3 Jul 2018 17:58:31 -0400 Subject: [PATCH 065/447] Dep upgrade mysql lib (#4161) * update gopkg file to add sql dep --- Gopkg.lock | 4 +- Gopkg.toml | 4 + vendor/github.com/go-sql-driver/mysql/AUTHORS | 34 ++ .../go-sql-driver/mysql/appengine.go | 2 +- vendor/github.com/go-sql-driver/mysql/auth.go | 420 +++++++++++++++++ .../github.com/go-sql-driver/mysql/buffer.go | 12 +- .../go-sql-driver/mysql/collations.go | 1 + .../go-sql-driver/mysql/connection.go | 148 ++++-- .../go-sql-driver/mysql/connection_go18.go | 208 +++++++++ .../github.com/go-sql-driver/mysql/const.go | 25 +- .../github.com/go-sql-driver/mysql/driver.go | 81 ++-- vendor/github.com/go-sql-driver/mysql/dsn.go | 159 +++++-- .../github.com/go-sql-driver/mysql/errors.go | 79 +--- .../github.com/go-sql-driver/mysql/fields.go | 194 ++++++++ .../github.com/go-sql-driver/mysql/infile.go | 6 +- .../github.com/go-sql-driver/mysql/packets.go | 429 ++++++++++-------- vendor/github.com/go-sql-driver/mysql/rows.go | 174 +++++-- .../go-sql-driver/mysql/statement.go | 125 +++-- .../go-sql-driver/mysql/transaction.go | 4 +- .../github.com/go-sql-driver/mysql/utils.go | 214 ++++----- .../go-sql-driver/mysql/utils_go17.go | 40 ++ .../go-sql-driver/mysql/utils_go18.go | 50 ++ 22 files changed, 1806 insertions(+), 607 deletions(-) create mode 100644 vendor/github.com/go-sql-driver/mysql/auth.go create mode 100644 vendor/github.com/go-sql-driver/mysql/connection_go18.go create mode 100644 vendor/github.com/go-sql-driver/mysql/fields.go create mode 100644 vendor/github.com/go-sql-driver/mysql/utils_go17.go create mode 100644 vendor/github.com/go-sql-driver/mysql/utils_go18.go diff --git a/Gopkg.lock b/Gopkg.lock index 6551354a0948..d5b2408bbaf8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -294,7 +294,7 @@ [[projects]] name = "github.com/go-sql-driver/mysql" packages = ["."] - revision = "ce924a41eea897745442daaa1739089b0f3f561d" + revision = "d523deb1b23d913de5bdada721a6071e71283618" [[projects]] name = "github.com/go-xorm/builder" @@ -873,6 +873,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "036b8c882671cf8d2c5e2fdbe53b1bdfbd39f7ebd7765bd50276c7c4ecf16687" + inputs-digest = "96c83a3502bd50c5ca8e4d9b4145172267630270e587c79b7253156725eeb9b8" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 1019888c015a..42523550fd09 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -40,6 +40,10 @@ ignored = ["google.golang.org/appengine*"] #version = "0.6.5" revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" +[[override]] + name = "github.com/go-sql-driver/mysql" + revision = "d523deb1b23d913de5bdada721a6071e71283618" + [[override]] name = "github.com/gorilla/mux" revision = "757bef944d0f21880861c2dd9c871ca543023cba" diff --git a/vendor/github.com/go-sql-driver/mysql/AUTHORS b/vendor/github.com/go-sql-driver/mysql/AUTHORS index 148ea93aa76d..73ff68fbcf22 100644 --- a/vendor/github.com/go-sql-driver/mysql/AUTHORS +++ b/vendor/github.com/go-sql-driver/mysql/AUTHORS @@ -12,34 +12,63 @@ # Individual Persons Aaron Hopkins +Achille Roussel +Alexey Palazhchenko +Andrew Reid Arne Hormann +Asta Xie +Bulat Gaifullin Carlos Nieto Chris Moos +Craig Wilson +Daniel Montoya Daniel Nichter Daniël van Eeden +Dave Protasowski DisposaBoy +Egor Smolyakov +Evan Shaw Frederick Mayle Gustavo Kristic +Hajime Nakagami Hanno Braun Henri Yandell Hirotaka Yamamoto +ICHINOSE Shogo INADA Naoki +Jacek Szwec James Harr +Jeff Hodges +Jeffrey Charles Jian Zhen Joshua Prunier Julien Lefevre Julien Schmidt +Justin Li +Justin Nuß Kamil Dziedzic Kevin Malachowski +Kieron Woodhouse Lennart Rudolph Leonardo YongUk Kim +Linh Tran Tuan +Lion Yang Luca Looz Lucas Liu Luke Scott +Maciej Zimnoch Michael Woolnough Nicola Peduzzi +Olivier Mengué +oscarzhao Paul Bonser +Peter Schultz +Rebecca Chin +Reed Allman +Richard Wilkes +Robert Russell Runrioter Wung +Shuode Li Soroush Pour Stan Putrya Stanley Gunawan @@ -51,5 +80,10 @@ Zhenye Xie # Organizations Barracuda Networks, Inc. +Counting Ltd. Google Inc. +InfoSum Ltd. +Keybase Inc. +Percona LLC +Pivotal Inc. Stripe Inc. diff --git a/vendor/github.com/go-sql-driver/mysql/appengine.go b/vendor/github.com/go-sql-driver/mysql/appengine.go index 565614eef7f3..be41f2ee6d7f 100644 --- a/vendor/github.com/go-sql-driver/mysql/appengine.go +++ b/vendor/github.com/go-sql-driver/mysql/appengine.go @@ -11,7 +11,7 @@ package mysql import ( - "appengine/cloudsql" + "google.golang.org/appengine/cloudsql" ) func init() { diff --git a/vendor/github.com/go-sql-driver/mysql/auth.go b/vendor/github.com/go-sql-driver/mysql/auth.go new file mode 100644 index 000000000000..0b59f52ee7e4 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/auth.go @@ -0,0 +1,420 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "sync" +) + +// server pub keys registry +var ( + serverPubKeyLock sync.RWMutex + serverPubKeyRegistry map[string]*rsa.PublicKey +) + +// RegisterServerPubKey registers a server RSA public key which can be used to +// send data in a secure manner to the server without receiving the public key +// in a potentially insecure way from the server first. +// Registered keys can afterwards be used adding serverPubKey= to the DSN. +// +// Note: The provided rsa.PublicKey instance is exclusively owned by the driver +// after registering it and may not be modified. +// +// data, err := ioutil.ReadFile("mykey.pem") +// if err != nil { +// log.Fatal(err) +// } +// +// block, _ := pem.Decode(data) +// if block == nil || block.Type != "PUBLIC KEY" { +// log.Fatal("failed to decode PEM block containing public key") +// } +// +// pub, err := x509.ParsePKIXPublicKey(block.Bytes) +// if err != nil { +// log.Fatal(err) +// } +// +// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok { +// mysql.RegisterServerPubKey("mykey", rsaPubKey) +// } else { +// log.Fatal("not a RSA public key") +// } +// +func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry == nil { + serverPubKeyRegistry = make(map[string]*rsa.PublicKey) + } + + serverPubKeyRegistry[name] = pubKey + serverPubKeyLock.Unlock() +} + +// DeregisterServerPubKey removes the public key registered with the given name. +func DeregisterServerPubKey(name string) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry != nil { + delete(serverPubKeyRegistry, name) + } + serverPubKeyLock.Unlock() +} + +func getServerPubKey(name string) (pubKey *rsa.PublicKey) { + serverPubKeyLock.RLock() + if v, ok := serverPubKeyRegistry[name]; ok { + pubKey = v + } + serverPubKeyLock.RUnlock() + return +} + +// Hash password using pre 4.1 (old password) method +// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c +type myRnd struct { + seed1, seed2 uint32 +} + +const myRndMaxVal = 0x3FFFFFFF + +// Pseudo random number generator +func newMyRnd(seed1, seed2 uint32) *myRnd { + return &myRnd{ + seed1: seed1 % myRndMaxVal, + seed2: seed2 % myRndMaxVal, + } +} + +// Tested to be equivalent to MariaDB's floating point variant +// http://play.golang.org/p/QHvhd4qved +// http://play.golang.org/p/RG0q4ElWDx +func (r *myRnd) NextByte() byte { + r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal + r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal + + return byte(uint64(r.seed1) * 31 / myRndMaxVal) +} + +// Generate binary hash from byte string using insecure pre 4.1 method +func pwHash(password []byte) (result [2]uint32) { + var add uint32 = 7 + var tmp uint32 + + result[0] = 1345345333 + result[1] = 0x12345671 + + for _, c := range password { + // skip spaces and tabs in password + if c == ' ' || c == '\t' { + continue + } + + tmp = uint32(c) + result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) + result[1] += (result[1] << 8) ^ result[0] + add += tmp + } + + // Remove sign bit (1<<31)-1) + result[0] &= 0x7FFFFFFF + result[1] &= 0x7FFFFFFF + + return +} + +// Hash password using insecure pre 4.1 method +func scrambleOldPassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + scramble = scramble[:8] + + hashPw := pwHash([]byte(password)) + hashSc := pwHash(scramble) + + r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) + + var out [8]byte + for i := range out { + out[i] = r.NextByte() + 64 + } + + mask := r.NextByte() + for i := range out { + out[i] ^= mask + } + + return out[:] +} + +// Hash password using 4.1+ method (SHA1) +func scramblePassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // stage1Hash = SHA1(password) + crypt := sha1.New() + crypt.Write([]byte(password)) + stage1 := crypt.Sum(nil) + + // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) + // inner Hash + crypt.Reset() + crypt.Write(stage1) + hash := crypt.Sum(nil) + + // outer Hash + crypt.Reset() + crypt.Write(scramble) + crypt.Write(hash) + scramble = crypt.Sum(nil) + + // token = scrambleHash XOR stage1Hash + for i := range scramble { + scramble[i] ^= stage1[i] + } + return scramble +} + +// Hash password using MySQL 8+ method (SHA256) +func scrambleSHA256Password(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble)) + + crypt := sha256.New() + crypt.Write([]byte(password)) + message1 := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1) + message1Hash := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1Hash) + crypt.Write(scramble) + message2 := crypt.Sum(nil) + + for i := range message1 { + message1[i] ^= message2[i] + } + + return message1 +} + +func encryptPassword(password string, seed []byte, pub *rsa.PublicKey) ([]byte, error) { + plain := make([]byte, len(password)+1) + copy(plain, password) + for i := range plain { + j := i % len(seed) + plain[i] ^= seed[j] + } + sha1 := sha1.New() + return rsa.EncryptOAEP(sha1, rand.Reader, pub, plain, nil) +} + +func (mc *mysqlConn) sendEncryptedPassword(seed []byte, pub *rsa.PublicKey) error { + enc, err := encryptPassword(mc.cfg.Passwd, seed, pub) + if err != nil { + return err + } + return mc.writeAuthSwitchPacket(enc, false) +} + +func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, bool, error) { + switch plugin { + case "caching_sha2_password": + authResp := scrambleSHA256Password(authData, mc.cfg.Passwd) + return authResp, (authResp == nil), nil + + case "mysql_old_password": + if !mc.cfg.AllowOldPasswords { + return nil, false, ErrOldPassword + } + // Note: there are edge cases where this should work but doesn't; + // this is currently "wontfix": + // https://github.com/go-sql-driver/mysql/issues/184 + authResp := scrambleOldPassword(authData[:8], mc.cfg.Passwd) + return authResp, true, nil + + case "mysql_clear_password": + if !mc.cfg.AllowCleartextPasswords { + return nil, false, ErrCleartextPassword + } + // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html + // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html + return []byte(mc.cfg.Passwd), true, nil + + case "mysql_native_password": + if !mc.cfg.AllowNativePasswords { + return nil, false, ErrNativePassword + } + // https://dev.mysql.com/doc/internals/en/secure-password-authentication.html + // Native password authentication only need and will need 20-byte challenge. + authResp := scramblePassword(authData[:20], mc.cfg.Passwd) + return authResp, false, nil + + case "sha256_password": + if len(mc.cfg.Passwd) == 0 { + return nil, true, nil + } + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + return []byte(mc.cfg.Passwd), true, nil + } + + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + return []byte{1}, false, nil + } + + // encrypted password + enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey) + return enc, false, err + + default: + errLog.Print("unknown auth plugin:", plugin) + return nil, false, ErrUnknownPlugin + } +} + +func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { + // Read Result Packet + authData, newPlugin, err := mc.readAuthResult() + if err != nil { + return err + } + + // handle auth plugin switch, if requested + if newPlugin != "" { + // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is + // sent and we have to keep using the cipher sent in the init packet. + if authData == nil { + authData = oldAuthData + } else { + // copy data from read buffer to owned slice + copy(oldAuthData, authData) + } + + plugin = newPlugin + + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + return err + } + if err = mc.writeAuthSwitchPacket(authResp, addNUL); err != nil { + return err + } + + // Read Result Packet + authData, newPlugin, err = mc.readAuthResult() + if err != nil { + return err + } + + // Do not allow to change the auth plugin more than once + if newPlugin != "" { + return ErrMalformPkt + } + } + + switch plugin { + + // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ + case "caching_sha2_password": + switch len(authData) { + case 0: + return nil // auth successful + case 1: + switch authData[0] { + case cachingSha2PasswordFastAuthSuccess: + if err = mc.readResultOK(); err == nil { + return nil // auth successful + } + + case cachingSha2PasswordPerformFullAuthentication: + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + err = mc.writeAuthSwitchPacket([]byte(mc.cfg.Passwd), true) + if err != nil { + return err + } + } else { + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + data := mc.buf.takeSmallBuffer(4 + 1) + data[4] = cachingSha2PasswordRequestPublicKey + mc.writePacket(data) + + // parse public key + data, err := mc.readPacket() + if err != nil { + return err + } + + block, _ := pem.Decode(data[1:]) + pkix, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + pubKey = pkix.(*rsa.PublicKey) + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pubKey) + if err != nil { + return err + } + } + return mc.readResultOK() + + default: + return ErrMalformPkt + } + default: + return ErrMalformPkt + } + + case "sha256_password": + switch len(authData) { + case 0: + return nil // auth successful + default: + block, _ := pem.Decode(authData) + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pub.(*rsa.PublicKey)) + if err != nil { + return err + } + return mc.readResultOK() + } + + default: + return nil // auth successful + } + + return err +} diff --git a/vendor/github.com/go-sql-driver/mysql/buffer.go b/vendor/github.com/go-sql-driver/mysql/buffer.go index 2001feacd31d..eb4748bf448d 100644 --- a/vendor/github.com/go-sql-driver/mysql/buffer.go +++ b/vendor/github.com/go-sql-driver/mysql/buffer.go @@ -130,18 +130,18 @@ func (b *buffer) takeBuffer(length int) []byte { // smaller than defaultBufSize // Only one buffer (total) can be used at a time. func (b *buffer) takeSmallBuffer(length int) []byte { - if b.length == 0 { - return b.buf[:length] + if b.length > 0 { + return nil } - return nil + return b.buf[:length] } // takeCompleteBuffer returns the complete existing buffer. // This can be used if the necessary buffer size is unknown. // Only one buffer (total) can be used at a time. func (b *buffer) takeCompleteBuffer() []byte { - if b.length == 0 { - return b.buf + if b.length > 0 { + return nil } - return nil + return b.buf } diff --git a/vendor/github.com/go-sql-driver/mysql/collations.go b/vendor/github.com/go-sql-driver/mysql/collations.go index 82079cfb93d3..136c9e4d1e91 100644 --- a/vendor/github.com/go-sql-driver/mysql/collations.go +++ b/vendor/github.com/go-sql-driver/mysql/collations.go @@ -9,6 +9,7 @@ package mysql const defaultCollation = "utf8_general_ci" +const binaryCollation = "binary" // A list of available collations mapped to the internal ID. // To update this map use the following MySQL query: diff --git a/vendor/github.com/go-sql-driver/mysql/connection.go b/vendor/github.com/go-sql-driver/mysql/connection.go index d82c728f3b86..e57061412bc2 100644 --- a/vendor/github.com/go-sql-driver/mysql/connection.go +++ b/vendor/github.com/go-sql-driver/mysql/connection.go @@ -10,12 +10,23 @@ package mysql import ( "database/sql/driver" + "io" "net" "strconv" "strings" "time" ) +// a copy of context.Context for Go 1.7 and earlier +type mysqlContext interface { + Done() <-chan struct{} + Err() error + + // defined in context.Context, but not used in this driver: + // Deadline() (deadline time.Time, ok bool) + // Value(key interface{}) interface{} +} + type mysqlConn struct { buf buffer netConn net.Conn @@ -29,7 +40,14 @@ type mysqlConn struct { status statusFlag sequence uint8 parseTime bool - strict bool + + // for context support (Go 1.8+) + watching bool + watcher chan<- mysqlContext + closech chan struct{} + finished chan<- struct{} + canceled atomicError // set non-nil if conn is canceled + closed atomicBool // set when conn is closed, before closech is closed } // Handles parameters set in DSN after the connection is established @@ -62,22 +80,41 @@ func (mc *mysqlConn) handleParams() (err error) { return } +func (mc *mysqlConn) markBadConn(err error) error { + if mc == nil { + return err + } + if err != errBadConnNoWrite { + return err + } + return driver.ErrBadConn +} + func (mc *mysqlConn) Begin() (driver.Tx, error) { - if mc.netConn == nil { + return mc.begin(false) +} + +func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } - err := mc.exec("START TRANSACTION") + var q string + if readOnly { + q = "START TRANSACTION READ ONLY" + } else { + q = "START TRANSACTION" + } + err := mc.exec(q) if err == nil { return &mysqlTx{mc}, err } - - return nil, err + return nil, mc.markBadConn(err) } func (mc *mysqlConn) Close() (err error) { // Makes Close idempotent - if mc.netConn != nil { + if !mc.closed.IsSet() { err = mc.writeCommandPacket(comQuit) } @@ -91,26 +128,39 @@ func (mc *mysqlConn) Close() (err error) { // is called before auth or on auth failure because MySQL will have already // closed the network connection. func (mc *mysqlConn) cleanup() { + if !mc.closed.TrySet(true) { + return + } + // Makes cleanup idempotent - if mc.netConn != nil { - if err := mc.netConn.Close(); err != nil { - errLog.Print(err) + close(mc.closech) + if mc.netConn == nil { + return + } + if err := mc.netConn.Close(); err != nil { + errLog.Print(err) + } +} + +func (mc *mysqlConn) error() error { + if mc.closed.IsSet() { + if err := mc.canceled.Value(); err != nil { + return err } - mc.netConn = nil + return ErrInvalidConn } - mc.cfg = nil - mc.buf.nc = nil + return nil } func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { - if mc.netConn == nil { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := mc.writeCommandPacketStr(comStmtPrepare, query) if err != nil { - return nil, err + return nil, mc.markBadConn(err) } stmt := &mysqlStmt{ @@ -144,7 +194,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin if buf == nil { // can not take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return "", driver.ErrBadConn + return "", ErrInvalidConn } buf = buf[:0] argPos := 0 @@ -257,7 +307,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin } func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { - if mc.netConn == nil { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } @@ -271,7 +321,6 @@ func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, err return nil, err } query = prepared - args = nil } mc.affectedRows = 0 mc.insertId = 0 @@ -283,32 +332,43 @@ func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, err insertId: int64(mc.insertId), }, err } - return nil, err + return nil, mc.markBadConn(err) } // Internal function to execute commands func (mc *mysqlConn) exec(query string) error { // Send command - err := mc.writeCommandPacketStr(comQuery, query) - if err != nil { - return err + if err := mc.writeCommandPacketStr(comQuery, query); err != nil { + return mc.markBadConn(err) } // Read Result resLen, err := mc.readResultSetHeaderPacket() - if err == nil && resLen > 0 { - if err = mc.readUntilEOF(); err != nil { + if err != nil { + return err + } + + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { return err } - err = mc.readUntilEOF() + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } } - return err + return mc.discardResults() } func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { - if mc.netConn == nil { + return mc.query(query, args) +} + +func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { + if mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } @@ -322,7 +382,6 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro return nil, err } query = prepared - args = nil } // Send command err := mc.writeCommandPacketStr(comQuery, query) @@ -335,15 +394,22 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro rows.mc = mc if resLen == 0 { - // no columns, no more data - return emptyRows{}, nil + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } } + // Columns - rows.columns, err = mc.readColumns(resLen) + rows.rs.columns, err = mc.readColumns(resLen) return rows, err } } - return nil, err + return nil, mc.markBadConn(err) } // Gets the value of the given MySQL System Variable @@ -359,7 +425,7 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { if err == nil { rows := new(textRows) rows.mc = mc - rows.columns = []mysqlField{{fieldType: fieldTypeVarChar}} + rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}} if resLen > 0 { // Columns @@ -375,3 +441,21 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { } return nil, err } + +// finish is called when the query has canceled. +func (mc *mysqlConn) cancel(err error) { + mc.canceled.Set(err) + mc.cleanup() +} + +// finish is called when the query has succeeded. +func (mc *mysqlConn) finish() { + if !mc.watching || mc.finished == nil { + return + } + select { + case mc.finished <- struct{}{}: + mc.watching = false + case <-mc.closech: + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/connection_go18.go b/vendor/github.com/go-sql-driver/mysql/connection_go18.go new file mode 100644 index 000000000000..62796bfcea58 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/connection_go18.go @@ -0,0 +1,208 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "context" + "database/sql" + "database/sql/driver" +) + +// Ping implements driver.Pinger interface +func (mc *mysqlConn) Ping(ctx context.Context) (err error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + if err = mc.watchCancel(ctx); err != nil { + return + } + defer mc.finish() + + if err = mc.writeCommandPacket(comPing); err != nil { + return + } + + return mc.readResultOK() +} + +// BeginTx implements driver.ConnBeginTx interface +func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { + level, err := mapIsolationLevel(opts.Isolation) + if err != nil { + return nil, err + } + err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) + if err != nil { + return nil, err + } + } + + return mc.begin(opts.ReadOnly) +} + +func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := mc.query(query, dargs) + if err != nil { + mc.finish() + return nil, err + } + rows.finish = mc.finish + return rows, err +} + +func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + return mc.Exec(query, dargs) +} + +func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + stmt, err := mc.Prepare(query) + mc.finish() + if err != nil { + return nil, err + } + + select { + default: + case <-ctx.Done(): + stmt.Close() + return nil, ctx.Err() + } + return stmt, nil +} + +func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := stmt.query(dargs) + if err != nil { + stmt.mc.finish() + return nil, err + } + rows.finish = stmt.mc.finish + return rows, err +} + +func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + defer stmt.mc.finish() + + return stmt.Exec(dargs) +} + +func (mc *mysqlConn) watchCancel(ctx context.Context) error { + if mc.watching { + // Reach here if canceled, + // so the connection is already invalid + mc.cleanup() + return nil + } + if ctx.Done() == nil { + return nil + } + + mc.watching = true + select { + default: + case <-ctx.Done(): + return ctx.Err() + } + if mc.watcher == nil { + return nil + } + + mc.watcher <- ctx + + return nil +} + +func (mc *mysqlConn) startWatcher() { + watcher := make(chan mysqlContext, 1) + mc.watcher = watcher + finished := make(chan struct{}) + mc.finished = finished + go func() { + for { + var ctx mysqlContext + select { + case ctx = <-watcher: + case <-mc.closech: + return + } + + select { + case <-ctx.Done(): + mc.cancel(ctx.Err()) + case <-finished: + case <-mc.closech: + return + } + } + }() +} + +func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { + nv.Value, err = converter{}.ConvertValue(nv.Value) + return +} + +// ResetSession implements driver.SessionResetter. +// (From Go 1.10) +func (mc *mysqlConn) ResetSession(ctx context.Context) error { + if mc.closed.IsSet() { + return driver.ErrBadConn + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/const.go b/vendor/github.com/go-sql-driver/mysql/const.go index 88cfff3fd8b0..b1e6b85efcae 100644 --- a/vendor/github.com/go-sql-driver/mysql/const.go +++ b/vendor/github.com/go-sql-driver/mysql/const.go @@ -9,7 +9,9 @@ package mysql const ( - minProtocolVersion byte = 10 + defaultAuthPlugin = "mysql_native_password" + defaultMaxAllowedPacket = 4 << 20 // 4 MiB + minProtocolVersion = 10 maxPacketSize = 1<<24 - 1 timeFormat = "2006-01-02 15:04:05.999999" ) @@ -18,10 +20,11 @@ const ( // http://dev.mysql.com/doc/internals/en/client-server-protocol.html const ( - iOK byte = 0x00 - iLocalInFile byte = 0xfb - iEOF byte = 0xfe - iERR byte = 0xff + iOK byte = 0x00 + iAuthMoreData byte = 0x01 + iLocalInFile byte = 0xfb + iEOF byte = 0xfe + iERR byte = 0xff ) // https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags @@ -87,8 +90,10 @@ const ( ) // https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType +type fieldType byte + const ( - fieldTypeDecimal byte = iota + fieldTypeDecimal fieldType = iota fieldTypeTiny fieldTypeShort fieldTypeLong @@ -107,7 +112,7 @@ const ( fieldTypeBit ) const ( - fieldTypeJSON byte = iota + 0xf5 + fieldTypeJSON fieldType = iota + 0xf5 fieldTypeNewDecimal fieldTypeEnum fieldTypeSet @@ -161,3 +166,9 @@ const ( statusInTransReadonly statusSessionStateChanged ) + +const ( + cachingSha2PasswordRequestPublicKey = 2 + cachingSha2PasswordFastAuthSuccess = 3 + cachingSha2PasswordPerformFullAuthentication = 4 +) diff --git a/vendor/github.com/go-sql-driver/mysql/driver.go b/vendor/github.com/go-sql-driver/mysql/driver.go index f5ee4728e5e0..1a75a16ecf0a 100644 --- a/vendor/github.com/go-sql-driver/mysql/driver.go +++ b/vendor/github.com/go-sql-driver/mysql/driver.go @@ -4,7 +4,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this file, // You can obtain one at http://mozilla.org/MPL/2.0/. -// Package mysql provides a MySQL driver for Go's database/sql package +// Package mysql provides a MySQL driver for Go's database/sql package. // // The driver should be used via the database/sql package: // @@ -20,8 +20,14 @@ import ( "database/sql" "database/sql/driver" "net" + "sync" ) +// watcher interface is used for context support (From Go 1.8) +type watcher interface { + startWatcher() +} + // MySQLDriver is exported to make the driver directly accessible. // In general the driver is used via the database/sql package. type MySQLDriver struct{} @@ -30,12 +36,17 @@ type MySQLDriver struct{} // Custom dial functions must be registered with RegisterDial type DialFunc func(addr string) (net.Conn, error) -var dials map[string]DialFunc +var ( + dialsLock sync.RWMutex + dials map[string]DialFunc +) // RegisterDial registers a custom dial function. It can then be used by the // network address mynet(addr), where mynet is the registered new network. // addr is passed as a parameter to the dial function. func RegisterDial(net string, dial DialFunc) { + dialsLock.Lock() + defer dialsLock.Unlock() if dials == nil { dials = make(map[string]DialFunc) } @@ -52,16 +63,19 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { mc := &mysqlConn{ maxAllowedPacket: maxPacketSize, maxWriteSize: maxPacketSize - 1, + closech: make(chan struct{}), } mc.cfg, err = ParseDSN(dsn) if err != nil { return nil, err } mc.parseTime = mc.cfg.ParseTime - mc.strict = mc.cfg.Strict // Connect to Server - if dial, ok := dials[mc.cfg.Net]; ok { + dialsLock.RLock() + dial, ok := dials[mc.cfg.Net] + dialsLock.RUnlock() + if ok { mc.netConn, err = dial(mc.cfg.Addr) } else { nd := net.Dialer{Timeout: mc.cfg.Timeout} @@ -81,6 +95,11 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { } } + // Call startWatcher for context support (From Go 1.8) + if s, ok := interface{}(mc).(watcher); ok { + s.startWatcher() + } + mc.buf = newBuffer(mc.netConn) // Set I/O timeouts @@ -88,20 +107,31 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { mc.writeTimeout = mc.cfg.WriteTimeout // Reading Handshake Initialization Packet - cipher, err := mc.readInitPacket() + authData, plugin, err := mc.readHandshakePacket() if err != nil { mc.cleanup() return nil, err } // Send Client Authentication Packet - if err = mc.writeAuthPacket(cipher); err != nil { + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + // try the default auth plugin, if using the requested plugin failed + errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) + plugin = defaultAuthPlugin + authResp, addNUL, err = mc.auth(authData, plugin) + if err != nil { + mc.cleanup() + return nil, err + } + } + if err = mc.writeHandshakeResponsePacket(authResp, addNUL, plugin); err != nil { mc.cleanup() return nil, err } // Handle response to auth packet, switch methods if possible - if err = handleAuthResult(mc); err != nil { + if err = mc.handleAuthResult(authData, plugin); err != nil { // Authentication failed and MySQL has already closed the connection // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). // Do not send COM_QUIT, just cleanup and return the error. @@ -134,43 +164,6 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { return mc, nil } -func handleAuthResult(mc *mysqlConn) error { - // Read Result Packet - cipher, err := mc.readResultOK() - if err == nil { - return nil // auth successful - } - - if mc.cfg == nil { - return err // auth failed and retry not possible - } - - // Retry auth if configured to do so. - if mc.cfg.AllowOldPasswords && err == ErrOldPassword { - // Retry with old authentication method. Note: there are edge cases - // where this should work but doesn't; this is currently "wontfix": - // https://github.com/go-sql-driver/mysql/issues/184 - if err = mc.writeOldAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowCleartextPasswords && err == ErrCleartextPassword { - // Retry with clear text password for - // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html - // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html - if err = mc.writeClearAuthPacket(); err != nil { - return err - } - _, err = mc.readResultOK() - } else if mc.cfg.AllowNativePasswords && err == ErrNativePassword { - if err = mc.writeNativeAuthPacket(cipher); err != nil { - return err - } - _, err = mc.readResultOK() - } - return err -} - func init() { sql.Register("mysql", &MySQLDriver{}) } diff --git a/vendor/github.com/go-sql-driver/mysql/dsn.go b/vendor/github.com/go-sql-driver/mysql/dsn.go index ac00dcedd517..be014babe333 100644 --- a/vendor/github.com/go-sql-driver/mysql/dsn.go +++ b/vendor/github.com/go-sql-driver/mysql/dsn.go @@ -10,11 +10,13 @@ package mysql import ( "bytes" + "crypto/rsa" "crypto/tls" "errors" "fmt" "net" "net/url" + "sort" "strconv" "strings" "time" @@ -27,7 +29,9 @@ var ( errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") ) -// Config is a configuration parsed from a DSN string +// Config is a configuration parsed from a DSN string. +// If a new Config is created instead of being parsed from a DSN string, +// the NewConfig function should be used, which sets default values. type Config struct { User string // Username Passwd string // Password (requires User) @@ -38,6 +42,8 @@ type Config struct { Collation string // Connection collation Loc *time.Location // Location for time.Time values MaxAllowedPacket int // Max packet size allowed + ServerPubKey string // Server public key name + pubKey *rsa.PublicKey // Server public key TLSConfig string // TLS configuration name tls *tls.Config // TLS configuration Timeout time.Duration // Dial timeout @@ -53,7 +59,54 @@ type Config struct { InterpolateParams bool // Interpolate placeholders into query string MultiStatements bool // Allow multiple statements in one query ParseTime bool // Parse time values to time.Time - Strict bool // Return warnings as errors + RejectReadOnly bool // Reject read-only connections +} + +// NewConfig creates a new Config and sets default values. +func NewConfig() *Config { + return &Config{ + Collation: defaultCollation, + Loc: time.UTC, + MaxAllowedPacket: defaultMaxAllowedPacket, + AllowNativePasswords: true, + } +} + +func (cfg *Config) normalize() error { + if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { + return errInvalidDSNUnsafeCollation + } + + // Set default network if empty + if cfg.Net == "" { + cfg.Net = "tcp" + } + + // Set default address if empty + if cfg.Addr == "" { + switch cfg.Net { + case "tcp": + cfg.Addr = "127.0.0.1:3306" + case "unix": + cfg.Addr = "/tmp/mysql.sock" + default: + return errors.New("default addr for network '" + cfg.Net + "' unknown") + } + + } else if cfg.Net == "tcp" { + cfg.Addr = ensureHavePort(cfg.Addr) + } + + if cfg.tls != nil { + if cfg.tls.ServerName == "" && !cfg.tls.InsecureSkipVerify { + host, _, err := net.SplitHostPort(cfg.Addr) + if err == nil { + cfg.tls.ServerName = host + } + } + } + + return nil } // FormatDSN formats the given Config into a DSN string which can be passed to @@ -102,12 +155,12 @@ func (cfg *Config) FormatDSN() string { } } - if cfg.AllowNativePasswords { + if !cfg.AllowNativePasswords { if hasParam { - buf.WriteString("&allowNativePasswords=true") + buf.WriteString("&allowNativePasswords=false") } else { hasParam = true - buf.WriteString("?allowNativePasswords=true") + buf.WriteString("?allowNativePasswords=false") } } @@ -195,15 +248,25 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(cfg.ReadTimeout.String()) } - if cfg.Strict { + if cfg.RejectReadOnly { if hasParam { - buf.WriteString("&strict=true") + buf.WriteString("&rejectReadOnly=true") } else { hasParam = true - buf.WriteString("?strict=true") + buf.WriteString("?rejectReadOnly=true") } } + if len(cfg.ServerPubKey) > 0 { + if hasParam { + buf.WriteString("&serverPubKey=") + } else { + hasParam = true + buf.WriteString("?serverPubKey=") + } + buf.WriteString(url.QueryEscape(cfg.ServerPubKey)) + } + if cfg.Timeout > 0 { if hasParam { buf.WriteString("&timeout=") @@ -234,7 +297,7 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(cfg.WriteTimeout.String()) } - if cfg.MaxAllowedPacket > 0 { + if cfg.MaxAllowedPacket != defaultMaxAllowedPacket { if hasParam { buf.WriteString("&maxAllowedPacket=") } else { @@ -247,7 +310,12 @@ func (cfg *Config) FormatDSN() string { // other params if cfg.Params != nil { - for param, value := range cfg.Params { + var params []string + for param := range cfg.Params { + params = append(params, param) + } + sort.Strings(params) + for _, param := range params { if hasParam { buf.WriteByte('&') } else { @@ -257,7 +325,7 @@ func (cfg *Config) FormatDSN() string { buf.WriteString(param) buf.WriteByte('=') - buf.WriteString(url.QueryEscape(value)) + buf.WriteString(url.QueryEscape(cfg.Params[param])) } } @@ -267,10 +335,7 @@ func (cfg *Config) FormatDSN() string { // ParseDSN parses the DSN string to a Config func ParseDSN(dsn string) (cfg *Config, err error) { // New config with some default values - cfg = &Config{ - Loc: time.UTC, - Collation: defaultCollation, - } + cfg = NewConfig() // [user[:password]@][net[(addr)]]/dbname[?param1=value1¶mN=valueN] // Find the last '/' (since the password or the net addr might contain a '/') @@ -338,28 +403,9 @@ func ParseDSN(dsn string) (cfg *Config, err error) { return nil, errInvalidDSNNoSlash } - if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { - return nil, errInvalidDSNUnsafeCollation - } - - // Set default network if empty - if cfg.Net == "" { - cfg.Net = "tcp" + if err = cfg.normalize(); err != nil { + return nil, err } - - // Set default address if empty - if cfg.Addr == "" { - switch cfg.Net { - case "tcp": - cfg.Addr = "127.0.0.1:3306" - case "unix": - cfg.Addr = "/tmp/mysql.sock" - default: - return nil, errors.New("default addr for network '" + cfg.Net + "' unknown") - } - - } - return } @@ -374,7 +420,6 @@ func parseDSNParams(cfg *Config, params string) (err error) { // cfg params switch value := param[1]; param[0] { - // Disable INFILE whitelist / enable all files case "allowAllFiles": var isBool bool @@ -472,14 +517,32 @@ func parseDSNParams(cfg *Config, params string) (err error) { return } - // Strict mode - case "strict": + // Reject read-only connections + case "rejectReadOnly": var isBool bool - cfg.Strict, isBool = readBool(value) + cfg.RejectReadOnly, isBool = readBool(value) if !isBool { return errors.New("invalid bool value: " + value) } + // Server public key + case "serverPubKey": + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for server pub key name: %v", err) + } + + if pubKey := getServerPubKey(name); pubKey != nil { + cfg.ServerPubKey = name + cfg.pubKey = pubKey + } else { + return errors.New("invalid value / unknown server pub key name: " + name) + } + + // Strict mode + case "strict": + panic("strict mode has been removed. See https://github.com/go-sql-driver/mysql/wiki/strict-mode") + // Dial Timeout case "timeout": cfg.Timeout, err = time.ParseDuration(value) @@ -506,14 +569,7 @@ func parseDSNParams(cfg *Config, params string) (err error) { return fmt.Errorf("invalid value for TLS config name: %v", err) } - if tlsConfig, ok := tlsConfigRegister[name]; ok { - if len(tlsConfig.ServerName) == 0 && !tlsConfig.InsecureSkipVerify { - host, _, err := net.SplitHostPort(cfg.Addr) - if err == nil { - tlsConfig.ServerName = host - } - } - + if tlsConfig := getTLSConfigClone(name); tlsConfig != nil { cfg.TLSConfig = name cfg.tls = tlsConfig } else { @@ -546,3 +602,10 @@ func parseDSNParams(cfg *Config, params string) (err error) { return } + +func ensureHavePort(addr string) string { + if _, _, err := net.SplitHostPort(addr); err != nil { + return net.JoinHostPort(addr, "3306") + } + return addr +} diff --git a/vendor/github.com/go-sql-driver/mysql/errors.go b/vendor/github.com/go-sql-driver/mysql/errors.go index 857854e14768..760782ff2fb5 100644 --- a/vendor/github.com/go-sql-driver/mysql/errors.go +++ b/vendor/github.com/go-sql-driver/mysql/errors.go @@ -9,10 +9,8 @@ package mysql import ( - "database/sql/driver" "errors" "fmt" - "io" "log" "os" ) @@ -31,6 +29,12 @@ var ( ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") ErrBusyBuffer = errors.New("busy buffer") + + // errBadConnNoWrite is used for connection errors where nothing was sent to the database yet. + // If this happens first in a function starting a database interaction, it should be replaced by driver.ErrBadConn + // to trigger a resend. + // See https://github.com/go-sql-driver/mysql/pull/302 + errBadConnNoWrite = errors.New("bad connection") ) var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) @@ -59,74 +63,3 @@ type MySQLError struct { func (me *MySQLError) Error() string { return fmt.Sprintf("Error %d: %s", me.Number, me.Message) } - -// MySQLWarnings is an error type which represents a group of one or more MySQL -// warnings -type MySQLWarnings []MySQLWarning - -func (mws MySQLWarnings) Error() string { - var msg string - for i, warning := range mws { - if i > 0 { - msg += "\r\n" - } - msg += fmt.Sprintf( - "%s %s: %s", - warning.Level, - warning.Code, - warning.Message, - ) - } - return msg -} - -// MySQLWarning is an error type which represents a single MySQL warning. -// Warnings are returned in groups only. See MySQLWarnings -type MySQLWarning struct { - Level string - Code string - Message string -} - -func (mc *mysqlConn) getWarnings() (err error) { - rows, err := mc.Query("SHOW WARNINGS", nil) - if err != nil { - return - } - - var warnings = MySQLWarnings{} - var values = make([]driver.Value, 3) - - for { - err = rows.Next(values) - switch err { - case nil: - warning := MySQLWarning{} - - if raw, ok := values[0].([]byte); ok { - warning.Level = string(raw) - } else { - warning.Level = fmt.Sprintf("%s", values[0]) - } - if raw, ok := values[1].([]byte); ok { - warning.Code = string(raw) - } else { - warning.Code = fmt.Sprintf("%s", values[1]) - } - if raw, ok := values[2].([]byte); ok { - warning.Message = string(raw) - } else { - warning.Message = fmt.Sprintf("%s", values[0]) - } - - warnings = append(warnings, warning) - - case io.EOF: - return warnings - - default: - rows.Close() - return - } - } -} diff --git a/vendor/github.com/go-sql-driver/mysql/fields.go b/vendor/github.com/go-sql-driver/mysql/fields.go new file mode 100644 index 000000000000..e1e2ece4b163 --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/fields.go @@ -0,0 +1,194 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql" + "reflect" +) + +func (mf *mysqlField) typeDatabaseName() string { + switch mf.fieldType { + case fieldTypeBit: + return "BIT" + case fieldTypeBLOB: + if mf.charSet != collations[binaryCollation] { + return "TEXT" + } + return "BLOB" + case fieldTypeDate: + return "DATE" + case fieldTypeDateTime: + return "DATETIME" + case fieldTypeDecimal: + return "DECIMAL" + case fieldTypeDouble: + return "DOUBLE" + case fieldTypeEnum: + return "ENUM" + case fieldTypeFloat: + return "FLOAT" + case fieldTypeGeometry: + return "GEOMETRY" + case fieldTypeInt24: + return "MEDIUMINT" + case fieldTypeJSON: + return "JSON" + case fieldTypeLong: + return "INT" + case fieldTypeLongBLOB: + if mf.charSet != collations[binaryCollation] { + return "LONGTEXT" + } + return "LONGBLOB" + case fieldTypeLongLong: + return "BIGINT" + case fieldTypeMediumBLOB: + if mf.charSet != collations[binaryCollation] { + return "MEDIUMTEXT" + } + return "MEDIUMBLOB" + case fieldTypeNewDate: + return "DATE" + case fieldTypeNewDecimal: + return "DECIMAL" + case fieldTypeNULL: + return "NULL" + case fieldTypeSet: + return "SET" + case fieldTypeShort: + return "SMALLINT" + case fieldTypeString: + if mf.charSet == collations[binaryCollation] { + return "BINARY" + } + return "CHAR" + case fieldTypeTime: + return "TIME" + case fieldTypeTimestamp: + return "TIMESTAMP" + case fieldTypeTiny: + return "TINYINT" + case fieldTypeTinyBLOB: + if mf.charSet != collations[binaryCollation] { + return "TINYTEXT" + } + return "TINYBLOB" + case fieldTypeVarChar: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeVarString: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeYear: + return "YEAR" + default: + return "" + } +} + +var ( + scanTypeFloat32 = reflect.TypeOf(float32(0)) + scanTypeFloat64 = reflect.TypeOf(float64(0)) + scanTypeInt8 = reflect.TypeOf(int8(0)) + scanTypeInt16 = reflect.TypeOf(int16(0)) + scanTypeInt32 = reflect.TypeOf(int32(0)) + scanTypeInt64 = reflect.TypeOf(int64(0)) + scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{}) + scanTypeNullInt = reflect.TypeOf(sql.NullInt64{}) + scanTypeNullTime = reflect.TypeOf(NullTime{}) + scanTypeUint8 = reflect.TypeOf(uint8(0)) + scanTypeUint16 = reflect.TypeOf(uint16(0)) + scanTypeUint32 = reflect.TypeOf(uint32(0)) + scanTypeUint64 = reflect.TypeOf(uint64(0)) + scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{}) + scanTypeUnknown = reflect.TypeOf(new(interface{})) +) + +type mysqlField struct { + tableName string + name string + length uint32 + flags fieldFlag + fieldType fieldType + decimals byte + charSet uint8 +} + +func (mf *mysqlField) scanType() reflect.Type { + switch mf.fieldType { + case fieldTypeTiny: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint8 + } + return scanTypeInt8 + } + return scanTypeNullInt + + case fieldTypeShort, fieldTypeYear: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint16 + } + return scanTypeInt16 + } + return scanTypeNullInt + + case fieldTypeInt24, fieldTypeLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint32 + } + return scanTypeInt32 + } + return scanTypeNullInt + + case fieldTypeLongLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint64 + } + return scanTypeInt64 + } + return scanTypeNullInt + + case fieldTypeFloat: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat32 + } + return scanTypeNullFloat + + case fieldTypeDouble: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat64 + } + return scanTypeNullFloat + + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON, + fieldTypeTime: + return scanTypeRawBytes + + case fieldTypeDate, fieldTypeNewDate, + fieldTypeTimestamp, fieldTypeDateTime: + // NullTime is always returned for more consistent behavior as it can + // handle both cases of parseTime regardless if the field is nullable. + return scanTypeNullTime + + default: + return scanTypeUnknown + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/infile.go b/vendor/github.com/go-sql-driver/mysql/infile.go index 547357cfa76d..273cb0ba500c 100644 --- a/vendor/github.com/go-sql-driver/mysql/infile.go +++ b/vendor/github.com/go-sql-driver/mysql/infile.go @@ -147,7 +147,8 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) { } // send content packets - if err == nil { + // if packetSize == 0, the Reader contains no data + if err == nil && packetSize > 0 { data := make([]byte, 4+packetSize) var n int for err == nil { @@ -173,8 +174,7 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) { // read OK packet if err == nil { - _, err = mc.readResultOK() - return err + return mc.readResultOK() } mc.readPacket() diff --git a/vendor/github.com/go-sql-driver/mysql/packets.go b/vendor/github.com/go-sql-driver/mysql/packets.go index 9160beb090e8..d873a97b2fea 100644 --- a/vendor/github.com/go-sql-driver/mysql/packets.go +++ b/vendor/github.com/go-sql-driver/mysql/packets.go @@ -25,26 +25,23 @@ import ( // Read packet to buffer 'data' func (mc *mysqlConn) readPacket() ([]byte, error) { - var payload []byte + var prevData []byte for { - // Read packet header + // read packet header data, err := mc.buf.readNext(4) if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } errLog.Print(err) mc.Close() - return nil, driver.ErrBadConn + return nil, ErrInvalidConn } - // Packet Length [24 bit] + // packet length [24 bit] pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) - if pktLen < 1 { - errLog.Print(ErrMalformPkt) - mc.Close() - return nil, driver.ErrBadConn - } - - // Check Packet Sync [8 bit] + // check packet sync [8 bit] if data[3] != mc.sequence { if data[3] > mc.sequence { return nil, ErrPktSyncMul @@ -53,26 +50,41 @@ func (mc *mysqlConn) readPacket() ([]byte, error) { } mc.sequence++ - // Read packet body [pktLen bytes] + // packets with length 0 terminate a previous packet which is a + // multiple of (2^24)−1 bytes long + if pktLen == 0 { + // there was no previous packet + if prevData == nil { + errLog.Print(ErrMalformPkt) + mc.Close() + return nil, ErrInvalidConn + } + + return prevData, nil + } + + // read packet body [pktLen bytes] data, err = mc.buf.readNext(pktLen) if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } errLog.Print(err) mc.Close() - return nil, driver.ErrBadConn + return nil, ErrInvalidConn } - isLastPacket := (pktLen < maxPacketSize) + // return data if this was the last packet + if pktLen < maxPacketSize { + // zero allocations for non-split packets + if prevData == nil { + return data, nil + } - // Zero allocations for non-splitting packets - if isLastPacket && payload == nil { - return data, nil + return append(prevData, data...), nil } - payload = append(payload, data...) - - if isLastPacket { - return payload, nil - } + prevData = append(prevData, data...) } } @@ -119,33 +131,47 @@ func (mc *mysqlConn) writePacket(data []byte) error { // Handle error if err == nil { // n != len(data) + mc.cleanup() errLog.Print(ErrMalformPkt) } else { + if cerr := mc.canceled.Value(); cerr != nil { + return cerr + } + if n == 0 && pktLen == len(data)-4 { + // only for the first loop iteration when nothing was written yet + return errBadConnNoWrite + } + mc.cleanup() errLog.Print(err) } - return driver.ErrBadConn + return ErrInvalidConn } } /****************************************************************************** -* Initialisation Process * +* Initialization Process * ******************************************************************************/ // Handshake Initialization Packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake -func (mc *mysqlConn) readInitPacket() ([]byte, error) { +func (mc *mysqlConn) readHandshakePacket() ([]byte, string, error) { data, err := mc.readPacket() if err != nil { - return nil, err + // for init we can rewrite this to ErrBadConn for sql.Driver to retry, since + // in connection initialization we don't risk retrying non-idempotent actions. + if err == ErrInvalidConn { + return nil, "", driver.ErrBadConn + } + return nil, "", err } if data[0] == iERR { - return nil, mc.handleErrorPacket(data) + return nil, "", mc.handleErrorPacket(data) } // protocol version [1 byte] if data[0] < minProtocolVersion { - return nil, fmt.Errorf( + return nil, "", fmt.Errorf( "unsupported protocol version %d. Version %d or higher is required", data[0], minProtocolVersion, @@ -157,7 +183,7 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 // first part of the password cipher [8 bytes] - cipher := data[pos : pos+8] + authData := data[pos : pos+8] // (filler) always 0x00 [1 byte] pos += 8 + 1 @@ -165,13 +191,14 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { // capability flags (lower 2 bytes) [2 bytes] mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) if mc.flags&clientProtocol41 == 0 { - return nil, ErrOldProtocol + return nil, "", ErrOldProtocol } if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { - return nil, ErrNoTLS + return nil, "", ErrNoTLS } pos += 2 + plugin := "" if len(data) > pos { // character set [1 byte] // status flags [2 bytes] @@ -192,32 +219,34 @@ func (mc *mysqlConn) readInitPacket() ([]byte, error) { // // The official Python library uses the fixed length 12 // which seems to work but technically could have a hidden bug. - cipher = append(cipher, data[pos:pos+12]...) + authData = append(authData, data[pos:pos+12]...) + pos += 13 - // TODO: Verify string termination // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) // \NUL otherwise - // - //if data[len(data)-1] == 0 { - // return - //} - //return ErrMalformPkt + if end := bytes.IndexByte(data[pos:], 0x00); end != -1 { + plugin = string(data[pos : pos+end]) + } else { + plugin = string(data[pos:]) + } // make a memory safe copy of the cipher slice var b [20]byte - copy(b[:], cipher) - return b[:], nil + copy(b[:], authData) + return b[:], plugin, nil } + plugin = defaultAuthPlugin + // make a memory safe copy of the cipher slice var b [8]byte - copy(b[:], cipher) - return b[:], nil + copy(b[:], authData) + return b[:], plugin, nil } // Client Authentication Packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse -func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { +func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, addNUL bool, plugin string) error { // Adjust client flags based on server support clientFlags := clientProtocol41 | clientSecureConn | @@ -241,10 +270,19 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { clientFlags |= clientMultiStatements } - // User Password - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) + // encode length of the auth plugin data + var authRespLEIBuf [9]byte + authRespLEI := appendLengthEncodedInteger(authRespLEIBuf[:0], uint64(len(authResp))) + if len(authRespLEI) > 1 { + // if the length can not be written in 1 byte, it must be written as a + // length encoded integer + clientFlags |= clientPluginAuthLenEncClientData + } - pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + 1 + len(scrambleBuff) + 21 + 1 + pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + len(authRespLEI) + len(authResp) + 21 + 1 + if addNUL { + pktLen++ + } // To specify a db name if n := len(mc.cfg.DBName); n > 0 { @@ -255,9 +293,9 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { // Calculate packet length and get buffer with that size data := mc.buf.takeSmallBuffer(pktLen + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // ClientFlags [32 bit] @@ -312,9 +350,13 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { data[pos] = 0x00 pos++ - // ScrambleBuffer [length encoded integer] - data[pos] = byte(len(scrambleBuff)) - pos += 1 + copy(data[pos+1:], scrambleBuff) + // Auth Data [length encoded integer] + pos += copy(data[pos:], authRespLEI) + pos += copy(data[pos:], authResp) + if addNUL { + data[pos] = 0x00 + pos++ + } // Databasename [null terminated string] if len(mc.cfg.DBName) > 0 { @@ -323,72 +365,32 @@ func (mc *mysqlConn) writeAuthPacket(cipher []byte) error { pos++ } - // Assume native client during response - pos += copy(data[pos:], "mysql_native_password") + pos += copy(data[pos:], plugin) data[pos] = 0x00 // Send Auth packet return mc.writePacket(data) } -// Client old authentication packet // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeOldAuthPacket(cipher []byte) error { - // User password - scrambleBuff := scrambleOldPassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn +func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte, addNUL bool) error { + pktLen := 4 + len(authData) + if addNUL { + pktLen++ } - - // Add the scrambled password [null terminated string] - copy(data[4:], scrambleBuff) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Client clear text authentication packet -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeClearAuthPacket() error { - // Calculate the packet length and add a tailing 0 - pktLen := len(mc.cfg.Passwd) + 1 - data := mc.buf.takeSmallBuffer(4 + pktLen) + data := mc.buf.takeSmallBuffer(pktLen) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } - // Add the clear password [null terminated string] - copy(data[4:], mc.cfg.Passwd) - data[4+pktLen-1] = 0x00 - - return mc.writePacket(data) -} - -// Native password authentication method -// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse -func (mc *mysqlConn) writeNativeAuthPacket(cipher []byte) error { - scrambleBuff := scramblePassword(cipher, []byte(mc.cfg.Passwd)) - - // Calculate the packet length and add a tailing 0 - pktLen := len(scrambleBuff) - data := mc.buf.takeSmallBuffer(4 + pktLen) - if data == nil { - // can not take the buffer. Something must be wrong with the connection - errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + // Add the auth data [EOF] + copy(data[4:], authData) + if addNUL { + data[pktLen-1] = 0x00 } - // Add the scramble - copy(data[4:], scrambleBuff) - return mc.writePacket(data) } @@ -402,9 +404,9 @@ func (mc *mysqlConn) writeCommandPacket(command byte) error { data := mc.buf.takeSmallBuffer(4 + 1) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -421,9 +423,9 @@ func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { pktLen := 1 + len(arg) data := mc.buf.takeBuffer(pktLen + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -442,9 +444,9 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { data := mc.buf.takeSmallBuffer(4 + 1 + 4) if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // Add command byte @@ -464,43 +466,50 @@ func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { * Result Packets * ******************************************************************************/ -// Returns error if Packet is not an 'Result OK'-Packet -func (mc *mysqlConn) readResultOK() ([]byte, error) { +func (mc *mysqlConn) readAuthResult() ([]byte, string, error) { data, err := mc.readPacket() - if err == nil { - // packet indicator - switch data[0] { + if err != nil { + return nil, "", err + } - case iOK: - return nil, mc.handleOkPacket(data) + // packet indicator + switch data[0] { - case iEOF: - if len(data) > 1 { - pluginEndIndex := bytes.IndexByte(data, 0x00) - plugin := string(data[1:pluginEndIndex]) - cipher := data[pluginEndIndex+1 : len(data)-1] - - if plugin == "mysql_old_password" { - // using old_passwords - return cipher, ErrOldPassword - } else if plugin == "mysql_clear_password" { - // using clear text password - return cipher, ErrCleartextPassword - } else if plugin == "mysql_native_password" { - // using mysql default authentication method - return cipher, ErrNativePassword - } else { - return cipher, ErrUnknownPlugin - } - } else { - return nil, ErrOldPassword - } + case iOK: + return nil, "", mc.handleOkPacket(data) - default: // Error otherwise - return nil, mc.handleErrorPacket(data) + case iAuthMoreData: + return data[1:], "", err + + case iEOF: + if len(data) < 1 { + // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest + return nil, "mysql_old_password", nil + } + pluginEndIndex := bytes.IndexByte(data, 0x00) + if pluginEndIndex < 0 { + return nil, "", ErrMalformPkt } + plugin := string(data[1:pluginEndIndex]) + authData := data[pluginEndIndex+1:] + return authData, plugin, nil + + default: // Error otherwise + return nil, "", mc.handleErrorPacket(data) } - return nil, err +} + +// Returns error if Packet is not an 'Result OK'-Packet +func (mc *mysqlConn) readResultOK() error { + data, err := mc.readPacket() + if err != nil { + return err + } + + if data[0] == iOK { + return mc.handleOkPacket(data) + } + return mc.handleErrorPacket(data) } // Result Set Header Packet @@ -543,6 +552,22 @@ func (mc *mysqlConn) handleErrorPacket(data []byte) error { // Error Number [16 bit uint] errno := binary.LittleEndian.Uint16(data[1:3]) + // 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION + // 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover) + if (errno == 1792 || errno == 1290) && mc.cfg.RejectReadOnly { + // Oops; we are connected to a read-only connection, and won't be able + // to issue any write statements. Since RejectReadOnly is configured, + // we throw away this connection hoping this one would have write + // permission. This is specifically for a possible race condition + // during failover (e.g. on AWS Aurora). See README.md for more. + // + // We explicitly close the connection before returning + // driver.ErrBadConn to ensure that `database/sql` purges this + // connection and initiates a new one for next statement next time. + mc.Close() + return driver.ErrBadConn + } + pos := 3 // SQL State [optional: # + 5bytes string] @@ -577,19 +602,12 @@ func (mc *mysqlConn) handleOkPacket(data []byte) error { // server_status [2 bytes] mc.status = readStatus(data[1+n+m : 1+n+m+2]) - if err := mc.discardResults(); err != nil { - return err + if mc.status&statusMoreResultsExists != 0 { + return nil } // warning count [2 bytes] - if !mc.strict { - return nil - } - pos := 1 + n + m + 2 - if binary.LittleEndian.Uint16(data[pos:pos+2]) > 0 { - return mc.getWarnings() - } return nil } @@ -661,14 +679,21 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { if err != nil { return nil, err } + pos += n // Filler [uint8] + pos++ + // Charset [charset, collation uint8] + columns[i].charSet = data[pos] + pos += 2 + // Length [uint32] - pos += n + 1 + 2 + 4 + columns[i].length = binary.LittleEndian.Uint32(data[pos : pos+4]) + pos += 4 // Field type [uint8] - columns[i].fieldType = data[pos] + columns[i].fieldType = fieldType(data[pos]) pos++ // Flags [uint16] @@ -691,6 +716,10 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { func (rows *textRows) readRow(dest []driver.Value) error { mc := rows.mc + if rows.rs.done { + return io.EOF + } + data, err := mc.readPacket() if err != nil { return err @@ -700,10 +729,10 @@ func (rows *textRows) readRow(dest []driver.Value) error { if data[0] == iEOF && len(data) == 5 { // server_status [2 bytes] rows.mc.status = readStatus(data[3:]) - if err := rows.mc.discardResults(); err != nil { - return err + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil } - rows.mc = nil return io.EOF } if data[0] == iERR { @@ -725,7 +754,7 @@ func (rows *textRows) readRow(dest []driver.Value) error { if !mc.parseTime { continue } else { - switch rows.columns[i].fieldType { + switch rows.rs.columns[i].fieldType { case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeDate, fieldTypeNewDate: dest[i], err = parseDateTime( @@ -797,14 +826,7 @@ func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { // Reserved [8 bit] // Warning count [16 bit uint] - if !stmt.mc.strict { - return columnCount, nil - } - // Check for warnings count > 0, only available in MySQL > 4.1 - if len(data) >= 12 && binary.LittleEndian.Uint16(data[10:12]) > 0 { - return columnCount, stmt.mc.getWarnings() - } return columnCount, nil } return 0, err @@ -821,7 +843,7 @@ func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { // 2 bytes paramID const dataOffset = 1 + 4 + 2 - // Can not use the write buffer since + // Cannot use the write buffer since // a) the buffer is too small // b) it is in use data := make([]byte, 4+1+4+2+len(arg)) @@ -876,6 +898,12 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { const minPktLen = 4 + 1 + 4 + 1 + 4 mc := stmt.mc + // Determine threshould dynamically to avoid packet size shortage. + longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) + if longDataSize < 64 { + longDataSize = 64 + } + // Reset packet-sequence mc.sequence = 0 @@ -887,9 +915,9 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { data = mc.buf.takeCompleteBuffer() } if data == nil { - // can not take the buffer. Something must be wrong with the connection + // cannot take the buffer. Something must be wrong with the connection errLog.Print(ErrBusyBuffer) - return driver.ErrBadConn + return errBadConnNoWrite } // command [1 byte] @@ -948,7 +976,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // build NULL-bitmap if arg == nil { nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL + paramTypes[i+i] = byte(fieldTypeNULL) paramTypes[i+i+1] = 0x00 continue } @@ -956,7 +984,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // cache types and values switch v := arg.(type) { case int64: - paramTypes[i+i] = fieldTypeLongLong + paramTypes[i+i] = byte(fieldTypeLongLong) paramTypes[i+i+1] = 0x00 if cap(paramValues)-len(paramValues)-8 >= 0 { @@ -972,7 +1000,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case float64: - paramTypes[i+i] = fieldTypeDouble + paramTypes[i+i] = byte(fieldTypeDouble) paramTypes[i+i+1] = 0x00 if cap(paramValues)-len(paramValues)-8 >= 0 { @@ -988,7 +1016,7 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case bool: - paramTypes[i+i] = fieldTypeTiny + paramTypes[i+i] = byte(fieldTypeTiny) paramTypes[i+i+1] = 0x00 if v { @@ -1000,10 +1028,10 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { case []byte: // Common case (non-nil value) first if v != nil { - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { + if len(v) < longDataSize { paramValues = appendLengthEncodedInteger(paramValues, uint64(len(v)), ) @@ -1018,14 +1046,14 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { // Handle []byte(nil) as a NULL value nullMask[i/8] |= 1 << (uint(i) & 7) - paramTypes[i+i] = fieldTypeNULL + paramTypes[i+i] = byte(fieldTypeNULL) paramTypes[i+i+1] = 0x00 case string: - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - if len(v) < mc.maxAllowedPacket-pos-len(paramValues)-(len(args)-(i+1))*64 { + if len(v) < longDataSize { paramValues = appendLengthEncodedInteger(paramValues, uint64(len(v)), ) @@ -1037,23 +1065,25 @@ func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { } case time.Time: - paramTypes[i+i] = fieldTypeString + paramTypes[i+i] = byte(fieldTypeString) paramTypes[i+i+1] = 0x00 - var val []byte + var a [64]byte + var b = a[:0] + if v.IsZero() { - val = []byte("0000-00-00") + b = append(b, "0000-00-00"...) } else { - val = []byte(v.In(mc.cfg.Loc).Format(timeFormat)) + b = v.In(mc.cfg.Loc).AppendFormat(b, timeFormat) } paramValues = appendLengthEncodedInteger(paramValues, - uint64(len(val)), + uint64(len(b)), ) - paramValues = append(paramValues, val...) + paramValues = append(paramValues, b...) default: - return fmt.Errorf("can not convert type: %T", arg) + return fmt.Errorf("cannot convert type: %T", arg) } } @@ -1086,8 +1116,6 @@ func (mc *mysqlConn) discardResults() error { if err := mc.readUntilEOF(); err != nil { return err } - } else { - mc.status &^= statusMoreResultsExists } } return nil @@ -1105,16 +1133,17 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { // EOF Packet if data[0] == iEOF && len(data) == 5 { rows.mc.status = readStatus(data[3:]) - if err := rows.mc.discardResults(); err != nil { - return err + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil } - rows.mc = nil return io.EOF } + mc := rows.mc rows.mc = nil // Error otherwise - return rows.mc.handleErrorPacket(data) + return mc.handleErrorPacket(data) } // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] @@ -1130,14 +1159,14 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { } // Convert to byte-coded string - switch rows.columns[i].fieldType { + switch rows.rs.columns[i].fieldType { case fieldTypeNULL: dest[i] = nil continue // Numeric Types case fieldTypeTiny: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(data[pos]) } else { dest[i] = int64(int8(data[pos])) @@ -1146,7 +1175,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeShort, fieldTypeYear: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) } else { dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) @@ -1155,7 +1184,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeInt24, fieldTypeLong: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) } else { dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) @@ -1164,7 +1193,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeLongLong: - if rows.columns[i].flags&flagUnsigned != 0 { + if rows.rs.columns[i].flags&flagUnsigned != 0 { val := binary.LittleEndian.Uint64(data[pos : pos+8]) if val > math.MaxInt64 { dest[i] = uint64ToString(val) @@ -1178,7 +1207,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { continue case fieldTypeFloat: - dest[i] = float32(math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4]))) + dest[i] = math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])) pos += 4 continue @@ -1218,10 +1247,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { case isNull: dest[i] = nil continue - case rows.columns[i].fieldType == fieldTypeTime: + case rows.rs.columns[i].fieldType == fieldTypeTime: // database/sql does not support an equivalent to TIME, return a string var dstlen uint8 - switch decimals := rows.columns[i].decimals; decimals { + switch decimals := rows.rs.columns[i].decimals; decimals { case 0x00, 0x1f: dstlen = 8 case 1, 2, 3, 4, 5, 6: @@ -1229,7 +1258,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { default: return fmt.Errorf( "protocol error, illegal decimals value %d", - rows.columns[i].decimals, + rows.rs.columns[i].decimals, ) } dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen, true) @@ -1237,10 +1266,10 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) default: var dstlen uint8 - if rows.columns[i].fieldType == fieldTypeDate { + if rows.rs.columns[i].fieldType == fieldTypeDate { dstlen = 10 } else { - switch decimals := rows.columns[i].decimals; decimals { + switch decimals := rows.rs.columns[i].decimals; decimals { case 0x00, 0x1f: dstlen = 19 case 1, 2, 3, 4, 5, 6: @@ -1248,7 +1277,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { default: return fmt.Errorf( "protocol error, illegal decimals value %d", - rows.columns[i].decimals, + rows.rs.columns[i].decimals, ) } } @@ -1264,7 +1293,7 @@ func (rows *binaryRows) readRow(dest []driver.Value) error { // Please report if this happens! default: - return fmt.Errorf("unknown field type %d", rows.columns[i].fieldType) + return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType) } } diff --git a/vendor/github.com/go-sql-driver/mysql/rows.go b/vendor/github.com/go-sql-driver/mysql/rows.go index c08255eeec8d..d3b1e2822176 100644 --- a/vendor/github.com/go-sql-driver/mysql/rows.go +++ b/vendor/github.com/go-sql-driver/mysql/rows.go @@ -11,19 +11,20 @@ package mysql import ( "database/sql/driver" "io" + "math" + "reflect" ) -type mysqlField struct { - tableName string - name string - flags fieldFlag - fieldType byte - decimals byte +type resultSet struct { + columns []mysqlField + columnNames []string + done bool } type mysqlRows struct { - mc *mysqlConn - columns []mysqlField + mc *mysqlConn + rs resultSet + finish func() } type binaryRows struct { @@ -34,37 +35,86 @@ type textRows struct { mysqlRows } -type emptyRows struct{} - func (rows *mysqlRows) Columns() []string { - columns := make([]string, len(rows.columns)) + if rows.rs.columnNames != nil { + return rows.rs.columnNames + } + + columns := make([]string, len(rows.rs.columns)) if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { for i := range columns { - if tableName := rows.columns[i].tableName; len(tableName) > 0 { - columns[i] = tableName + "." + rows.columns[i].name + if tableName := rows.rs.columns[i].tableName; len(tableName) > 0 { + columns[i] = tableName + "." + rows.rs.columns[i].name } else { - columns[i] = rows.columns[i].name + columns[i] = rows.rs.columns[i].name } } } else { for i := range columns { - columns[i] = rows.columns[i].name + columns[i] = rows.rs.columns[i].name } } + + rows.rs.columnNames = columns return columns } -func (rows *mysqlRows) Close() error { +func (rows *mysqlRows) ColumnTypeDatabaseTypeName(i int) string { + return rows.rs.columns[i].typeDatabaseName() +} + +// func (rows *mysqlRows) ColumnTypeLength(i int) (length int64, ok bool) { +// return int64(rows.rs.columns[i].length), true +// } + +func (rows *mysqlRows) ColumnTypeNullable(i int) (nullable, ok bool) { + return rows.rs.columns[i].flags&flagNotNULL == 0, true +} + +func (rows *mysqlRows) ColumnTypePrecisionScale(i int) (int64, int64, bool) { + column := rows.rs.columns[i] + decimals := int64(column.decimals) + + switch column.fieldType { + case fieldTypeDecimal, fieldTypeNewDecimal: + if decimals > 0 { + return int64(column.length) - 2, decimals, true + } + return int64(column.length) - 1, decimals, true + case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeTime: + return decimals, decimals, true + case fieldTypeFloat, fieldTypeDouble: + if decimals == 0x1f { + return math.MaxInt64, math.MaxInt64, true + } + return math.MaxInt64, decimals, true + } + + return 0, 0, false +} + +func (rows *mysqlRows) ColumnTypeScanType(i int) reflect.Type { + return rows.rs.columns[i].scanType() +} + +func (rows *mysqlRows) Close() (err error) { + if f := rows.finish; f != nil { + f() + rows.finish = nil + } + mc := rows.mc if mc == nil { return nil } - if mc.netConn == nil { - return ErrInvalidConn + if err := mc.error(); err != nil { + return err } // Remove unread packets from stream - err := mc.readUntilEOF() + if !rows.rs.done { + err = mc.readUntilEOF() + } if err == nil { if err = mc.discardResults(); err != nil { return err @@ -75,22 +125,66 @@ func (rows *mysqlRows) Close() error { return err } -func (rows *binaryRows) Next(dest []driver.Value) error { - if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn +func (rows *mysqlRows) HasNextResultSet() (b bool) { + if rows.mc == nil { + return false + } + return rows.mc.status&statusMoreResultsExists != 0 +} + +func (rows *mysqlRows) nextResultSet() (int, error) { + if rows.mc == nil { + return 0, io.EOF + } + if err := rows.mc.error(); err != nil { + return 0, err + } + + // Remove unread packets from stream + if !rows.rs.done { + if err := rows.mc.readUntilEOF(); err != nil { + return 0, err } + rows.rs.done = true + } - // Fetch next row from stream - return rows.readRow(dest) + if !rows.HasNextResultSet() { + rows.mc = nil + return 0, io.EOF } - return io.EOF + rows.rs = resultSet{} + return rows.mc.readResultSetHeaderPacket() } -func (rows *textRows) Next(dest []driver.Value) error { +func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) { + for { + resLen, err := rows.nextResultSet() + if err != nil { + return 0, err + } + + if resLen > 0 { + return resLen, nil + } + + rows.rs.done = true + } +} + +func (rows *binaryRows) NextResultSet() error { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + +func (rows *binaryRows) Next(dest []driver.Value) error { if mc := rows.mc; mc != nil { - if mc.netConn == nil { - return ErrInvalidConn + if err := mc.error(); err != nil { + return err } // Fetch next row from stream @@ -99,14 +193,24 @@ func (rows *textRows) Next(dest []driver.Value) error { return io.EOF } -func (rows emptyRows) Columns() []string { - return nil -} +func (rows *textRows) NextResultSet() (err error) { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } -func (rows emptyRows) Close() error { - return nil + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err } -func (rows emptyRows) Next(dest []driver.Value) error { +func (rows *textRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if err := mc.error(); err != nil { + return err + } + + // Fetch next row from stream + return rows.readRow(dest) + } return io.EOF } diff --git a/vendor/github.com/go-sql-driver/mysql/statement.go b/vendor/github.com/go-sql-driver/mysql/statement.go index ead9a6bf4711..ce7fe4cd049d 100644 --- a/vendor/github.com/go-sql-driver/mysql/statement.go +++ b/vendor/github.com/go-sql-driver/mysql/statement.go @@ -11,6 +11,7 @@ package mysql import ( "database/sql/driver" "fmt" + "io" "reflect" "strconv" ) @@ -19,12 +20,14 @@ type mysqlStmt struct { mc *mysqlConn id uint32 paramCount int - columns []mysqlField // cached from the first query } func (stmt *mysqlStmt) Close() error { - if stmt.mc == nil || stmt.mc.netConn == nil { - errLog.Print(ErrInvalidConn) + if stmt.mc == nil || stmt.mc.closed.IsSet() { + // driver.Stmt.Close can be called more than once, thus this function + // has to be idempotent. + // See also Issue #450 and golang/go#16019. + //errLog.Print(ErrInvalidConn) return driver.ErrBadConn } @@ -42,14 +45,14 @@ func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { } func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { - if stmt.mc.netConn == nil { + if stmt.mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := stmt.writeExecutePacket(args) if err != nil { - return nil, err + return nil, stmt.mc.markBadConn(err) } mc := stmt.mc @@ -59,37 +62,45 @@ func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { // Read Result resLen, err := mc.readResultSetHeaderPacket() - if err == nil { - if resLen > 0 { - // Columns - err = mc.readUntilEOF() - if err != nil { - return nil, err - } - - // Rows - err = mc.readUntilEOF() + if err != nil { + return nil, err + } + + if resLen > 0 { + // Columns + if err = mc.readUntilEOF(); err != nil { + return nil, err } - if err == nil { - return &mysqlResult{ - affectedRows: int64(mc.affectedRows), - insertId: int64(mc.insertId), - }, nil + + // Rows + if err := mc.readUntilEOF(); err != nil { + return nil, err } } - return nil, err + if err := mc.discardResults(); err != nil { + return nil, err + } + + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, nil } func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { - if stmt.mc.netConn == nil { + return stmt.query(args) +} + +func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) { + if stmt.mc.closed.IsSet() { errLog.Print(ErrInvalidConn) return nil, driver.ErrBadConn } // Send command err := stmt.writeExecutePacket(args) if err != nil { - return nil, err + return nil, stmt.mc.markBadConn(err) } mc := stmt.mc @@ -104,14 +115,15 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { if resLen > 0 { rows.mc = mc - // Columns - // If not cached, read them and cache them - if stmt.columns == nil { - rows.columns, err = mc.readColumns(resLen) - stmt.columns = rows.columns - } else { - rows.columns = stmt.columns - err = mc.readUntilEOF() + rows.rs.columns, err = mc.readColumns(resLen) + } else { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err } } @@ -120,19 +132,36 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { type converter struct{} +// ConvertValue mirrors the reference/default converter in database/sql/driver +// with _one_ exception. We support uint64 with their high bit and the default +// implementation does not. This function should be kept in sync with +// database/sql/driver defaultConverter.ConvertValue() except for that +// deliberate difference. func (c converter) ConvertValue(v interface{}) (driver.Value, error) { if driver.IsValue(v) { return v, nil } + if vr, ok := v.(driver.Valuer); ok { + sv, err := callValuerValue(vr) + if err != nil { + return nil, err + } + if !driver.IsValue(sv) { + return nil, fmt.Errorf("non-Value type %T returned from Value", sv) + } + return sv, nil + } + rv := reflect.ValueOf(v) switch rv.Kind() { case reflect.Ptr: // indirect pointers if rv.IsNil() { return nil, nil + } else { + return c.ConvertValue(rv.Elem().Interface()) } - return c.ConvertValue(rv.Elem().Interface()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return rv.Int(), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: @@ -145,6 +174,38 @@ func (c converter) ConvertValue(v interface{}) (driver.Value, error) { return int64(u64), nil case reflect.Float32, reflect.Float64: return rv.Float(), nil + case reflect.Bool: + return rv.Bool(), nil + case reflect.Slice: + ek := rv.Type().Elem().Kind() + if ek == reflect.Uint8 { + return rv.Bytes(), nil + } + return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek) + case reflect.String: + return rv.String(), nil } return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) } + +var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() + +// callValuerValue returns vr.Value(), with one exception: +// If vr.Value is an auto-generated method on a pointer type and the +// pointer is nil, it would panic at runtime in the panicwrap +// method. Treat it like nil instead. +// +// This is so people can implement driver.Value on value types and +// still use nil pointers to those types to mean nil/NULL, just like +// string/*string. +// +// This is an exact copy of the same-named unexported function from the +// database/sql package. +func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { + if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && + rv.IsNil() && + rv.Type().Elem().Implements(valuerReflectType) { + return nil, nil + } + return vr.Value() +} diff --git a/vendor/github.com/go-sql-driver/mysql/transaction.go b/vendor/github.com/go-sql-driver/mysql/transaction.go index 33c749b35c49..417d72793b1f 100644 --- a/vendor/github.com/go-sql-driver/mysql/transaction.go +++ b/vendor/github.com/go-sql-driver/mysql/transaction.go @@ -13,7 +13,7 @@ type mysqlTx struct { } func (tx *mysqlTx) Commit() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { + if tx.mc == nil || tx.mc.closed.IsSet() { return ErrInvalidConn } err = tx.mc.exec("COMMIT") @@ -22,7 +22,7 @@ func (tx *mysqlTx) Commit() (err error) { } func (tx *mysqlTx) Rollback() (err error) { - if tx.mc == nil || tx.mc.netConn == nil { + if tx.mc == nil || tx.mc.closed.IsSet() { return ErrInvalidConn } err = tx.mc.exec("ROLLBACK") diff --git a/vendor/github.com/go-sql-driver/mysql/utils.go b/vendor/github.com/go-sql-driver/mysql/utils.go index d523b7ffdff5..84d595b6ba6e 100644 --- a/vendor/github.com/go-sql-driver/mysql/utils.go +++ b/vendor/github.com/go-sql-driver/mysql/utils.go @@ -9,23 +9,29 @@ package mysql import ( - "crypto/sha1" "crypto/tls" "database/sql/driver" "encoding/binary" "fmt" "io" "strings" + "sync" + "sync/atomic" "time" ) +// Registry for custom tls.Configs var ( - tlsConfigRegister map[string]*tls.Config // Register for custom tls.Configs + tlsConfigLock sync.RWMutex + tlsConfigRegistry map[string]*tls.Config ) // RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. // Use the key as a value in the DSN where tls=value. // +// Note: The provided tls.Config is exclusively owned by the driver after +// registering it. +// // rootCertPool := x509.NewCertPool() // pem, err := ioutil.ReadFile("/path/ca-cert.pem") // if err != nil { @@ -51,19 +57,32 @@ func RegisterTLSConfig(key string, config *tls.Config) error { return fmt.Errorf("key '%s' is reserved", key) } - if tlsConfigRegister == nil { - tlsConfigRegister = make(map[string]*tls.Config) + tlsConfigLock.Lock() + if tlsConfigRegistry == nil { + tlsConfigRegistry = make(map[string]*tls.Config) } - tlsConfigRegister[key] = config + tlsConfigRegistry[key] = config + tlsConfigLock.Unlock() return nil } // DeregisterTLSConfig removes the tls.Config associated with key. func DeregisterTLSConfig(key string) { - if tlsConfigRegister != nil { - delete(tlsConfigRegister, key) + tlsConfigLock.Lock() + if tlsConfigRegistry != nil { + delete(tlsConfigRegistry, key) } + tlsConfigLock.Unlock() +} + +func getTLSConfigClone(key string) (config *tls.Config) { + tlsConfigLock.RLock() + if v, ok := tlsConfigRegistry[key]; ok { + config = cloneTLSConfig(v) + } + tlsConfigLock.RUnlock() + return } // Returns the bool value of the input. @@ -80,119 +99,6 @@ func readBool(input string) (value bool, valid bool) { return } -/****************************************************************************** -* Authentication * -******************************************************************************/ - -// Encrypt password using 4.1+ method -func scramblePassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - // stage1Hash = SHA1(password) - crypt := sha1.New() - crypt.Write(password) - stage1 := crypt.Sum(nil) - - // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) - // inner Hash - crypt.Reset() - crypt.Write(stage1) - hash := crypt.Sum(nil) - - // outer Hash - crypt.Reset() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= stage1[i] - } - return scramble -} - -// Encrypt password using pre 4.1 (old password) method -// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c -type myRnd struct { - seed1, seed2 uint32 -} - -const myRndMaxVal = 0x3FFFFFFF - -// Pseudo random number generator -func newMyRnd(seed1, seed2 uint32) *myRnd { - return &myRnd{ - seed1: seed1 % myRndMaxVal, - seed2: seed2 % myRndMaxVal, - } -} - -// Tested to be equivalent to MariaDB's floating point variant -// http://play.golang.org/p/QHvhd4qved -// http://play.golang.org/p/RG0q4ElWDx -func (r *myRnd) NextByte() byte { - r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal - r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal - - return byte(uint64(r.seed1) * 31 / myRndMaxVal) -} - -// Generate binary hash from byte string using insecure pre 4.1 method -func pwHash(password []byte) (result [2]uint32) { - var add uint32 = 7 - var tmp uint32 - - result[0] = 1345345333 - result[1] = 0x12345671 - - for _, c := range password { - // skip spaces and tabs in password - if c == ' ' || c == '\t' { - continue - } - - tmp = uint32(c) - result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) - result[1] += (result[1] << 8) ^ result[0] - add += tmp - } - - // Remove sign bit (1<<31)-1) - result[0] &= 0x7FFFFFFF - result[1] &= 0x7FFFFFFF - - return -} - -// Encrypt password using insecure pre 4.1 method -func scrambleOldPassword(scramble, password []byte) []byte { - if len(password) == 0 { - return nil - } - - scramble = scramble[:8] - - hashPw := pwHash(password) - hashSc := pwHash(scramble) - - r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) - - var out [8]byte - for i := range out { - out[i] = r.NextByte() + 64 - } - - mask := r.NextByte() - for i := range out { - out[i] ^= mask - } - - return out[:] -} - /****************************************************************************** * Time related utils * ******************************************************************************/ @@ -519,7 +425,7 @@ func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { // Check data length if len(b) >= n { - return b[n-int(num) : n], false, n, nil + return b[n-int(num) : n : n], false, n, nil } return nil, false, n, io.EOF } @@ -548,8 +454,8 @@ func readLengthEncodedInteger(b []byte) (uint64, bool, int) { if len(b) == 0 { return 0, true, 1 } - switch b[0] { + switch b[0] { // 251: NULL case 0xfb: return 0, true, 1 @@ -738,3 +644,67 @@ func escapeStringQuotes(buf []byte, v string) []byte { return buf[:pos] } + +/****************************************************************************** +* Sync utils * +******************************************************************************/ + +// noCopy may be embedded into structs which must not be copied +// after the first use. +// +// See https://github.com/golang/go/issues/8005#issuecomment-190753527 +// for details. +type noCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*noCopy) Lock() {} + +// atomicBool is a wrapper around uint32 for usage as a boolean value with +// atomic access. +type atomicBool struct { + _noCopy noCopy + value uint32 +} + +// IsSet returns wether the current boolean value is true +func (ab *atomicBool) IsSet() bool { + return atomic.LoadUint32(&ab.value) > 0 +} + +// Set sets the value of the bool regardless of the previous value +func (ab *atomicBool) Set(value bool) { + if value { + atomic.StoreUint32(&ab.value, 1) + } else { + atomic.StoreUint32(&ab.value, 0) + } +} + +// TrySet sets the value of the bool and returns wether the value changed +func (ab *atomicBool) TrySet(value bool) bool { + if value { + return atomic.SwapUint32(&ab.value, 1) == 0 + } + return atomic.SwapUint32(&ab.value, 0) > 0 +} + +// atomicError is a wrapper for atomically accessed error values +type atomicError struct { + _noCopy noCopy + value atomic.Value +} + +// Set sets the error value regardless of the previous value. +// The value must not be nil +func (ae *atomicError) Set(value error) { + ae.value.Store(value) +} + +// Value returns the current error value +func (ae *atomicError) Value() error { + if v := ae.value.Load(); v != nil { + // this will panic if the value doesn't implement the error interface + return v.(error) + } + return nil +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go17.go b/vendor/github.com/go-sql-driver/mysql/utils_go17.go new file mode 100644 index 000000000000..f5956345674d --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go17.go @@ -0,0 +1,40 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.7 +// +build !go1.8 + +package mysql + +import "crypto/tls" + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return &tls.Config{ + Rand: c.Rand, + Time: c.Time, + Certificates: c.Certificates, + NameToCertificate: c.NameToCertificate, + GetCertificate: c.GetCertificate, + RootCAs: c.RootCAs, + NextProtos: c.NextProtos, + ServerName: c.ServerName, + ClientAuth: c.ClientAuth, + ClientCAs: c.ClientCAs, + InsecureSkipVerify: c.InsecureSkipVerify, + CipherSuites: c.CipherSuites, + PreferServerCipherSuites: c.PreferServerCipherSuites, + SessionTicketsDisabled: c.SessionTicketsDisabled, + SessionTicketKey: c.SessionTicketKey, + ClientSessionCache: c.ClientSessionCache, + MinVersion: c.MinVersion, + MaxVersion: c.MaxVersion, + CurvePreferences: c.CurvePreferences, + DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, + Renegotiation: c.Renegotiation, + } +} diff --git a/vendor/github.com/go-sql-driver/mysql/utils_go18.go b/vendor/github.com/go-sql-driver/mysql/utils_go18.go new file mode 100644 index 000000000000..c35c2a6aabfe --- /dev/null +++ b/vendor/github.com/go-sql-driver/mysql/utils_go18.go @@ -0,0 +1,50 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build go1.8 + +package mysql + +import ( + "crypto/tls" + "database/sql" + "database/sql/driver" + "errors" + "fmt" +) + +func cloneTLSConfig(c *tls.Config) *tls.Config { + return c.Clone() +} + +func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { + dargs := make([]driver.Value, len(named)) + for n, param := range named { + if len(param.Name) > 0 { + // TODO: support the use of Named Parameters #561 + return nil, errors.New("mysql: driver does not support the use of Named Parameters") + } + dargs[n] = param.Value + } + return dargs, nil +} + +func mapIsolationLevel(level driver.IsolationLevel) (string, error) { + switch sql.IsolationLevel(level) { + case sql.LevelRepeatableRead: + return "REPEATABLE READ", nil + case sql.LevelReadCommitted: + return "READ COMMITTED", nil + case sql.LevelReadUncommitted: + return "READ UNCOMMITTED", nil + case sql.LevelSerializable: + return "SERIALIZABLE", nil + default: + return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) + } +} From 2267279129c99443938cd5c9f0d8b512334e43f0 Mon Sep 17 00:00:00 2001 From: Clar Charr Date: Tue, 3 Jul 2018 18:10:35 -0400 Subject: [PATCH 066/447] Increase default TOTP secret size to 320 bits (#4287) --- routers/user/setting/security_twofa.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/user/setting/security_twofa.go b/routers/user/setting/security_twofa.go index 55101ed1a489..cb61b9e27025 100644 --- a/routers/user/setting/security_twofa.go +++ b/routers/user/setting/security_twofa.go @@ -76,6 +76,7 @@ func twofaGenerateSecretAndQr(ctx *context.Context) bool { if otpKey == nil { err = nil // clear the error, in case the URL was invalid otpKey, err = totp.Generate(totp.GenerateOpts{ + SecretSize: 40, Issuer: setting.AppName + " (" + strings.TrimRight(setting.AppURL, "/") + ")", AccountName: ctx.User.Name, }) From 90e90a7019065b575c5be8c391226102ae82153f Mon Sep 17 00:00:00 2001 From: Pofilo Date: Wed, 4 Jul 2018 01:03:31 +0200 Subject: [PATCH 067/447] #4354 Fix translation (#4355) --- options/locale/locale_en-US.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 21ae775e4197..be0489680a54 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1273,8 +1273,8 @@ dashboard.operation_switch = Switch dashboard.operation_run = Run dashboard.clean_unbind_oauth = Clean unbound OAuth connections dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted. -dashboard.delete_inactivate_accounts = Delete all inactive accounts -dashboard.delete_inactivate_accounts_success = All inactive accounts have been deleted. +dashboard.delete_inactivate_accounts = Delete all not activated accounts +dashboard.delete_inactivate_accounts_success = All not activated accounts have been deleted. dashboard.delete_repo_archives = Delete all repository archives dashboard.delete_repo_archives_success = All repository archives have been deleted. dashboard.delete_missing_repos = Delete all repositories missing their Git files From d1cbebf4e9ed063cd43aaac0db6d1df2df942ac6 Mon Sep 17 00:00:00 2001 From: ucodi <40141083+ucodi@users.noreply.github.com> Date: Tue, 3 Jul 2018 23:16:46 +0000 Subject: [PATCH 068/447] Update notification icon (#4343) --- templates/base/head.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/base/head.tmpl b/templates/base/head.tmpl index fb9611cb62c8..53d3de1e912d 100644 --- a/templates/base/head.tmpl +++ b/templates/base/head.tmpl @@ -174,7 +174,7 @@
diff --git a/templates/home.tmpl b/templates/home.tmpl index d115d8298c75..4e03c0c1aefe 100644 --- a/templates/home.tmpl +++ b/templates/home.tmpl @@ -20,7 +20,7 @@ Einfach zu installieren

- Starte einfach die Anwendung für deine Plattform. Gitea gibt es auch für Docker, Vagrant oder als Installationspaket. + Starte einfach die Anwendung für deine Plattform. Gitea gibt es auch für Docker, Vagrant oder als Installationspaket.

@@ -28,7 +28,7 @@ Plattformübergreifend

- Gitea läuft überall. Go kompiliert für: Windows, macOS, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt! + Gitea läuft überall. Go kompiliert für: Windows, macOS, Linux, ARM, etc. Wähle dasjenige System, was dir am meisten gefällt!

@@ -46,7 +46,7 @@ Quelloffen

- Der komplette Code befindet sich auf GitHub! Unterstütze uns bei der Verbesserung dieses Projekts. Trau dich! + Der komplette Code befindet sich auf GitHub! Unterstütze uns bei der Verbesserung dieses Projekts. Trau dich!

@@ -57,7 +57,7 @@ 易安裝

- 直接用 執行檔安裝,還可以透過 DockerVagrant,以及 套件安装。 + 直接用 執行檔安裝,還可以透過 DockerVagrant,以及 套件安装。

@@ -65,7 +65,7 @@ 跨平台

- Gitea 可以運作在任何 Go 語言能夠編譯的平台: Windows, macOS, Linux, ARM 等等。挑一個您喜歡的就好。 + Gitea 可以運作在任何 Go 語言能夠編譯的平台: Windows, macOS, Linux, ARM 等等。挑一個您喜歡的就好。

@@ -83,7 +83,7 @@ 開源化

- 所有程式碼都在 GitHub 上,加入我們讓 Gitea 更好,別害羞,你可以做到的。 + 所有程式碼都在 GitHub 上,加入我們讓 Gitea 更好,別害羞,你可以做到的。

@@ -94,7 +94,7 @@ 易安装

- 您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。 + 您除了可以根据操作系统平台通过 二进制运行,还可以通过 DockerVagrant,以及 包管理 安装。

@@ -102,7 +102,7 @@ 跨平台

- 任何 Go 语言 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行! + 任何 Go 语言 支持的平台都可以运行 Gitea,包括 Windows、Mac、Linux 以及 ARM。挑一个您喜欢的就行!

@@ -120,7 +120,7 @@ 开源化

- 所有的代码都开源在 GitHub 上,赶快加入我们来共同发展这个伟大的项目!还等什么?成为贡献者吧! + 所有的代码都开源在 GitHub 上,赶快加入我们来共同发展这个伟大的项目!还等什么?成为贡献者吧!

@@ -131,10 +131,10 @@ Facile à installer

- Il suffit de lancer l'exécutable correspondant à votre système. - Ou d'utiliser Gitea avec Docker ou - Vagrant - ou en l'installant depuis un package. + Il suffit de lancer l'exécutable correspondant à votre système. + Ou d'utiliser Gitea avec Docker ou + Vagrant + ou en l'installant depuis un package.

@@ -142,7 +142,7 @@ Multi-plateforme

- Gitea tourne partout où Go peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré ! + Gitea tourne partout où Go peut être compilé : Windows, macOS, Linux, ARM, etc. Choisissez votre préféré !

@@ -160,7 +160,7 @@ Open Source

- Toutes les sources sont sur GitHub ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur. + Toutes les sources sont sur GitHub ! Rejoignez-nous et contribuez à rendre ce projet encore meilleur.

@@ -171,7 +171,7 @@ Fácil de instalar

- Simplemente arranca el binario para tu plataforma. O usa Gitea con Docker o Vagrant, o utilice el paquete. + Simplemente arranca el binario para tu plataforma. O usa Gitea con Docker o Vagrant, o utilice el paquete.

@@ -179,7 +179,7 @@ Multiplatforma

- Gitea funciona en cualquier parte, Go puede compilarse en: Windows, macOS, Linux, ARM, etc. !Elige tu favorita! + Gitea funciona en cualquier parte, Go puede compilarse en: Windows, macOS, Linux, ARM, etc. !Elige tu favorita!

@@ -197,7 +197,7 @@ Open Source

- ¡Está todo en GitHub! Uniros contribuyendo a hacer este proyecto todavía mejor. ¡No seas tímido y colabora! + ¡Está todo en GitHub! Uniros contribuyendo a hacer este proyecto todavía mejor. ¡No seas tímido y colabora!

@@ -208,7 +208,7 @@ Fácil de instalar

- Simplesmente rode o executável para o seu sistema operacional. Ou obtenha o Gitea com o Docker ou Vagrant, ou baixe o pacote. + Simplesmente rode o executável para o seu sistema operacional. Ou obtenha o Gitea com o Docker ou Vagrant, ou baixe o pacote.

@@ -216,7 +216,7 @@ Multi-plataforma

- Gitea roda em qualquer sistema operacional em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais! + Gitea roda em qualquer sistema operacional em que Go consegue compilar: Windows, macOS, Linux, ARM, etc. Escolha qual você gosta mais!

@@ -234,7 +234,7 @@ Código aberto

- Está tudo no GitHub! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir! + Está tudo no GitHub! Contribua e torne este projeto ainda melhor. Não tenha vergonha de contribuir!

@@ -245,7 +245,7 @@ Простой в установке

- Просто запустите исполняемый файл для вашей платформы. Изпользуйте Gitea с Docker или Vagrant, или загрузите пакет. + Просто запустите исполняемый файл для вашей платформы. Изпользуйте Gitea с Docker или Vagrant, или загрузите пакет.

@@ -253,7 +253,7 @@ Кроссплатформенный

- Gitea работает на любой операционной системе, которая может компилировать Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится! + Gitea работает на любой операционной системе, которая может компилировать Go: Windows, macOS, Linux, ARM и т. д. Выбирайте, что вам больше нравится!

@@ -271,7 +271,7 @@ Открытый исходный код

- Всё это на GitHub! Присоединяйтесь к нам, внося вклад, чтобы сделать этот проект еще лучше. Не бойтесь помогать! + Всё это на GitHub! Присоединяйтесь к нам, внося вклад, чтобы сделать этот проект еще лучше. Не бойтесь помогать!

@@ -282,7 +282,7 @@ Makkelijk te installeren

- Je hoeft alleen maar de binary uit te voeren. Of gebruik Gitea met Docker, Vagrant, of download een installatiepakket. + Je hoeft alleen maar de binary uit te voeren. Of gebruik Gitea met Docker, Vagrant, of download een installatiepakket.

@@ -290,7 +290,7 @@ Cross-platform

- Gitea werkt op alles waar Go op kan compileren: Windows, macOS, Linux, ARM, etc. Kies het platform dat bij je past! + Gitea werkt op alles waar Go op kan compileren: Windows, macOS, Linux, ARM, etc. Kies het platform dat bij je past!

@@ -308,7 +308,7 @@ Open Source

- Alles staat op GitHub! Help ons door mee te bouwen aan Gitea, samen maken we dit project nog beter. Aarzel dus niet om een bijdrage te leveren! + Alles staat op GitHub! Help ons door mee te bouwen aan Gitea, samen maken we dit project nog beter. Aarzel dus niet om een bijdrage te leveren!

@@ -319,7 +319,7 @@ Easy to install

- Simply run the binary for your platform. Or ship Gitea with Docker or Vagrant, or get it packaged. + Simply run the binary for your platform. Or ship Gitea with Docker or Vagrant, or get it packaged.

@@ -327,7 +327,7 @@ Cross-platform

- Gitea runs anywhere Go can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love! + Gitea runs anywhere Go can compile for: Windows, macOS, Linux, ARM, etc. Choose the one you love!

@@ -345,7 +345,7 @@ Open Source

- It's all on GitHub! Join us by contributing to make this project even better. Don't be shy to be a contributor! + It's all on GitHub! Join us by contributing to make this project even better. Don't be shy to be a contributor!

diff --git a/templates/mail/auth/activate.tmpl b/templates/mail/auth/activate.tmpl index ac552ca64747..0f6afc196bc2 100644 --- a/templates/mail/auth/activate.tmpl +++ b/templates/mail/auth/activate.tmpl @@ -10,6 +10,6 @@

Please click the following link to activate your account within {{.ActiveCodeLives}}:

{{AppUrl}}user/activate?code={{.Code}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/activate_email.tmpl b/templates/mail/auth/activate_email.tmpl index 5111de06c567..7c47aaa7b8fc 100644 --- a/templates/mail/auth/activate_email.tmpl +++ b/templates/mail/auth/activate_email.tmpl @@ -10,6 +10,6 @@

Please click the following link to verify your email address within {{.ActiveCodeLives}}:

{{AppUrl}}user/activate_email?code={{.Code}}&email={{.Email}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/register_notify.tmpl b/templates/mail/auth/register_notify.tmpl index a896f0e59d76..4c2a9c43ad3e 100644 --- a/templates/mail/auth/register_notify.tmpl +++ b/templates/mail/auth/register_notify.tmpl @@ -10,6 +10,6 @@

You can now login via username: {{.Username}}.

{{AppUrl}}user/login

If this account has been created for you, please reset your password first.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/mail/auth/reset_passwd.tmpl b/templates/mail/auth/reset_passwd.tmpl index ea233d8f5d8e..0a09c47e8508 100644 --- a/templates/mail/auth/reset_passwd.tmpl +++ b/templates/mail/auth/reset_passwd.tmpl @@ -10,6 +10,6 @@

Please click the following link to reset your password within {{.ResetPwdCodeLives}}:

{{AppUrl}}user/reset_password?code={{.Code}}

Not working? Try copying and pasting it to your browser.

-

© {{AppName}}

+

© {{AppName}}

diff --git a/templates/org/home.tmpl b/templates/org/home.tmpl index 0b5ae0facba1..13b557bd7a01 100644 --- a/templates/org/home.tmpl +++ b/templates/org/home.tmpl @@ -12,7 +12,7 @@ {{if .Org.Description}}

{{.Org.Description}}

{{end}}
{{if .Org.Location}}
{{.Org.Location}}
{{end}} - {{if .Org.Website}}{{end}} + {{if .Org.Website}}{{end}}
diff --git a/templates/repo/commit_status.tmpl b/templates/repo/commit_status.tmpl index d5f75c132a9d..f5bbbb02d61d 100644 --- a/templates/repo/commit_status.tmpl +++ b/templates/repo/commit_status.tmpl @@ -1,15 +1,15 @@ {{if eq .State "pending"}} - + {{end}} {{if eq .State "success"}} - + {{end}} {{if eq .State "error"}} - + {{end}} {{if eq .State "failure"}} - + {{end}} {{if eq .State "warning"}} - -{{end}} \ No newline at end of file + +{{end}} diff --git a/templates/repo/header.tmpl b/templates/repo/header.tmpl index 6f54cb9f61f7..a496b9b9124f 100644 --- a/templates/repo/header.tmpl +++ b/templates/repo/header.tmpl @@ -8,7 +8,7 @@ {{.Owner.Name}}
/
{{.Name}} - {{if .IsMirror}}
{{$.i18n.Tr "repo.mirror_from"}} {{$.Mirror.Address}}
{{end}} + {{if .IsMirror}}
{{$.i18n.Tr "repo.mirror_from"}} {{$.Mirror.Address}}
{{end}} {{if .IsFork}}
{{$.i18n.Tr "repo.forked_from"}} {{SubStr .BaseRepo.RelLink 1 -1}}
{{end}} @@ -60,7 +60,7 @@ {{end}} {{if .Repository.UnitEnabled $.UnitTypeExternalTracker}} - + {{.i18n.Tr "repo.issues"}} {{end}} @@ -78,7 +78,7 @@ {{end}} {{if or (.Repository.UnitEnabled $.UnitTypeWiki) (.Repository.UnitEnabled $.UnitTypeExternalWiki)}} - + {{.i18n.Tr "repo.wiki"}} {{end}} diff --git a/templates/repo/issue/labels.tmpl b/templates/repo/issue/labels.tmpl index 3e360cb726f9..38d914520635 100644 --- a/templates/repo/issue/labels.tmpl +++ b/templates/repo/issue/labels.tmpl @@ -63,7 +63,7 @@
DatabaseDefaultCharset-->SystemDefaultCharset. - // TODO: change TableOption parser to parse collate. - // This is a tmp solution. - return "utf8", "utf8_unicode_ci" -} - -func setColumnFlagWithConstraint(colMap map[string]*column.Col, v *ast.Constraint) { - switch v.Tp { - case ast.ConstraintPrimaryKey: - for _, key := range v.Keys { - c, ok := colMap[key.Column.Name.L] - if !ok { - // TODO: table constraint on unknown column. - continue - } - c.Flag |= mysql.PriKeyFlag - // Primary key can not be NULL. - c.Flag |= mysql.NotNullFlag - } - case ast.ConstraintUniq, ast.ConstraintUniqIndex, ast.ConstraintUniqKey: - for i, key := range v.Keys { - c, ok := colMap[key.Column.Name.L] - if !ok { - // TODO: table constraint on unknown column. - continue - } - if i == 0 { - // Only the first column can be set - // if unique index has multi columns, - // the flag should be MultipleKeyFlag. - // See: https://dev.mysql.com/doc/refman/5.7/en/show-columns.html - if len(v.Keys) > 1 { - c.Flag |= mysql.MultipleKeyFlag - } else { - c.Flag |= mysql.UniqueKeyFlag - } - } - } - case ast.ConstraintKey, ast.ConstraintIndex: - for i, key := range v.Keys { - c, ok := colMap[key.Column.Name.L] - if !ok { - // TODO: table constraint on unknown column. - continue - } - if i == 0 { - // Only the first column can be set. - c.Flag |= mysql.MultipleKeyFlag - } - } - } -} - -func (d *ddl) buildColumnsAndConstraints(ctx context.Context, colDefs []*ast.ColumnDef, - constraints []*ast.Constraint) ([]*column.Col, []*ast.Constraint, error) { - var cols []*column.Col - colMap := map[string]*column.Col{} - for i, colDef := range colDefs { - col, cts, err := d.buildColumnAndConstraint(ctx, i, colDef) - if err != nil { - return nil, nil, errors.Trace(err) - } - col.State = model.StatePublic - constraints = append(constraints, cts...) - cols = append(cols, col) - colMap[colDef.Name.Name.L] = col - } - // traverse table Constraints and set col.flag - for _, v := range constraints { - setColumnFlagWithConstraint(colMap, v) - } - return cols, constraints, nil -} - -func (d *ddl) buildColumnAndConstraint(ctx context.Context, offset int, - colDef *ast.ColumnDef) (*column.Col, []*ast.Constraint, error) { - // Set charset. - if len(colDef.Tp.Charset) == 0 { - switch colDef.Tp.Tp { - case mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - colDef.Tp.Charset, colDef.Tp.Collate = getDefaultCharsetAndCollate() - default: - colDef.Tp.Charset = charset.CharsetBin - colDef.Tp.Collate = charset.CharsetBin - } - } - - col, cts, err := columnDefToCol(ctx, offset, colDef) - if err != nil { - return nil, nil, errors.Trace(err) - } - - col.ID, err = d.genGlobalID() - if err != nil { - return nil, nil, errors.Trace(err) - } - - return col, cts, nil -} - -// columnDefToCol converts ColumnDef to Col and TableConstraints. -func columnDefToCol(ctx context.Context, offset int, colDef *ast.ColumnDef) (*column.Col, []*ast.Constraint, error) { - constraints := []*ast.Constraint{} - col := &column.Col{ - ColumnInfo: model.ColumnInfo{ - Offset: offset, - Name: colDef.Name.Name, - FieldType: *colDef.Tp, - }, - } - - // Check and set TimestampFlag and OnUpdateNowFlag. - if col.Tp == mysql.TypeTimestamp { - col.Flag |= mysql.TimestampFlag - col.Flag |= mysql.OnUpdateNowFlag - col.Flag |= mysql.NotNullFlag - } - - // If flen is not assigned, assigned it by type. - if col.Flen == types.UnspecifiedLength { - col.Flen = mysql.GetDefaultFieldLength(col.Tp) - } - if col.Decimal == types.UnspecifiedLength { - col.Decimal = mysql.GetDefaultDecimal(col.Tp) - } - - setOnUpdateNow := false - hasDefaultValue := false - if colDef.Options != nil { - keys := []*ast.IndexColName{ - { - Column: colDef.Name, - Length: colDef.Tp.Flen, - }, - } - for _, v := range colDef.Options { - switch v.Tp { - case ast.ColumnOptionNotNull: - col.Flag |= mysql.NotNullFlag - case ast.ColumnOptionNull: - col.Flag &= ^uint(mysql.NotNullFlag) - removeOnUpdateNowFlag(col) - case ast.ColumnOptionAutoIncrement: - col.Flag |= mysql.AutoIncrementFlag - case ast.ColumnOptionPrimaryKey: - constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.PriKeyFlag - case ast.ColumnOptionUniq: - constraint := &ast.Constraint{Tp: ast.ConstraintUniq, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.UniqueKeyFlag - case ast.ColumnOptionIndex: - constraint := &ast.Constraint{Tp: ast.ConstraintIndex, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - case ast.ColumnOptionUniqIndex: - constraint := &ast.Constraint{Tp: ast.ConstraintUniqIndex, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.UniqueKeyFlag - case ast.ColumnOptionKey: - constraint := &ast.Constraint{Tp: ast.ConstraintKey, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - case ast.ColumnOptionUniqKey: - constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Name: colDef.Name.Name.O, Keys: keys} - constraints = append(constraints, constraint) - col.Flag |= mysql.UniqueKeyFlag - case ast.ColumnOptionDefaultValue: - value, err := getDefaultValue(ctx, v, colDef.Tp.Tp, colDef.Tp.Decimal) - if err != nil { - return nil, nil, errors.Errorf("invalid default value - %s", errors.Trace(err)) - } - col.DefaultValue = value - hasDefaultValue = true - removeOnUpdateNowFlag(col) - case ast.ColumnOptionOnUpdate: - if !evaluator.IsCurrentTimeExpr(v.Expr) { - return nil, nil, errors.Errorf("invalid ON UPDATE for - %s", col.Name) - } - - col.Flag |= mysql.OnUpdateNowFlag - setOnUpdateNow = true - case ast.ColumnOptionFulltext, ast.ColumnOptionComment: - // Do nothing. - } - } - } - - setTimestampDefaultValue(col, hasDefaultValue, setOnUpdateNow) - - // Set `NoDefaultValueFlag` if this field doesn't have a default value and - // it is `not null` and not an `AUTO_INCREMENT` field or `TIMESTAMP` field. - setNoDefaultValueFlag(col, hasDefaultValue) - - err := checkDefaultValue(col, hasDefaultValue) - if err != nil { - return nil, nil, errors.Trace(err) - } - if col.Charset == charset.CharsetBin { - col.Flag |= mysql.BinaryFlag - } - return col, constraints, nil -} - -func getDefaultValue(ctx context.Context, c *ast.ColumnOption, tp byte, fsp int) (interface{}, error) { - if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { - value, err := evaluator.GetTimeValue(ctx, c.Expr, tp, fsp) - if err != nil { - return nil, errors.Trace(err) - } - - // Value is nil means `default null`. - if value == nil { - return nil, nil - } - - // If value is mysql.Time, convert it to string. - if vv, ok := value.(mysql.Time); ok { - return vv.String(), nil - } - - return value, nil - } - v, err := evaluator.Eval(ctx, c.Expr) - if err != nil { - return nil, errors.Trace(err) - } - return v, nil -} - -func removeOnUpdateNowFlag(c *column.Col) { - // For timestamp Col, if it is set null or default value, - // OnUpdateNowFlag should be removed. - if mysql.HasTimestampFlag(c.Flag) { - c.Flag &= ^uint(mysql.OnUpdateNowFlag) - } -} - -func setTimestampDefaultValue(c *column.Col, hasDefaultValue bool, setOnUpdateNow bool) { - if hasDefaultValue { - return - } - - // For timestamp Col, if is not set default value or not set null, use current timestamp. - if mysql.HasTimestampFlag(c.Flag) && mysql.HasNotNullFlag(c.Flag) { - if setOnUpdateNow { - c.DefaultValue = evaluator.ZeroTimestamp - } else { - c.DefaultValue = evaluator.CurrentTimestamp - } - } -} - -func setNoDefaultValueFlag(c *column.Col, hasDefaultValue bool) { - if hasDefaultValue { - return - } - - if !mysql.HasNotNullFlag(c.Flag) { - return - } - - // Check if it is an `AUTO_INCREMENT` field or `TIMESTAMP` field. - if !mysql.HasAutoIncrementFlag(c.Flag) && !mysql.HasTimestampFlag(c.Flag) { - c.Flag |= mysql.NoDefaultValueFlag - } -} - -func checkDefaultValue(c *column.Col, hasDefaultValue bool) error { - if !hasDefaultValue { - return nil - } - - if c.DefaultValue != nil { - return nil - } - - // Set not null but default null is invalid. - if mysql.HasNotNullFlag(c.Flag) { - return errors.Errorf("invalid default value for %s", c.Name) - } - - return nil -} - -func checkDuplicateColumn(colDefs []*ast.ColumnDef) error { - colNames := map[string]bool{} - for _, colDef := range colDefs { - nameLower := colDef.Name.Name.O - if colNames[nameLower] { - return errors.Errorf("CREATE TABLE: duplicate column %s", colDef.Name) - } - colNames[nameLower] = true - } - return nil -} - -func checkConstraintNames(constraints []*ast.Constraint) error { - constrNames := map[string]bool{} - - // Check not empty constraint name whether is duplicated. - for _, constr := range constraints { - if constr.Tp == ast.ConstraintForeignKey { - // Ignore foreign key. - continue - } - if constr.Name != "" { - nameLower := strings.ToLower(constr.Name) - if constrNames[nameLower] { - return errors.Errorf("CREATE TABLE: duplicate key %s", constr.Name) - } - constrNames[nameLower] = true - } - } - - // Set empty constraint names. - for _, constr := range constraints { - if constr.Name == "" && len(constr.Keys) > 0 { - colName := constr.Keys[0].Column.Name.O - constrName := colName - i := 2 - for constrNames[strings.ToLower(constrName)] { - // We loop forever until we find constrName that haven't been used. - constrName = fmt.Sprintf("%s_%d", colName, i) - i++ - } - constr.Name = constrName - constrNames[constrName] = true - } - } - return nil -} - -func (d *ddl) buildTableInfo(tableName model.CIStr, cols []*column.Col, constraints []*ast.Constraint) (tbInfo *model.TableInfo, err error) { - tbInfo = &model.TableInfo{ - Name: tableName, - } - tbInfo.ID, err = d.genGlobalID() - if err != nil { - return nil, errors.Trace(err) - } - for _, v := range cols { - tbInfo.Columns = append(tbInfo.Columns, &v.ColumnInfo) - } - for _, constr := range constraints { - if constr.Tp == ast.ConstraintPrimaryKey { - if len(constr.Keys) == 1 { - key := constr.Keys[0] - col := column.FindCol(cols, key.Column.Name.O) - if col == nil { - return nil, errors.Errorf("No such column: %v", key) - } - switch col.Tp { - case mysql.TypeLong, mysql.TypeLonglong: - tbInfo.PKIsHandle = true - // Avoid creating index for PK handle column. - continue - } - } - } - - // 1. check if the column is exists - // 2. add index - indexColumns := make([]*model.IndexColumn, 0, len(constr.Keys)) - for _, key := range constr.Keys { - col := column.FindCol(cols, key.Column.Name.O) - if col == nil { - return nil, errors.Errorf("No such column: %v", key) - } - indexColumns = append(indexColumns, &model.IndexColumn{ - Name: key.Column.Name, - Offset: col.Offset, - Length: key.Length, - }) - } - idxInfo := &model.IndexInfo{ - Name: model.NewCIStr(constr.Name), - Columns: indexColumns, - State: model.StatePublic, - } - switch constr.Tp { - case ast.ConstraintPrimaryKey: - idxInfo.Unique = true - idxInfo.Primary = true - idxInfo.Name = model.NewCIStr(column.PrimaryKeyName) - case ast.ConstraintUniq, ast.ConstraintUniqKey, ast.ConstraintUniqIndex: - idxInfo.Unique = true - } - if constr.Option != nil { - idxInfo.Comment = constr.Option.Comment - idxInfo.Tp = constr.Option.Tp - } else { - // Use btree as default index type. - idxInfo.Tp = model.IndexTypeBtree - } - idxInfo.ID, err = d.genGlobalID() - if err != nil { - return nil, errors.Trace(err) - } - tbInfo.Indices = append(tbInfo.Indices, idxInfo) - } - return -} - -func (d *ddl) CreateTable(ctx context.Context, ident ast.Ident, colDefs []*ast.ColumnDef, - constraints []*ast.Constraint, options []*ast.TableOption) (err error) { - is := d.GetInformationSchema() - schema, ok := is.SchemaByName(ident.Schema) - if !ok { - return infoschema.DatabaseNotExists.Gen("database %s not exists", ident.Schema) - } - if is.TableExists(ident.Schema, ident.Name) { - return errors.Trace(infoschema.TableExists) - } - if err = checkDuplicateColumn(colDefs); err != nil { - return errors.Trace(err) - } - - cols, newConstraints, err := d.buildColumnsAndConstraints(ctx, colDefs, constraints) - if err != nil { - return errors.Trace(err) - } - - err = checkConstraintNames(newConstraints) - if err != nil { - return errors.Trace(err) - } - - tbInfo, err := d.buildTableInfo(ident.Name, cols, newConstraints) - if err != nil { - return errors.Trace(err) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: tbInfo.ID, - Type: model.ActionCreateTable, - Args: []interface{}{tbInfo}, - } - - err = d.startDDLJob(ctx, job) - if err == nil { - err = d.handleTableOptions(options, tbInfo, schema.ID) - } - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -func (d *ddl) handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo, schemaID int64) error { - for _, op := range options { - if op.Tp == ast.TableOptionAutoIncrement { - alloc := autoid.NewAllocator(d.store, schemaID) - tbInfo.State = model.StatePublic - tb, err := table.TableFromMeta(alloc, tbInfo) - if err != nil { - return errors.Trace(err) - } - // The operation of the minus 1 to make sure that the current value doesn't be used, - // the next Alloc operation will get this value. - // Its behavior is consistent with MySQL. - if err = tb.RebaseAutoID(int64(op.UintValue-1), false); err != nil { - return errors.Trace(err) - } - } - } - - return nil -} - -func (d *ddl) AlterTable(ctx context.Context, ident ast.Ident, specs []*ast.AlterTableSpec) (err error) { - // now we only allow one schema changes at the same time. - if len(specs) != 1 { - return errors.New("can't run multi schema changes in one DDL") - } - - for _, spec := range specs { - switch spec.Tp { - case ast.AlterTableAddColumn: - err = d.AddColumn(ctx, ident, spec) - case ast.AlterTableDropColumn: - err = d.DropColumn(ctx, ident, spec.DropColumn.Name) - case ast.AlterTableDropIndex: - err = d.DropIndex(ctx, ident, model.NewCIStr(spec.Name)) - case ast.AlterTableAddConstraint: - constr := spec.Constraint - switch spec.Constraint.Tp { - case ast.ConstraintKey, ast.ConstraintIndex: - err = d.CreateIndex(ctx, ident, false, model.NewCIStr(constr.Name), spec.Constraint.Keys) - case ast.ConstraintUniq, ast.ConstraintUniqIndex, ast.ConstraintUniqKey: - err = d.CreateIndex(ctx, ident, true, model.NewCIStr(constr.Name), spec.Constraint.Keys) - default: - // nothing to do now. - } - default: - // nothing to do now. - } - - if err != nil { - return errors.Trace(err) - } - } - - return nil -} - -func checkColumnConstraint(constraints []*ast.ColumnOption) error { - for _, constraint := range constraints { - switch constraint.Tp { - case ast.ColumnOptionAutoIncrement, ast.ColumnOptionPrimaryKey, ast.ColumnOptionUniq, ast.ColumnOptionUniqKey: - return errors.Errorf("unsupported add column constraint - %v", constraint.Tp) - } - } - - return nil -} - -// AddColumn will add a new column to the table. -func (d *ddl) AddColumn(ctx context.Context, ti ast.Ident, spec *ast.AlterTableSpec) error { - // Check whether the added column constraints are supported. - err := checkColumnConstraint(spec.Column.Options) - if err != nil { - return errors.Trace(err) - } - - is := d.infoHandle.Get() - schema, ok := is.SchemaByName(ti.Schema) - if !ok { - return errors.Trace(infoschema.DatabaseNotExists) - } - - t, err := is.TableByName(ti.Schema, ti.Name) - if err != nil { - return errors.Trace(infoschema.TableNotExists) - } - - // Check whether added column has existed. - colName := spec.Column.Name.Name.O - col := column.FindCol(t.Cols(), colName) - if col != nil { - return errors.Errorf("column %s already exists", colName) - } - - // ingore table constraints now, maybe return error later - // we use length(t.Cols()) as the default offset first, later we will change the - // column's offset later. - col, _, err = d.buildColumnAndConstraint(ctx, len(t.Cols()), spec.Column) - if err != nil { - return errors.Trace(err) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - Type: model.ActionAddColumn, - Args: []interface{}{&col.ColumnInfo, spec.Position, 0}, - } - - err = d.startDDLJob(ctx, job) - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -// DropColumn will drop a column from the table, now we don't support drop the column with index covered. -func (d *ddl) DropColumn(ctx context.Context, ti ast.Ident, colName model.CIStr) error { - is := d.infoHandle.Get() - schema, ok := is.SchemaByName(ti.Schema) - if !ok { - return errors.Trace(infoschema.DatabaseNotExists) - } - - t, err := is.TableByName(ti.Schema, ti.Name) - if err != nil { - return errors.Trace(infoschema.TableNotExists) - } - - // Check whether dropped column has existed. - col := column.FindCol(t.Cols(), colName.L) - if col == nil { - return errors.Errorf("column %s doesn’t exist", colName.L) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - Type: model.ActionDropColumn, - Args: []interface{}{colName}, - } - - err = d.startDDLJob(ctx, job) - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -// DropTable will proceed even if some table in the list does not exists. -func (d *ddl) DropTable(ctx context.Context, ti ast.Ident) (err error) { - is := d.GetInformationSchema() - schema, ok := is.SchemaByName(ti.Schema) - if !ok { - return infoschema.DatabaseNotExists.Gen("database %s not exists", ti.Schema) - } - - tb, err := is.TableByName(ti.Schema, ti.Name) - if err != nil { - return errors.Trace(infoschema.TableNotExists) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: tb.Meta().ID, - Type: model.ActionDropTable, - } - - err = d.startDDLJob(ctx, job) - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -func (d *ddl) CreateIndex(ctx context.Context, ti ast.Ident, unique bool, indexName model.CIStr, idxColNames []*ast.IndexColName) error { - is := d.infoHandle.Get() - schema, ok := is.SchemaByName(ti.Schema) - if !ok { - return infoschema.DatabaseNotExists.Gen("database %s not exists", ti.Schema) - } - - t, err := is.TableByName(ti.Schema, ti.Name) - if err != nil { - return errors.Trace(infoschema.TableNotExists) - } - indexID, err := d.genGlobalID() - if err != nil { - return errors.Trace(err) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - Type: model.ActionAddIndex, - Args: []interface{}{unique, indexName, indexID, idxColNames}, - } - - err = d.startDDLJob(ctx, job) - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -func (d *ddl) DropIndex(ctx context.Context, ti ast.Ident, indexName model.CIStr) error { - is := d.infoHandle.Get() - schema, ok := is.SchemaByName(ti.Schema) - if !ok { - return errors.Trace(infoschema.DatabaseNotExists) - } - - t, err := is.TableByName(ti.Schema, ti.Name) - if err != nil { - return errors.Trace(infoschema.TableNotExists) - } - - job := &model.Job{ - SchemaID: schema.ID, - TableID: t.Meta().ID, - Type: model.ActionDropIndex, - Args: []interface{}{indexName}, - } - - err = d.startDDLJob(ctx, job) - err = d.hook.OnChanged(err) - return errors.Trace(err) -} - -// findCol finds column in cols by name. -func findCol(cols []*model.ColumnInfo, name string) *model.ColumnInfo { - name = strings.ToLower(name) - for _, col := range cols { - if col.Name.L == name { - return col - } - } - - return nil -} diff --git a/vendor/github.com/pingcap/tidb/ddl/ddl_worker.go b/vendor/github.com/pingcap/tidb/ddl/ddl_worker.go deleted file mode 100644 index e8bd97024c97..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/ddl_worker.go +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/terror" -) - -func (d *ddl) startDDLJob(ctx context.Context, job *model.Job) error { - // for every DDL, we must commit current transaction. - if err := ctx.FinishTxn(false); err != nil { - return errors.Trace(err) - } - - // Create a new job and queue it. - err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { - t := meta.NewMeta(txn) - var err error - job.ID, err = t.GenGlobalID() - if err != nil { - return errors.Trace(err) - } - - err = t.EnQueueDDLJob(job) - return errors.Trace(err) - }) - - if err != nil { - return errors.Trace(err) - } - - // notice worker that we push a new job and wait the job done. - asyncNotify(d.ddlJobCh) - - log.Warnf("[ddl] start DDL job %v", job) - - jobID := job.ID - - var historyJob *model.Job - - // for a job from start to end, the state of it will be none -> delete only -> write only -> reorganization -> public - // for every state changes, we will wait as lease 2 * lease time, so here the ticker check is 10 * lease. - ticker := time.NewTicker(chooseLeaseTime(10*d.lease, 10*time.Second)) - defer ticker.Stop() - for { - select { - case <-d.ddlJobDoneCh: - case <-ticker.C: - } - - historyJob, err = d.getHistoryDDLJob(jobID) - if err != nil { - log.Errorf("[ddl] get history DDL job err %v, check again", err) - continue - } else if historyJob == nil { - log.Warnf("[ddl] DDL job %d is not in history, maybe not run", jobID) - continue - } - - // if a job is a history table, the state must be JobDone or JobCancel. - if historyJob.State == model.JobDone { - return nil - } - - return errors.Errorf(historyJob.Error) - } -} - -func (d *ddl) getHistoryDDLJob(id int64) (*model.Job, error) { - var job *model.Job - - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { - t := meta.NewMeta(txn) - var err1 error - job, err1 = t.GetHistoryDDLJob(id) - return errors.Trace(err1) - }) - - return job, errors.Trace(err) -} - -func asyncNotify(ch chan struct{}) { - select { - case ch <- struct{}{}: - default: - } -} - -func (d *ddl) checkOwner(t *meta.Meta, flag JobType) (*model.Owner, error) { - var owner *model.Owner - var err error - - switch flag { - case ddlJobFlag: - owner, err = t.GetDDLJobOwner() - case bgJobFlag: - owner, err = t.GetBgJobOwner() - default: - err = errInvalidJobFlag - } - if err != nil { - return nil, errors.Trace(err) - } - - if owner == nil { - owner = &model.Owner{} - // try to set onwer - owner.OwnerID = d.uuid - } - - now := time.Now().UnixNano() - // we must wait 2 * lease time to guarantee other servers update the schema, - // the owner will update its owner status every 2 * lease time, so here we use - // 4 * lease to check its timeout. - maxTimeout := int64(4 * d.lease) - if owner.OwnerID == d.uuid || now-owner.LastUpdateTS > maxTimeout { - owner.OwnerID = d.uuid - owner.LastUpdateTS = now - // update status. - switch flag { - case ddlJobFlag: - err = t.SetDDLJobOwner(owner) - case bgJobFlag: - err = t.SetBgJobOwner(owner) - } - if err != nil { - return nil, errors.Trace(err) - } - log.Debugf("[ddl] become %s job owner %s", flag, owner.OwnerID) - } - - if owner.OwnerID != d.uuid { - log.Debugf("[ddl] not %s job owner, owner is %s", flag, owner.OwnerID) - return nil, errors.Trace(ErrNotOwner) - } - - return owner, nil -} - -func (d *ddl) getFirstDDLJob(t *meta.Meta) (*model.Job, error) { - job, err := t.GetDDLJob(0) - return job, errors.Trace(err) -} - -// every time we enter another state except final state, we must call this function. -func (d *ddl) updateDDLJob(t *meta.Meta, job *model.Job) error { - err := t.UpdateDDLJob(0, job) - return errors.Trace(err) -} - -func (d *ddl) finishDDLJob(t *meta.Meta, job *model.Job) error { - log.Warnf("[ddl] finish DDL job %v", job) - // done, notice and run next job. - _, err := t.DeQueueDDLJob() - if err != nil { - return errors.Trace(err) - } - switch job.Type { - case model.ActionDropSchema, model.ActionDropTable: - if err = d.prepareBgJob(job); err != nil { - return errors.Trace(err) - } - } - - err = t.AddHistoryDDLJob(job) - return errors.Trace(err) -} - -// ErrNotOwner means we are not owner and can't handle DDL jobs. -var ErrNotOwner = errors.New("DDL: not owner") - -// ErrWorkerClosed means we have already closed the DDL worker. -var ErrWorkerClosed = errors.New("DDL: worker is closed") - -var errInvalidJobFlag = errors.New("DDL: invalid job flag") - -// JobType is job type, including ddl/background. -type JobType int - -const ( - ddlJobFlag = iota + 1 - bgJobFlag -) - -func (j JobType) String() string { - switch j { - case ddlJobFlag: - return "ddl" - case bgJobFlag: - return "background" - } - - return "unknown" -} - -func (d *ddl) handleDDLJobQueue() error { - for { - if d.isClosed() { - return nil - } - - waitTime := 2 * d.lease - - var job *model.Job - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { - t := meta.NewMeta(txn) - owner, err := d.checkOwner(t, ddlJobFlag) - if terror.ErrorEqual(err, ErrNotOwner) { - // we are not owner, return and retry checking later. - return nil - } else if err != nil { - return errors.Trace(err) - } - - // become the owner - // get the first job and run - job, err = d.getFirstDDLJob(t) - if job == nil || err != nil { - return errors.Trace(err) - } - - if job.IsRunning() { - // if we enter a new state, crash when waiting 2 * lease time, and restart quickly, - // we may run the job immediately again, but we don't wait enough 2 * lease time to - // let other servers update the schema. - // so here we must check the elapsed time from last update, if < 2 * lease, we must - // wait again. - elapsed := time.Duration(time.Now().UnixNano() - job.LastUpdateTS) - if elapsed > 0 && elapsed < waitTime { - log.Warnf("[ddl] the elapsed time from last update is %s < %s, wait again", elapsed, waitTime) - waitTime -= elapsed - return nil - } - } - - log.Warnf("[ddl] run DDL job %v", job) - - d.hook.OnJobRunBefore(job) - - // if run job meets error, we will save this error in job Error - // and retry later if the job is not cancelled. - d.runDDLJob(t, job) - - if job.IsFinished() { - err = d.finishDDLJob(t, job) - } else { - err = d.updateDDLJob(t, job) - } - if err != nil { - return errors.Trace(err) - } - - // running job may cost some time, so here we must update owner status to - // prevent other become the owner. - owner.LastUpdateTS = time.Now().UnixNano() - err = t.SetDDLJobOwner(owner) - - return errors.Trace(err) - }) - if err != nil { - return errors.Trace(err) - } else if job == nil { - // no job now, return and retry get later. - return nil - } - - d.hook.OnJobUpdated(job) - - // here means the job enters another state (delete only, write only, public, etc...) or is cancelled. - // if the job is done or still running, we will wait 2 * lease time to guarantee other servers to update - // the newest schema. - if job.State == model.JobRunning || job.State == model.JobDone { - d.waitSchemaChanged(waitTime) - } - - if job.IsFinished() { - d.startBgJob(job.Type) - asyncNotify(d.ddlJobDoneCh) - } - } -} - -func chooseLeaseTime(n1 time.Duration, n2 time.Duration) time.Duration { - if n1 > 0 { - return n1 - } - - return n2 -} - -// onDDLWorker is for async online schema change, it will try to become the owner first, -// then wait or pull the job queue to handle a schema change job. -func (d *ddl) onDDLWorker() { - defer d.wait.Done() - - // we use 4 * lease time to check owner's timeout, so here, we will update owner's status - // every 2 * lease time, if lease is 0, we will use default 10s. - checkTime := chooseLeaseTime(2*d.lease, 10*time.Second) - - ticker := time.NewTicker(checkTime) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - log.Debugf("[ddl] wait %s to check DDL status again", checkTime) - case <-d.ddlJobCh: - case <-d.quitCh: - return - } - - err := d.handleDDLJobQueue() - if err != nil { - log.Errorf("[ddl] handle ddl job err %v", errors.ErrorStack(err)) - } - } -} - -func (d *ddl) runDDLJob(t *meta.Meta, job *model.Job) { - if job.IsFinished() { - return - } - - job.State = model.JobRunning - - var err error - switch job.Type { - case model.ActionCreateSchema: - err = d.onCreateSchema(t, job) - case model.ActionDropSchema: - err = d.onDropSchema(t, job) - case model.ActionCreateTable: - err = d.onCreateTable(t, job) - case model.ActionDropTable: - err = d.onDropTable(t, job) - case model.ActionAddColumn: - err = d.onAddColumn(t, job) - case model.ActionDropColumn: - err = d.onDropColumn(t, job) - case model.ActionAddIndex: - err = d.onCreateIndex(t, job) - case model.ActionDropIndex: - err = d.onDropIndex(t, job) - default: - // invalid job, cancel it. - job.State = model.JobCancelled - err = errors.Errorf("invalid ddl job %v", job) - } - - // saves error in job, so that others can know error happens. - if err != nil { - // if job is not cancelled, we should log this error. - if job.State != model.JobCancelled { - log.Errorf("run ddl job err %v", errors.ErrorStack(err)) - } - - job.Error = err.Error() - job.ErrorCount++ - } -} - -// for every lease seconds, we will re-update the whole schema, so we will wait 2 * lease time -// to guarantee that all servers have already updated schema. -func (d *ddl) waitSchemaChanged(waitTime time.Duration) { - if waitTime == 0 { - return - } - - select { - case <-time.After(waitTime): - case <-d.quitCh: - } -} diff --git a/vendor/github.com/pingcap/tidb/ddl/index.go b/vendor/github.com/pingcap/tidb/ddl/index.go deleted file mode 100644 index d4f5fc49902f..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/index.go +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/types" -) - -func buildIndexInfo(tblInfo *model.TableInfo, unique bool, indexName model.CIStr, indexID int64, idxColNames []*ast.IndexColName) (*model.IndexInfo, error) { - // build offsets - idxColumns := make([]*model.IndexColumn, 0, len(idxColNames)) - for _, ic := range idxColNames { - col := findCol(tblInfo.Columns, ic.Column.Name.O) - if col == nil { - return nil, errors.Errorf("CREATE INDEX: column does not exist: %s", ic.Column.Name.O) - } - - idxColumns = append(idxColumns, &model.IndexColumn{ - Name: col.Name, - Offset: col.Offset, - Length: ic.Length, - }) - } - // create index info - idxInfo := &model.IndexInfo{ - ID: indexID, - Name: indexName, - Columns: idxColumns, - Unique: unique, - State: model.StateNone, - } - return idxInfo, nil -} - -func addIndexColumnFlag(tblInfo *model.TableInfo, indexInfo *model.IndexInfo) { - col := indexInfo.Columns[0] - - if indexInfo.Unique && len(indexInfo.Columns) == 1 { - tblInfo.Columns[col.Offset].Flag |= mysql.UniqueKeyFlag - } else { - tblInfo.Columns[col.Offset].Flag |= mysql.MultipleKeyFlag - } -} - -func dropIndexColumnFlag(tblInfo *model.TableInfo, indexInfo *model.IndexInfo) { - col := indexInfo.Columns[0] - - if indexInfo.Unique && len(indexInfo.Columns) == 1 { - tblInfo.Columns[col.Offset].Flag &= ^uint(mysql.UniqueKeyFlag) - } else { - tblInfo.Columns[col.Offset].Flag &= ^uint(mysql.MultipleKeyFlag) - } - - // other index may still cover this col - for _, index := range tblInfo.Indices { - if index.Name.L == indexInfo.Name.L { - continue - } - - if index.Columns[0].Name.L != col.Name.L { - continue - } - - addIndexColumnFlag(tblInfo, index) - } -} - -func (d *ddl) onCreateIndex(t *meta.Meta, job *model.Job) error { - schemaID := job.SchemaID - tblInfo, err := d.getTableInfo(t, job) - if err != nil { - return errors.Trace(err) - } - - var ( - unique bool - indexName model.CIStr - indexID int64 - idxColNames []*ast.IndexColName - ) - - err = job.DecodeArgs(&unique, &indexName, &indexID, &idxColNames) - if err != nil { - job.State = model.JobCancelled - return errors.Trace(err) - } - - var indexInfo *model.IndexInfo - for _, idx := range tblInfo.Indices { - if idx.Name.L == indexName.L { - if idx.State == model.StatePublic { - // we already have a index with same index name - job.State = model.JobCancelled - return errors.Errorf("CREATE INDEX: index already exist %s", indexName) - } - - indexInfo = idx - } - } - - if indexInfo == nil { - indexInfo, err = buildIndexInfo(tblInfo, unique, indexName, indexID, idxColNames) - if err != nil { - job.State = model.JobCancelled - return errors.Trace(err) - } - tblInfo.Indices = append(tblInfo.Indices, indexInfo) - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch indexInfo.State { - case model.StateNone: - // none -> delete only - job.SchemaState = model.StateDeleteOnly - indexInfo.State = model.StateDeleteOnly - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateDeleteOnly: - // delete only -> write only - job.SchemaState = model.StateWriteOnly - indexInfo.State = model.StateWriteOnly - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateWriteOnly: - // write only -> reorganization - job.SchemaState = model.StateWriteReorganization - indexInfo.State = model.StateWriteReorganization - // initialize SnapshotVer to 0 for later reorganization check. - job.SnapshotVer = 0 - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateWriteReorganization: - // reorganization -> public - reorgInfo, err := d.getReorgInfo(t, job) - if err != nil || reorgInfo.first { - // if we run reorg firstly, we should update the job snapshot version - // and then run the reorg next time. - return errors.Trace(err) - } - - var tbl table.Table - tbl, err = d.getTable(schemaID, tblInfo) - if err != nil { - return errors.Trace(err) - } - - err = d.runReorgJob(func() error { - return d.addTableIndex(tbl, indexInfo, reorgInfo) - }) - - if terror.ErrorEqual(err, errWaitReorgTimeout) { - // if timeout, we should return, check for the owner and re-wait job done. - return nil - } - if err != nil { - return errors.Trace(err) - } - - indexInfo.State = model.StatePublic - // set column index flag. - addIndexColumnFlag(tblInfo, indexInfo) - if err = t.UpdateTable(schemaID, tblInfo); err != nil { - return errors.Trace(err) - } - - // finish this job - job.SchemaState = model.StatePublic - job.State = model.JobDone - return nil - default: - return errors.Errorf("invalid index state %v", tblInfo.State) - } -} - -func (d *ddl) onDropIndex(t *meta.Meta, job *model.Job) error { - schemaID := job.SchemaID - tblInfo, err := d.getTableInfo(t, job) - if err != nil { - return errors.Trace(err) - } - - var indexName model.CIStr - if err = job.DecodeArgs(&indexName); err != nil { - job.State = model.JobCancelled - return errors.Trace(err) - } - - var indexInfo *model.IndexInfo - for _, idx := range tblInfo.Indices { - if idx.Name.L == indexName.L { - indexInfo = idx - } - } - - if indexInfo == nil { - job.State = model.JobCancelled - return errors.Errorf("index %s doesn't exist", indexName) - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch indexInfo.State { - case model.StatePublic: - // public -> write only - job.SchemaState = model.StateWriteOnly - indexInfo.State = model.StateWriteOnly - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateWriteOnly: - // write only -> delete only - job.SchemaState = model.StateDeleteOnly - indexInfo.State = model.StateDeleteOnly - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateDeleteOnly: - // delete only -> reorganization - job.SchemaState = model.StateDeleteReorganization - indexInfo.State = model.StateDeleteReorganization - err = t.UpdateTable(schemaID, tblInfo) - return errors.Trace(err) - case model.StateDeleteReorganization: - // reorganization -> absent - tbl, err := d.getTable(schemaID, tblInfo) - if err != nil { - return errors.Trace(err) - } - - err = d.runReorgJob(func() error { - return d.dropTableIndex(tbl, indexInfo) - }) - - if terror.ErrorEqual(err, errWaitReorgTimeout) { - // if timeout, we should return, check for the owner and re-wait job done. - return nil - } - if err != nil { - return errors.Trace(err) - } - - // all reorganization jobs done, drop this index - newIndices := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) - for _, idx := range tblInfo.Indices { - if idx.Name.L != indexName.L { - newIndices = append(newIndices, idx) - } - } - tblInfo.Indices = newIndices - // set column index flag. - dropIndexColumnFlag(tblInfo, indexInfo) - if err = t.UpdateTable(schemaID, tblInfo); err != nil { - return errors.Trace(err) - } - - // finish this job - job.SchemaState = model.StateNone - job.State = model.JobDone - return nil - default: - return errors.Errorf("invalid table state %v", tblInfo.State) - } -} - -func checkRowExist(txn kv.Transaction, t table.Table, handle int64) (bool, error) { - _, err := txn.Get(t.RecordKey(handle, nil)) - if terror.ErrorEqual(err, kv.ErrNotExist) { - // If row doesn't exist, we may have deleted the row already, - // no need to add index again. - return false, nil - } else if err != nil { - return false, errors.Trace(err) - } - - return true, nil -} - -func fetchRowColVals(txn kv.Transaction, t table.Table, handle int64, indexInfo *model.IndexInfo) ([]types.Datum, error) { - // fetch datas - cols := t.Cols() - vals := make([]types.Datum, 0, len(indexInfo.Columns)) - for _, v := range indexInfo.Columns { - col := cols[v.Offset] - k := t.RecordKey(handle, col) - data, err := txn.Get(k) - if err != nil { - return nil, errors.Trace(err) - } - val, err := tables.DecodeValue(data, &col.FieldType) - if err != nil { - return nil, errors.Trace(err) - } - vals = append(vals, val) - } - - return vals, nil -} - -const maxBatchSize = 1024 - -// How to add index in reorganization state? -// 1. Generate a snapshot with special version. -// 2. Traverse the snapshot, get every row in the table. -// 3. For one row, if the row has been already deleted, skip to next row. -// 4. If not deleted, check whether index has existed, if existed, skip to next row. -// 5. If index doesn't exist, create the index and then continue to handle next row. -func (d *ddl) addTableIndex(t table.Table, indexInfo *model.IndexInfo, reorgInfo *reorgInfo) error { - seekHandle := reorgInfo.Handle - version := reorgInfo.SnapshotVer - for { - handles, err := d.getSnapshotRows(t, version, seekHandle) - if err != nil { - return errors.Trace(err) - } else if len(handles) == 0 { - return nil - } - - seekHandle = handles[len(handles)-1] + 1 - - err = d.backfillTableIndex(t, indexInfo, handles, reorgInfo) - if err != nil { - return errors.Trace(err) - } - } -} - -func (d *ddl) getSnapshotRows(t table.Table, version uint64, seekHandle int64) ([]int64, error) { - ver := kv.Version{Ver: version} - - snap, err := d.store.GetSnapshot(ver) - if err != nil { - return nil, errors.Trace(err) - } - - defer snap.Release() - - firstKey := t.RecordKey(seekHandle, nil) - - it, err := snap.Seek(firstKey) - if err != nil { - return nil, errors.Trace(err) - } - defer it.Close() - - handles := make([]int64, 0, maxBatchSize) - - for it.Valid() { - if !it.Key().HasPrefix(t.RecordPrefix()) { - break - } - - var handle int64 - handle, err = tables.DecodeRecordKeyHandle(it.Key()) - if err != nil { - return nil, errors.Trace(err) - } - - rk := t.RecordKey(handle, nil) - - handles = append(handles, handle) - if len(handles) == maxBatchSize { - break - } - - err = kv.NextUntil(it, util.RowKeyPrefixFilter(rk)) - if terror.ErrorEqual(err, kv.ErrNotExist) { - break - } else if err != nil { - return nil, errors.Trace(err) - } - } - - return handles, nil -} - -func lockRow(txn kv.Transaction, t table.Table, h int64) error { - // Get row lock key - lockKey := t.RecordKey(h, nil) - // set row lock key to current txn - err := txn.Set(lockKey, []byte(txn.String())) - return errors.Trace(err) -} - -func (d *ddl) backfillTableIndex(t table.Table, indexInfo *model.IndexInfo, handles []int64, reorgInfo *reorgInfo) error { - kvX := kv.NewKVIndex(t.IndexPrefix(), indexInfo.Name.L, indexInfo.ID, indexInfo.Unique) - - for _, handle := range handles { - log.Debug("[ddl] building index...", handle) - - err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { - if err := d.isReorgRunnable(txn); err != nil { - return errors.Trace(err) - } - - // first check row exists - exist, err := checkRowExist(txn, t, handle) - if err != nil { - return errors.Trace(err) - } else if !exist { - // row doesn't exist, skip it. - return nil - } - - var vals []types.Datum - vals, err = fetchRowColVals(txn, t, handle, indexInfo) - if err != nil { - return errors.Trace(err) - } - - exist, _, err = kvX.Exist(txn, vals, handle) - if err != nil { - return errors.Trace(err) - } else if exist { - // index already exists, skip it. - return nil - } - - err = lockRow(txn, t, handle) - if err != nil { - return errors.Trace(err) - } - - // create the index. - err = kvX.Create(txn, vals, handle) - if err != nil { - return errors.Trace(err) - } - - // update reorg next handle - return errors.Trace(reorgInfo.UpdateHandle(txn, handle)) - }) - - if err != nil { - return errors.Trace(err) - } - } - - return nil -} - -func (d *ddl) dropTableIndex(t table.Table, indexInfo *model.IndexInfo) error { - prefix := kv.GenIndexPrefix(t.IndexPrefix(), indexInfo.ID) - err := d.delKeysWithPrefix(prefix) - - return errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/ddl/reorg.go b/vendor/github.com/pingcap/tidb/ddl/reorg.go deleted file mode 100644 index a00c07297455..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/reorg.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "fmt" - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/terror" -) - -var _ context.Context = &reorgContext{} - -// reorgContext implements context.Context interface for reorganization use. -type reorgContext struct { - store kv.Storage - m map[fmt.Stringer]interface{} - txn kv.Transaction -} - -func (c *reorgContext) GetTxn(forceNew bool) (kv.Transaction, error) { - if forceNew { - if c.txn != nil { - if err := c.txn.Commit(); err != nil { - return nil, errors.Trace(err) - } - c.txn = nil - } - } - - if c.txn != nil { - return c.txn, nil - } - - txn, err := c.store.Begin() - if err != nil { - return nil, errors.Trace(err) - } - - c.txn = txn - return c.txn, nil -} - -func (c *reorgContext) FinishTxn(rollback bool) error { - if c.txn == nil { - return nil - } - - var err error - if rollback { - err = c.txn.Rollback() - } else { - err = c.txn.Commit() - } - - c.txn = nil - - return errors.Trace(err) -} - -func (c *reorgContext) SetValue(key fmt.Stringer, value interface{}) { - c.m[key] = value -} - -func (c *reorgContext) Value(key fmt.Stringer) interface{} { - return c.m[key] -} - -func (c *reorgContext) ClearValue(key fmt.Stringer) { - delete(c.m, key) -} - -func (d *ddl) newReorgContext() context.Context { - c := &reorgContext{ - store: d.store, - m: make(map[fmt.Stringer]interface{}), - } - - return c -} - -const waitReorgTimeout = 10 * time.Second - -var errWaitReorgTimeout = errors.New("wait for reorganization timeout") - -func (d *ddl) runReorgJob(f func() error) error { - if d.reorgDoneCh == nil { - // start a reorganization job - d.wait.Add(1) - d.reorgDoneCh = make(chan error, 1) - go func() { - defer d.wait.Done() - d.reorgDoneCh <- f() - }() - } - - waitTimeout := waitReorgTimeout - // if d.lease is 0, we are using a local storage, - // and we can wait the reorganization to be done here. - // if d.lease > 0, we don't need to wait here because - // we will wait 2 * lease outer and try checking again, - // so we use a very little timeout here. - if d.lease > 0 { - waitTimeout = 1 * time.Millisecond - } - - // wait reorganization job done or timeout - select { - case err := <-d.reorgDoneCh: - d.reorgDoneCh = nil - return errors.Trace(err) - case <-d.quitCh: - // we return errWaitReorgTimeout here too, so that outer loop will break. - return errWaitReorgTimeout - case <-time.After(waitTimeout): - // if timeout, we will return, check the owner and retry to wait job done again. - return errWaitReorgTimeout - } -} - -func (d *ddl) isReorgRunnable(txn kv.Transaction) error { - if d.isClosed() { - // worker is closed, can't run reorganization. - return errors.Trace(ErrWorkerClosed) - } - - t := meta.NewMeta(txn) - owner, err := t.GetDDLJobOwner() - if err != nil { - return errors.Trace(err) - } else if owner == nil || owner.OwnerID != d.uuid { - // if no owner, we will try later, so here just return error. - // or another server is owner, return error too. - return errors.Trace(ErrNotOwner) - } - - return nil -} - -func (d *ddl) delKeysWithPrefix(prefix kv.Key) error { - for { - keys := make([]kv.Key, 0, maxBatchSize) - err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { - if err1 := d.isReorgRunnable(txn); err1 != nil { - return errors.Trace(err1) - } - - iter, err := txn.Seek(prefix) - if err != nil { - return errors.Trace(err) - } - - defer iter.Close() - for i := 0; i < maxBatchSize; i++ { - if iter.Valid() && iter.Key().HasPrefix(prefix) { - keys = append(keys, iter.Key().Clone()) - err = iter.Next() - if err != nil { - return errors.Trace(err) - } - } else { - break - } - } - - for _, key := range keys { - err := txn.Delete(key) - // must skip ErrNotExist - // if key doesn't exist, skip this error. - if err != nil && !terror.ErrorEqual(err, kv.ErrNotExist) { - return errors.Trace(err) - } - } - - return nil - }) - - if err != nil { - return errors.Trace(err) - } - - // delete no keys, return. - if len(keys) == 0 { - return nil - } - } -} - -type reorgInfo struct { - *model.Job - Handle int64 - d *ddl - first bool -} - -func (d *ddl) getReorgInfo(t *meta.Meta, job *model.Job) (*reorgInfo, error) { - var err error - - info := &reorgInfo{ - Job: job, - d: d, - first: job.SnapshotVer == 0, - } - - if info.first { - // get the current version for reorganization if we don't have - var ver kv.Version - ver, err = d.store.CurrentVersion() - if err != nil { - return nil, errors.Trace(err) - } else if ver.Ver <= 0 { - return nil, errors.Errorf("invalid storage current version %d", ver.Ver) - } - - job.SnapshotVer = ver.Ver - } else { - info.Handle, err = t.GetDDLReorgHandle(job) - if err != nil { - return nil, errors.Trace(err) - } - } - - if info.Handle > 0 { - // we have already handled this handle, so use next - info.Handle++ - } - - return info, errors.Trace(err) -} - -func (r *reorgInfo) UpdateHandle(txn kv.Transaction, handle int64) error { - t := meta.NewMeta(txn) - return errors.Trace(t.UpdateDDLReorgHandle(r.Job, handle)) -} diff --git a/vendor/github.com/pingcap/tidb/ddl/schema.go b/vendor/github.com/pingcap/tidb/ddl/schema.go deleted file mode 100644 index ad411a8c9cad..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/schema.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" -) - -func (d *ddl) onCreateSchema(t *meta.Meta, job *model.Job) error { - schemaID := job.SchemaID - dbInfo := &model.DBInfo{} - if err := job.DecodeArgs(dbInfo); err != nil { - // arg error, cancel this job. - job.State = model.JobCancelled - return errors.Trace(err) - } - - dbInfo.ID = schemaID - dbInfo.State = model.StateNone - - dbs, err := t.ListDatabases() - if err != nil { - return errors.Trace(err) - } - - for _, db := range dbs { - if db.Name.L == dbInfo.Name.L { - if db.ID != schemaID { - // database exists, can't create, we should cancel this job now. - job.State = model.JobCancelled - return errors.Trace(infoschema.DatabaseExists) - } - dbInfo = db - } - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch dbInfo.State { - case model.StateNone: - // none -> public - job.SchemaState = model.StatePublic - dbInfo.State = model.StatePublic - err = t.CreateDatabase(dbInfo) - if err != nil { - return errors.Trace(err) - } - // finish this job - job.State = model.JobDone - return nil - default: - // we can't enter here. - return errors.Errorf("invalid db state %v", dbInfo.State) - } -} - -func (d *ddl) delReorgSchema(t *meta.Meta, job *model.Job) error { - dbInfo := &model.DBInfo{} - if err := job.DecodeArgs(dbInfo); err != nil { - // arg error, cancel this job. - job.State = model.JobCancelled - return errors.Trace(err) - } - - tables, err := t.ListTables(dbInfo.ID) - if terror.ErrorEqual(meta.ErrDBNotExists, err) { - job.State = model.JobDone - return nil - } - if err != nil { - return errors.Trace(err) - } - - if err = d.dropSchemaData(dbInfo, tables); err != nil { - return errors.Trace(err) - } - - // finish this background job - job.SchemaState = model.StateNone - job.State = model.JobDone - - return nil -} - -func (d *ddl) onDropSchema(t *meta.Meta, job *model.Job) error { - dbInfo, err := t.GetDatabase(job.SchemaID) - if err != nil { - return errors.Trace(err) - } - if dbInfo == nil { - job.State = model.JobCancelled - return errors.Trace(infoschema.DatabaseNotExists) - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch dbInfo.State { - case model.StatePublic: - // public -> write only - job.SchemaState = model.StateWriteOnly - dbInfo.State = model.StateWriteOnly - err = t.UpdateDatabase(dbInfo) - case model.StateWriteOnly: - // write only -> delete only - job.SchemaState = model.StateDeleteOnly - dbInfo.State = model.StateDeleteOnly - err = t.UpdateDatabase(dbInfo) - case model.StateDeleteOnly: - dbInfo.State = model.StateDeleteReorganization - err = t.UpdateDatabase(dbInfo) - if err = t.DropDatabase(dbInfo.ID); err != nil { - break - } - // finish this job - job.Args = []interface{}{dbInfo} - job.State = model.JobDone - job.SchemaState = model.StateNone - default: - // we can't enter here. - err = errors.Errorf("invalid db state %v", dbInfo.State) - } - - return errors.Trace(err) -} - -func (d *ddl) dropSchemaData(dbInfo *model.DBInfo, tables []*model.TableInfo) error { - for _, tblInfo := range tables { - alloc := autoid.NewAllocator(d.store, dbInfo.ID) - t, err := table.TableFromMeta(alloc, tblInfo) - if err != nil { - return errors.Trace(err) - } - - err = d.dropTableData(t) - if err != nil { - return errors.Trace(err) - } - } - return nil -} diff --git a/vendor/github.com/pingcap/tidb/ddl/stat.go b/vendor/github.com/pingcap/tidb/ddl/stat.go deleted file mode 100644 index a39fa5717ef5..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/stat.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/inspectkv" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/sessionctx/variable" -) - -var ( - serverID = "server_id" - ddlSchemaVersion = "ddl_schema_version" - ddlOwnerID = "ddl_owner_id" - ddlOwnerLastUpdateTS = "ddl_owner_last_update_ts" - ddlJobID = "ddl_job_id" - ddlJobAction = "ddl_job_action" - ddlJobLastUpdateTS = "ddl_job_last_update_ts" - ddlJobState = "ddl_job_state" - ddlJobError = "ddl_job_error" - ddlJobSchemaState = "ddl_job_schema_state" - ddlJobSchemaID = "ddl_job_schema_id" - ddlJobTableID = "ddl_job_table_id" - ddlJobSnapshotVer = "ddl_job_snapshot_ver" - ddlJobReorgHandle = "ddl_job_reorg_handle" - ddlJobArgs = "ddl_job_args" - bgSchemaVersion = "bg_schema_version" - bgOwnerID = "bg_owner_id" - bgOwnerLastUpdateTS = "bg_owner_last_update_ts" - bgJobID = "bg_job_id" - bgJobAction = "bg_job_action" - bgJobLastUpdateTS = "bg_job_last_update_ts" - bgJobState = "bg_job_state" - bgJobError = "bg_job_error" - bgJobSchemaState = "bg_job_schema_state" - bgJobSchemaID = "bg_job_schema_id" - bgJobTableID = "bg_job_table_id" - bgJobSnapshotVer = "bg_job_snapshot_ver" - bgJobReorgHandle = "bg_job_reorg_handle" - bgJobArgs = "bg_job_args" -) - -// GetScope gets the status variables scope. -func (d *ddl) GetScope(status string) variable.ScopeFlag { - // Now ddl status variables scope are all default scope. - return variable.DefaultScopeFlag -} - -// Stat returns the DDL statistics. -func (d *ddl) Stats() (map[string]interface{}, error) { - m := make(map[string]interface{}) - m[serverID] = d.uuid - var ddlInfo, bgInfo *inspectkv.DDLInfo - - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { - var err1 error - ddlInfo, err1 = inspectkv.GetDDLInfo(txn) - if err1 != nil { - return errors.Trace(err1) - } - bgInfo, err1 = inspectkv.GetBgDDLInfo(txn) - - return errors.Trace(err1) - }) - if err != nil { - return nil, errors.Trace(err) - } - - m[ddlSchemaVersion] = ddlInfo.SchemaVer - if ddlInfo.Owner != nil { - m[ddlOwnerID] = ddlInfo.Owner.OwnerID - // LastUpdateTS uses nanosecond. - m[ddlOwnerLastUpdateTS] = ddlInfo.Owner.LastUpdateTS / 1e9 - } - if ddlInfo.Job != nil { - m[ddlJobID] = ddlInfo.Job.ID - m[ddlJobAction] = ddlInfo.Job.Type.String() - m[ddlJobLastUpdateTS] = ddlInfo.Job.LastUpdateTS / 1e9 - m[ddlJobState] = ddlInfo.Job.State.String() - m[ddlJobError] = ddlInfo.Job.Error - m[ddlJobSchemaState] = ddlInfo.Job.SchemaState.String() - m[ddlJobSchemaID] = ddlInfo.Job.SchemaID - m[ddlJobTableID] = ddlInfo.Job.TableID - m[ddlJobSnapshotVer] = ddlInfo.Job.SnapshotVer - m[ddlJobReorgHandle] = ddlInfo.ReorgHandle - m[ddlJobArgs] = ddlInfo.Job.Args - } - - // background DDL info - m[bgSchemaVersion] = bgInfo.SchemaVer - if bgInfo.Owner != nil { - m[bgOwnerID] = bgInfo.Owner.OwnerID - // LastUpdateTS uses nanosecond. - m[bgOwnerLastUpdateTS] = bgInfo.Owner.LastUpdateTS / 1e9 - } - if bgInfo.Job != nil { - m[bgJobID] = bgInfo.Job.ID - m[bgJobAction] = bgInfo.Job.Type.String() - m[bgJobLastUpdateTS] = bgInfo.Job.LastUpdateTS / 1e9 - m[bgJobState] = bgInfo.Job.State.String() - m[bgJobError] = bgInfo.Job.Error - m[bgJobSchemaState] = bgInfo.Job.SchemaState.String() - m[bgJobSchemaID] = bgInfo.Job.SchemaID - m[bgJobTableID] = bgInfo.Job.TableID - m[bgJobSnapshotVer] = bgInfo.Job.SnapshotVer - m[bgJobReorgHandle] = bgInfo.ReorgHandle - m[bgJobArgs] = bgInfo.Job.Args - } - - return m, nil -} diff --git a/vendor/github.com/pingcap/tidb/ddl/table.go b/vendor/github.com/pingcap/tidb/ddl/table.go deleted file mode 100644 index ef9708a75bf9..000000000000 --- a/vendor/github.com/pingcap/tidb/ddl/table.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package ddl - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" -) - -func (d *ddl) onCreateTable(t *meta.Meta, job *model.Job) error { - schemaID := job.SchemaID - tbInfo := &model.TableInfo{} - if err := job.DecodeArgs(tbInfo); err != nil { - // arg error, cancel this job. - job.State = model.JobCancelled - return errors.Trace(err) - } - - tbInfo.State = model.StateNone - - tables, err := t.ListTables(schemaID) - if terror.ErrorEqual(err, meta.ErrDBNotExists) { - job.State = model.JobCancelled - return errors.Trace(infoschema.DatabaseNotExists) - } else if err != nil { - return errors.Trace(err) - } - - for _, tbl := range tables { - if tbl.Name.L == tbInfo.Name.L { - if tbl.ID != tbInfo.ID { - // table exists, can't create, we should cancel this job now. - job.State = model.JobCancelled - return errors.Trace(infoschema.TableExists) - } - - tbInfo = tbl - } - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch tbInfo.State { - case model.StateNone: - // none -> public - job.SchemaState = model.StatePublic - tbInfo.State = model.StatePublic - err = t.CreateTable(schemaID, tbInfo) - if err != nil { - return errors.Trace(err) - } - // finish this job - job.State = model.JobDone - return nil - default: - return errors.Errorf("invalid table state %v", tbInfo.State) - } -} - -func (d *ddl) delReorgTable(t *meta.Meta, job *model.Job) error { - tblInfo := &model.TableInfo{} - err := job.DecodeArgs(tblInfo) - if err != nil { - // arg error, cancel this job. - job.State = model.JobCancelled - return errors.Trace(err) - } - tblInfo.State = model.StateDeleteReorganization - tbl, err := d.getTable(job.SchemaID, tblInfo) - if err != nil { - return errors.Trace(err) - } - - err = d.dropTableData(tbl) - if err != nil { - return errors.Trace(err) - } - - // finish this background job - job.SchemaState = model.StateNone - job.State = model.JobDone - - return nil -} - -func (d *ddl) onDropTable(t *meta.Meta, job *model.Job) error { - schemaID := job.SchemaID - tableID := job.TableID - - tblInfo, err := t.GetTable(schemaID, tableID) - if terror.ErrorEqual(err, meta.ErrDBNotExists) { - job.State = model.JobCancelled - return errors.Trace(infoschema.DatabaseNotExists) - } else if err != nil { - return errors.Trace(err) - } - - if tblInfo == nil { - job.State = model.JobCancelled - return errors.Trace(infoschema.TableNotExists) - } - - _, err = t.GenSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - switch tblInfo.State { - case model.StatePublic: - // public -> write only - job.SchemaState = model.StateWriteOnly - tblInfo.State = model.StateWriteOnly - err = t.UpdateTable(schemaID, tblInfo) - case model.StateWriteOnly: - // write only -> delete only - job.SchemaState = model.StateDeleteOnly - tblInfo.State = model.StateDeleteOnly - err = t.UpdateTable(schemaID, tblInfo) - case model.StateDeleteOnly: - tblInfo.State = model.StateNone - err = t.UpdateTable(schemaID, tblInfo) - if err = t.DropTable(job.SchemaID, job.TableID); err != nil { - break - } - // finish this job - job.Args = []interface{}{tblInfo} - job.State = model.JobDone - job.SchemaState = model.StateNone - default: - err = errors.Errorf("invalid table state %v", tblInfo.State) - } - - return errors.Trace(err) -} - -func (d *ddl) getTable(schemaID int64, tblInfo *model.TableInfo) (table.Table, error) { - alloc := autoid.NewAllocator(d.store, schemaID) - tbl, err := table.TableFromMeta(alloc, tblInfo) - return tbl, errors.Trace(err) -} - -func (d *ddl) getTableInfo(t *meta.Meta, job *model.Job) (*model.TableInfo, error) { - schemaID := job.SchemaID - tableID := job.TableID - tblInfo, err := t.GetTable(schemaID, tableID) - if terror.ErrorEqual(err, meta.ErrDBNotExists) { - job.State = model.JobCancelled - return nil, errors.Trace(infoschema.DatabaseNotExists) - } else if err != nil { - return nil, errors.Trace(err) - } else if tblInfo == nil { - job.State = model.JobCancelled - return nil, errors.Trace(infoschema.TableNotExists) - } - - if tblInfo.State != model.StatePublic { - job.State = model.JobCancelled - return nil, errors.Errorf("table %s is not in public, but %s", tblInfo.Name.L, tblInfo.State) - } - - return tblInfo, nil -} - -func (d *ddl) dropTableData(t table.Table) error { - // delete table data - err := d.delKeysWithPrefix(t.RecordPrefix()) - if err != nil { - return errors.Trace(err) - } - - // delete table index - err = d.delKeysWithPrefix(t.IndexPrefix()) - - return errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/domain/domain.go b/vendor/github.com/pingcap/tidb/domain/domain.go deleted file mode 100644 index 1ac14b6faceb..000000000000 --- a/vendor/github.com/pingcap/tidb/domain/domain.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package domain - -import ( - "sync" - "sync/atomic" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/localstore" - "github.com/pingcap/tidb/terror" -) - -var ddlLastReloadSchemaTS = "ddl_last_reload_schema_ts" - -// Domain represents a storage space. Different domains can use the same database name. -// Multiple domains can be used in parallel without synchronization. -type Domain struct { - store kv.Storage - infoHandle *infoschema.Handle - ddl ddl.DDL - leaseCh chan time.Duration - // nano seconds - lastLeaseTS int64 - m sync.Mutex -} - -func (do *Domain) loadInfoSchema(txn kv.Transaction) (err error) { - m := meta.NewMeta(txn) - schemaMetaVersion, err := m.GetSchemaVersion() - if err != nil { - return errors.Trace(err) - } - - info := do.infoHandle.Get() - if info != nil && schemaMetaVersion <= info.SchemaMetaVersion() { - // info may be changed by other txn, so here its version may be bigger than schema version, - // so we don't need to reload. - log.Debugf("[ddl] schema version is still %d, no need reload", schemaMetaVersion) - return nil - } - - schemas, err := m.ListDatabases() - if err != nil { - return errors.Trace(err) - } - - for _, di := range schemas { - if di.State != model.StatePublic { - // schema is not public, can't be used outside. - continue - } - - tables, err1 := m.ListTables(di.ID) - if err1 != nil { - return errors.Trace(err1) - } - - di.Tables = make([]*model.TableInfo, 0, len(tables)) - for _, tbl := range tables { - if tbl.State != model.StatePublic { - // schema is not public, can't be used outsiee. - continue - } - di.Tables = append(di.Tables, tbl) - } - } - - log.Infof("[ddl] loadInfoSchema %d", schemaMetaVersion) - err = do.infoHandle.Set(schemas, schemaMetaVersion) - return errors.Trace(err) -} - -// InfoSchema gets information schema from domain. -func (do *Domain) InfoSchema() infoschema.InfoSchema { - // try reload if possible. - do.tryReload() - return do.infoHandle.Get() -} - -// DDL gets DDL from domain. -func (do *Domain) DDL() ddl.DDL { - return do.ddl -} - -// Store gets KV store from domain. -func (do *Domain) Store() kv.Storage { - return do.store -} - -// SetLease will reset the lease time for online DDL change. -func (do *Domain) SetLease(lease time.Duration) { - do.leaseCh <- lease - - // let ddl to reset lease too. - do.ddl.SetLease(lease) -} - -// Stats returns the domain statistic. -func (do *Domain) Stats() (map[string]interface{}, error) { - m := make(map[string]interface{}) - m[ddlLastReloadSchemaTS] = atomic.LoadInt64(&do.lastLeaseTS) / 1e9 - - return m, nil -} - -// GetScope gets the status variables scope. -func (do *Domain) GetScope(status string) variable.ScopeFlag { - // Now domain status variables scope are all default scope. - return variable.DefaultScopeFlag -} - -func (do *Domain) tryReload() { - // if we don't have update the schema for a long time > lease, we must force reloading it. - // Although we try to reload schema every lease time in a goroutine, sometimes it may not - // run accurately, e.g, the machine has a very high load, running the ticker is delayed. - last := atomic.LoadInt64(&do.lastLeaseTS) - lease := do.ddl.GetLease() - - // if lease is 0, we use the local store, so no need to reload. - if lease > 0 && time.Now().UnixNano()-last > lease.Nanoseconds() { - do.mustReload() - } -} - -const minReloadTimeout = 20 * time.Second - -func (do *Domain) reload() error { - // lock here for only once at same time. - do.m.Lock() - defer do.m.Unlock() - - timeout := do.ddl.GetLease() / 2 - if timeout < minReloadTimeout { - timeout = minReloadTimeout - } - - done := make(chan error, 1) - go func() { - var err error - - for { - err = kv.RunInNewTxn(do.store, false, do.loadInfoSchema) - // if err is db closed, we will return it directly, otherwise, we will - // check reloading again. - if terror.ErrorEqual(err, localstore.ErrDBClosed) { - break - } - - if err != nil { - log.Errorf("[ddl] load schema err %v, retry again", errors.ErrorStack(err)) - // TODO: use a backoff algorithm. - time.Sleep(500 * time.Millisecond) - continue - } - - atomic.StoreInt64(&do.lastLeaseTS, time.Now().UnixNano()) - break - } - - done <- err - }() - - select { - case err := <-done: - return errors.Trace(err) - case <-time.After(timeout): - return errors.New("reload schema timeout") - } -} - -func (do *Domain) mustReload() { - // if reload error, we will terminate whole program to guarantee data safe. - err := do.reload() - if err != nil { - log.Fatalf("[ddl] reload schema err %v", errors.ErrorStack(err)) - } -} - -// check schema every 300 seconds default. -const defaultLoadTime = 300 * time.Second - -func (do *Domain) loadSchemaInLoop(lease time.Duration) { - if lease <= 0 { - lease = defaultLoadTime - } - - ticker := time.NewTicker(lease) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - err := do.reload() - // we may close store in test, but the domain load schema loop is still checking, - // so we can't panic for ErrDBClosed and just return here. - if terror.ErrorEqual(err, localstore.ErrDBClosed) { - return - } else if err != nil { - log.Fatalf("[ddl] reload schema err %v", errors.ErrorStack(err)) - } - case newLease := <-do.leaseCh: - if newLease <= 0 { - newLease = defaultLoadTime - } - - if lease == newLease { - // nothing to do - continue - } - - lease = newLease - // reset ticker too. - ticker.Stop() - ticker = time.NewTicker(lease) - } - } -} - -type ddlCallback struct { - ddl.BaseCallback - do *Domain -} - -func (c *ddlCallback) OnChanged(err error) error { - if err != nil { - return err - } - log.Warnf("[ddl] on DDL change") - - c.do.mustReload() - return nil -} - -// NewDomain creates a new domain. -func NewDomain(store kv.Storage, lease time.Duration) (d *Domain, err error) { - d = &Domain{ - store: store, - leaseCh: make(chan time.Duration, 1), - } - - d.infoHandle = infoschema.NewHandle(d.store) - d.ddl = ddl.NewDDL(d.store, d.infoHandle, &ddlCallback{do: d}, lease) - d.mustReload() - - variable.RegisterStatistics(d) - - go d.loadSchemaInLoop(lease) - - return d, nil -} diff --git a/vendor/github.com/pingcap/tidb/driver.go b/vendor/github.com/pingcap/tidb/driver.go deleted file mode 100644 index f8b95421ac62..000000000000 --- a/vendor/github.com/pingcap/tidb/driver.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -// database/sql/driver - -package tidb - -import ( - "database/sql" - "database/sql/driver" - "io" - "net/url" - "path/filepath" - "strings" - "sync" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/types" -) - -const ( - // DriverName is name of TiDB driver. - DriverName = "tidb" -) - -var ( - _ driver.Conn = (*driverConn)(nil) - _ driver.Execer = (*driverConn)(nil) - _ driver.Queryer = (*driverConn)(nil) - _ driver.Tx = (*driverConn)(nil) - - _ driver.Result = (*driverResult)(nil) - _ driver.Rows = (*driverRows)(nil) - _ driver.Stmt = (*driverStmt)(nil) - _ driver.Driver = (*sqlDriver)(nil) - - txBeginSQL = "BEGIN;" - txCommitSQL = "COMMIT;" - txRollbackSQL = "ROLLBACK;" - - errNoResult = errors.New("query statement does not produce a result set (no top level SELECT)") -) - -type errList []error - -type driverParams struct { - storePath string - dbName string - // when set to true `mysql.Time` isn't encoded as string but passed as `time.Time` - // this option is named for compatibility the same as in the mysql driver - // while we actually do not have additional parsing to do - parseTime bool -} - -func (e *errList) append(err error) { - if err != nil { - *e = append(*e, err) - } -} - -func (e errList) error() error { - if len(e) == 0 { - return nil - } - - return e -} - -func (e errList) Error() string { - a := make([]string, len(e)) - for i, v := range e { - a[i] = v.Error() - } - return strings.Join(a, "\n") -} - -func params(args []driver.Value) []interface{} { - r := make([]interface{}, len(args)) - for i, v := range args { - r[i] = interface{}(v) - } - return r -} - -var ( - tidbDriver = &sqlDriver{} - driverOnce sync.Once -) - -// RegisterDriver registers TiDB driver. -// The name argument can be optionally prefixed by "engine://". In that case the -// prefix is recognized as a storage engine name. -// -// The name argument can be optionally prefixed by "memory://". In that case -// the prefix is stripped before interpreting it as a name of a memory-only, -// volatile DB. -// -// [0]: http://golang.org/pkg/database/sql/driver/ -func RegisterDriver() { - driverOnce.Do(func() { sql.Register(DriverName, tidbDriver) }) -} - -// sqlDriver implements the interface required by database/sql/driver. -type sqlDriver struct { - mu sync.Mutex -} - -func (d *sqlDriver) lock() { - d.mu.Lock() -} - -func (d *sqlDriver) unlock() { - d.mu.Unlock() -} - -// parseDriverDSN cuts off DB name from dsn. It returns error if the dsn is not -// valid. -func parseDriverDSN(dsn string) (params *driverParams, err error) { - u, err := url.Parse(dsn) - if err != nil { - return nil, errors.Trace(err) - } - path := filepath.Join(u.Host, u.Path) - dbName := filepath.Clean(filepath.Base(path)) - if dbName == "" || dbName == "." || dbName == string(filepath.Separator) { - return nil, errors.Errorf("invalid DB name %q", dbName) - } - // cut off dbName - path = filepath.Clean(filepath.Dir(path)) - if path == "" || path == "." || path == string(filepath.Separator) { - return nil, errors.Errorf("invalid dsn %q", dsn) - } - u.Path, u.Host = path, "" - params = &driverParams{ - storePath: u.String(), - dbName: dbName, - } - // parse additional driver params - query := u.Query() - if parseTime := query.Get("parseTime"); parseTime == "true" { - params.parseTime = true - } - - return params, nil -} - -// Open returns a new connection to the database. -// -// The dsn must be a URL format 'engine://path/dbname?params'. -// Engine is the storage name registered with RegisterStore. -// Path is the storage specific format. -// Params is key-value pairs split by '&', optional params are storage specific. -// Examples: -// goleveldb://relative/path/test -// boltdb:///absolute/path/test -// hbase://zk1,zk2,zk3/hbasetbl/test?tso=zk -// -// Open may return a cached connection (one previously closed), but doing so is -// unnecessary; the sql package maintains a pool of idle connections for -// efficient re-use. -// -// The behavior of the mysql driver regarding time parsing can also be imitated -// by passing ?parseTime -// -// The returned connection is only used by one goroutine at a time. -func (d *sqlDriver) Open(dsn string) (driver.Conn, error) { - params, err := parseDriverDSN(dsn) - if err != nil { - return nil, errors.Trace(err) - } - store, err := NewStore(params.storePath) - if err != nil { - return nil, errors.Trace(err) - } - - sess, err := CreateSession(store) - if err != nil { - return nil, errors.Trace(err) - } - s := sess.(*session) - - d.lock() - defer d.unlock() - - DBName := model.NewCIStr(params.dbName) - domain := sessionctx.GetDomain(s) - cs := &ast.CharsetOpt{ - Chs: "utf8", - Col: "utf8_bin", - } - if !domain.InfoSchema().SchemaExists(DBName) { - err = domain.DDL().CreateSchema(s, DBName, cs) - if err != nil { - return nil, errors.Trace(err) - } - } - driver := &sqlDriver{} - return newDriverConn(s, driver, DBName.O, params) -} - -// driverConn is a connection to a database. It is not used concurrently by -// multiple goroutines. -// -// Conn is assumed to be stateful. -type driverConn struct { - s Session - driver *sqlDriver - stmts map[string]driver.Stmt - params *driverParams -} - -func newDriverConn(sess *session, d *sqlDriver, schema string, params *driverParams) (driver.Conn, error) { - r := &driverConn{ - driver: d, - stmts: map[string]driver.Stmt{}, - s: sess, - params: params, - } - - _, err := r.s.Execute("use " + schema) - if err != nil { - return nil, errors.Trace(err) - } - return r, nil -} - -// Prepare returns a prepared statement, bound to this connection. -func (c *driverConn) Prepare(query string) (driver.Stmt, error) { - stmtID, paramCount, fields, err := c.s.PrepareStmt(query) - if err != nil { - return nil, err - } - s := &driverStmt{ - conn: c, - query: query, - stmtID: stmtID, - paramCount: paramCount, - isQuery: fields != nil, - } - c.stmts[query] = s - return s, nil -} - -// Close invalidates and potentially stops any current prepared statements and -// transactions, marking this connection as no longer in use. -// -// Because the sql package maintains a free pool of connections and only calls -// Close when there's a surplus of idle connections, it shouldn't be necessary -// for drivers to do their own connection caching. -func (c *driverConn) Close() error { - var err errList - for _, s := range c.stmts { - stmt := s.(*driverStmt) - err.append(stmt.conn.s.DropPreparedStmt(stmt.stmtID)) - } - - c.driver.lock() - defer c.driver.unlock() - - return err.error() -} - -// Begin starts and returns a new transaction. -func (c *driverConn) Begin() (driver.Tx, error) { - if c.s == nil { - return nil, errors.Errorf("Need init first") - } - - if _, err := c.s.Execute(txBeginSQL); err != nil { - return nil, errors.Trace(err) - } - - return c, nil -} - -func (c *driverConn) Commit() error { - if c.s == nil { - return terror.CommitNotInTransaction - } - _, err := c.s.Execute(txCommitSQL) - - if err != nil { - return errors.Trace(err) - } - - err = c.s.FinishTxn(false) - return errors.Trace(err) -} - -func (c *driverConn) Rollback() error { - if c.s == nil { - return terror.RollbackNotInTransaction - } - - if _, err := c.s.Execute(txRollbackSQL); err != nil { - return errors.Trace(err) - } - - return nil -} - -// Execer is an optional interface that may be implemented by a Conn. -// -// If a Conn does not implement Execer, the sql package's DB.Exec will first -// prepare a query, execute the statement, and then close the statement. -// -// Exec may return driver.ErrSkip. -func (c *driverConn) Exec(query string, args []driver.Value) (driver.Result, error) { - return c.driverExec(query, args) - -} - -func (c *driverConn) getStmt(query string) (stmt driver.Stmt, err error) { - stmt, ok := c.stmts[query] - if !ok { - stmt, err = c.Prepare(query) - if err != nil { - return nil, errors.Trace(err) - } - } - return -} - -func (c *driverConn) driverExec(query string, args []driver.Value) (driver.Result, error) { - if len(args) == 0 { - if _, err := c.s.Execute(query); err != nil { - return nil, errors.Trace(err) - } - r := &driverResult{} - r.lastInsertID, r.rowsAffected = int64(c.s.LastInsertID()), int64(c.s.AffectedRows()) - return r, nil - } - stmt, err := c.getStmt(query) - if err != nil { - return nil, errors.Trace(err) - } - return stmt.Exec(args) -} - -// Queryer is an optional interface that may be implemented by a Conn. -// -// If a Conn does not implement Queryer, the sql package's DB.Query will first -// prepare a query, execute the statement, and then close the statement. -// -// Query may return driver.ErrSkip. -func (c *driverConn) Query(query string, args []driver.Value) (driver.Rows, error) { - return c.driverQuery(query, args) -} - -func (c *driverConn) driverQuery(query string, args []driver.Value) (driver.Rows, error) { - if len(args) == 0 { - rss, err := c.s.Execute(query) - if err != nil { - return nil, errors.Trace(err) - } - if len(rss) == 0 { - return nil, errors.Trace(errNoResult) - } - return &driverRows{params: c.params, rs: rss[0]}, nil - } - stmt, err := c.getStmt(query) - if err != nil { - return nil, errors.Trace(err) - } - return stmt.Query(args) -} - -// driverResult is the result of a query execution. -type driverResult struct { - lastInsertID int64 - rowsAffected int64 -} - -// LastInsertID returns the database's auto-generated ID after, for example, an -// INSERT into a table with primary key. -func (r *driverResult) LastInsertId() (int64, error) { // -golint - return r.lastInsertID, nil -} - -// RowsAffected returns the number of rows affected by the query. -func (r *driverResult) RowsAffected() (int64, error) { - return r.rowsAffected, nil -} - -// driverRows is an iterator over an executed query's results. -type driverRows struct { - rs ast.RecordSet - params *driverParams -} - -// Columns returns the names of the columns. The number of columns of the -// result is inferred from the length of the slice. If a particular column -// name isn't known, an empty string should be returned for that entry. -func (r *driverRows) Columns() []string { - if r.rs == nil { - return []string{} - } - fs, _ := r.rs.Fields() - names := make([]string, len(fs)) - for i, f := range fs { - names[i] = f.ColumnAsName.O - } - return names -} - -// Close closes the rows iterator. -func (r *driverRows) Close() error { - if r.rs != nil { - return r.rs.Close() - } - return nil -} - -// Next is called to populate the next row of data into the provided slice. The -// provided slice will be the same size as the Columns() are wide. -// -// The dest slice may be populated only with a driver Value type, but excluding -// string. All string values must be converted to []byte. -// -// Next should return io.EOF when there are no more rows. -func (r *driverRows) Next(dest []driver.Value) error { - if r.rs == nil { - return io.EOF - } - row, err := r.rs.Next() - if err != nil { - return errors.Trace(err) - } - if row == nil { - return io.EOF - } - if len(row.Data) != len(dest) { - return errors.Errorf("field count mismatch: got %d, need %d", len(row.Data), len(dest)) - } - for i, xi := range row.Data { - switch xi.Kind() { - case types.KindNull: - dest[i] = nil - case types.KindInt64: - dest[i] = xi.GetInt64() - case types.KindUint64: - dest[i] = xi.GetUint64() - case types.KindFloat32: - dest[i] = xi.GetFloat32() - case types.KindFloat64: - dest[i] = xi.GetFloat64() - case types.KindString: - dest[i] = xi.GetString() - case types.KindBytes: - dest[i] = xi.GetBytes() - case types.KindMysqlBit: - dest[i] = xi.GetMysqlBit().ToString() - case types.KindMysqlDecimal: - dest[i] = xi.GetMysqlDecimal().String() - case types.KindMysqlDuration: - dest[i] = xi.GetMysqlDuration().String() - case types.KindMysqlEnum: - dest[i] = xi.GetMysqlEnum().String() - case types.KindMysqlHex: - dest[i] = xi.GetMysqlHex().ToString() - case types.KindMysqlSet: - dest[i] = xi.GetMysqlSet().String() - case types.KindMysqlTime: - t := xi.GetMysqlTime() - if !r.params.parseTime { - dest[i] = t.String() - } else { - dest[i] = t.Time - } - default: - return errors.Errorf("unable to handle type %T", xi.GetValue()) - } - } - return nil -} - -// driverStmt is a prepared statement. It is bound to a driverConn and not used -// by multiple goroutines concurrently. -type driverStmt struct { - conn *driverConn - query string - stmtID uint32 - paramCount int - isQuery bool -} - -// Close closes the statement. -// -// As of Go 1.1, a Stmt will not be closed if it's in use by any queries. -func (s *driverStmt) Close() error { - s.conn.s.DropPreparedStmt(s.stmtID) - delete(s.conn.stmts, s.query) - return nil -} - -// NumInput returns the number of placeholder parameters. -// -// If NumInput returns >= 0, the sql package will sanity check argument counts -// from callers and return errors to the caller before the statement's Exec or -// Query methods are called. -// -// NumInput may also return -1, if the driver doesn't know its number of -// placeholders. In that case, the sql package will not sanity check Exec or -// Query argument counts. -func (s *driverStmt) NumInput() int { - return s.paramCount -} - -// Exec executes a query that doesn't return rows, such as an INSERT or UPDATE. -func (s *driverStmt) Exec(args []driver.Value) (driver.Result, error) { - c := s.conn - _, err := c.s.ExecutePreparedStmt(s.stmtID, params(args)...) - if err != nil { - return nil, errors.Trace(err) - } - r := &driverResult{} - if s != nil { - r.lastInsertID, r.rowsAffected = int64(c.s.LastInsertID()), int64(c.s.AffectedRows()) - } - return r, nil -} - -// Exec executes a query that may return rows, such as a SELECT. -func (s *driverStmt) Query(args []driver.Value) (driver.Rows, error) { - c := s.conn - rs, err := c.s.ExecutePreparedStmt(s.stmtID, params(args)...) - if err != nil { - return nil, errors.Trace(err) - } - if rs == nil { - if s.isQuery { - return nil, errors.Trace(errNoResult) - } - // The statement is not a query. - return &driverRows{}, nil - } - return &driverRows{params: s.conn.params, rs: rs}, nil -} - -func init() { - RegisterDriver() -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin.go b/vendor/github.com/pingcap/tidb/evaluator/builtin.go deleted file mode 100644 index 5d44b616c431..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin.go +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/util/types" -) - -// OldFunc is for a old builtin function. -type OldFunc struct { - // F is the specific calling function. - F func([]interface{}, context.Context) (interface{}, error) - // MinArgs is the minimal arguments needed, - MinArgs int - // MaxArgs is the maximal arguments needed, -1 for infinity. - MaxArgs int - // IsStatic shows whether this function can be called statically. - IsStatic bool - // IsAggregate represents whether this function is an aggregate function or not. - IsAggregate bool -} - -// Func is for a builtin function. -type Func struct { - // F is the specific calling function. - F func([]types.Datum, context.Context) (types.Datum, error) - // MinArgs is the minimal arguments needed, - MinArgs int - // MaxArgs is the maximal arguments needed, -1 for infinity. - MaxArgs int -} - -// OldFuncs holds all has old registered builtin functions. -var OldFuncs = map[string]OldFunc{ - // control functions - "if": {builtinIf, 3, 3, true, false}, - "ifnull": {builtinIfNull, 2, 2, true, false}, - "nullif": {builtinNullIf, 2, 2, true, false}, - - // string functions - "replace": {builtinReplace, 3, 3, true, false}, - "strcmp": {builtinStrcmp, 2, 2, true, false}, - "convert": {builtinConvert, 2, 2, true, false}, - "substring": {builtinSubstring, 2, 3, true, false}, - "substring_index": {builtinSubstringIndex, 3, 3, true, false}, - "locate": {builtinLocate, 2, 3, true, false}, - "trim": {builtinTrim, 1, 3, true, false}, - - // information functions - "current_user": {builtinCurrentUser, 0, 0, false, false}, - "database": {builtinDatabase, 0, 0, false, false}, - "found_rows": {builtinFoundRows, 0, 0, false, false}, - "user": {builtinUser, 0, 0, false, false}, - "connection_id": {builtinConnectionID, 0, 0, true, false}, - "version": {builtinVersion, 0, 0, true, false}, -} - -// Funcs holds all registered builtin functions. -var Funcs = map[string]Func{ - // common functions - "coalesce": {builtinCoalesce, 1, -1}, - - // math functions - "abs": {builtinAbs, 1, 1}, - "pow": {builtinPow, 2, 2}, - "power": {builtinPow, 2, 2}, - "rand": {builtinRand, 0, 1}, - - // time functions - "curdate": {builtinCurrentDate, 0, 0}, - "current_date": {builtinCurrentDate, 0, 0}, - "current_time": {builtinCurrentTime, 0, 1}, - "current_timestamp": {builtinNow, 0, 1}, - "curtime": {builtinCurrentTime, 0, 1}, - "date": {builtinDate, 1, 1}, - "day": {builtinDay, 1, 1}, - "dayname": {builtinDayName, 1, 1}, - "dayofmonth": {builtinDayOfMonth, 1, 1}, - "dayofweek": {builtinDayOfWeek, 1, 1}, - "dayofyear": {builtinDayOfYear, 1, 1}, - "hour": {builtinHour, 1, 1}, - "microsecond": {builtinMicroSecond, 1, 1}, - "minute": {builtinMinute, 1, 1}, - "month": {builtinMonth, 1, 1}, - "now": {builtinNow, 0, 1}, - "second": {builtinSecond, 1, 1}, - "sysdate": {builtinSysDate, 0, 1}, - "week": {builtinWeek, 1, 2}, - "weekday": {builtinWeekDay, 1, 1}, - "weekofyear": {builtinWeekOfYear, 1, 1}, - "year": {builtinYear, 1, 1}, - "yearweek": {builtinYearWeek, 1, 2}, - "extract": {builtinExtract, 2, 2}, - "date_arith": {builtinDateArith, 3, 3}, - - // string functions - "concat": {builtinConcat, 1, -1}, - "concat_ws": {builtinConcatWS, 2, -1}, - "left": {builtinLeft, 2, 2}, - "length": {builtinLength, 1, 1}, - "lower": {builtinLower, 1, 1}, - "repeat": {builtinRepeat, 2, 2}, - "upper": {builtinUpper, 1, 1}, -} - -// See: http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce -func builtinCoalesce(args []types.Datum, ctx context.Context) (d types.Datum, err error) { - for _, d = range args { - if d.Kind() != types.KindNull { - return d, nil - } - } - return d, nil -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin_control.go b/vendor/github.com/pingcap/tidb/evaluator/builtin_control.go deleted file mode 100644 index c310f3fab601..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin_control.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/util/types" -) - -// See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_if -func builtinIf(args []interface{}, _ context.Context) (interface{}, error) { - // if(expr1, expr2, expr3) - // if expr1 is true, return expr2, otherwise, return expr3 - v1 := args[0] - v2 := args[1] - v3 := args[2] - - if v1 == nil { - return v3, nil - } - - b, err := types.ToBool(v1) - if err != nil { - return nil, err - } - - // TODO: check return type, must be numeric or string - if b == 1 { - return v2, nil - } - - return v3, nil -} - -// See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_ifnull -func builtinIfNull(args []interface{}, _ context.Context) (interface{}, error) { - // ifnull(expr1, expr2) - // if expr1 is not null, return expr1, otherwise, return expr2 - v1 := args[0] - v2 := args[1] - - if v1 != nil { - return v1, nil - } - - return v2, nil -} - -// See https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_nullif -func builtinNullIf(args []interface{}, _ context.Context) (interface{}, error) { - // nullif(expr1, expr2) - // returns null if expr1 = expr2 is true, otherwise returns expr1 - v1 := args[0] - v2 := args[1] - - if v1 == nil || v2 == nil { - return v1, nil - } - - if n, err := types.Compare(v1, v2); err != nil || n == 0 { - return nil, err - } - - return v1, nil -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin_info.go b/vendor/github.com/pingcap/tidb/evaluator/builtin_info.go deleted file mode 100644 index 2004c0d13cb9..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin_info.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/sessionctx/variable" -) - -// See: https://dev.mysql.com/doc/refman/5.7/en/information-functions.html - -func builtinDatabase(args []interface{}, ctx context.Context) (v interface{}, err error) { - d := db.GetCurrentSchema(ctx) - if d == "" { - return nil, nil - } - return d, nil -} - -func builtinFoundRows(arg []interface{}, ctx context.Context) (interface{}, error) { - data := variable.GetSessionVars(ctx) - if data == nil { - return nil, errors.Errorf("Missing session variable when evalue builtin") - } - - return data.FoundRows, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user -// TODO: The value of CURRENT_USER() can differ from the value of USER(). We will finish this after we support grant tables. -func builtinCurrentUser(args []interface{}, ctx context.Context) (v interface{}, err error) { - data := variable.GetSessionVars(ctx) - if data == nil { - return nil, errors.Errorf("Missing session variable when evalue builtin") - } - - return data.User, nil -} - -func builtinUser(args []interface{}, ctx context.Context) (v interface{}, err error) { - data := variable.GetSessionVars(ctx) - if data == nil { - return nil, errors.Errorf("Missing session variable when evalue builtin") - } - - return data.User, nil -} - -func builtinConnectionID(args []interface{}, ctx context.Context) (v interface{}, err error) { - data := variable.GetSessionVars(ctx) - if data == nil { - return nil, errors.Errorf("Missing session variable when evalue builtin") - } - - return data.ConnectionID, nil -} - -func builtinVersion(args []interface{}, ctx context.Context) (v interface{}, err error) { - return mysql.ServerVersion, nil -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin_math.go b/vendor/github.com/pingcap/tidb/evaluator/builtin_math.go deleted file mode 100644 index d01289426cc4..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin_math.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "math" - "math/rand" - - "github.com/juju/errors" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/util/types" -) - -// see https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html - -func builtinAbs(args []types.Datum, _ context.Context) (d types.Datum, err error) { - d = args[0] - switch d.Kind() { - case types.KindNull: - return d, nil - case types.KindUint64: - return d, nil - case types.KindInt64: - iv := d.GetInt64() - if iv >= 0 { - d.SetInt64(iv) - return d, nil - } - d.SetInt64(-iv) - return d, nil - default: - // we will try to convert other types to float - // TODO: if time has no precision, it will be a integer - f, err := d.ToFloat64() - d.SetFloat64(math.Abs(f)) - return d, errors.Trace(err) - } -} - -func builtinRand(args []types.Datum, _ context.Context) (d types.Datum, err error) { - if len(args) == 1 && args[0].Kind() != types.KindNull { - seed, err := args[0].ToInt64() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - - rand.Seed(seed) - } - d.SetFloat64(rand.Float64()) - return d, nil -} - -func builtinPow(args []types.Datum, _ context.Context) (d types.Datum, err error) { - x, err := args[0].ToFloat64() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - - y, err := args[1].ToFloat64() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - d.SetFloat64(math.Pow(x, y)) - return d, nil -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin_string.go b/vendor/github.com/pingcap/tidb/evaluator/builtin_string.go deleted file mode 100644 index 1751c83f94cf..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin_string.go +++ /dev/null @@ -1,476 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" - "golang.org/x/text/transform" -) - -// https://dev.mysql.com/doc/refman/5.7/en/string-functions.html - -func builtinLength(args []types.Datum, _ context.Context) (d types.Datum, err error) { - switch args[0].Kind() { - case types.KindNull: - d.SetNull() - return d, nil - default: - s, err := args[0].ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - d.SetInt64(int64(len(s))) - return d, nil - } -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat -func builtinConcat(args []types.Datum, _ context.Context) (d types.Datum, err error) { - var s []byte - for _, a := range args { - if a.Kind() == types.KindNull { - d.SetNull() - return d, nil - } - var ss string - ss, err = a.ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - s = append(s, []byte(ss)...) - } - d.SetBytesAsString(s) - return d, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat-ws -func builtinConcatWS(args []types.Datum, _ context.Context) (d types.Datum, err error) { - var sep string - s := make([]string, 0, len(args)) - for i, a := range args { - if a.Kind() == types.KindNull { - if i == 0 { - d.SetNull() - return d, nil - } - continue - } - ss, err := a.ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - - if i == 0 { - sep = ss - continue - } - s = append(s, ss) - } - - d.SetString(strings.Join(s, sep)) - return d, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_left -func builtinLeft(args []types.Datum, _ context.Context) (d types.Datum, err error) { - str, err := args[0].ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - length, err := args[1].ToInt64() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - l := int(length) - if l < 0 { - l = 0 - } else if l > len(str) { - l = len(str) - } - d.SetString(str[:l]) - return d, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_repeat -func builtinRepeat(args []types.Datum, _ context.Context) (d types.Datum, err error) { - str, err := args[0].ToString() - if err != nil { - d.SetNull() - return d, err - } - ch := fmt.Sprintf("%v", str) - num := 0 - x := args[1] - switch x.Kind() { - case types.KindInt64: - num = int(x.GetInt64()) - case types.KindUint64: - num = int(x.GetUint64()) - } - if num < 1 { - d.SetString("") - return d, nil - } - d.SetString(strings.Repeat(ch, num)) - return d, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_lower -func builtinLower(args []types.Datum, _ context.Context) (d types.Datum, err error) { - x := args[0] - switch x.Kind() { - case types.KindNull: - d.SetNull() - return d, nil - default: - s, err := x.ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - d.SetString(strings.ToLower(s)) - return d, nil - } -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_upper -func builtinUpper(args []types.Datum, _ context.Context) (d types.Datum, err error) { - x := args[0] - switch x.Kind() { - case types.KindNull: - d.SetNull() - return d, nil - default: - s, err := x.ToString() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - d.SetString(strings.ToUpper(s)) - return d, nil - } -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html -func builtinStrcmp(args []interface{}, _ context.Context) (interface{}, error) { - if args[0] == nil || args[1] == nil { - return nil, nil - } - left, err := types.ToString(args[0]) - if err != nil { - return nil, errors.Trace(err) - } - right, err := types.ToString(args[1]) - if err != nil { - return nil, errors.Trace(err) - } - res := types.CompareString(left, right) - return res, nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace -func builtinReplace(args []interface{}, _ context.Context) (interface{}, error) { - for _, arg := range args { - if arg == nil { - return nil, nil - } - } - - str, err := types.ToString(args[0]) - if err != nil { - return nil, errors.Trace(err) - } - oldStr, err := types.ToString(args[1]) - if err != nil { - return nil, errors.Trace(err) - } - newStr, err := types.ToString(args[2]) - if err != nil { - return nil, errors.Trace(err) - } - - return strings.Replace(str, oldStr, newStr, -1), nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert -func builtinConvert(args []interface{}, _ context.Context) (interface{}, error) { - value := args[0] - Charset := args[1].(string) - - // Casting nil to any type returns nil - if value == nil { - return nil, nil - } - str, ok := value.(string) - if !ok { - return nil, nil - } - if strings.ToLower(Charset) == "ascii" { - return value, nil - } else if strings.ToLower(Charset) == "utf8mb4" { - return value, nil - } - - encoding, _ := charset.Lookup(Charset) - if encoding == nil { - return nil, errors.Errorf("unknown encoding: %s", Charset) - } - - target, _, err := transform.String(encoding.NewDecoder(), str) - if err != nil { - log.Errorf("Convert %s to %s with error: %v", str, Charset, err) - return nil, errors.Trace(err) - } - return target, nil -} - -func builtinSubstring(args []interface{}, _ context.Context) (interface{}, error) { - // The meaning of the elements of args. - // arg[0] -> StrExpr - // arg[1] -> Pos - // arg[2] -> Len (Optional) - str, err := types.ToString(args[0]) - if err != nil { - return nil, errors.Errorf("Substring invalid args, need string but get %T", args[0]) - } - - t := args[1] - p, ok := t.(int64) - if !ok { - return nil, errors.Errorf("Substring invalid pos args, need int but get %T", t) - } - pos := int(p) - - length := -1 - if len(args) == 3 { - t = args[2] - p, ok = t.(int64) - if !ok { - return nil, errors.Errorf("Substring invalid pos args, need int but get %T", t) - } - length = int(p) - } - // The forms without a len argument return a substring from string str starting at position pos. - // The forms with a len argument return a substring len characters long from string str, starting at position pos. - // The forms that use FROM are standard SQL syntax. It is also possible to use a negative value for pos. - // In this case, the beginning of the substring is pos characters from the end of the string, rather than the beginning. - // A negative value may be used for pos in any of the forms of this function. - if pos < 0 { - pos = len(str) + pos - } else { - pos-- - } - if pos > len(str) || pos <= 0 { - pos = len(str) - } - end := len(str) - if length != -1 { - end = pos + length - } - if end > len(str) { - end = len(str) - } - return str[pos:end], nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_substring-index -func builtinSubstringIndex(args []interface{}, _ context.Context) (interface{}, error) { - // The meaning of the elements of args. - // args[0] -> StrExpr - // args[1] -> Delim - // args[2] -> Count - fs := args[0] - str, err := types.ToString(fs) - if err != nil { - return nil, errors.Errorf("Substring_Index invalid args, need string but get %T", fs) - } - - t := args[1] - delim, err := types.ToString(t) - if err != nil { - return nil, errors.Errorf("Substring_Index invalid delim, need string but get %T", t) - } - if len(delim) == 0 { - return "", nil - } - - t = args[2] - c, err := types.ToInt64(t) - if err != nil { - return nil, errors.Trace(err) - } - count := int(c) - strs := strings.Split(str, delim) - var ( - start = 0 - end = len(strs) - ) - if count > 0 { - // If count is positive, everything to the left of the final delimiter (counting from the left) is returned. - if count < end { - end = count - } - } else { - // If count is negative, everything to the right of the final delimiter (counting from the right) is returned. - count = -count - if count < end { - start = end - count - } - } - substrs := strs[start:end] - return strings.Join(substrs, delim), nil -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_locate -func builtinLocate(args []interface{}, _ context.Context) (interface{}, error) { - // The meaning of the elements of args. - // args[0] -> SubStr - // args[1] -> Str - // args[2] -> Pos - // eval str - fs := args[1] - if fs == nil { - return nil, nil - } - str, err := types.ToString(fs) - if err != nil { - return nil, errors.Trace(err) - } - // eval substr - fs = args[0] - if fs == nil { - return nil, nil - } - subStr, err := types.ToString(fs) - if err != nil { - return nil, errors.Trace(err) - } - // eval pos - pos := int64(0) - if len(args) == 3 { - t := args[2] - p, err := types.ToInt64(t) - if err != nil { - return nil, errors.Trace(err) - } - pos = p - 1 - if pos < 0 || pos > int64(len(str)) { - return 0, nil - } - if pos > int64(len(str)-len(subStr)) { - return 0, nil - } - } - if len(subStr) == 0 { - return pos + 1, nil - } - i := strings.Index(str[pos:], subStr) - if i == -1 { - return 0, nil - } - return int64(i) + pos + 1, nil -} - -const spaceChars = "\n\t\r " - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim -func builtinTrim(args []interface{}, _ context.Context) (interface{}, error) { - // args[0] -> Str - // args[1] -> RemStr - // args[2] -> Direction - // eval str - fs := args[0] - if fs == nil { - return nil, nil - } - str, err := types.ToString(fs) - if err != nil { - return nil, errors.Trace(err) - } - remstr := "" - // eval remstr - if len(args) > 1 { - fs = args[1] - if fs != nil { - remstr, err = types.ToString(fs) - if err != nil { - return nil, errors.Trace(err) - } - } - } - // do trim - var result string - var direction ast.TrimDirectionType - if len(args) > 2 { - direction = args[2].(ast.TrimDirectionType) - } else { - direction = ast.TrimBothDefault - } - if direction == ast.TrimLeading { - if len(remstr) > 0 { - result = trimLeft(str, remstr) - } else { - result = strings.TrimLeft(str, spaceChars) - } - } else if direction == ast.TrimTrailing { - if len(remstr) > 0 { - result = trimRight(str, remstr) - } else { - result = strings.TrimRight(str, spaceChars) - } - } else if len(remstr) > 0 { - x := trimLeft(str, remstr) - result = trimRight(x, remstr) - } else { - result = strings.Trim(str, spaceChars) - } - return result, nil -} - -func trimLeft(str, remstr string) string { - for { - x := strings.TrimPrefix(str, remstr) - if len(x) == len(str) { - return x - } - str = x - } -} - -func trimRight(str, remstr string) string { - for { - x := strings.TrimSuffix(str, remstr) - if len(x) == len(str) { - return x - } - str = x - } -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/builtin_time.go b/vendor/github.com/pingcap/tidb/evaluator/builtin_time.go deleted file mode 100644 index 084ae1337036..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/builtin_time.go +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "fmt" - "regexp" - "strings" - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/types" -) - -func convertToTime(arg types.Datum, tp byte) (d types.Datum, err error) { - f := types.NewFieldType(tp) - f.Decimal = mysql.MaxFsp - - d, err = arg.ConvertTo(f) - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - - if d.Kind() == types.KindNull { - return d, nil - } - - if d.Kind() != types.KindMysqlTime { - err = errors.Errorf("need time type, but got %T", d.GetValue()) - d.SetNull() - return d, err - } - return d, nil -} - -func convertToDuration(arg types.Datum, fsp int) (d types.Datum, err error) { - f := types.NewFieldType(mysql.TypeDuration) - f.Decimal = fsp - - d, err = arg.ConvertTo(f) - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - - if d.Kind() == types.KindNull { - d.SetNull() - return d, nil - } - - if d.Kind() != types.KindMysqlDuration { - err = errors.Errorf("need duration type, but got %T", d.GetValue()) - d.SetNull() - return d, err - } - return d, nil -} - -func builtinDate(args []types.Datum, _ context.Context) (types.Datum, error) { - return convertToTime(args[0], mysql.TypeDate) -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_day -// day is a synonym for DayOfMonth -func builtinDay(args []types.Datum, ctx context.Context) (types.Datum, error) { - return builtinDayOfMonth(args, ctx) -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_hour -func builtinHour(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToDuration(args[0], mysql.MaxFsp) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - h := int64(d.GetMysqlDuration().Hour()) - d.SetInt64(h) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_minute -func builtinMinute(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToDuration(args[0], mysql.MaxFsp) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - m := int64(d.GetMysqlDuration().Minute()) - d.SetInt64(m) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_second -func builtinSecond(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToDuration(args[0], mysql.MaxFsp) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - s := int64(d.GetMysqlDuration().Second()) - d.SetInt64(s) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_microsecond -func builtinMicroSecond(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToDuration(args[0], mysql.MaxFsp) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - m := int64(d.GetMysqlDuration().MicroSecond()) - d.SetInt64(m) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_month -func builtinMonth(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - i := int64(0) - if t.IsZero() { - d.SetInt64(i) - return d, nil - } - i = int64(t.Month()) - d.SetInt64(i) - return d, nil -} - -func builtinNow(args []types.Datum, _ context.Context) (d types.Datum, err error) { - // TODO: if NOW is used in stored function or trigger, NOW will return the beginning time - // of the execution. - fsp := 0 - if len(args) == 1 && args[0].Kind() != types.KindNull { - if fsp, err = checkFsp(args[0]); err != nil { - d.SetNull() - return d, errors.Trace(err) - } - } - - t := mysql.Time{ - Time: time.Now(), - Type: mysql.TypeDatetime, - // set unspecified for later round - Fsp: mysql.UnspecifiedFsp, - } - - tr, err := t.RoundFrac(int(fsp)) - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - d.SetMysqlTime(tr) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayname -func builtinDayName(args []types.Datum, ctx context.Context) (types.Datum, error) { - d, err := builtinWeekDay(args, ctx) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - weekday := d.GetInt64() - if (weekday < 0) || (weekday >= int64(len(mysql.WeekdayNames))) { - d.SetNull() - return d, errors.Errorf("no name for invalid weekday: %d.", weekday) - } - d.SetString(mysql.WeekdayNames[weekday]) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofmonth -func builtinDayOfMonth(args []types.Datum, _ context.Context) (d types.Datum, err error) { - // TODO: some invalid format like 2000-00-00 will return 0 too. - d, err = convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetInt64(int64(0)) - return d, nil - } - - d.SetInt64(int64(t.Day())) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofweek -func builtinDayOfWeek(args []types.Datum, _ context.Context) (d types.Datum, err error) { - d, err = convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetNull() - // TODO: log warning or return error? - return d, nil - } - - // 1 is Sunday, 2 is Monday, .... 7 is Saturday - d.SetInt64(int64(t.Weekday()) + 1) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_dayofyear -func builtinDayOfYear(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - t := d.GetMysqlTime() - if t.IsZero() { - // TODO: log warning or return error? - d.SetNull() - return d, nil - } - - yd := int64(t.YearDay()) - d.SetInt64(yd) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_week -func builtinWeek(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - // TODO: log warning or return error? - d.SetNull() - return d, nil - } - - // TODO: support multi mode for week - _, week := t.ISOWeek() - wi := int64(week) - d.SetInt64(wi) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_weekday -func builtinWeekDay(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - // TODO: log warning or return error? - d.SetNull() - return d, nil - } - - // Monday is 0, ... Sunday = 6 in MySQL - // but in go, Sunday is 0, ... Saturday is 6 - // w will do a conversion. - w := (int64(t.Weekday()) + 6) % 7 - d.SetInt64(w) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_weekofyear -func builtinWeekOfYear(args []types.Datum, ctx context.Context) (types.Datum, error) { - // WeekOfYear is equivalent to to Week(date, 3) - d := types.Datum{} - d.SetInt64(3) - return builtinWeek([]types.Datum{args[0], d}, ctx) -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_year -func builtinYear(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetInt64(0) - return d, nil - } - - d.SetInt64(int64(t.Year())) - return d, nil -} - -// See http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_yearweek -func builtinYearWeek(args []types.Datum, _ context.Context) (types.Datum, error) { - d, err := convertToTime(args[0], mysql.TypeDate) - if err != nil || d.Kind() == types.KindNull { - d.SetNull() - return d, errors.Trace(err) - } - - // No need to check type here. - t := d.GetMysqlTime() - if t.IsZero() { - d.SetNull() - // TODO: log warning or return error? - return d, nil - } - - // TODO: support multi mode for week - year, week := t.ISOWeek() - d.SetInt64(int64(year*100 + week)) - return d, nil -} - -func builtinSysDate(args []types.Datum, ctx context.Context) (types.Datum, error) { - // SYSDATE is not the same as NOW if NOW is used in a stored function or trigger. - // But here we can just think they are the same because we don't support stored function - // and trigger now. - return builtinNow(args, ctx) -} - -// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_curdate -func builtinCurrentDate(args []types.Datum, _ context.Context) (d types.Datum, err error) { - year, month, day := time.Now().Date() - t := mysql.Time{ - Time: time.Date(year, month, day, 0, 0, 0, 0, time.Local), - Type: mysql.TypeDate, Fsp: 0} - d.SetMysqlTime(t) - return d, nil -} - -// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_curtime -func builtinCurrentTime(args []types.Datum, _ context.Context) (d types.Datum, err error) { - fsp := 0 - if len(args) == 1 && args[0].Kind() != types.KindNull { - if fsp, err = checkFsp(args[0]); err != nil { - d.SetNull() - return d, errors.Trace(err) - } - } - d.SetString(time.Now().Format("15:04:05.000000")) - return convertToDuration(d, fsp) -} - -// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract -func builtinExtract(args []types.Datum, _ context.Context) (d types.Datum, err error) { - unit := args[0].GetString() - vd := args[1] - - if vd.Kind() == types.KindNull { - d.SetNull() - return d, nil - } - - f := types.NewFieldType(mysql.TypeDatetime) - f.Decimal = mysql.MaxFsp - val, err := vd.ConvertTo(f) - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - if val.Kind() == types.KindNull { - d.SetNull() - return d, nil - } - - if val.Kind() != types.KindMysqlTime { - err = errors.Errorf("need time type, but got %T", val) - d.SetNull() - return d, err - } - t := val.GetMysqlTime() - n, err1 := mysql.ExtractTimeNum(unit, t) - if err1 != nil { - d.SetNull() - return d, errors.Trace(err1) - } - d.SetInt64(n) - return d, nil -} - -func checkFsp(arg types.Datum) (int, error) { - fsp, err := arg.ToInt64() - if err != nil { - return 0, errors.Trace(err) - } - if int(fsp) > mysql.MaxFsp { - return 0, errors.Errorf("Too big precision %d specified. Maximum is 6.", fsp) - } else if fsp < 0 { - return 0, errors.Errorf("Invalid negative %d specified, must in [0, 6].", fsp) - } - return int(fsp), nil -} - -func builtinDateArith(args []types.Datum, ctx context.Context) (d types.Datum, err error) { - // Op is used for distinguishing date_add and date_sub. - // args[0] -> Op - // args[1] -> Date - // args[2] -> DateArithInterval - // health check for date and interval - if args[1].Kind() == types.KindNull { - d.SetNull() - return d, nil - } - nodeDate := args[1] - nodeInterval := args[2].GetInterface().(ast.DateArithInterval) - nodeIntervalIntervalDatum := nodeInterval.Interval.GetDatum() - if nodeIntervalIntervalDatum.Kind() == types.KindNull { - d.SetNull() - return d, nil - } - // parse date - fieldType := mysql.TypeDate - var resultField *types.FieldType - switch nodeDate.Kind() { - case types.KindMysqlTime: - x := nodeDate.GetMysqlTime() - if (x.Type == mysql.TypeDatetime) || (x.Type == mysql.TypeTimestamp) { - fieldType = mysql.TypeDatetime - } - case types.KindString: - x := nodeDate.GetString() - if !mysql.IsDateFormat(x) { - fieldType = mysql.TypeDatetime - } - case types.KindInt64: - x := nodeDate.GetInt64() - if t, err1 := mysql.ParseTimeFromInt64(x); err1 == nil { - if (t.Type == mysql.TypeDatetime) || (t.Type == mysql.TypeTimestamp) { - fieldType = mysql.TypeDatetime - } - } - } - if mysql.IsClockUnit(nodeInterval.Unit) { - fieldType = mysql.TypeDatetime - } - resultField = types.NewFieldType(fieldType) - resultField.Decimal = mysql.MaxFsp - value, err := nodeDate.ConvertTo(resultField) - if err != nil { - d.SetNull() - return d, ErrInvalidOperation.Gen("DateArith invalid args, need date but get %T", nodeDate) - } - if value.Kind() == types.KindNull { - d.SetNull() - return d, ErrInvalidOperation.Gen("DateArith invalid args, need date but get %v", value.GetValue()) - } - if value.Kind() != types.KindMysqlTime { - d.SetNull() - return d, ErrInvalidOperation.Gen("DateArith need time type, but got %T", value.GetValue()) - } - result := value.GetMysqlTime() - // parse interval - var interval string - if strings.ToLower(nodeInterval.Unit) == "day" { - day, err2 := parseDayInterval(*nodeIntervalIntervalDatum) - if err2 != nil { - d.SetNull() - return d, ErrInvalidOperation.Gen("DateArith invalid day interval, need int but got %T", nodeIntervalIntervalDatum.GetString()) - } - interval = fmt.Sprintf("%d", day) - } else { - if nodeIntervalIntervalDatum.Kind() == types.KindString { - interval = fmt.Sprintf("%v", nodeIntervalIntervalDatum.GetString()) - } else { - ii, err := nodeIntervalIntervalDatum.ToInt64() - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - interval = fmt.Sprintf("%v", ii) - } - } - year, month, day, duration, err := mysql.ExtractTimeValue(nodeInterval.Unit, interval) - if err != nil { - d.SetNull() - return d, errors.Trace(err) - } - op := args[0].GetInterface().(ast.DateArithType) - if op == ast.DateSub { - year, month, day, duration = -year, -month, -day, -duration - } - result.Time = result.Time.Add(duration) - result.Time = result.Time.AddDate(int(year), int(month), int(day)) - if result.Time.Nanosecond() == 0 { - result.Fsp = 0 - } - d.SetMysqlTime(result) - return d, nil -} - -var reg = regexp.MustCompile(`[\d]+`) - -func parseDayInterval(value types.Datum) (int64, error) { - switch value.Kind() { - case types.KindString: - vs := value.GetString() - s := strings.ToLower(vs) - if s == "false" { - return 0, nil - } else if s == "true" { - return 1, nil - } - value.SetString(reg.FindString(vs)) - } - return value.ToInt64() -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/evaluator.go b/vendor/github.com/pingcap/tidb/evaluator/evaluator.go deleted file mode 100644 index 5531a8777b86..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/evaluator.go +++ /dev/null @@ -1,717 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/types" -) - -// Error instances. -var ( - ErrInvalidOperation = terror.ClassEvaluator.New(CodeInvalidOperation, "invalid operation") -) - -// Error codes. -const ( - CodeInvalidOperation terror.ErrCode = 1 -) - -// Eval evaluates an expression to a value. -func Eval(ctx context.Context, expr ast.ExprNode) (interface{}, error) { - e := &Evaluator{ctx: ctx} - expr.Accept(e) - if e.err != nil { - return nil, errors.Trace(e.err) - } - return expr.GetValue(), nil -} - -// EvalBool evalueates an expression to a boolean value. -func EvalBool(ctx context.Context, expr ast.ExprNode) (bool, error) { - val, err := Eval(ctx, expr) - if err != nil { - return false, errors.Trace(err) - } - if val == nil { - return false, nil - } - - i, err := types.ToBool(val) - if err != nil { - return false, errors.Trace(err) - } - return i != 0, nil -} - -func boolToInt64(v bool) int64 { - if v { - return int64(1) - } - return int64(0) -} - -// Evaluator is an ast Visitor that evaluates an expression. -type Evaluator struct { - ctx context.Context - err error - multipleRows bool - existRow bool -} - -// Enter implements ast.Visitor interface. -func (e *Evaluator) Enter(in ast.Node) (out ast.Node, skipChildren bool) { - switch v := in.(type) { - case *ast.SubqueryExpr: - if v.Evaluated && !v.UseOuterContext { - return in, true - } - case *ast.PatternInExpr, *ast.CompareSubqueryExpr: - e.multipleRows = true - case *ast.ExistsSubqueryExpr: - e.existRow = true - } - return in, false -} - -// Leave implements ast.Visitor interface. -func (e *Evaluator) Leave(in ast.Node) (out ast.Node, ok bool) { - switch v := in.(type) { - case *ast.AggregateFuncExpr: - ok = e.aggregateFunc(v) - case *ast.BetweenExpr: - ok = e.between(v) - case *ast.BinaryOperationExpr: - ok = e.binaryOperation(v) - case *ast.CaseExpr: - ok = e.caseExpr(v) - case *ast.ColumnName: - ok = true - case *ast.ColumnNameExpr: - ok = e.columnName(v) - case *ast.CompareSubqueryExpr: - e.multipleRows = false - ok = e.compareSubquery(v) - case *ast.DefaultExpr: - ok = e.defaultExpr(v) - case *ast.ExistsSubqueryExpr: - e.existRow = false - ok = e.existsSubquery(v) - case *ast.FuncCallExpr: - ok = e.funcCall(v) - case *ast.FuncCastExpr: - ok = e.funcCast(v) - case *ast.IsNullExpr: - ok = e.isNull(v) - case *ast.IsTruthExpr: - ok = e.isTruth(v) - case *ast.ParamMarkerExpr: - ok = e.paramMarker(v) - case *ast.ParenthesesExpr: - ok = e.parentheses(v) - case *ast.PatternInExpr: - e.multipleRows = false - ok = e.patternIn(v) - case *ast.PatternLikeExpr: - ok = e.patternLike(v) - case *ast.PatternRegexpExpr: - ok = e.patternRegexp(v) - case *ast.PositionExpr: - ok = e.position(v) - case *ast.RowExpr: - ok = e.row(v) - case *ast.SubqueryExpr: - ok = e.subqueryExpr(v) - case ast.SubqueryExec: - ok = e.subqueryExec(v) - case *ast.UnaryOperationExpr: - ok = e.unaryOperation(v) - case *ast.ValueExpr: - ok = true - case *ast.ValuesExpr: - ok = e.values(v) - case *ast.VariableExpr: - ok = e.variable(v) - case *ast.WhenClause: - ok = true - } - out = in - return -} - -func (e *Evaluator) between(v *ast.BetweenExpr) bool { - var l, r ast.ExprNode - op := opcode.AndAnd - - if v.Not { - // v < lv || v > rv - op = opcode.OrOr - l = &ast.BinaryOperationExpr{Op: opcode.LT, L: v.Expr, R: v.Left} - r = &ast.BinaryOperationExpr{Op: opcode.GT, L: v.Expr, R: v.Right} - } else { - // v >= lv && v <= rv - l = &ast.BinaryOperationExpr{Op: opcode.GE, L: v.Expr, R: v.Left} - r = &ast.BinaryOperationExpr{Op: opcode.LE, L: v.Expr, R: v.Right} - } - - ret := &ast.BinaryOperationExpr{Op: op, L: l, R: r} - ret.Accept(e) - if e.err != nil { - return false - } - v.SetDatum(*ret.GetDatum()) - return true -} - -func (e *Evaluator) caseExpr(v *ast.CaseExpr) bool { - tmp := types.NewDatum(boolToInt64(true)) - target := &tmp - if v.Value != nil { - target = v.Value.GetDatum() - } - if target.Kind() != types.KindNull { - for _, val := range v.WhenClauses { - cmp, err := target.CompareDatum(*val.Expr.GetDatum()) - if err != nil { - e.err = errors.Trace(err) - return false - } - if cmp == 0 { - v.SetDatum(*val.Result.GetDatum()) - return true - } - } - } - if v.ElseClause != nil { - v.SetDatum(*v.ElseClause.GetDatum()) - } else { - v.SetNull() - } - return true -} - -func (e *Evaluator) columnName(v *ast.ColumnNameExpr) bool { - v.SetDatum(*v.Refer.Expr.GetDatum()) - return true -} - -func (e *Evaluator) defaultExpr(v *ast.DefaultExpr) bool { - return true -} - -func (e *Evaluator) compareSubquery(cs *ast.CompareSubqueryExpr) bool { - lvDatum := cs.L.GetDatum() - if lvDatum.Kind() == types.KindNull { - cs.SetNull() - return true - } - lv := lvDatum.GetValue() - x, err := e.checkResult(cs, lv, cs.R.GetValue().([]interface{})) - if err != nil { - e.err = errors.Trace(err) - return false - } - cs.SetValue(x) - return true -} - -func (e *Evaluator) checkResult(cs *ast.CompareSubqueryExpr, lv interface{}, result []interface{}) (interface{}, error) { - if cs.All { - return e.checkAllResult(cs, lv, result) - } - return e.checkAnyResult(cs, lv, result) -} - -func (e *Evaluator) checkAllResult(cs *ast.CompareSubqueryExpr, lv interface{}, result []interface{}) (interface{}, error) { - hasNull := false - for _, v := range result { - if v == nil { - hasNull = true - continue - } - - comRes, err := types.Compare(lv, v) - if err != nil { - return nil, errors.Trace(err) - } - - res, err := getCompResult(cs.Op, comRes) - if err != nil { - return nil, errors.Trace(err) - } - if !res { - return false, nil - } - } - if hasNull { - // If no matched but we get null, return null. - // Like `insert t (c) values (1),(2),(null)`, then - // `select 3 > all (select c from t)`, returns null. - return nil, nil - } - return true, nil -} - -func (e *Evaluator) checkAnyResult(cs *ast.CompareSubqueryExpr, lv interface{}, result []interface{}) (interface{}, error) { - hasNull := false - for _, v := range result { - if v == nil { - hasNull = true - continue - } - - comRes, err := types.Compare(lv, v) - if err != nil { - return nil, errors.Trace(err) - } - - res, err := getCompResult(cs.Op, comRes) - if err != nil { - return nil, errors.Trace(err) - } - if res { - return true, nil - } - } - - if hasNull { - // If no matched but we get null, return null. - // Like `insert t (c) values (1),(2),(null)`, then - // `select 0 > any (select c from t)`, returns null. - return nil, nil - } - - return false, nil -} - -func (e *Evaluator) existsSubquery(v *ast.ExistsSubqueryExpr) bool { - datum := v.Sel.GetDatum() - if datum.Kind() == types.KindNull { - v.SetInt64(0) - return true - } - r := datum.GetValue() - rows, _ := r.([]interface{}) - if len(rows) > 0 { - v.SetInt64(1) - } else { - v.SetInt64(0) - } - return true -} - -// Evaluate SubqueryExpr. -// Get the value from v.SubQuery and set it to v. -func (e *Evaluator) subqueryExpr(v *ast.SubqueryExpr) bool { - if v.SubqueryExec != nil { - v.SetDatum(*v.SubqueryExec.GetDatum()) - } - v.Evaluated = true - return true -} - -// Do the real work to evaluate subquery. -func (e *Evaluator) subqueryExec(v ast.SubqueryExec) bool { - rowCount := 2 - if e.multipleRows { - rowCount = -1 - } else if e.existRow { - rowCount = 1 - } - rows, err := v.EvalRows(e.ctx, rowCount) - if err != nil { - e.err = errors.Trace(err) - return false - } - if e.multipleRows || e.existRow { - v.SetValue(rows) - return true - } - switch len(rows) { - case 0: - v.GetDatum().SetNull() - case 1: - v.SetValue(rows[0]) - default: - e.err = errors.New("Subquery returns more than 1 row") - return false - } - return true -} - -func (e *Evaluator) checkInList(not bool, in interface{}, list []interface{}) interface{} { - hasNull := false - for _, v := range list { - if v == nil { - hasNull = true - continue - } - - r, err := types.Compare(types.Coerce(in, v)) - if err != nil { - e.err = errors.Trace(err) - return nil - } - if r == 0 { - if !not { - return 1 - } - return 0 - } - } - - if hasNull { - // if no matched but we got null in In, return null - // e.g 1 in (null, 2, 3) returns null - return nil - } - if not { - return 1 - } - return 0 -} - -func (e *Evaluator) patternIn(n *ast.PatternInExpr) bool { - lhs := n.Expr.GetDatum() - if lhs.Kind() == types.KindNull { - n.SetNull() - return true - } - if n.Sel == nil { - values := make([]interface{}, 0, len(n.List)) - for _, ei := range n.List { - values = append(values, ei.GetValue()) - } - x := e.checkInList(n.Not, lhs.GetValue(), values) - if e.err != nil { - return false - } - n.SetValue(x) - return true - } - se := n.Sel.(*ast.SubqueryExpr) - sel := se.SubqueryExec - - res := sel.GetValue().([]interface{}) - x := e.checkInList(n.Not, lhs.GetValue(), res) - if e.err != nil { - return false - } - n.SetValue(x) - return true -} - -func (e *Evaluator) isNull(v *ast.IsNullExpr) bool { - var boolVal bool - if v.Expr.GetDatum().Kind() == types.KindNull { - boolVal = true - } - if v.Not { - boolVal = !boolVal - } - v.SetInt64(boolToInt64(boolVal)) - return true -} - -func (e *Evaluator) isTruth(v *ast.IsTruthExpr) bool { - var boolVal bool - datum := v.Expr.GetDatum() - if datum.Kind() != types.KindNull { - ival, err := datum.ToBool() - if err != nil { - e.err = errors.Trace(err) - return false - } - if ival == v.True { - boolVal = true - } - } - if v.Not { - boolVal = !boolVal - } - v.GetDatum().SetInt64(boolToInt64(boolVal)) - return true -} - -func (e *Evaluator) paramMarker(v *ast.ParamMarkerExpr) bool { - return true -} - -func (e *Evaluator) parentheses(v *ast.ParenthesesExpr) bool { - v.SetDatum(*v.Expr.GetDatum()) - return true -} - -func (e *Evaluator) position(v *ast.PositionExpr) bool { - v.SetDatum(*v.Refer.Expr.GetDatum()) - return true -} - -func (e *Evaluator) row(v *ast.RowExpr) bool { - row := make([]interface{}, 0, len(v.Values)) - for _, val := range v.Values { - row = append(row, val.GetValue()) - } - v.SetValue(row) - return true -} - -func (e *Evaluator) unaryOperation(u *ast.UnaryOperationExpr) bool { - defer func() { - if er := recover(); er != nil { - e.err = errors.Errorf("%v", er) - } - }() - aDatum := u.V.GetDatum() - if aDatum.Kind() == types.KindNull { - u.SetNull() - return true - } - switch op := u.Op; op { - case opcode.Not: - n, err := aDatum.ToBool() - if err != nil { - e.err = errors.Trace(err) - } else if n == 0 { - u.SetInt64(1) - } else { - u.SetInt64(0) - } - case opcode.BitNeg: - // for bit operation, we will use int64 first, then return uint64 - n, err := aDatum.ToInt64() - if err != nil { - e.err = errors.Trace(err) - return false - } - u.SetUint64(uint64(^n)) - case opcode.Plus: - switch aDatum.Kind() { - case types.KindInt64, - types.KindUint64, - types.KindFloat64, - types.KindFloat32, - types.KindMysqlDuration, - types.KindMysqlTime, - types.KindString, - types.KindMysqlDecimal, - types.KindBytes, - types.KindMysqlHex, - types.KindMysqlBit, - types.KindMysqlEnum, - types.KindMysqlSet: - u.SetDatum(*aDatum) - default: - e.err = ErrInvalidOperation - return false - } - case opcode.Minus: - switch aDatum.Kind() { - case types.KindInt64: - u.SetInt64(-aDatum.GetInt64()) - case types.KindUint64: - u.SetInt64(-int64(aDatum.GetUint64())) - case types.KindFloat64: - u.SetFloat64(-aDatum.GetFloat64()) - case types.KindFloat32: - u.SetFloat32(-aDatum.GetFloat32()) - case types.KindMysqlDuration: - u.SetValue(mysql.ZeroDecimal.Sub(aDatum.GetMysqlDuration().ToNumber())) - case types.KindMysqlTime: - u.SetValue(mysql.ZeroDecimal.Sub(aDatum.GetMysqlTime().ToNumber())) - case types.KindString: - f, err := types.StrToFloat(aDatum.GetString()) - e.err = errors.Trace(err) - u.SetFloat64(-f) - case types.KindMysqlDecimal: - f, _ := aDatum.GetMysqlDecimal().Float64() - u.SetValue(mysql.NewDecimalFromFloat(-f)) - case types.KindBytes: - f, err := types.StrToFloat(string(aDatum.GetBytes())) - e.err = errors.Trace(err) - u.SetFloat64(-f) - case types.KindMysqlHex: - u.SetFloat64(-aDatum.GetMysqlHex().ToNumber()) - case types.KindMysqlBit: - u.SetFloat64(-aDatum.GetMysqlBit().ToNumber()) - case types.KindMysqlEnum: - u.SetFloat64(-aDatum.GetMysqlEnum().ToNumber()) - case types.KindMysqlSet: - u.SetFloat64(-aDatum.GetMysqlSet().ToNumber()) - default: - e.err = ErrInvalidOperation - return false - } - default: - e.err = ErrInvalidOperation - return false - } - - return true -} - -func (e *Evaluator) values(v *ast.ValuesExpr) bool { - v.SetDatum(*v.Column.GetDatum()) - return true -} - -func (e *Evaluator) variable(v *ast.VariableExpr) bool { - name := strings.ToLower(v.Name) - sessionVars := variable.GetSessionVars(e.ctx) - globalVars := variable.GetGlobalVarAccessor(e.ctx) - if !v.IsSystem { - // user vars - if value, ok := sessionVars.Users[name]; ok { - v.SetString(value) - return true - } - // select null user vars is permitted. - v.SetNull() - return true - } - - _, ok := variable.SysVars[name] - if !ok { - // select null sys vars is not permitted - e.err = variable.UnknownSystemVar.Gen("Unknown system variable '%s'", name) - return false - } - - if !v.IsGlobal { - if value, ok := sessionVars.Systems[name]; ok { - v.SetString(value) - return true - } - } - - value, err := globalVars.GetGlobalSysVar(e.ctx, name) - if err != nil { - e.err = errors.Trace(err) - return false - } - - v.SetString(value) - return true -} - -func (e *Evaluator) funcCall(v *ast.FuncCallExpr) bool { - of, ok := OldFuncs[v.FnName.L] - if ok { - if len(v.Args) < of.MinArgs || (of.MaxArgs != -1 && len(v.Args) > of.MaxArgs) { - e.err = ErrInvalidOperation.Gen("number of function arguments must in [%d, %d].", of.MinArgs, of.MaxArgs) - return false - } - a := make([]interface{}, len(v.Args)) - for i, arg := range v.Args { - a[i] = arg.GetValue() - } - val, err := of.F(a, e.ctx) - if err != nil { - e.err = errors.Trace(err) - return false - } - v.SetValue(val) - return true - } - f, ok := Funcs[v.FnName.L] - if !ok { - e.err = ErrInvalidOperation.Gen("unknown function %s", v.FnName.O) - return false - } - if len(v.Args) < f.MinArgs || (f.MaxArgs != -1 && len(v.Args) > f.MaxArgs) { - e.err = ErrInvalidOperation.Gen("number of function arguments must in [%d, %d].", f.MinArgs, f.MaxArgs) - return false - } - a := make([]types.Datum, len(v.Args)) - for i, arg := range v.Args { - a[i] = *arg.GetDatum() - } - val, err := f.F(a, e.ctx) - if err != nil { - e.err = errors.Trace(err) - return false - } - v.SetDatum(val) - return true -} - -func (e *Evaluator) funcCast(v *ast.FuncCastExpr) bool { - value := v.Expr.GetValue() - // Casting nil to any type returns null - if value == nil { - v.SetNull() - return true - } - var err error - value, err = types.Cast(value, v.Tp) - if err != nil { - e.err = errors.Trace(err) - return false - } - v.SetValue(value) - return true -} - -func (e *Evaluator) aggregateFunc(v *ast.AggregateFuncExpr) bool { - name := strings.ToLower(v.F) - switch name { - case ast.AggFuncAvg: - e.evalAggAvg(v) - case ast.AggFuncCount: - e.evalAggCount(v) - case ast.AggFuncFirstRow, ast.AggFuncMax, ast.AggFuncMin, ast.AggFuncSum: - e.evalAggSetValue(v) - case ast.AggFuncGroupConcat: - e.evalAggGroupConcat(v) - } - return e.err == nil -} - -func (e *Evaluator) evalAggCount(v *ast.AggregateFuncExpr) { - ctx := v.GetContext() - v.SetInt64(ctx.Count) -} - -func (e *Evaluator) evalAggSetValue(v *ast.AggregateFuncExpr) { - ctx := v.GetContext() - v.SetValue(ctx.Value) -} - -func (e *Evaluator) evalAggAvg(v *ast.AggregateFuncExpr) { - ctx := v.GetContext() - switch x := ctx.Value.(type) { - case float64: - ctx.Value = x / float64(ctx.Count) - case mysql.Decimal: - ctx.Value = x.Div(mysql.NewDecimalFromUint(uint64(ctx.Count), 0)) - } - v.SetValue(ctx.Value) -} - -func (e *Evaluator) evalAggGroupConcat(v *ast.AggregateFuncExpr) { - ctx := v.GetContext() - if ctx.Buffer != nil { - v.SetValue(ctx.Buffer.String()) - } else { - v.SetValue(nil) - } -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/evaluator_binop.go b/vendor/github.com/pingcap/tidb/evaluator/evaluator_binop.go deleted file mode 100644 index bec6a1f8d574..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/evaluator_binop.go +++ /dev/null @@ -1,564 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "math" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/types" -) - -const ( - zeroI64 int64 = 0 - oneI64 int64 = 1 -) - -func (e *Evaluator) binaryOperation(o *ast.BinaryOperationExpr) bool { - switch o.Op { - case opcode.AndAnd, opcode.OrOr, opcode.LogicXor: - return e.handleLogicOperation(o) - case opcode.LT, opcode.LE, opcode.GE, opcode.GT, opcode.EQ, opcode.NE, opcode.NullEQ: - return e.handleComparisonOp(o) - case opcode.RightShift, opcode.LeftShift, opcode.And, opcode.Or, opcode.Xor: - return e.handleBitOp(o) - case opcode.Plus, opcode.Minus, opcode.Mod, opcode.Div, opcode.Mul, opcode.IntDiv: - return e.handleArithmeticOp(o) - default: - e.err = ErrInvalidOperation - return false - } -} - -func (e *Evaluator) handleLogicOperation(o *ast.BinaryOperationExpr) bool { - switch o.Op { - case opcode.AndAnd: - return e.handleAndAnd(o) - case opcode.OrOr: - return e.handleOrOr(o) - case opcode.LogicXor: - return e.handleXor(o) - default: - e.err = ErrInvalidOperation.Gen("unkown operator %s", o.Op) - return false - } -} - -func (e *Evaluator) handleAndAnd(o *ast.BinaryOperationExpr) bool { - leftVal := o.L.GetValue() - righVal := o.R.GetValue() - if leftVal != nil { - x, err := types.ToBool(leftVal) - if err != nil { - e.err = errors.Trace(err) - return false - } else if x == 0 { - // false && any other types is false - o.SetValue(x) - return true - } - } - if righVal != nil { - y, err := types.ToBool(righVal) - if err != nil { - e.err = errors.Trace(err) - return false - } else if y == 0 { - o.SetValue(y) - return true - } - } - if leftVal == nil || righVal == nil { - o.SetValue(nil) - return true - } - o.SetValue(int64(1)) - return true -} - -func (e *Evaluator) handleOrOr(o *ast.BinaryOperationExpr) bool { - leftVal := o.L.GetValue() - righVal := o.R.GetValue() - if leftVal != nil { - x, err := types.ToBool(leftVal) - if err != nil { - e.err = errors.Trace(err) - return false - } else if x == 1 { - // true || any other types is true. - o.SetValue(x) - return true - } - } - if righVal != nil { - y, err := types.ToBool(righVal) - if err != nil { - e.err = errors.Trace(err) - return false - } else if y == 1 { - o.SetValue(y) - return true - } - } - if leftVal == nil || righVal == nil { - o.SetValue(nil) - return true - } - o.SetValue(int64(0)) - return true -} - -func (e *Evaluator) handleXor(o *ast.BinaryOperationExpr) bool { - leftVal := o.L.GetValue() - righVal := o.R.GetValue() - if leftVal == nil || righVal == nil { - o.SetValue(nil) - return true - } - x, err := types.ToBool(leftVal) - if err != nil { - e.err = errors.Trace(err) - return false - } - - y, err := types.ToBool(righVal) - if err != nil { - e.err = errors.Trace(err) - return false - } - if x == y { - o.SetValue(int64(0)) - } else { - o.SetValue(int64(1)) - } - return true -} - -func (e *Evaluator) handleComparisonOp(o *ast.BinaryOperationExpr) bool { - a, b := types.Coerce(o.L.GetValue(), o.R.GetValue()) - if a == nil || b == nil { - // for <=>, if a and b are both nil, return true. - // if a or b is nil, return false. - if o.Op == opcode.NullEQ { - if a == nil && b == nil { - o.SetValue(oneI64) - } else { - o.SetValue(zeroI64) - } - } else { - o.SetValue(nil) - } - return true - } - - n, err := types.Compare(a, b) - if err != nil { - e.err = errors.Trace(err) - return false - } - - r, err := getCompResult(o.Op, n) - if err != nil { - e.err = errors.Trace(err) - return false - } - if r { - o.SetValue(oneI64) - } else { - o.SetValue(zeroI64) - } - return true -} - -func getCompResult(op opcode.Op, value int) (bool, error) { - switch op { - case opcode.LT: - return value < 0, nil - case opcode.LE: - return value <= 0, nil - case opcode.GE: - return value >= 0, nil - case opcode.GT: - return value > 0, nil - case opcode.EQ: - return value == 0, nil - case opcode.NE: - return value != 0, nil - case opcode.NullEQ: - return value == 0, nil - default: - return false, ErrInvalidOperation.Gen("invalid op %v in comparision operation", op) - } -} - -func (e *Evaluator) handleBitOp(o *ast.BinaryOperationExpr) bool { - a, b := types.Coerce(o.L.GetValue(), o.R.GetValue()) - - if a == nil || b == nil { - o.SetValue(nil) - return true - } - - x, err := types.ToInt64(a) - if err != nil { - e.err = errors.Trace(err) - return false - } - - y, err := types.ToInt64(b) - if err != nil { - e.err = errors.Trace(err) - return false - } - - // use a int64 for bit operator, return uint64 - switch o.Op { - case opcode.And: - o.SetValue(uint64(x & y)) - case opcode.Or: - o.SetValue(uint64(x | y)) - case opcode.Xor: - o.SetValue(uint64(x ^ y)) - case opcode.RightShift: - o.SetValue(uint64(x) >> uint64(y)) - case opcode.LeftShift: - o.SetValue(uint64(x) << uint64(y)) - default: - e.err = ErrInvalidOperation.Gen("invalid op %v in bit operation", o.Op) - return false - } - return true -} - -func (e *Evaluator) handleArithmeticOp(o *ast.BinaryOperationExpr) bool { - a, err := coerceArithmetic(o.L.GetValue()) - if err != nil { - e.err = errors.Trace(err) - return false - } - - b, err := coerceArithmetic(o.R.GetValue()) - if err != nil { - e.err = errors.Trace(err) - return false - } - - a, b = types.Coerce(a, b) - if a == nil || b == nil { - o.SetValue(nil) - return true - } - - var result interface{} - switch o.Op { - case opcode.Plus: - result, e.err = computePlus(a, b) - case opcode.Minus: - result, e.err = computeMinus(a, b) - case opcode.Mul: - result, e.err = computeMul(a, b) - case opcode.Div: - result, e.err = computeDiv(a, b) - case opcode.Mod: - result, e.err = computeMod(a, b) - case opcode.IntDiv: - result, e.err = computeIntDiv(a, b) - default: - e.err = ErrInvalidOperation.Gen("invalid op %v in arithmetic operation", o.Op) - return false - } - o.SetValue(result) - return e.err == nil -} - -func computePlus(a, b interface{}) (interface{}, error) { - switch x := a.(type) { - case int64: - switch y := b.(type) { - case int64: - return types.AddInt64(x, y) - case uint64: - return types.AddInteger(y, x) - } - case uint64: - switch y := b.(type) { - case int64: - return types.AddInteger(x, y) - case uint64: - return types.AddUint64(x, y) - } - case float64: - switch y := b.(type) { - case float64: - return x + y, nil - } - case mysql.Decimal: - switch y := b.(type) { - case mysql.Decimal: - return x.Add(y), nil - } - } - return types.InvOp2(a, b, opcode.Plus) -} - -func computeMinus(a, b interface{}) (interface{}, error) { - switch x := a.(type) { - case int64: - switch y := b.(type) { - case int64: - return types.SubInt64(x, y) - case uint64: - return types.SubIntWithUint(x, y) - } - case uint64: - switch y := b.(type) { - case int64: - return types.SubUintWithInt(x, y) - case uint64: - return types.SubUint64(x, y) - } - case float64: - switch y := b.(type) { - case float64: - return x - y, nil - } - case mysql.Decimal: - switch y := b.(type) { - case mysql.Decimal: - return x.Sub(y), nil - } - } - - return types.InvOp2(a, b, opcode.Minus) -} - -func computeMul(a, b interface{}) (interface{}, error) { - switch x := a.(type) { - case int64: - switch y := b.(type) { - case int64: - return types.MulInt64(x, y) - case uint64: - return types.MulInteger(y, x) - } - case uint64: - switch y := b.(type) { - case int64: - return types.MulInteger(x, y) - case uint64: - return types.MulUint64(x, y) - } - case float64: - switch y := b.(type) { - case float64: - return x * y, nil - } - case mysql.Decimal: - switch y := b.(type) { - case mysql.Decimal: - return x.Mul(y), nil - } - } - - return types.InvOp2(a, b, opcode.Mul) -} - -func computeDiv(a, b interface{}) (interface{}, error) { - // MySQL support integer divison Div and division operator / - // we use opcode.Div for division operator and will use another for integer division later. - // for division operator, we will use float64 for calculation. - switch x := a.(type) { - case float64: - y, err := types.ToFloat64(b) - if err != nil { - return nil, errors.Trace(err) - } - - if y == 0 { - return nil, nil - } - - return x / y, nil - default: - // the scale of the result is the scale of the first operand plus - // the value of the div_precision_increment system variable (which is 4 by default) - // we will use 4 here - xa, err := types.ToDecimal(a) - if err != nil { - return nil, errors.Trace(err) - } - - xb, err := types.ToDecimal(b) - if err != nil { - return nil, errors.Trace(err) - } - if f, _ := xb.Float64(); f == 0 { - // division by zero return null - return nil, nil - } - - return xa.Div(xb), nil - } -} - -func computeMod(a, b interface{}) (interface{}, error) { - switch x := a.(type) { - case int64: - switch y := b.(type) { - case int64: - if y == 0 { - return nil, nil - } - return x % y, nil - case uint64: - if y == 0 { - return nil, nil - } else if x < 0 { - // first is int64, return int64. - return -int64(uint64(-x) % y), nil - } - return int64(uint64(x) % y), nil - } - case uint64: - switch y := b.(type) { - case int64: - if y == 0 { - return nil, nil - } else if y < 0 { - // first is uint64, return uint64. - return uint64(x % uint64(-y)), nil - } - return x % uint64(y), nil - case uint64: - if y == 0 { - return nil, nil - } - return x % y, nil - } - case float64: - switch y := b.(type) { - case float64: - if y == 0 { - return nil, nil - } - return math.Mod(x, y), nil - } - case mysql.Decimal: - switch y := b.(type) { - case mysql.Decimal: - xf, _ := x.Float64() - yf, _ := y.Float64() - if yf == 0 { - return nil, nil - } - return math.Mod(xf, yf), nil - } - } - - return types.InvOp2(a, b, opcode.Mod) -} - -func computeIntDiv(a, b interface{}) (interface{}, error) { - switch x := a.(type) { - case int64: - switch y := b.(type) { - case int64: - if y == 0 { - return nil, nil - } - return types.DivInt64(x, y) - case uint64: - if y == 0 { - return nil, nil - } - return types.DivIntWithUint(x, y) - } - case uint64: - switch y := b.(type) { - case int64: - if y == 0 { - return nil, nil - } - return types.DivUintWithInt(x, y) - case uint64: - if y == 0 { - return nil, nil - } - return x / y, nil - } - } - - // if any is none integer, use decimal to calculate - x, err := types.ToDecimal(a) - if err != nil { - return nil, errors.Trace(err) - } - - y, err := types.ToDecimal(b) - if err != nil { - return nil, errors.Trace(err) - } - - if f, _ := y.Float64(); f == 0 { - return nil, nil - } - - return x.Div(y).IntPart(), nil -} - -func coerceArithmetic(a interface{}) (interface{}, error) { - switch x := a.(type) { - case string: - // MySQL will convert string to float for arithmetic operation - f, err := types.StrToFloat(x) - if err != nil { - return nil, errors.Trace(err) - } - return f, errors.Trace(err) - case mysql.Time: - // if time has no precision, return int64 - v := x.ToNumber() - if x.Fsp == 0 { - return v.IntPart(), nil - } - return v, nil - case mysql.Duration: - // if duration has no precision, return int64 - v := x.ToNumber() - if x.Fsp == 0 { - return v.IntPart(), nil - } - return v, nil - case []byte: - // []byte is the same as string, converted to float for arithmetic operator. - f, err := types.StrToFloat(string(x)) - if err != nil { - return nil, errors.Trace(err) - } - return f, errors.Trace(err) - case mysql.Hex: - return x.ToNumber(), nil - case mysql.Bit: - return x.ToNumber(), nil - case mysql.Enum: - return x.ToNumber(), nil - case mysql.Set: - return x.ToNumber(), nil - default: - return x, nil - } -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/evaluator_like.go b/vendor/github.com/pingcap/tidb/evaluator/evaluator_like.go deleted file mode 100644 index 2870fa7823d7..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/evaluator_like.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package evaluator - -import ( - "regexp" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/util/types" -) - -const ( - patMatch = iota + 1 - patOne - patAny -) - -// handle escapes and wild cards convert pattern characters and pattern types, -func compilePattern(pattern string, escape byte) (patChars, patTypes []byte) { - var lastAny bool - patChars = make([]byte, len(pattern)) - patTypes = make([]byte, len(pattern)) - patLen := 0 - for i := 0; i < len(pattern); i++ { - var tp byte - var c = pattern[i] - switch c { - case escape: - lastAny = false - tp = patMatch - if i < len(pattern)-1 { - i++ - c = pattern[i] - if c == escape || c == '_' || c == '%' { - // valid escape. - } else { - // invalid escape, fall back to escape byte - // mysql will treat escape character as the origin value even - // the escape sequence is invalid in Go or C. - // e.g, \m is invalid in Go, but in MySQL we will get "m" for select '\m'. - // Following case is correct just for escape \, not for others like +. - // TODO: add more checks for other escapes. - i-- - c = escape - } - } - case '_': - lastAny = false - tp = patOne - case '%': - if lastAny { - continue - } - lastAny = true - tp = patAny - default: - lastAny = false - tp = patMatch - } - patChars[patLen] = c - patTypes[patLen] = tp - patLen++ - } - for i := 0; i < patLen-1; i++ { - if (patTypes[i] == patAny) && (patTypes[i+1] == patOne) { - patTypes[i] = patOne - patTypes[i+1] = patAny - } - } - patChars = patChars[:patLen] - patTypes = patTypes[:patLen] - return -} - -const caseDiff = 'a' - 'A' - -func matchByteCI(a, b byte) bool { - if a == b { - return true - } - if a >= 'a' && a <= 'z' && a-caseDiff == b { - return true - } - return a >= 'A' && a <= 'Z' && a+caseDiff == b -} - -func doMatch(str string, patChars, patTypes []byte) bool { - var sIdx int - for i := 0; i < len(patChars); i++ { - switch patTypes[i] { - case patMatch: - if sIdx >= len(str) || !matchByteCI(str[sIdx], patChars[i]) { - return false - } - sIdx++ - case patOne: - sIdx++ - if sIdx > len(str) { - return false - } - case patAny: - i++ - if i == len(patChars) { - return true - } - for sIdx < len(str) { - if matchByteCI(patChars[i], str[sIdx]) && doMatch(str[sIdx:], patChars[i:], patTypes[i:]) { - return true - } - sIdx++ - } - return false - } - } - return sIdx == len(str) -} - -func (e *Evaluator) patternLike(p *ast.PatternLikeExpr) bool { - expr := p.Expr.GetValue() - if expr == nil { - p.SetValue(nil) - return true - } - - sexpr, err := types.ToString(expr) - if err != nil { - e.err = errors.Trace(err) - return false - } - - // We need to compile pattern if it has not been compiled or it is not static. - var needCompile = len(p.PatChars) == 0 || !ast.IsConstant(p.Pattern) - if needCompile { - pattern := p.Pattern.GetValue() - if pattern == nil { - p.SetValue(nil) - return true - } - spattern, err := types.ToString(pattern) - if err != nil { - e.err = errors.Trace(err) - return false - } - p.PatChars, p.PatTypes = compilePattern(spattern, p.Escape) - } - match := doMatch(sexpr, p.PatChars, p.PatTypes) - if p.Not { - match = !match - } - p.SetValue(boolToInt64(match)) - return true -} - -func (e *Evaluator) patternRegexp(p *ast.PatternRegexpExpr) bool { - var sexpr string - if p.Sexpr != nil { - sexpr = *p.Sexpr - } else { - expr := p.Expr.GetValue() - if expr == nil { - p.SetValue(nil) - return true - } - var err error - sexpr, err = types.ToString(expr) - if err != nil { - e.err = errors.Errorf("non-string Expression in LIKE: %v (Value of type %T)", expr, expr) - return false - } - - if ast.IsConstant(p.Expr) { - p.Sexpr = new(string) - *p.Sexpr = sexpr - } - } - - re := p.Re - if re == nil { - pattern := p.Pattern.GetValue() - if pattern == nil { - p.SetValue(nil) - return true - } - spattern, err := types.ToString(pattern) - if err != nil { - e.err = errors.Errorf("non-string pattern in LIKE: %v (Value of type %T)", pattern, pattern) - return false - } - - if re, err = regexp.Compile(spattern); err != nil { - e.err = errors.Trace(err) - return false - } - - if ast.IsConstant(p.Pattern) { - p.Re = re - } - } - match := re.MatchString(sexpr) - if p.Not { - match = !match - } - p.SetValue(boolToInt64(match)) - return true -} diff --git a/vendor/github.com/pingcap/tidb/evaluator/helper.go b/vendor/github.com/pingcap/tidb/evaluator/helper.go deleted file mode 100644 index eaa759e71c8a..000000000000 --- a/vendor/github.com/pingcap/tidb/evaluator/helper.go +++ /dev/null @@ -1,136 +0,0 @@ -package evaluator - -import ( - "strconv" - "strings" - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/types" -) - -var ( - // CurrentTimestamp is the keyword getting default value for datetime and timestamp type. - CurrentTimestamp = "CURRENT_TIMESTAMP" - currentTimestampL = "current_timestamp" - // ZeroTimestamp shows the zero datetime and timestamp. - ZeroTimestamp = "0000-00-00 00:00:00" -) - -var ( - errDefaultValue = errors.New("invalid default value") -) - -// GetTimeValue gets the time value with type tp. -func GetTimeValue(ctx context.Context, v interface{}, tp byte, fsp int) (interface{}, error) { - return getTimeValue(ctx, v, tp, fsp) -} - -func getTimeValue(ctx context.Context, v interface{}, tp byte, fsp int) (interface{}, error) { - value := mysql.Time{ - Type: tp, - Fsp: fsp, - } - - defaultTime, err := getSystemTimestamp(ctx) - if err != nil { - return nil, errors.Trace(err) - } - - switch x := v.(type) { - case string: - upperX := strings.ToUpper(x) - if upperX == CurrentTimestamp { - value.Time = defaultTime - } else if upperX == ZeroTimestamp { - value, _ = mysql.ParseTimeFromNum(0, tp, fsp) - } else { - value, err = mysql.ParseTime(x, tp, fsp) - if err != nil { - return nil, errors.Trace(err) - } - } - case *ast.ValueExpr: - switch x.Kind() { - case types.KindString: - value, err = mysql.ParseTime(x.GetString(), tp, fsp) - if err != nil { - return nil, errors.Trace(err) - } - case types.KindInt64: - value, err = mysql.ParseTimeFromNum(x.GetInt64(), tp, fsp) - if err != nil { - return nil, errors.Trace(err) - } - case types.KindNull: - return nil, nil - default: - return nil, errors.Trace(errDefaultValue) - } - case *ast.FuncCallExpr: - if x.FnName.L == currentTimestampL { - return CurrentTimestamp, nil - } - return nil, errors.Trace(errDefaultValue) - case *ast.UnaryOperationExpr: - // support some expression, like `-1` - v, err := Eval(ctx, x) - if err != nil { - return nil, errors.Trace(err) - } - ft := types.NewFieldType(mysql.TypeLonglong) - xval, err := types.Convert(v, ft) - if err != nil { - return nil, errors.Trace(err) - } - - value, err = mysql.ParseTimeFromNum(xval.(int64), tp, fsp) - if err != nil { - return nil, errors.Trace(err) - } - default: - return nil, nil - } - - return value, nil -} - -// IsCurrentTimeExpr returns whether e is CurrentTimeExpr. -func IsCurrentTimeExpr(e ast.ExprNode) bool { - x, ok := e.(*ast.FuncCallExpr) - if !ok { - return false - } - return x.FnName.L == currentTimestampL -} - -func getSystemTimestamp(ctx context.Context) (time.Time, error) { - value := time.Now() - - if ctx == nil { - return value, nil - } - - // check whether use timestamp varibale - sessionVars := variable.GetSessionVars(ctx) - if v, ok := sessionVars.Systems["timestamp"]; ok { - if v != "" { - timestamp, err := strconv.ParseInt(v, 10, 64) - if err != nil { - return time.Time{}, errors.Trace(err) - } - - if timestamp <= 0 { - return value, nil - } - - return time.Unix(timestamp, 0), nil - } - } - - return value, nil -} diff --git a/vendor/github.com/pingcap/tidb/executor/adapter.go b/vendor/github.com/pingcap/tidb/executor/adapter.go deleted file mode 100644 index fbc8657b57a9..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/adapter.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/optimizer/plan" -) - -// recordSet wraps an executor, implements ast.RecordSet interface -type recordSet struct { - fields []*ast.ResultField - executor Executor -} - -func (a *recordSet) Fields() ([]*ast.ResultField, error) { - return a.fields, nil -} - -func (a *recordSet) Next() (*ast.Row, error) { - row, err := a.executor.Next() - if err != nil || row == nil { - return nil, errors.Trace(err) - } - return &ast.Row{Data: row.Data}, nil -} - -func (a *recordSet) Close() error { - return a.executor.Close() -} - -type statement struct { - is infoschema.InfoSchema - plan plan.Plan -} - -func (a *statement) OriginText() string { - return "" -} - -func (a *statement) SetText(text string) { - return -} - -func (a *statement) IsDDL() bool { - return false -} - -func (a *statement) Exec(ctx context.Context) (ast.RecordSet, error) { - b := newExecutorBuilder(ctx, a.is) - e := b.build(a.plan) - if b.err != nil { - return nil, errors.Trace(b.err) - } - - if executorExec, ok := e.(*ExecuteExec); ok { - err := executorExec.Build() - if err != nil { - return nil, errors.Trace(err) - } - e = executorExec.StmtExec - } - - if len(e.Fields()) == 0 { - // No result fields means no Recordset. - defer e.Close() - for { - row, err := e.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - // It's used to insert retry. - changeInsertValueForRetry(a.plan, e) - return nil, nil - } - } - } - - fs := e.Fields() - for _, f := range fs { - if len(f.ColumnAsName.O) == 0 { - f.ColumnAsName = f.Column.Name - } - } - return &recordSet{ - executor: e, - fields: fs, - }, nil -} - -func changeInsertValueForRetry(p plan.Plan, e Executor) { - if v, ok := p.(*plan.Insert); ok { - var insertValue *InsertValues - if !v.IsReplace { - insertValue = e.(*InsertExec).InsertValues - } else { - insertValue = e.(*ReplaceExec).InsertValues - } - v.Columns = insertValue.Columns - v.Setlist = insertValue.Setlist - if len(v.Setlist) == 0 { - v.Lists = insertValue.Lists - } - } -} diff --git a/vendor/github.com/pingcap/tidb/executor/builder.go b/vendor/github.com/pingcap/tidb/executor/builder.go deleted file mode 100644 index 07143ff42d3a..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/builder.go +++ /dev/null @@ -1,438 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "math" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/sessionctx/autocommit" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/types" -) - -// executorBuilder builds an Executor from a Plan. -// The InfoSchema must be the same one used in InfoBinder. -type executorBuilder struct { - ctx context.Context - is infoschema.InfoSchema - err error -} - -func newExecutorBuilder(ctx context.Context, is infoschema.InfoSchema) *executorBuilder { - return &executorBuilder{ - ctx: ctx, - is: is, - } -} - -func (b *executorBuilder) build(p plan.Plan) Executor { - switch v := p.(type) { - case nil: - return nil - case *plan.Aggregate: - return b.buildAggregate(v) - case *plan.CheckTable: - return b.buildCheckTable(v) - case *plan.DDL: - return b.buildDDL(v) - case *plan.Deallocate: - return b.buildDeallocate(v) - case *plan.Delete: - return b.buildDelete(v) - case *plan.Distinct: - return b.buildDistinct(v) - case *plan.Execute: - return b.buildExecute(v) - case *plan.Explain: - return b.buildExplain(v) - case *plan.Filter: - src := b.build(v.Src()) - return b.buildFilter(src, v.Conditions) - case *plan.Having: - return b.buildHaving(v) - case *plan.IndexScan: - return b.buildIndexScan(v) - case *plan.Insert: - return b.buildInsert(v) - case *plan.JoinInner: - return b.buildJoinInner(v) - case *plan.JoinOuter: - return b.buildJoinOuter(v) - case *plan.Limit: - return b.buildLimit(v) - case *plan.Prepare: - return b.buildPrepare(v) - case *plan.SelectFields: - return b.buildSelectFields(v) - case *plan.SelectLock: - return b.buildSelectLock(v) - case *plan.ShowDDL: - return b.buildShowDDL(v) - case *plan.Show: - return b.buildShow(v) - case *plan.Simple: - return b.buildSimple(v) - case *plan.Sort: - return b.buildSort(v) - case *plan.TableScan: - return b.buildTableScan(v) - case *plan.Union: - return b.buildUnion(v) - case *plan.Update: - return b.buildUpdate(v) - default: - b.err = ErrUnknownPlan.Gen("Unknown Plan %T", p) - return nil - } -} - -func (b *executorBuilder) buildFilter(src Executor, conditions []ast.ExprNode) Executor { - if len(conditions) == 0 { - return src - } - return &FilterExec{ - Src: src, - Condition: b.joinConditions(conditions), - ctx: b.ctx, - } -} - -func (b *executorBuilder) buildTableScan(v *plan.TableScan) Executor { - table, _ := b.is.TableByID(v.Table.ID) - e := &TableScanExec{ - t: table, - fields: v.Fields(), - ctx: b.ctx, - ranges: v.Ranges, - seekHandle: math.MinInt64, - } - return b.buildFilter(e, v.FilterConditions) -} - -func (b *executorBuilder) buildShowDDL(v *plan.ShowDDL) Executor { - return &ShowDDLExec{ - fields: v.Fields(), - ctx: b.ctx, - } -} - -func (b *executorBuilder) buildCheckTable(v *plan.CheckTable) Executor { - return &CheckTableExec{ - tables: v.Tables, - ctx: b.ctx, - } -} - -func (b *executorBuilder) buildDeallocate(v *plan.Deallocate) Executor { - return &DeallocateExec{ - ctx: b.ctx, - Name: v.Name, - } -} - -func (b *executorBuilder) buildIndexScan(v *plan.IndexScan) Executor { - tbl, _ := b.is.TableByID(v.Table.ID) - var idx *column.IndexedCol - for _, val := range tbl.Indices() { - if val.IndexInfo.Name.L == v.Index.Name.L { - idx = val - break - } - } - e := &IndexScanExec{ - tbl: tbl, - idx: idx, - fields: v.Fields(), - ctx: b.ctx, - Desc: v.Desc, - valueTypes: make([]*types.FieldType, len(idx.Columns)), - } - - for i, ic := range idx.Columns { - col := tbl.Cols()[ic.Offset] - e.valueTypes[i] = &col.FieldType - } - - e.Ranges = make([]*IndexRangeExec, len(v.Ranges)) - for i, val := range v.Ranges { - e.Ranges[i] = b.buildIndexRange(e, val) - } - return b.buildFilter(e, v.FilterConditions) -} - -func (b *executorBuilder) buildIndexRange(scan *IndexScanExec, v *plan.IndexRange) *IndexRangeExec { - ran := &IndexRangeExec{ - scan: scan, - lowVals: v.LowVal, - lowExclude: v.LowExclude, - highVals: v.HighVal, - highExclude: v.HighExclude, - } - return ran -} - -func (b *executorBuilder) buildJoinOuter(v *plan.JoinOuter) *JoinOuterExec { - e := &JoinOuterExec{ - OuterExec: b.build(v.Outer), - InnerPlan: v.Inner, - fields: v.Fields(), - builder: b, - } - return e -} - -func (b *executorBuilder) buildJoinInner(v *plan.JoinInner) *JoinInnerExec { - e := &JoinInnerExec{ - InnerPlans: v.Inners, - innerExecs: make([]Executor, len(v.Inners)), - Condition: b.joinConditions(v.Conditions), - fields: v.Fields(), - ctx: b.ctx, - builder: b, - } - return e -} - -func (b *executorBuilder) joinConditions(conditions []ast.ExprNode) ast.ExprNode { - if len(conditions) == 0 { - return nil - } - if len(conditions) == 1 { - return conditions[0] - } - condition := &ast.BinaryOperationExpr{ - Op: opcode.AndAnd, - L: conditions[0], - R: b.joinConditions(conditions[1:]), - } - return condition -} - -func (b *executorBuilder) buildSelectLock(v *plan.SelectLock) Executor { - src := b.build(v.Src()) - if autocommit.ShouldAutocommit(b.ctx) { - // Locking of rows for update using SELECT FOR UPDATE only applies when autocommit - // is disabled (either by beginning transaction with START TRANSACTION or by setting - // autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked. - // See: https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html - return src - } - e := &SelectLockExec{ - Src: src, - Lock: v.Lock, - ctx: b.ctx, - } - return e -} - -func (b *executorBuilder) buildSelectFields(v *plan.SelectFields) Executor { - src := b.build(v.Src()) - e := &SelectFieldsExec{ - Src: src, - ResultFields: v.Fields(), - ctx: b.ctx, - } - return e -} - -func (b *executorBuilder) buildAggregate(v *plan.Aggregate) Executor { - src := b.build(v.Src()) - e := &AggregateExec{ - Src: src, - ResultFields: v.Fields(), - ctx: b.ctx, - AggFuncs: v.AggFuncs, - GroupByItems: v.GroupByItems, - } - return e -} - -func (b *executorBuilder) buildHaving(v *plan.Having) Executor { - src := b.build(v.Src()) - return b.buildFilter(src, v.Conditions) -} - -func (b *executorBuilder) buildSort(v *plan.Sort) Executor { - src := b.build(v.Src()) - e := &SortExec{ - Src: src, - ByItems: v.ByItems, - ctx: b.ctx, - } - return e -} - -func (b *executorBuilder) buildLimit(v *plan.Limit) Executor { - src := b.build(v.Src()) - e := &LimitExec{ - Src: src, - Offset: v.Offset, - Count: v.Count, - } - return e -} - -func (b *executorBuilder) buildUnion(v *plan.Union) Executor { - e := &UnionExec{ - fields: v.Fields(), - Sels: make([]Executor, len(v.Selects)), - } - for i, sel := range v.Selects { - selExec := b.build(sel) - e.Sels[i] = selExec - } - return e -} - -func (b *executorBuilder) buildDistinct(v *plan.Distinct) Executor { - return &DistinctExec{Src: b.build(v.Src())} -} - -func (b *executorBuilder) buildPrepare(v *plan.Prepare) Executor { - return &PrepareExec{ - Ctx: b.ctx, - IS: b.is, - Name: v.Name, - SQLText: v.SQLText, - } -} - -func (b *executorBuilder) buildExecute(v *plan.Execute) Executor { - return &ExecuteExec{ - Ctx: b.ctx, - IS: b.is, - Name: v.Name, - UsingVars: v.UsingVars, - ID: v.ID, - } -} - -func (b *executorBuilder) buildUpdate(v *plan.Update) Executor { - selExec := b.build(v.SelectPlan) - return &UpdateExec{ctx: b.ctx, SelectExec: selExec, OrderedList: v.OrderedList} -} - -func (b *executorBuilder) buildDelete(v *plan.Delete) Executor { - selExec := b.build(v.SelectPlan) - return &DeleteExec{ - ctx: b.ctx, - SelectExec: selExec, - Tables: v.Tables, - IsMultiTable: v.IsMultiTable, - } -} - -func (b *executorBuilder) buildShow(v *plan.Show) Executor { - e := &ShowExec{ - Tp: v.Tp, - DBName: model.NewCIStr(v.DBName), - Table: v.Table, - Column: v.Column, - User: v.User, - Flag: v.Flag, - Full: v.Full, - GlobalScope: v.GlobalScope, - ctx: b.ctx, - is: b.is, - fields: v.Fields(), - } - if e.Tp == ast.ShowGrants && len(e.User) == 0 { - e.User = variable.GetSessionVars(e.ctx).User - } - return e -} - -func (b *executorBuilder) buildSimple(v *plan.Simple) Executor { - switch s := v.Statement.(type) { - case *ast.GrantStmt: - return b.buildGrant(s) - } - return &SimpleExec{Statement: v.Statement, ctx: b.ctx} -} - -func (b *executorBuilder) buildInsert(v *plan.Insert) Executor { - ivs := &InsertValues{ - ctx: b.ctx, - Columns: v.Columns, - Lists: v.Lists, - Setlist: v.Setlist, - } - if v.SelectPlan != nil { - ivs.SelectExec = b.build(v.SelectPlan) - } - // Get Table - ts, ok := v.Table.TableRefs.Left.(*ast.TableSource) - if !ok { - b.err = errors.New("Can not get table") - return nil - } - tn, ok := ts.Source.(*ast.TableName) - if !ok { - b.err = errors.New("Can not get table") - return nil - } - tableInfo := tn.TableInfo - tbl, ok := b.is.TableByID(tableInfo.ID) - if !ok { - b.err = errors.Errorf("Can not get table %d", tableInfo.ID) - return nil - } - ivs.Table = tbl - if v.IsReplace { - return b.buildReplace(ivs) - } - insert := &InsertExec{ - InsertValues: ivs, - OnDuplicate: v.OnDuplicate, - Priority: v.Priority, - } - // fields is used to evaluate values expr. - insert.fields = ts.GetResultFields() - return insert -} - -func (b *executorBuilder) buildReplace(vals *InsertValues) Executor { - return &ReplaceExec{ - InsertValues: vals, - } -} - -func (b *executorBuilder) buildGrant(grant *ast.GrantStmt) Executor { - return &GrantExec{ - ctx: b.ctx, - Privs: grant.Privs, - ObjectType: grant.ObjectType, - Level: grant.Level, - Users: grant.Users, - } -} - -func (b *executorBuilder) buildDDL(v *plan.DDL) Executor { - return &DDLExec{Statement: v.Statement, ctx: b.ctx, is: b.is} -} - -func (b *executorBuilder) buildExplain(v *plan.Explain) Executor { - return &ExplainExec{ - StmtPlan: v.StmtPlan, - fields: v.Fields(), - } -} diff --git a/vendor/github.com/pingcap/tidb/executor/compiler.go b/vendor/github.com/pingcap/tidb/executor/compiler.go deleted file mode 100644 index a00e2eb19280..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/compiler.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/optimizer" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/sessionctx" -) - -// Compiler compiles an ast.StmtNode to a stmt.Statement. -type Compiler struct { -} - -// Compile compiles an ast.StmtNode to a stmt.Statement. -// If it is supported to use new plan and executer, it optimizes the node to -// a plan, and we wrap the plan in an adapter as stmt.Statement. -// If it is not supported, the node will be converted to old statement. -func (c *Compiler) Compile(ctx context.Context, node ast.StmtNode) (ast.Statement, error) { - ast.SetFlag(node) - - is := sessionctx.GetDomain(ctx).InfoSchema() - if err := optimizer.Preprocess(node, is, ctx); err != nil { - return nil, errors.Trace(err) - } - // Validate should be after NameResolve. - if err := optimizer.Validate(node, false); err != nil { - return nil, errors.Trace(err) - } - sb := NewSubQueryBuilder(is) - p, err := optimizer.Optimize(ctx, node, sb) - if err != nil { - return nil, errors.Trace(err) - } - sa := &statement{ - is: is, - plan: p, - } - return sa, nil -} - -// NewSubQueryBuilder builds and returns a new SubQuery builder. -func NewSubQueryBuilder(is infoschema.InfoSchema) plan.SubQueryBuilder { - return &subqueryBuilder{is: is} -} diff --git a/vendor/github.com/pingcap/tidb/executor/executor.go b/vendor/github.com/pingcap/tidb/executor/executor.go deleted file mode 100644 index 6372317ba97a..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/executor.go +++ /dev/null @@ -1,1157 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "sort" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/inspectkv" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/sessionctx/forupdate" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/distinct" - "github.com/pingcap/tidb/util/types" -) - -var ( - _ Executor = &AggregateExec{} - _ Executor = &CheckTableExec{} - _ Executor = &FilterExec{} - _ Executor = &IndexRangeExec{} - _ Executor = &IndexScanExec{} - _ Executor = &LimitExec{} - _ Executor = &SelectFieldsExec{} - _ Executor = &SelectLockExec{} - _ Executor = &ShowDDLExec{} - _ Executor = &SortExec{} - _ Executor = &TableScanExec{} -) - -// Error instances. -var ( - ErrUnknownPlan = terror.ClassExecutor.New(CodeUnknownPlan, "Unknown plan") - ErrPrepareMulti = terror.ClassExecutor.New(CodePrepareMulti, "Can not prepare multiple statements") - ErrStmtNotFound = terror.ClassExecutor.New(CodeStmtNotFound, "Prepared statement not found") - ErrSchemaChanged = terror.ClassExecutor.New(CodeSchemaChanged, "Schema has changed") - ErrWrongParamCount = terror.ClassExecutor.New(CodeWrongParamCount, "Wrong parameter count") -) - -// Error codes. -const ( - CodeUnknownPlan terror.ErrCode = 1 - CodePrepareMulti terror.ErrCode = 2 - CodeStmtNotFound terror.ErrCode = 3 - CodeSchemaChanged terror.ErrCode = 4 - CodeWrongParamCount terror.ErrCode = 5 -) - -// Row represents a record row. -type Row struct { - // Data is the output record data for current Plan. - Data []types.Datum - - RowKeys []*RowKeyEntry -} - -// RowKeyEntry is designed for Delete statement in multi-table mode, -// we should know which table this row comes from. -type RowKeyEntry struct { - // The table which this row come from. - Tbl table.Table - // Row key. - Handle int64 -} - -// Executor executes a query. -type Executor interface { - Fields() []*ast.ResultField - Next() (*Row, error) - Close() error -} - -// ShowDDLExec represents a show DDL executor. -type ShowDDLExec struct { - fields []*ast.ResultField - ctx context.Context - done bool -} - -// Fields implements Executor Fields interface. -func (e *ShowDDLExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Execution Next interface. -func (e *ShowDDLExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - - txn, err := e.ctx.GetTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - - ddlInfo, err := inspectkv.GetDDLInfo(txn) - if err != nil { - return nil, errors.Trace(err) - } - bgInfo, err := inspectkv.GetBgDDLInfo(txn) - if err != nil { - return nil, errors.Trace(err) - } - - var ddlOwner, ddlJob string - if ddlInfo.Owner != nil { - ddlOwner = ddlInfo.Owner.String() - } - if ddlInfo.Job != nil { - ddlJob = ddlInfo.Job.String() - } - - var bgOwner, bgJob string - if bgInfo.Owner != nil { - bgOwner = bgInfo.Owner.String() - } - if bgInfo.Job != nil { - bgJob = bgInfo.Job.String() - } - - row := &Row{} - row.Data = types.MakeDatums( - ddlInfo.SchemaVer, - ddlOwner, - ddlJob, - bgInfo.SchemaVer, - bgOwner, - bgJob, - ) - for i, f := range e.fields { - f.Expr.SetValue(row.Data[i].GetValue()) - } - e.done = true - - return row, nil -} - -// Close implements Executor Close interface. -func (e *ShowDDLExec) Close() error { - return nil -} - -// CheckTableExec represents a check table executor. -type CheckTableExec struct { - tables []*ast.TableName - ctx context.Context - done bool -} - -// Fields implements Executor Fields interface. -func (e *CheckTableExec) Fields() []*ast.ResultField { - return nil -} - -// Next implements Execution Next interface. -func (e *CheckTableExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - - dbName := model.NewCIStr(db.GetCurrentSchema(e.ctx)) - is := sessionctx.GetDomain(e.ctx).InfoSchema() - - for _, t := range e.tables { - tb, err := is.TableByName(dbName, t.Name) - if err != nil { - return nil, errors.Trace(err) - } - for _, idx := range tb.Indices() { - txn, err := e.ctx.GetTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - err = inspectkv.CompareIndexData(txn, tb, idx) - if err != nil { - return nil, errors.Errorf("%v err:%v", t.Name, err) - } - } - } - e.done = true - - return nil, nil -} - -// Close implements plan.Plan Close interface. -func (e *CheckTableExec) Close() error { - return nil -} - -// TableScanExec represents a table scan executor. -type TableScanExec struct { - t table.Table - fields []*ast.ResultField - iter kv.Iterator - ctx context.Context - ranges []plan.TableRange // Disjoint close handle ranges. - seekHandle int64 // The handle to seek, should be initialized to math.MinInt64. - cursor int // The range cursor, used to locate to current range. -} - -// Fields implements Executor Fields interface. -func (e *TableScanExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Execution Next interface. -func (e *TableScanExec) Next() (*Row, error) { - for { - if e.cursor >= len(e.ranges) { - return nil, nil - } - ran := e.ranges[e.cursor] - if e.seekHandle < ran.LowVal { - e.seekHandle = ran.LowVal - } - if e.seekHandle > ran.HighVal { - e.cursor++ - continue - } - handle, found, err := e.t.Seek(e.ctx, e.seekHandle) - if err != nil { - return nil, errors.Trace(err) - } - if !found { - return nil, nil - } - if handle > ran.HighVal { - // The handle is out of the current range, but may be in following ranges. - // We seek to the range that may contains the handle, so we - // don't need to seek key again. - inRange := e.seekRange(handle) - if !inRange { - // The handle may be less than the current range low value, can not - // return directly. - continue - } - } - row, err := e.getRow(handle) - if err != nil { - return nil, errors.Trace(err) - } - e.seekHandle = handle + 1 - return row, nil - } -} - -// seekRange increments the range cursor to the range -// with high value greater or equal to handle. -func (e *TableScanExec) seekRange(handle int64) (inRange bool) { - for { - e.cursor++ - if e.cursor >= len(e.ranges) { - return false - } - ran := e.ranges[e.cursor] - if handle < ran.LowVal { - return false - } - if handle > ran.HighVal { - continue - } - return true - } -} - -func (e *TableScanExec) getRow(handle int64) (*Row, error) { - row := &Row{} - var err error - row.Data, err = e.t.Row(e.ctx, handle) - if err != nil { - return nil, errors.Trace(err) - } - // Set result fields value. - for i, v := range e.fields { - v.Expr.SetValue(row.Data[i].GetValue()) - } - - // Put rowKey to the tail of record row - rke := &RowKeyEntry{ - Tbl: e.t, - Handle: handle, - } - row.RowKeys = append(row.RowKeys, rke) - return row, nil -} - -// Close implements Executor Close interface. -func (e *TableScanExec) Close() error { - if e.iter != nil { - e.iter.Close() - e.iter = nil - } - return nil -} - -// IndexRangeExec represents an index range scan executor. -type IndexRangeExec struct { - scan *IndexScanExec - - // seekVal is different from lowVal, it is casted from lowVal and - // must be less than or equal to lowVal, used to seek the index. - lowVals []types.Datum - lowExclude bool - highVals []types.Datum - highExclude bool - - iter kv.IndexIterator - skipLowCmp bool - finished bool -} - -// Fields implements Executor Fields interface. -func (e *IndexRangeExec) Fields() []*ast.ResultField { - return e.scan.fields -} - -// Next implements Executor Next interface. -func (e *IndexRangeExec) Next() (*Row, error) { - if e.iter == nil { - seekVals := make([]types.Datum, len(e.scan.idx.Columns)) - for i := 0; i < len(e.lowVals); i++ { - if e.lowVals[i].Kind() == types.KindMinNotNull { - seekVals[i].SetBytes([]byte{}) - } else { - val, err := e.lowVals[i].ConvertTo(e.scan.valueTypes[i]) - seekVals[i] = val - if err != nil { - return nil, errors.Trace(err) - } - } - } - txn, err := e.scan.ctx.GetTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - e.iter, _, err = e.scan.idx.X.Seek(txn, seekVals) - if err != nil { - return nil, types.EOFAsNil(err) - } - } - - for { - if e.finished { - return nil, nil - } - idxKey, h, err := e.iter.Next() - if err != nil { - return nil, types.EOFAsNil(err) - } - if !e.skipLowCmp { - var cmp int - cmp, err = indexCompare(idxKey, e.lowVals) - if err != nil { - return nil, errors.Trace(err) - } - if cmp < 0 || (cmp == 0 && e.lowExclude) { - continue - } - e.skipLowCmp = true - } - cmp, err := indexCompare(idxKey, e.highVals) - if err != nil { - return nil, errors.Trace(err) - } - if cmp > 0 || (cmp == 0 && e.highExclude) { - // This span has finished iteration. - e.finished = true - continue - } - var row *Row - row, err = e.lookupRow(h) - if err != nil { - return nil, errors.Trace(err) - } - return row, nil - } -} - -// indexCompare compares multi column index. -// The length of boundVals may be less than idxKey. -func indexCompare(idxKey []types.Datum, boundVals []types.Datum) (int, error) { - for i := 0; i < len(boundVals); i++ { - cmp, err := idxKey[i].CompareDatum(boundVals[i]) - if err != nil { - return -1, errors.Trace(err) - } - if cmp != 0 { - return cmp, nil - } - } - return 0, nil -} - -func (e *IndexRangeExec) lookupRow(h int64) (*Row, error) { - row := &Row{} - var err error - row.Data, err = e.scan.tbl.Row(e.scan.ctx, h) - if err != nil { - return nil, errors.Trace(err) - } - rowKey := &RowKeyEntry{ - Tbl: e.scan.tbl, - Handle: h, - } - row.RowKeys = append(row.RowKeys, rowKey) - return row, nil -} - -// Close implements Executor Close interface. -func (e *IndexRangeExec) Close() error { - if e.iter != nil { - e.iter.Close() - e.iter = nil - } - e.finished = false - e.skipLowCmp = false - return nil -} - -// IndexScanExec represents an index scan executor. -type IndexScanExec struct { - tbl table.Table - idx *column.IndexedCol - fields []*ast.ResultField - Ranges []*IndexRangeExec - Desc bool - rangeIdx int - ctx context.Context - valueTypes []*types.FieldType -} - -// Fields implements Executor Fields interface. -func (e *IndexScanExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Executor Next interface. -func (e *IndexScanExec) Next() (*Row, error) { - for e.rangeIdx < len(e.Ranges) { - ran := e.Ranges[e.rangeIdx] - row, err := ran.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row != nil { - for i, val := range row.Data { - e.fields[i].Expr.SetValue(val.GetValue()) - } - return row, nil - } - ran.Close() - e.rangeIdx++ - } - return nil, nil -} - -// Close implements Executor Close interface. -func (e *IndexScanExec) Close() error { - for e.rangeIdx < len(e.Ranges) { - e.Ranges[e.rangeIdx].Close() - e.rangeIdx++ - } - return nil -} - -// JoinOuterExec represents an outer join executor. -type JoinOuterExec struct { - OuterExec Executor - InnerPlan plan.Plan - innerExec Executor - fields []*ast.ResultField - builder *executorBuilder - gotRow bool -} - -// Fields implements Executor Fields interface. -func (e *JoinOuterExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Executor Next interface. -// The data in the returned row is not used by caller. -// If inner executor didn't get any row for an outer executor row, -// a row with 0 len Data indicates there is no inner row matched for -// an outer row. -func (e *JoinOuterExec) Next() (*Row, error) { - var rowKeys []*RowKeyEntry - for { - if e.innerExec == nil { - e.gotRow = false - outerRow, err := e.OuterExec.Next() - if err != nil { - return nil, errors.Trace(err) - } - if outerRow == nil { - return nil, nil - } - rowKeys = outerRow.RowKeys - plan.Refine(e.InnerPlan) - e.innerExec = e.builder.build(e.InnerPlan) - if e.builder.err != nil { - return nil, errors.Trace(e.builder.err) - } - } - row, err := e.innerExec.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - e.innerExec.Close() - e.innerExec = nil - if e.gotRow { - continue - } - e.setInnerNull() - return &Row{RowKeys: rowKeys}, nil - } - if len(row.Data) != 0 { - e.gotRow = true - row.RowKeys = append(rowKeys, row.RowKeys...) - return row, nil - } - } -} - -func (e *JoinOuterExec) setInnerNull() { - for _, rf := range e.InnerPlan.Fields() { - rf.Expr.SetValue(nil) - } -} - -// Close implements Executor Close interface. -func (e *JoinOuterExec) Close() error { - err := e.OuterExec.Close() - if e.innerExec != nil { - return errors.Trace(e.innerExec.Close()) - } - return errors.Trace(err) -} - -// JoinInnerExec represents an inner join executor. -type JoinInnerExec struct { - InnerPlans []plan.Plan - innerExecs []Executor - Condition ast.ExprNode - ctx context.Context - fields []*ast.ResultField - builder *executorBuilder - done bool - cursor int -} - -// Fields implements Executor Fields interface. -func (e *JoinInnerExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Executor Next interface. -// The data in the returned row is not used by caller. -func (e *JoinInnerExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - rowKeysSlice := make([][]*RowKeyEntry, len(e.InnerPlans)) - for { - exec := e.innerExecs[e.cursor] - if exec == nil { - innerPlan := e.InnerPlans[e.cursor] - plan.Refine(innerPlan) - exec = e.builder.build(innerPlan) - if e.builder.err != nil { - return nil, errors.Trace(e.builder.err) - } - e.innerExecs[e.cursor] = exec - } - row, err := exec.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - exec.Close() - e.innerExecs[e.cursor] = nil - if e.cursor == 0 { - e.done = true - return nil, nil - } - e.cursor-- - continue - } - rowKeysSlice[e.cursor] = row.RowKeys - if e.cursor < len(e.innerExecs)-1 { - e.cursor++ - continue - } - var match = true - if e.Condition != nil { - match, err = evaluator.EvalBool(e.ctx, e.Condition) - if err != nil { - return nil, errors.Trace(err) - } - } - if match { - row.RowKeys = joinRowKeys(rowKeysSlice) - return row, nil - } - } -} - -func joinRowKeys(rowKeysSlice [][]*RowKeyEntry) []*RowKeyEntry { - count := 0 - for _, rowKeys := range rowKeysSlice { - count += len(rowKeys) - } - joined := make([]*RowKeyEntry, count) - offset := 0 - for _, rowKeys := range rowKeysSlice { - copy(joined[offset:], rowKeys) - offset += len(rowKeys) - } - return joined -} - -// Close implements Executor Close interface. -func (e *JoinInnerExec) Close() error { - var err error - for _, inExec := range e.innerExecs { - if inExec != nil { - e := inExec.Close() - if e != nil { - err = errors.Trace(e) - } - } - } - return err -} - -// SelectFieldsExec represents a select fields executor. -type SelectFieldsExec struct { - Src Executor - ResultFields []*ast.ResultField - executed bool - ctx context.Context -} - -// Fields implements Executor Fields interface. -func (e *SelectFieldsExec) Fields() []*ast.ResultField { - return e.ResultFields -} - -// Next implements Executor Next interface. -func (e *SelectFieldsExec) Next() (*Row, error) { - var rowKeys []*RowKeyEntry - if e.Src != nil { - srcRow, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if srcRow == nil { - return nil, nil - } - rowKeys = srcRow.RowKeys - } else { - // If Src is nil, only one row should be returned. - if e.executed { - return nil, nil - } - } - e.executed = true - row := &Row{ - RowKeys: rowKeys, - Data: make([]types.Datum, len(e.ResultFields)), - } - for i, field := range e.ResultFields { - val, err := evaluator.Eval(e.ctx, field.Expr) - if err != nil { - return nil, errors.Trace(err) - } - row.Data[i] = types.NewDatum(val) - } - return row, nil -} - -// Close implements Executor Close interface. -func (e *SelectFieldsExec) Close() error { - if e.Src != nil { - return e.Src.Close() - } - return nil -} - -// FilterExec represents a filter executor. -type FilterExec struct { - Src Executor - Condition ast.ExprNode - ctx context.Context -} - -// Fields implements Executor Fields interface. -func (e *FilterExec) Fields() []*ast.ResultField { - return e.Src.Fields() -} - -// Next implements Executor Next interface. -func (e *FilterExec) Next() (*Row, error) { - for { - srcRow, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if srcRow == nil { - return nil, nil - } - match, err := evaluator.EvalBool(e.ctx, e.Condition) - if err != nil { - return nil, errors.Trace(err) - } - if match { - return srcRow, nil - } - } -} - -// Close implements Executor Close interface. -func (e *FilterExec) Close() error { - return e.Src.Close() -} - -// SelectLockExec represents a select lock executor. -type SelectLockExec struct { - Src Executor - Lock ast.SelectLockType - ctx context.Context -} - -// Fields implements Executor Fields interface. -func (e *SelectLockExec) Fields() []*ast.ResultField { - return e.Src.Fields() -} - -// Next implements Executor Next interface. -func (e *SelectLockExec) Next() (*Row, error) { - row, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - return nil, nil - } - if len(row.RowKeys) != 0 && e.Lock == ast.SelectLockForUpdate { - forupdate.SetForUpdate(e.ctx) - for _, k := range row.RowKeys { - err = k.Tbl.LockRow(e.ctx, k.Handle, true) - if err != nil { - return nil, errors.Trace(err) - } - } - } - return row, nil -} - -// Close implements Executor Close interface. -func (e *SelectLockExec) Close() error { - return e.Src.Close() -} - -// LimitExec represents limit executor -type LimitExec struct { - Src Executor - Offset uint64 - Count uint64 - Idx uint64 -} - -// Fields implements Executor Fields interface. -func (e *LimitExec) Fields() []*ast.ResultField { - return e.Src.Fields() -} - -// Next implements Executor Next interface. -func (e *LimitExec) Next() (*Row, error) { - for e.Idx < e.Offset { - srcRow, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if srcRow == nil { - return nil, nil - } - e.Idx++ - } - // Negative Limit means no limit. - if e.Count >= 0 && e.Idx >= e.Offset+e.Count { - return nil, nil - } - srcRow, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if srcRow == nil { - return nil, nil - } - e.Idx++ - return srcRow, nil -} - -// Close implements Executor Close interface. -func (e *LimitExec) Close() error { - return e.Src.Close() -} - -// orderByRow binds a row to its order values, so it can be sorted. -type orderByRow struct { - key []interface{} - row *Row -} - -// SortExec represents sorting executor. -type SortExec struct { - Src Executor - ByItems []*ast.ByItem - Rows []*orderByRow - ctx context.Context - Idx int - fetched bool - err error -} - -// Fields implements Executor Fields interface. -func (e *SortExec) Fields() []*ast.ResultField { - return e.Src.Fields() -} - -// Len returns the number of rows. -func (e *SortExec) Len() int { - return len(e.Rows) -} - -// Swap implements sort.Interface Swap interface. -func (e *SortExec) Swap(i, j int) { - e.Rows[i], e.Rows[j] = e.Rows[j], e.Rows[i] -} - -// Less implements sort.Interface Less interface. -func (e *SortExec) Less(i, j int) bool { - for index, by := range e.ByItems { - v1 := e.Rows[i].key[index] - v2 := e.Rows[j].key[index] - - ret, err := types.Compare(v1, v2) - if err != nil { - e.err = err - return true - } - - if by.Desc { - ret = -ret - } - - if ret < 0 { - return true - } else if ret > 0 { - return false - } - } - - return false -} - -// Next implements Executor Next interface. -func (e *SortExec) Next() (*Row, error) { - if !e.fetched { - for { - srcRow, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if srcRow == nil { - break - } - orderRow := &orderByRow{ - row: srcRow, - key: make([]interface{}, len(e.ByItems)), - } - for i, byItem := range e.ByItems { - orderRow.key[i], err = evaluator.Eval(e.ctx, byItem.Expr) - if err != nil { - return nil, errors.Trace(err) - } - } - e.Rows = append(e.Rows, orderRow) - } - sort.Sort(e) - e.fetched = true - } - if e.err != nil { - return nil, errors.Trace(e.err) - } - if e.Idx >= len(e.Rows) { - return nil, nil - } - row := e.Rows[e.Idx].row - e.Idx++ - return row, nil -} - -// Close implements Executor Close interface. -func (e *SortExec) Close() error { - return e.Src.Close() -} - -// For select stmt with aggregate function but without groupby clasue, -// We consider there is a single group with key singleGroup. -const singleGroup = "SingleGroup" - -// AggregateExec deals with all the aggregate functions. -// It is built from Aggregate Plan. When Next() is called, it reads all the data from Src and updates all the items in AggFuncs. -// TODO: Support having. -type AggregateExec struct { - Src Executor - ResultFields []*ast.ResultField - executed bool - ctx context.Context - finish bool - AggFuncs []*ast.AggregateFuncExpr - groupMap map[string]bool - groups []string - currentGroupIndex int - GroupByItems []*ast.ByItem -} - -// Fields implements Executor Fields interface. -func (e *AggregateExec) Fields() []*ast.ResultField { - return e.ResultFields -} - -// Next implements Executor Next interface. -func (e *AggregateExec) Next() (*Row, error) { - // In this stage we consider all data from src as a single group. - if !e.executed { - e.groupMap = make(map[string]bool) - e.groups = []string{} - for { - hasMore, err := e.innerNext() - if err != nil { - return nil, errors.Trace(err) - } - if !hasMore { - break - } - } - e.executed = true - if (len(e.groups) == 0) && (len(e.GroupByItems) == 0) { - // If no groupby and no data, we should add an empty group. - // For example: - // "select count(c) from t;" should return one row [0] - // "select count(c) from t group by c1;" should return empty result set. - e.groups = append(e.groups, singleGroup) - } - } - if e.currentGroupIndex >= len(e.groups) { - return nil, nil - } - groupKey := e.groups[e.currentGroupIndex] - for _, af := range e.AggFuncs { - af.CurrentGroup = groupKey - } - e.currentGroupIndex++ - return &Row{}, nil -} - -func (e *AggregateExec) getGroupKey() (string, error) { - if len(e.GroupByItems) == 0 { - return singleGroup, nil - } - vals := make([]types.Datum, 0, len(e.GroupByItems)) - for _, item := range e.GroupByItems { - v, err := evaluator.Eval(e.ctx, item.Expr) - if err != nil { - return "", errors.Trace(err) - } - vals = append(vals, types.NewDatum(v)) - } - bs, err := codec.EncodeValue([]byte{}, vals...) - if err != nil { - return "", errors.Trace(err) - } - return string(bs), nil -} - -// Fetch a single row from src and update each aggregate function. -// If the first return value is false, it means there is no more data from src. -func (e *AggregateExec) innerNext() (bool, error) { - if e.Src != nil { - srcRow, err := e.Src.Next() - if err != nil { - return false, errors.Trace(err) - } - if srcRow == nil { - return false, nil - } - } else { - // If Src is nil, only one row should be returned. - if e.executed { - return false, nil - } - } - e.executed = true - groupKey, err := e.getGroupKey() - if err != nil { - return false, errors.Trace(err) - } - if _, ok := e.groupMap[groupKey]; !ok { - e.groupMap[groupKey] = true - e.groups = append(e.groups, groupKey) - } - for _, af := range e.AggFuncs { - for _, arg := range af.Args { - _, err := evaluator.Eval(e.ctx, arg) - if err != nil { - return false, errors.Trace(err) - } - } - af.CurrentGroup = groupKey - af.Update() - } - return true, nil -} - -// Close implements Executor Close interface. -func (e *AggregateExec) Close() error { - for _, af := range e.AggFuncs { - af.Clear() - } - if e.Src != nil { - return e.Src.Close() - } - return nil -} - -// UnionExec represents union executor. -type UnionExec struct { - fields []*ast.ResultField - Sels []Executor - cursor int -} - -// Fields implements Executor Fields interface. -func (e *UnionExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Executor Next interface. -func (e *UnionExec) Next() (*Row, error) { - for { - if e.cursor >= len(e.Sels) { - return nil, nil - } - sel := e.Sels[e.cursor] - row, err := sel.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - e.cursor++ - continue - } - if e.cursor != 0 { - for i := range row.Data { - // The column value should be casted as the same type of the first select statement in corresponding position - rf := e.fields[i] - var val types.Datum - val, err = row.Data[i].ConvertTo(&rf.Column.FieldType) - if err != nil { - return nil, errors.Trace(err) - } - row.Data[i] = val - } - } - for i, v := range row.Data { - e.fields[i].Expr.SetValue(v.GetValue()) - } - return row, nil - } -} - -// Close implements Executor Close interface. -func (e *UnionExec) Close() error { - var err error - for _, sel := range e.Sels { - er := sel.Close() - if er != nil { - err = errors.Trace(er) - } - } - return err -} - -// DistinctExec represents Distinct executor. -type DistinctExec struct { - Src Executor - checker *distinct.Checker -} - -// Fields implements Executor Fields interface. -func (e *DistinctExec) Fields() []*ast.ResultField { - return e.Src.Fields() -} - -// Next implements Executor Next interface. -func (e *DistinctExec) Next() (*Row, error) { - if e.checker == nil { - e.checker = distinct.CreateDistinctChecker() - } - for { - row, err := e.Src.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - return nil, nil - } - ok, err := e.checker.Check(types.DatumsToInterfaces(row.Data)) - if err != nil { - return nil, errors.Trace(err) - } - if !ok { - continue - } - return row, nil - } -} - -// Close implements Executor Close interface. -func (e *DistinctExec) Close() error { - return e.Src.Close() -} diff --git a/vendor/github.com/pingcap/tidb/executor/executor_ddl.go b/vendor/github.com/pingcap/tidb/executor/executor_ddl.go deleted file mode 100644 index 710193f93831..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/executor_ddl.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/privilege" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/terror" -) - -// DDLExec represents a DDL executor. -type DDLExec struct { - Statement ast.StmtNode - ctx context.Context - is infoschema.InfoSchema - done bool -} - -// Fields implements Executor Fields interface. -func (e *DDLExec) Fields() []*ast.ResultField { - return nil -} - -// Next implements Execution Next interface. -func (e *DDLExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - var err error - switch x := e.Statement.(type) { - case *ast.TruncateTableStmt: - err = e.executeTruncateTable(x) - case *ast.CreateDatabaseStmt: - err = e.executeCreateDatabase(x) - case *ast.CreateTableStmt: - err = e.executeCreateTable(x) - case *ast.CreateIndexStmt: - err = e.executeCreateIndex(x) - case *ast.DropDatabaseStmt: - err = e.executeDropDatabase(x) - case *ast.DropTableStmt: - err = e.executeDropTable(x) - case *ast.DropIndexStmt: - err = e.executeDropIndex(x) - case *ast.AlterTableStmt: - err = e.executeAlterTable(x) - } - if err != nil { - return nil, errors.Trace(err) - } - e.done = true - return nil, nil -} - -// Close implements Executor Close interface. -func (e *DDLExec) Close() error { - return nil -} - -func (e *DDLExec) executeTruncateTable(s *ast.TruncateTableStmt) error { - table, ok := e.is.TableByID(s.Table.TableInfo.ID) - if !ok { - return errors.New("table not found, should never happen") - } - return table.Truncate(e.ctx) -} - -func (e *DDLExec) executeCreateDatabase(s *ast.CreateDatabaseStmt) error { - var opt *ast.CharsetOpt - if len(s.Options) != 0 { - opt = &ast.CharsetOpt{} - for _, val := range s.Options { - switch val.Tp { - case ast.DatabaseOptionCharset: - opt.Chs = val.Value - case ast.DatabaseOptionCollate: - opt.Col = val.Value - } - } - } - err := sessionctx.GetDomain(e.ctx).DDL().CreateSchema(e.ctx, model.NewCIStr(s.Name), opt) - if err != nil { - if terror.ErrorEqual(err, infoschema.DatabaseExists) && s.IfNotExists { - err = nil - } - } - return errors.Trace(err) -} - -func (e *DDLExec) executeCreateTable(s *ast.CreateTableStmt) error { - ident := ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name} - err := sessionctx.GetDomain(e.ctx).DDL().CreateTable(e.ctx, ident, s.Cols, s.Constraints, s.Options) - if terror.ErrorEqual(err, infoschema.TableExists) { - if s.IfNotExists { - return nil - } - return infoschema.TableExists.Gen("CREATE TABLE: table exists %s", ident) - } - return errors.Trace(err) -} - -func (e *DDLExec) executeCreateIndex(s *ast.CreateIndexStmt) error { - ident := ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name} - err := sessionctx.GetDomain(e.ctx).DDL().CreateIndex(e.ctx, ident, s.Unique, model.NewCIStr(s.IndexName), s.IndexColNames) - return errors.Trace(err) -} - -func (e *DDLExec) executeDropDatabase(s *ast.DropDatabaseStmt) error { - err := sessionctx.GetDomain(e.ctx).DDL().DropSchema(e.ctx, model.NewCIStr(s.Name)) - if terror.ErrorEqual(err, infoschema.DatabaseNotExists) { - if s.IfExists { - err = nil - } else { - err = infoschema.DatabaseDropExists.Gen("Can't drop database '%s'; database doesn't exist", s.Name) - } - } - return errors.Trace(err) -} - -func (e *DDLExec) executeDropTable(s *ast.DropTableStmt) error { - var notExistTables []string - for _, tn := range s.Tables { - fullti := ast.Ident{Schema: tn.Schema, Name: tn.Name} - schema, ok := e.is.SchemaByName(tn.Schema) - if !ok { - // TODO: we should return special error for table not exist, checking "not exist" is not enough, - // because some other errors may contain this error string too. - notExistTables = append(notExistTables, fullti.String()) - continue - } - tb, err := e.is.TableByName(tn.Schema, tn.Name) - if err != nil && strings.HasSuffix(err.Error(), "not exist") { - notExistTables = append(notExistTables, fullti.String()) - continue - } else if err != nil { - return errors.Trace(err) - } - // Check Privilege - privChecker := privilege.GetPrivilegeChecker(e.ctx) - hasPriv, err := privChecker.Check(e.ctx, schema, tb.Meta(), mysql.DropPriv) - if err != nil { - return errors.Trace(err) - } - if !hasPriv { - return errors.Errorf("You do not have the privilege to drop table %s.%s.", tn.Schema, tn.Name) - } - - err = sessionctx.GetDomain(e.ctx).DDL().DropTable(e.ctx, fullti) - if infoschema.DatabaseNotExists.Equal(err) || infoschema.TableNotExists.Equal(err) { - notExistTables = append(notExistTables, fullti.String()) - } else if err != nil { - return errors.Trace(err) - } - } - if len(notExistTables) > 0 && !s.IfExists { - return infoschema.TableDropExists.Gen("DROP TABLE: table %s does not exist", strings.Join(notExistTables, ",")) - } - return nil -} - -func (e *DDLExec) executeDropIndex(s *ast.DropIndexStmt) error { - ti := ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name} - err := sessionctx.GetDomain(e.ctx).DDL().DropIndex(e.ctx, ti, model.NewCIStr(s.IndexName)) - if (infoschema.DatabaseNotExists.Equal(err) || infoschema.TableNotExists.Equal(err)) && s.IfExists { - err = nil - } - return errors.Trace(err) -} - -func (e *DDLExec) executeAlterTable(s *ast.AlterTableStmt) error { - ti := ast.Ident{Schema: s.Table.Schema, Name: s.Table.Name} - err := sessionctx.GetDomain(e.ctx).DDL().AlterTable(e.ctx, ti, s.Specs) - return errors.Trace(err) -} - -func joinColumnName(columnName *ast.ColumnName) string { - var originStrs []string - if columnName.Schema.O != "" { - originStrs = append(originStrs, columnName.Schema.O) - } - if columnName.Table.O != "" { - originStrs = append(originStrs, columnName.Table.O) - } - originStrs = append(originStrs, columnName.Name.O) - return strings.Join(originStrs, ".") -} diff --git a/vendor/github.com/pingcap/tidb/executor/executor_simple.go b/vendor/github.com/pingcap/tidb/executor/executor_simple.go deleted file mode 100644 index b5d35e37a87d..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/executor_simple.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/types" -) - -// SimpleExec represents simple statement executor. -// For statements do simple execution. -// includes `UseStmt`, 'SetStmt`, `SetCharsetStmt`. -// `DoStmt`, `BeginStmt`, `CommitStmt`, `RollbackStmt`. -// TODO: list all simple statements. -type SimpleExec struct { - Statement ast.StmtNode - ctx context.Context - done bool -} - -// Fields implements Executor Fields interface. -func (e *SimpleExec) Fields() []*ast.ResultField { - return nil -} - -// Next implements Execution Next interface. -func (e *SimpleExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - var err error - switch x := e.Statement.(type) { - case *ast.UseStmt: - err = e.executeUse(x) - case *ast.SetStmt: - err = e.executeSet(x) - case *ast.SetCharsetStmt: - err = e.executeSetCharset(x) - case *ast.DoStmt: - err = e.executeDo(x) - case *ast.BeginStmt: - err = e.executeBegin(x) - case *ast.CommitStmt: - err = e.executeCommit(x) - case *ast.RollbackStmt: - err = e.executeRollback(x) - case *ast.CreateUserStmt: - err = e.executeCreateUser(x) - case *ast.SetPwdStmt: - err = e.executeSetPwd(x) - } - if err != nil { - return nil, errors.Trace(err) - } - e.done = true - return nil, nil -} - -// Close implements Executor Close interface. -func (e *SimpleExec) Close() error { - return nil -} - -func (e *SimpleExec) executeUse(s *ast.UseStmt) error { - dbname := model.NewCIStr(s.DBName) - dbinfo, exists := sessionctx.GetDomain(e.ctx).InfoSchema().SchemaByName(dbname) - if !exists { - return infoschema.DatabaseNotExists.Gen("database %s not exists", dbname) - } - db.BindCurrentSchema(e.ctx, dbname.O) - // character_set_database is the character set used by the default database. - // The server sets this variable whenever the default database changes. - // See: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_character_set_database - sessionVars := variable.GetSessionVars(e.ctx) - sessionVars.Systems[variable.CharsetDatabase] = dbinfo.Charset - sessionVars.Systems[variable.CollationDatabase] = dbinfo.Collate - return nil -} - -func (e *SimpleExec) executeSet(s *ast.SetStmt) error { - sessionVars := variable.GetSessionVars(e.ctx) - globalVars := variable.GetGlobalVarAccessor(e.ctx) - for _, v := range s.Variables { - // Variable is case insensitive, we use lower case. - name := strings.ToLower(v.Name) - if !v.IsSystem { - // User variable. - value, err := evaluator.Eval(e.ctx, v.Value) - if err != nil { - return errors.Trace(err) - } - - if value == nil { - delete(sessionVars.Users, name) - } else { - sessionVars.Users[name] = fmt.Sprintf("%v", value) - } - return nil - } - sysVar := variable.GetSysVar(name) - if sysVar == nil { - return variable.UnknownSystemVar.Gen("Unknown system variable '%s'", name) - } - if sysVar.Scope == variable.ScopeNone { - return errors.Errorf("Variable '%s' is a read only variable", name) - } - if v.IsGlobal { - if sysVar.Scope&variable.ScopeGlobal > 0 { - value, err := evaluator.Eval(e.ctx, v.Value) - if err != nil { - return errors.Trace(err) - } - if value == nil { - value = "" - } - svalue, err := types.ToString(value) - if err != nil { - return errors.Trace(err) - } - err = globalVars.SetGlobalSysVar(e.ctx, name, svalue) - return errors.Trace(err) - } - return errors.Errorf("Variable '%s' is a SESSION variable and can't be used with SET GLOBAL", name) - } - if sysVar.Scope&variable.ScopeSession > 0 { - if value, err := evaluator.Eval(e.ctx, v.Value); err != nil { - return errors.Trace(err) - } else if value == nil { - sessionVars.Systems[name] = "" - } else { - sessionVars.Systems[name] = fmt.Sprintf("%v", value) - } - return nil - } - return errors.Errorf("Variable '%s' is a GLOBAL variable and should be set with SET GLOBAL", name) - } - return nil -} - -func (e *SimpleExec) executeSetCharset(s *ast.SetCharsetStmt) error { - collation := s.Collate - if len(collation) == 0 { - var err error - collation, err = charset.GetDefaultCollation(s.Charset) - if err != nil { - return errors.Trace(err) - } - } - sessionVars := variable.GetSessionVars(e.ctx) - for _, v := range variable.SetNamesVariables { - sessionVars.Systems[v] = s.Charset - } - sessionVars.Systems[variable.CollationConnection] = collation - return nil -} - -func (e *SimpleExec) executeDo(s *ast.DoStmt) error { - for _, expr := range s.Exprs { - _, err := evaluator.Eval(e.ctx, expr) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func (e *SimpleExec) executeBegin(s *ast.BeginStmt) error { - _, err := e.ctx.GetTxn(true) - if err != nil { - return errors.Trace(err) - } - // With START TRANSACTION, autocommit remains disabled until you end - // the transaction with COMMIT or ROLLBACK. The autocommit mode then - // reverts to its previous state. - variable.GetSessionVars(e.ctx).SetStatusFlag(mysql.ServerStatusInTrans, true) - return nil -} - -func (e *SimpleExec) executeCommit(s *ast.CommitStmt) error { - err := e.ctx.FinishTxn(false) - variable.GetSessionVars(e.ctx).SetStatusFlag(mysql.ServerStatusInTrans, false) - return errors.Trace(err) -} - -func (e *SimpleExec) executeRollback(s *ast.RollbackStmt) error { - err := e.ctx.FinishTxn(true) - variable.GetSessionVars(e.ctx).SetStatusFlag(mysql.ServerStatusInTrans, false) - return errors.Trace(err) -} - -func (e *SimpleExec) executeCreateUser(s *ast.CreateUserStmt) error { - users := make([]string, 0, len(s.Specs)) - for _, spec := range s.Specs { - userName, host := parseUser(spec.User) - exists, err1 := userExists(e.ctx, userName, host) - if err1 != nil { - return errors.Trace(err1) - } - if exists { - if !s.IfNotExists { - return errors.New("Duplicate user") - } - continue - } - pwd := "" - if spec.AuthOpt.ByAuthString { - pwd = util.EncodePassword(spec.AuthOpt.AuthString) - } else { - pwd = util.EncodePassword(spec.AuthOpt.HashString) - } - user := fmt.Sprintf(`("%s", "%s", "%s")`, host, userName, pwd) - users = append(users, user) - } - if len(users) == 0 { - return nil - } - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, Password) VALUES %s;`, mysql.SystemDB, mysql.UserTable, strings.Join(users, ", ")) - _, err := e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - if err != nil { - return errors.Trace(err) - } - return nil -} - -// parse user string into username and host -// root@localhost -> roor, localhost -func parseUser(user string) (string, string) { - strs := strings.Split(user, "@") - return strs[0], strs[1] -} - -func userExists(ctx context.Context, name string, host string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND Host="%s";`, mysql.SystemDB, mysql.UserTable, name, host) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return false, errors.Trace(err) - } - defer rs.Close() - row, err := rs.Next() - if err != nil { - return false, errors.Trace(err) - } - return row != nil, nil -} - -func (e *SimpleExec) executeSetPwd(s *ast.SetPwdStmt) error { - // TODO: If len(s.User) == 0, use CURRENT_USER() - userName, host := parseUser(s.User) - // Update mysql.user - sql := fmt.Sprintf(`UPDATE %s.%s SET password="%s" WHERE User="%s" AND Host="%s";`, mysql.SystemDB, mysql.UserTable, util.EncodePassword(s.Password), userName, host) - _, err := e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - return errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/executor/executor_write.go b/vendor/github.com/pingcap/tidb/executor/executor_write.go deleted file mode 100644 index 1c3ac3d474c7..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/executor_write.go +++ /dev/null @@ -1,932 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/types" -) - -var ( - _ Executor = &UpdateExec{} - _ Executor = &DeleteExec{} - _ Executor = &InsertExec{} -) - -// UpdateExec represents an update executor. -type UpdateExec struct { - SelectExec Executor - OrderedList []*ast.Assignment - - // Map for unique (Table, handle) pair. - updatedRowKeys map[table.Table]map[int64]struct{} - ctx context.Context - - rows []*Row // The rows fetched from TableExec. - newRowsData [][]types.Datum // The new values to be set. - fetched bool - cursor int -} - -// Next implements Executor Next interface. -func (e *UpdateExec) Next() (*Row, error) { - if !e.fetched { - err := e.fetchRows() - if err != nil { - return nil, errors.Trace(err) - } - e.fetched = true - } - - columns, err := getUpdateColumns(e.OrderedList) - if err != nil { - return nil, errors.Trace(err) - } - if e.cursor >= len(e.rows) { - return nil, nil - } - if e.updatedRowKeys == nil { - e.updatedRowKeys = make(map[table.Table]map[int64]struct{}) - } - row := e.rows[e.cursor] - newData := e.newRowsData[e.cursor] - for _, entry := range row.RowKeys { - tbl := entry.Tbl - if e.updatedRowKeys[tbl] == nil { - e.updatedRowKeys[tbl] = make(map[int64]struct{}) - } - offset := e.getTableOffset(tbl) - handle := entry.Handle - oldData := row.Data[offset : offset+len(tbl.Cols())] - newTableData := newData[offset : offset+len(tbl.Cols())] - - _, ok := e.updatedRowKeys[tbl][handle] - if ok { - // Each matching row is updated once, even if it matches the conditions multiple times. - continue - } - // Update row - err1 := updateRecord(e.ctx, handle, oldData, newTableData, columns, tbl, offset, false) - if err1 != nil { - return nil, errors.Trace(err1) - } - e.updatedRowKeys[tbl][handle] = struct{}{} - } - e.cursor++ - return &Row{}, nil -} - -func getUpdateColumns(assignList []*ast.Assignment) (map[int]*ast.Assignment, error) { - m := make(map[int]*ast.Assignment, len(assignList)) - for i, v := range assignList { - m[i] = v - } - return m, nil -} - -func (e *UpdateExec) fetchRows() error { - for { - row, err := e.SelectExec.Next() - if err != nil { - return errors.Trace(err) - } - if row == nil { - return nil - } - data := make([]types.Datum, len(e.SelectExec.Fields())) - newData := make([]types.Datum, len(e.SelectExec.Fields())) - for i, f := range e.SelectExec.Fields() { - data[i] = types.NewDatum(f.Expr.GetValue()) - newData[i] = data[i] - if e.OrderedList[i] != nil { - val, err := evaluator.Eval(e.ctx, e.OrderedList[i].Expr) - if err != nil { - return errors.Trace(err) - } - newData[i] = types.NewDatum(val) - } - } - row.Data = data - e.rows = append(e.rows, row) - e.newRowsData = append(e.newRowsData, newData) - } -} - -func (e *UpdateExec) getTableOffset(t table.Table) int { - fields := e.SelectExec.Fields() - i := 0 - for i < len(fields) { - field := fields[i] - if field.Table.Name.L == t.Meta().Name.L { - return i - } - i += len(field.Table.Columns) - } - return 0 -} - -func updateRecord(ctx context.Context, h int64, oldData, newData []types.Datum, updateColumns map[int]*ast.Assignment, t table.Table, offset int, onDuplicateUpdate bool) error { - if err := t.LockRow(ctx, h, false); err != nil { - return errors.Trace(err) - } - - cols := t.Cols() - touched := make(map[int]bool, len(cols)) - - assignExists := false - var newHandle types.Datum - for i, asgn := range updateColumns { - if asgn == nil { - continue - } - if i < offset || i >= offset+len(cols) { - // The assign expression is for another table, not this. - continue - } - - colIndex := i - offset - col := cols[colIndex] - if col.IsPKHandleColumn(t.Meta()) { - newHandle = newData[i] - } - if mysql.HasAutoIncrementFlag(col.Flag) { - if newData[i].Kind() == types.KindNull { - return errors.Errorf("Column '%v' cannot be null", col.Name.O) - } - val, err := newData[i].ToInt64() - if err != nil { - return errors.Trace(err) - } - t.RebaseAutoID(val, true) - } - - touched[colIndex] = true - assignExists = true - } - - // If no assign list for this table, no need to update. - if !assignExists { - return nil - } - - // Check whether new value is valid. - if err := column.CastValues(ctx, newData, cols); err != nil { - return errors.Trace(err) - } - - if err := column.CheckNotNull(cols, newData); err != nil { - return errors.Trace(err) - } - - // If row is not changed, we should do nothing. - rowChanged := false - for i := range oldData { - if !touched[i] { - continue - } - - n, err := newData[i].CompareDatum(oldData[i]) - if err != nil { - return errors.Trace(err) - } - if n != 0 { - rowChanged = true - break - } - } - if !rowChanged { - // See: https://dev.mysql.com/doc/refman/5.7/en/mysql-real-connect.html CLIENT_FOUND_ROWS - if variable.GetSessionVars(ctx).ClientCapability&mysql.ClientFoundRows > 0 { - variable.GetSessionVars(ctx).AddAffectedRows(1) - } - return nil - } - - var err error - if newHandle.Kind() != types.KindNull { - err = t.RemoveRecord(ctx, h, oldData) - if err != nil { - return errors.Trace(err) - } - _, err = t.AddRecord(ctx, newData) - } else { - // Update record to new value and update index. - err = t.UpdateRecord(ctx, h, oldData, newData, touched) - } - if err != nil { - return errors.Trace(err) - } - - // Record affected rows. - if !onDuplicateUpdate { - variable.GetSessionVars(ctx).AddAffectedRows(1) - } else { - variable.GetSessionVars(ctx).AddAffectedRows(2) - } - return nil -} - -// Fields implements Executor Fields interface. -// Returns nil to indicate there is no output. -func (e *UpdateExec) Fields() []*ast.ResultField { - return nil -} - -// Close implements Executor Close interface. -func (e *UpdateExec) Close() error { - return e.SelectExec.Close() -} - -// DeleteExec represents a delete executor. -// See: https://dev.mysql.com/doc/refman/5.7/en/delete.html -type DeleteExec struct { - SelectExec Executor - - ctx context.Context - Tables []*ast.TableName - IsMultiTable bool - - finished bool -} - -// Next implements Executor Next interface. -func (e *DeleteExec) Next() (*Row, error) { - if e.finished { - return nil, nil - } - defer func() { - e.finished = true - }() - if e.IsMultiTable && len(e.Tables) == 0 { - return &Row{}, nil - } - tblIDMap := make(map[int64]bool, len(e.Tables)) - // Get table alias map. - tblNames := make(map[string]string) - - // Map for unique (Table, handle) pair. - rowKeyMap := make(map[table.Table]map[int64]struct{}) - if e.IsMultiTable { - // Delete from multiple tables should consider table ident list. - fs := e.SelectExec.Fields() - for _, f := range fs { - if len(f.TableAsName.L) > 0 { - tblNames[f.TableAsName.L] = f.TableName.Name.L - } else { - tblNames[f.TableName.Name.L] = f.TableName.Name.L - } - } - for _, t := range e.Tables { - // Consider DBName. - _, ok := tblNames[t.Name.L] - if !ok { - return nil, errors.Errorf("Unknown table '%s' in MULTI DELETE", t.Name.O) - } - tblIDMap[t.TableInfo.ID] = true - } - } - for { - row, err := e.SelectExec.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - break - } - - for _, entry := range row.RowKeys { - if e.IsMultiTable { - tid := entry.Tbl.Meta().ID - if _, ok := tblIDMap[tid]; !ok { - continue - } - } - if rowKeyMap[entry.Tbl] == nil { - rowKeyMap[entry.Tbl] = make(map[int64]struct{}) - } - rowKeyMap[entry.Tbl][entry.Handle] = struct{}{} - } - } - for t, handleMap := range rowKeyMap { - for handle := range handleMap { - data, err := t.Row(e.ctx, handle) - if err != nil { - return nil, errors.Trace(err) - } - err = e.removeRow(e.ctx, t, handle, data) - if err != nil { - return nil, errors.Trace(err) - } - } - } - return nil, nil -} - -func (e *DeleteExec) getTable(ctx context.Context, tableName *ast.TableName) (table.Table, error) { - return sessionctx.GetDomain(ctx).InfoSchema().TableByName(tableName.Schema, tableName.Name) -} - -func (e *DeleteExec) removeRow(ctx context.Context, t table.Table, h int64, data []types.Datum) error { - err := t.RemoveRecord(ctx, h, data) - if err != nil { - return errors.Trace(err) - } - variable.GetSessionVars(ctx).AddAffectedRows(1) - return nil -} - -// Fields implements Executor Fields interface. -// Returns nil to indicate there is no output. -func (e *DeleteExec) Fields() []*ast.ResultField { - return nil -} - -// Close implements Executor Close interface. -func (e *DeleteExec) Close() error { - return e.SelectExec.Close() -} - -// InsertValues is the data to insert. -type InsertValues struct { - currRow int - ctx context.Context - SelectExec Executor - - Table table.Table - Columns []*ast.ColumnName - Lists [][]ast.ExprNode - Setlist []*ast.Assignment -} - -// InsertExec represents an insert executor. -type InsertExec struct { - *InsertValues - - OnDuplicate []*ast.Assignment - fields []*ast.ResultField - - Priority int - - finished bool -} - -// Next implements Executor Next interface. -func (e *InsertExec) Next() (*Row, error) { - if e.finished { - return nil, nil - } - cols, err := e.getColumns(e.Table.Cols()) - if err != nil { - return nil, errors.Trace(err) - } - txn, err := e.ctx.GetTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - toUpdateColumns, err := getOnDuplicateUpdateColumns(e.OnDuplicate, e.Table) - if err != nil { - return nil, errors.Trace(err) - } - - var rows [][]types.Datum - if e.SelectExec != nil { - rows, err = e.getRowsSelect(cols) - } else { - rows, err = e.getRows(cols) - } - if err != nil { - return nil, errors.Trace(err) - } - - for _, row := range rows { - if len(e.OnDuplicate) == 0 { - txn.SetOption(kv.PresumeKeyNotExists, nil) - } - h, err := e.Table.AddRecord(e.ctx, row) - txn.DelOption(kv.PresumeKeyNotExists) - if err == nil { - continue - } - - if len(e.OnDuplicate) == 0 || !terror.ErrorEqual(err, kv.ErrKeyExists) { - return nil, errors.Trace(err) - } - if err = e.onDuplicateUpdate(row, h, toUpdateColumns); err != nil { - return nil, errors.Trace(err) - } - } - e.finished = true - return nil, nil -} - -// Fields implements Executor Fields interface. -// Returns nil to indicate there is no output. -func (e *InsertExec) Fields() []*ast.ResultField { - return nil -} - -// Close implements Executor Close interface. -func (e *InsertExec) Close() error { - if e.SelectExec != nil { - return e.SelectExec.Close() - } - return nil -} - -// There are three types of insert statements: -// 1 insert ... values(...) --> name type column -// 2 insert ... set x=y... --> set type column -// 3 insert ... (select ..) --> name type column -// See: https://dev.mysql.com/doc/refman/5.7/en/insert.html -func (e *InsertValues) getColumns(tableCols []*column.Col) ([]*column.Col, error) { - var cols []*column.Col - var err error - - if len(e.Setlist) > 0 { - // Process `set` type column. - columns := make([]string, 0, len(e.Setlist)) - for _, v := range e.Setlist { - columns = append(columns, v.Column.Name.O) - } - - cols, err = column.FindCols(tableCols, columns) - if err != nil { - return nil, errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) - } - - if len(cols) == 0 { - return nil, errors.Errorf("INSERT INTO %s: empty column", e.Table.Meta().Name.O) - } - } else { - // Process `name` type column. - columns := make([]string, 0, len(e.Columns)) - for _, v := range e.Columns { - columns = append(columns, v.Name.O) - } - cols, err = column.FindCols(tableCols, columns) - if err != nil { - return nil, errors.Errorf("INSERT INTO %s: %s", e.Table.Meta().Name.O, err) - } - - // If cols are empty, use all columns instead. - if len(cols) == 0 { - cols = tableCols - } - } - - // Check column whether is specified only once. - err = column.CheckOnce(cols) - if err != nil { - return nil, errors.Trace(err) - } - - return cols, nil -} - -func (e *InsertValues) fillValueList() error { - if len(e.Setlist) > 0 { - if len(e.Lists) > 0 { - return errors.Errorf("INSERT INTO %s: set type should not use values", e.Table) - } - var l []ast.ExprNode - for _, v := range e.Setlist { - l = append(l, v.Expr) - } - e.Lists = append(e.Lists, l) - } - return nil -} - -func (e *InsertValues) checkValueCount(insertValueCount, valueCount, num int, cols []*column.Col) error { - if insertValueCount != valueCount { - // "insert into t values (), ()" is valid. - // "insert into t values (), (1)" is not valid. - // "insert into t values (1), ()" is not valid. - // "insert into t values (1,2), (1)" is not valid. - // So the value count must be same for all insert list. - return errors.Errorf("Column count doesn't match value count at row %d", num+1) - } - if valueCount == 0 && len(e.Columns) > 0 { - // "insert into t (c1) values ()" is not valid. - return errors.Errorf("INSERT INTO %s: expected %d value(s), have %d", e.Table.Meta().Name.O, len(e.Columns), 0) - } else if valueCount > 0 && valueCount != len(cols) { - return errors.Errorf("INSERT INTO %s: expected %d value(s), have %d", e.Table.Meta().Name.O, len(cols), valueCount) - } - return nil -} - -func (e *InsertValues) getColumnDefaultValues(cols []*column.Col) (map[string]types.Datum, error) { - defaultValMap := map[string]types.Datum{} - for _, col := range cols { - if value, ok, err := table.GetColDefaultValue(e.ctx, &col.ColumnInfo); ok { - if err != nil { - return nil, errors.Trace(err) - } - defaultValMap[col.Name.L] = value - } - } - return defaultValMap, nil -} - -func (e *InsertValues) getRows(cols []*column.Col) (rows [][]types.Datum, err error) { - // process `insert|replace ... set x=y...` - if err = e.fillValueList(); err != nil { - return nil, errors.Trace(err) - } - - defaultVals, err := e.getColumnDefaultValues(e.Table.Cols()) - if err != nil { - return nil, errors.Trace(err) - } - - rows = make([][]types.Datum, len(e.Lists)) - length := len(e.Lists[0]) - for i, list := range e.Lists { - if err = e.checkValueCount(length, len(list), i, cols); err != nil { - return nil, errors.Trace(err) - } - e.currRow = i - rows[i], err = e.getRow(cols, list, defaultVals) - if err != nil { - return nil, errors.Trace(err) - } - } - return -} - -func (e *InsertValues) getRow(cols []*column.Col, list []ast.ExprNode, defaultVals map[string]types.Datum) ([]types.Datum, error) { - vals := make([]types.Datum, len(list)) - var err error - for i, expr := range list { - if d, ok := expr.(*ast.DefaultExpr); ok { - cn := d.Name - if cn != nil { - var found bool - vals[i], found = defaultVals[cn.Name.L] - if !found { - return nil, errors.Errorf("default column not found - %s", cn.Name.O) - } - } else { - vals[i] = defaultVals[cols[i].Name.L] - } - } else { - var val interface{} - val, err = evaluator.Eval(e.ctx, expr) - vals[i].SetValue(val) - if err != nil { - return nil, errors.Trace(err) - } - } - } - return e.fillRowData(cols, vals) -} - -func (e *InsertValues) getRowsSelect(cols []*column.Col) ([][]types.Datum, error) { - // process `insert|replace into ... select ... from ...` - if len(e.SelectExec.Fields()) != len(cols) { - return nil, errors.Errorf("Column count %d doesn't match value count %d", len(cols), len(e.SelectExec.Fields())) - } - var rows [][]types.Datum - for { - innerRow, err := e.SelectExec.Next() - if err != nil { - return nil, errors.Trace(err) - } - if innerRow == nil { - break - } - e.currRow = len(rows) - row, err := e.fillRowData(cols, innerRow.Data) - if err != nil { - return nil, errors.Trace(err) - } - rows = append(rows, row) - } - return rows, nil -} - -func (e *InsertValues) fillRowData(cols []*column.Col, vals []types.Datum) ([]types.Datum, error) { - row := make([]types.Datum, len(e.Table.Cols())) - marked := make(map[int]struct{}, len(vals)) - for i, v := range vals { - offset := cols[i].Offset - row[offset] = v - marked[offset] = struct{}{} - } - err := e.initDefaultValues(row, marked) - if err != nil { - return nil, errors.Trace(err) - } - if err = column.CastValues(e.ctx, row, cols); err != nil { - return nil, errors.Trace(err) - } - if err = column.CheckNotNull(e.Table.Cols(), row); err != nil { - return nil, errors.Trace(err) - } - return row, nil -} - -func (e *InsertValues) initDefaultValues(row []types.Datum, marked map[int]struct{}) error { - var rewriteValueCol *column.Col - var defaultValueCols []*column.Col - for i, c := range e.Table.Cols() { - if row[i].Kind() != types.KindNull { - // Column value isn't nil and column isn't auto-increment, continue. - if !mysql.HasAutoIncrementFlag(c.Flag) { - continue - } - val, err := row[i].ToInt64() - if err != nil { - return errors.Trace(err) - } - if val != 0 { - e.Table.RebaseAutoID(val, true) - continue - } - } - - // If the nil value is evaluated in insert list, we will use nil except auto increment column. - if _, ok := marked[i]; ok && !mysql.HasAutoIncrementFlag(c.Flag) && !mysql.HasTimestampFlag(c.Flag) { - continue - } - - if mysql.HasAutoIncrementFlag(c.Flag) { - recordID, err := e.Table.AllocAutoID() - if err != nil { - return errors.Trace(err) - } - row[i].SetInt64(recordID) - // Notes: incompatible with mysql - // MySQL will set last insert id to the first row, as follows: - // `t(id int AUTO_INCREMENT, c1 int, PRIMARY KEY (id))` - // `insert t (c1) values(1),(2),(3);` - // Last insert id will be 1, not 3. - variable.GetSessionVars(e.ctx).SetLastInsertID(uint64(recordID)) - // It's used for retry. - rewriteValueCol = c - } else { - var err error - row[i], _, err = table.GetColDefaultValue(e.ctx, &c.ColumnInfo) - if err != nil { - return errors.Trace(err) - } - } - - defaultValueCols = append(defaultValueCols, c) - } - if err := column.CastValues(e.ctx, row, defaultValueCols); err != nil { - return errors.Trace(err) - } - - // It's used for retry. - if rewriteValueCol == nil { - return nil - } - if len(e.Setlist) > 0 { - val := &ast.Assignment{ - Column: &ast.ColumnName{Name: rewriteValueCol.Name}, - Expr: ast.NewValueExpr(row[rewriteValueCol.Offset].GetValue())} - if len(e.Setlist) < rewriteValueCol.Offset+1 { - e.Setlist = append(e.Setlist, val) - return nil - } - setlist := make([]*ast.Assignment, 0, len(e.Setlist)+1) - setlist = append(setlist, e.Setlist[:rewriteValueCol.Offset]...) - setlist = append(setlist, val) - e.Setlist = append(setlist, e.Setlist[rewriteValueCol.Offset:]...) - return nil - } - - // records the values of each row. - vals := make([]ast.ExprNode, len(row)) - for i, col := range row { - vals[i] = ast.NewValueExpr(col.GetValue()) - } - if len(e.Lists) <= e.currRow { - e.Lists = append(e.Lists, vals) - } else { - e.Lists[e.currRow] = vals - } - - // records the column name only once. - if e.currRow != len(e.Lists)-1 { - return nil - } - if len(e.Columns) < rewriteValueCol.Offset+1 { - e.Columns = append(e.Columns, &ast.ColumnName{Name: rewriteValueCol.Name}) - return nil - } - cols := make([]*ast.ColumnName, 0, len(e.Columns)+1) - cols = append(cols, e.Columns[:rewriteValueCol.Offset]...) - cols = append(cols, &ast.ColumnName{Name: rewriteValueCol.Name}) - e.Columns = append(cols, e.Columns[rewriteValueCol.Offset:]...) - - return nil -} - -func (e *InsertExec) onDuplicateUpdate(row []types.Datum, h int64, cols map[int]*ast.Assignment) error { - // On duplicate key update the duplicate row. - // Evaluate the updated value. - // TODO: report rows affected and last insert id. - data, err := e.Table.Row(e.ctx, h) - if err != nil { - return errors.Trace(err) - } - // For evaluate ValuesExpr - // http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values - for i, rf := range e.fields { - rf.Expr.SetValue(row[i].GetValue()) - } - // Evaluate assignment - newData := make([]types.Datum, len(data)) - for i, c := range row { - asgn, ok := cols[i] - if !ok { - newData[i] = c - continue - } - var val interface{} - val, err = evaluator.Eval(e.ctx, asgn.Expr) - if err != nil { - return errors.Trace(err) - } - newData[i].SetValue(val) - } - if err = updateRecord(e.ctx, h, data, newData, cols, e.Table, 0, true); err != nil { - return errors.Trace(err) - } - return nil -} - -func findColumnByName(t table.Table, name string) (*column.Col, error) { - _, tableName, colName := splitQualifiedName(name) - if len(tableName) > 0 && tableName != t.Meta().Name.O { - return nil, errors.Errorf("unknown field %s.%s", tableName, colName) - } - - c := column.FindCol(t.Cols(), colName) - if c == nil { - return nil, errors.Errorf("unknown field %s", colName) - } - return c, nil -} - -func getOnDuplicateUpdateColumns(assignList []*ast.Assignment, t table.Table) (map[int]*ast.Assignment, error) { - m := make(map[int]*ast.Assignment, len(assignList)) - - for _, v := range assignList { - col := v.Column - c, err := findColumnByName(t, joinQualifiedName("", col.Table.L, col.Name.L)) - if err != nil { - return nil, errors.Trace(err) - } - m[c.Offset] = v - } - return m, nil -} - -// ReplaceExec represents a replace executor. -type ReplaceExec struct { - *InsertValues - Priority int - finished bool -} - -// Fields implements Executor Fields interface. -// Returns nil to indicate there is no output. -func (e *ReplaceExec) Fields() []*ast.ResultField { - return nil -} - -// Close implements Executor Close interface. -func (e *ReplaceExec) Close() error { - if e.SelectExec != nil { - return e.SelectExec.Close() - } - return nil -} - -// Next implements Executor Next interface. -func (e *ReplaceExec) Next() (*Row, error) { - if e.finished { - return nil, nil - } - cols, err := e.getColumns(e.Table.Cols()) - if err != nil { - return nil, errors.Trace(err) - } - - var rows [][]types.Datum - if e.SelectExec != nil { - rows, err = e.getRowsSelect(cols) - } else { - rows, err = e.getRows(cols) - } - if err != nil { - return nil, errors.Trace(err) - } - - for _, row := range rows { - h, err := e.Table.AddRecord(e.ctx, row) - if err == nil { - continue - } - if err != nil && !terror.ErrorEqual(err, kv.ErrKeyExists) { - return nil, errors.Trace(err) - } - - // While the insertion fails because a duplicate-key error occurs for a primary key or unique index, - // a storage engine may perform the REPLACE as an update rather than a delete plus insert. - // See: http://dev.mysql.com/doc/refman/5.7/en/replace.html. - if err = e.replaceRow(h, row); err != nil { - return nil, errors.Trace(err) - } - variable.GetSessionVars(e.ctx).AddAffectedRows(1) - } - e.finished = true - return nil, nil -} - -func (e *ReplaceExec) replaceRow(handle int64, replaceRow []types.Datum) error { - row, err := e.Table.Row(e.ctx, handle) - if err != nil { - return errors.Trace(err) - } - isReplace := false - touched := make(map[int]bool, len(row)) - for i, val := range row { - v, err1 := val.CompareDatum(replaceRow[i]) - if err1 != nil { - return errors.Trace(err1) - } - if v != 0 { - touched[i] = true - isReplace = true - } - } - if isReplace { - variable.GetSessionVars(e.ctx).AddAffectedRows(1) - if err = e.Table.UpdateRecord(e.ctx, handle, row, replaceRow, touched); err != nil { - return errors.Trace(err) - } - } - return nil -} - -// SplitQualifiedName splits an identifier name to db, table and field name. -func splitQualifiedName(name string) (db string, table string, field string) { - seps := strings.Split(name, ".") - - l := len(seps) - switch l { - case 1: - // `name` is field. - field = seps[0] - case 2: - // `name` is `table.field`. - table, field = seps[0], seps[1] - case 3: - // `name` is `db.table.field`. - db, table, field = seps[0], seps[1], seps[2] - default: - // `name` is `db.table.field`. - db, table, field = seps[l-3], seps[l-2], seps[l-1] - } - - return -} - -// JoinQualifiedName converts db, table, field to a qualified name. -func joinQualifiedName(db string, table string, field string) string { - if len(db) > 0 { - return fmt.Sprintf("%s.%s.%s", db, table, field) - } else if len(table) > 0 { - return fmt.Sprintf("%s.%s", table, field) - } else { - return field - } -} diff --git a/vendor/github.com/pingcap/tidb/executor/explain.go b/vendor/github.com/pingcap/tidb/executor/explain.go deleted file mode 100644 index 1d135e074e4b..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/explain.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "strconv" - "strings" - - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/types" -) - -type explainEntry struct { - ID int64 - selectType string - table string - joinType string - possibleKeys string - key string - keyLen string - ref string - rows int64 - extra []string -} - -func (e *explainEntry) setJoinTypeForTableScan(p *plan.TableScan) { - if len(p.AccessConditions) == 0 { - e.joinType = "ALL" - return - } - if p.RefAccess { - e.joinType = "eq_ref" - return - } - for _, con := range p.AccessConditions { - if x, ok := con.(*ast.BinaryOperationExpr); ok { - if x.Op == opcode.EQ { - e.joinType = "const" - return - } - } - } - e.joinType = "range" -} - -func (e *explainEntry) setJoinTypeForIndexScan(p *plan.IndexScan) { - if len(p.AccessConditions) == 0 { - e.joinType = "index" - return - } - if len(p.AccessConditions) == p.AccessEqualCount { - if p.RefAccess { - if p.Index.Unique { - e.joinType = "eq_ref" - } else { - e.joinType = "ref" - } - } else { - if p.Index.Unique { - e.joinType = "const" - } else { - e.joinType = "range" - } - } - return - } - e.joinType = "range" -} - -// ExplainExec represents an explain executor. -// See: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html -type ExplainExec struct { - StmtPlan plan.Plan - fields []*ast.ResultField - rows []*Row - cursor int -} - -// Fields implements Executor Fields interface. -func (e *ExplainExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Execution Next interface. -func (e *ExplainExec) Next() (*Row, error) { - if e.rows == nil { - e.fetchRows() - } - if e.cursor >= len(e.rows) { - return nil, nil - } - row := e.rows[e.cursor] - e.cursor++ - return row, nil -} - -func (e *ExplainExec) fetchRows() { - visitor := &explainVisitor{id: 1} - e.StmtPlan.Accept(visitor) - for _, entry := range visitor.entries { - row := &Row{} - row.Data = types.MakeDatums( - entry.ID, - entry.selectType, - entry.table, - entry.joinType, - entry.key, - entry.key, - entry.keyLen, - entry.ref, - entry.rows, - strings.Join(entry.extra, "; "), - ) - for i := range row.Data { - if row.Data[i].Kind() == types.KindString && row.Data[i].GetString() == "" { - row.Data[i].SetNull() - } - } - e.rows = append(e.rows, row) - } -} - -// Close implements Executor Close interface. -func (e *ExplainExec) Close() error { - return nil -} - -type explainVisitor struct { - id int64 - - // Sort extra should be appended in the first table in a join. - sort bool - entries []*explainEntry -} - -func (v *explainVisitor) Enter(p plan.Plan) (plan.Plan, bool) { - switch x := p.(type) { - case *plan.TableScan: - v.entries = append(v.entries, v.newEntryForTableScan(x)) - case *plan.IndexScan: - v.entries = append(v.entries, v.newEntryForIndexScan(x)) - case *plan.Sort: - v.sort = true - } - return p, false -} - -func (v *explainVisitor) Leave(p plan.Plan) (plan.Plan, bool) { - return p, true -} - -func (v *explainVisitor) newEntryForTableScan(p *plan.TableScan) *explainEntry { - entry := &explainEntry{ - ID: v.id, - selectType: "SIMPLE", - table: p.Table.Name.O, - } - entry.setJoinTypeForTableScan(p) - if entry.joinType != "ALL" { - entry.key = "PRIMARY" - entry.keyLen = "8" - } - if len(p.AccessConditions)+len(p.FilterConditions) > 0 { - entry.extra = append(entry.extra, "Using where") - } - - v.setSortExtra(entry) - return entry -} - -func (v *explainVisitor) newEntryForIndexScan(p *plan.IndexScan) *explainEntry { - entry := &explainEntry{ - ID: v.id, - selectType: "SIMPLE", - table: p.Table.Name.O, - key: p.Index.Name.O, - } - if len(p.AccessConditions) != 0 { - keyLen := 0 - for i := 0; i < len(p.Index.Columns); i++ { - if i < p.AccessEqualCount { - keyLen += p.Index.Columns[i].Length - } else if i < len(p.AccessConditions) { - keyLen += p.Index.Columns[i].Length - break - } - } - entry.keyLen = strconv.Itoa(keyLen) - } - entry.setJoinTypeForIndexScan(p) - if len(p.AccessConditions)+len(p.FilterConditions) > 0 { - entry.extra = append(entry.extra, "Using where") - } - - v.setSortExtra(entry) - return entry -} - -func (v *explainVisitor) setSortExtra(entry *explainEntry) { - if v.sort { - entry.extra = append(entry.extra, "Using filesort") - v.sort = false - } -} diff --git a/vendor/github.com/pingcap/tidb/executor/grant.go b/vendor/github.com/pingcap/tidb/executor/grant.go deleted file mode 100644 index 45ebdc161358..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/grant.go +++ /dev/null @@ -1,520 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/types" -) - -/*** - * Grant Statement - * See: https://dev.mysql.com/doc/refman/5.7/en/grant.html - ************************************************************************************/ -var ( - _ Executor = (*GrantExec)(nil) -) - -// GrantExec executes GrantStmt. -type GrantExec struct { - Privs []*ast.PrivElem - ObjectType ast.ObjectTypeType - Level *ast.GrantLevel - Users []*ast.UserSpec - - ctx context.Context - done bool -} - -// Fields implements Executor Fields interface. -func (e *GrantExec) Fields() []*ast.ResultField { - return nil -} - -// Next implements Execution Next interface. -func (e *GrantExec) Next() (*Row, error) { - if e.done { - return nil, nil - } - // Grant for each user - for _, user := range e.Users { - // Check if user exists. - userName, host := parseUser(user.User) - exists, err := userExists(e.ctx, userName, host) - if err != nil { - return nil, errors.Trace(err) - } - if !exists { - return nil, errors.Errorf("Unknown user: %s", user.User) - } - - // If there is no privilege entry in corresponding table, insert a new one. - // DB scope: mysql.DB - // Table scope: mysql.Tables_priv - // Column scope: mysql.Columns_priv - switch e.Level.Level { - case ast.GrantLevelDB: - err := e.checkAndInitDBPriv(userName, host) - if err != nil { - return nil, errors.Trace(err) - } - case ast.GrantLevelTable: - err := e.checkAndInitTablePriv(userName, host) - if err != nil { - return nil, errors.Trace(err) - } - } - // Grant each priv to the user. - for _, priv := range e.Privs { - if len(priv.Cols) > 0 { - // Check column scope privilege entry. - // TODO: Check validity before insert new entry. - err1 := e.checkAndInitColumnPriv(userName, host, priv.Cols) - if err1 != nil { - return nil, errors.Trace(err1) - } - } - err2 := e.grantPriv(priv, user) - if err2 != nil { - return nil, errors.Trace(err2) - } - } - } - e.done = true - return nil, nil -} - -// Close implements Executor Close interface. -func (e *GrantExec) Close() error { - return nil -} - -// Check if DB scope privilege entry exists in mysql.DB. -// If unexists, insert a new one. -func (e *GrantExec) checkAndInitDBPriv(user string, host string) error { - db, err := e.getTargetSchema() - if err != nil { - return errors.Trace(err) - } - ok, err := dbUserExists(e.ctx, user, host, db.Name.O) - if err != nil { - return errors.Trace(err) - } - if ok { - return nil - } - // Entry does not exist for user-host-db. Insert a new entry. - return initDBPrivEntry(e.ctx, user, host, db.Name.O) -} - -// Check if table scope privilege entry exists in mysql.Tables_priv. -// If unexists, insert a new one. -func (e *GrantExec) checkAndInitTablePriv(user string, host string) error { - db, tbl, err := e.getTargetSchemaAndTable() - if err != nil { - return errors.Trace(err) - } - ok, err := tableUserExists(e.ctx, user, host, db.Name.O, tbl.Meta().Name.O) - if err != nil { - return errors.Trace(err) - } - if ok { - return nil - } - // Entry does not exist for user-host-db-tbl. Insert a new entry. - return initTablePrivEntry(e.ctx, user, host, db.Name.O, tbl.Meta().Name.O) -} - -// Check if column scope privilege entry exists in mysql.Columns_priv. -// If unexists, insert a new one. -func (e *GrantExec) checkAndInitColumnPriv(user string, host string, cols []*ast.ColumnName) error { - db, tbl, err := e.getTargetSchemaAndTable() - if err != nil { - return errors.Trace(err) - } - for _, c := range cols { - col := column.FindCol(tbl.Cols(), c.Name.L) - if col == nil { - return errors.Errorf("Unknown column: %s", c.Name.O) - } - ok, err := columnPrivEntryExists(e.ctx, user, host, db.Name.O, tbl.Meta().Name.O, col.Name.O) - if err != nil { - return errors.Trace(err) - } - if ok { - continue - } - // Entry does not exist for user-host-db-tbl-col. Insert a new entry. - err = initColumnPrivEntry(e.ctx, user, host, db.Name.O, tbl.Meta().Name.O, col.Name.O) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// Insert a new row into mysql.DB with empty privilege. -func initDBPrivEntry(ctx context.Context, user string, host string, db string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB) VALUES ("%s", "%s", "%s")`, mysql.SystemDB, mysql.DBTable, host, user, db) - _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - return errors.Trace(err) -} - -// Insert a new row into mysql.Tables_priv with empty privilege. -func initTablePrivEntry(ctx context.Context, user string, host string, db string, tbl string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB, Table_name, Table_priv, Column_priv) VALUES ("%s", "%s", "%s", "%s", "", "")`, mysql.SystemDB, mysql.TablePrivTable, host, user, db, tbl) - _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - return errors.Trace(err) -} - -// Insert a new row into mysql.Columns_priv with empty privilege. -func initColumnPrivEntry(ctx context.Context, user string, host string, db string, tbl string, col string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB, Table_name, Column_name, Column_priv) VALUES ("%s", "%s", "%s", "%s", "%s", "")`, mysql.SystemDB, mysql.ColumnPrivTable, host, user, db, tbl, col) - _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - return errors.Trace(err) -} - -// Grant priv to user in s.Level scope. -func (e *GrantExec) grantPriv(priv *ast.PrivElem, user *ast.UserSpec) error { - switch e.Level.Level { - case ast.GrantLevelGlobal: - return e.grantGlobalPriv(priv, user) - case ast.GrantLevelDB: - return e.grantDBPriv(priv, user) - case ast.GrantLevelTable: - if len(priv.Cols) == 0 { - return e.grantTablePriv(priv, user) - } - return e.grantColumnPriv(priv, user) - default: - return errors.Errorf("Unknown grant level: %#v", e.Level) - } -} - -// Manipulate mysql.user table. -func (e *GrantExec) grantGlobalPriv(priv *ast.PrivElem, user *ast.UserSpec) error { - asgns, err := composeGlobalPrivUpdate(priv.Priv) - if err != nil { - return errors.Trace(err) - } - userName, host := parseUser(user.User) - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User="%s" AND Host="%s"`, mysql.SystemDB, mysql.UserTable, asgns, userName, host) - _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - return errors.Trace(err) -} - -// Manipulate mysql.db table. -func (e *GrantExec) grantDBPriv(priv *ast.PrivElem, user *ast.UserSpec) error { - db, err := e.getTargetSchema() - if err != nil { - return errors.Trace(err) - } - asgns, err := composeDBPrivUpdate(priv.Priv) - if err != nil { - return errors.Trace(err) - } - userName, host := parseUser(user.User) - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User="%s" AND Host="%s" AND DB="%s";`, mysql.SystemDB, mysql.DBTable, asgns, userName, host, db.Name.O) - _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - return errors.Trace(err) -} - -// Manipulate mysql.tables_priv table. -func (e *GrantExec) grantTablePriv(priv *ast.PrivElem, user *ast.UserSpec) error { - db, tbl, err := e.getTargetSchemaAndTable() - if err != nil { - return errors.Trace(err) - } - userName, host := parseUser(user.User) - asgns, err := composeTablePrivUpdate(e.ctx, priv.Priv, userName, host, db.Name.O, tbl.Meta().Name.O) - if err != nil { - return errors.Trace(err) - } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s";`, mysql.SystemDB, mysql.TablePrivTable, asgns, userName, host, db.Name.O, tbl.Meta().Name.O) - _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - return errors.Trace(err) -} - -// Manipulate mysql.tables_priv table. -func (e *GrantExec) grantColumnPriv(priv *ast.PrivElem, user *ast.UserSpec) error { - db, tbl, err := e.getTargetSchemaAndTable() - if err != nil { - return errors.Trace(err) - } - userName, host := parseUser(user.User) - for _, c := range priv.Cols { - col := column.FindCol(tbl.Cols(), c.Name.L) - if col == nil { - return errors.Errorf("Unknown column: %s", c) - } - asgns, err := composeColumnPrivUpdate(e.ctx, priv.Priv, userName, host, db.Name.O, tbl.Meta().Name.O, col.Name.O) - if err != nil { - return errors.Trace(err) - } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s" AND Column_name="%s";`, mysql.SystemDB, mysql.ColumnPrivTable, asgns, userName, host, db.Name.O, tbl.Meta().Name.O, col.Name.O) - _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(e.ctx, sql) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// Compose update stmt assignment list string for global scope privilege update. -func composeGlobalPrivUpdate(priv mysql.PrivilegeType) (string, error) { - if priv == mysql.AllPriv { - strs := make([]string, 0, len(mysql.Priv2UserCol)) - for _, v := range mysql.Priv2UserCol { - strs = append(strs, fmt.Sprintf(`%s="Y"`, v)) - } - return strings.Join(strs, ", "), nil - } - col, ok := mysql.Priv2UserCol[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) - } - return fmt.Sprintf(`%s="Y"`, col), nil -} - -// Compose update stmt assignment list for db scope privilege update. -func composeDBPrivUpdate(priv mysql.PrivilegeType) (string, error) { - if priv == mysql.AllPriv { - strs := make([]string, 0, len(mysql.AllDBPrivs)) - for _, p := range mysql.AllDBPrivs { - v, ok := mysql.Priv2UserCol[p] - if !ok { - return "", errors.Errorf("Unknown db privilege %v", priv) - } - strs = append(strs, fmt.Sprintf(`%s="Y"`, v)) - } - return strings.Join(strs, ", "), nil - } - col, ok := mysql.Priv2UserCol[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) - } - return fmt.Sprintf(`%s="Y"`, col), nil -} - -// Compose update stmt assignment list for table scope privilege update. -func composeTablePrivUpdate(ctx context.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string) (string, error) { - var newTablePriv, newColumnPriv string - if priv == mysql.AllPriv { - for _, p := range mysql.AllTablePrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown table privilege %v", p) - } - if len(newTablePriv) == 0 { - newTablePriv = v - } else { - newTablePriv = fmt.Sprintf("%s,%s", newTablePriv, v) - } - } - for _, p := range mysql.AllColumnPrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown column privilege %v", p) - } - if len(newColumnPriv) == 0 { - newColumnPriv = v - } else { - newColumnPriv = fmt.Sprintf("%s,%s", newColumnPriv, v) - } - } - } else { - currTablePriv, currColumnPriv, err := getTablePriv(ctx, name, host, db, tbl) - if err != nil { - return "", errors.Trace(err) - } - p, ok := mysql.Priv2SetStr[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) - } - if len(currTablePriv) == 0 { - newTablePriv = p - } else { - newTablePriv = fmt.Sprintf("%s,%s", currTablePriv, p) - } - for _, cp := range mysql.AllColumnPrivs { - if priv == cp { - if len(currColumnPriv) == 0 { - newColumnPriv = p - } else { - newColumnPriv = fmt.Sprintf("%s,%s", currColumnPriv, p) - } - break - } - } - } - return fmt.Sprintf(`Table_priv="%s", Column_priv="%s", Grantor="%s"`, newTablePriv, newColumnPriv, variable.GetSessionVars(ctx).User), nil -} - -// Compose update stmt assignment list for column scope privilege update. -func composeColumnPrivUpdate(ctx context.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) (string, error) { - newColumnPriv := "" - if priv == mysql.AllPriv { - for _, p := range mysql.AllColumnPrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown column privilege %v", p) - } - if len(newColumnPriv) == 0 { - newColumnPriv = v - } else { - newColumnPriv = fmt.Sprintf("%s,%s", newColumnPriv, v) - } - } - } else { - currColumnPriv, err := getColumnPriv(ctx, name, host, db, tbl, col) - if err != nil { - return "", errors.Trace(err) - } - p, ok := mysql.Priv2SetStr[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) - } - if len(currColumnPriv) == 0 { - newColumnPriv = p - } else { - newColumnPriv = fmt.Sprintf("%s,%s", currColumnPriv, p) - } - } - return fmt.Sprintf(`Column_priv="%s"`, newColumnPriv), nil -} - -// Helper function to check if the sql returns any row. -func recordExists(ctx context.Context, sql string) (bool, error) { - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return false, errors.Trace(err) - } - defer rs.Close() - row, err := rs.Next() - if err != nil { - return false, errors.Trace(err) - } - return row != nil, nil -} - -// Check if there is an entry with key user-host-db in mysql.DB. -func dbUserExists(ctx context.Context, name string, host string, db string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND Host="%s" AND DB="%s";`, mysql.SystemDB, mysql.DBTable, name, host, db) - return recordExists(ctx, sql) -} - -// Check if there is an entry with key user-host-db-tbl in mysql.Tables_priv. -func tableUserExists(ctx context.Context, name string, host string, db string, tbl string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s";`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) - return recordExists(ctx, sql) -} - -// Check if there is an entry with key user-host-db-tbl-col in mysql.Columns_priv. -func columnPrivEntryExists(ctx context.Context, name string, host string, db string, tbl string, col string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s" AND Column_name="%s";`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) - return recordExists(ctx, sql) -} - -// Get current table scope privilege set from mysql.Tables_priv. -// Return Table_priv and Column_priv. -func getTablePriv(ctx context.Context, name string, host string, db string, tbl string) (string, string, error) { - sql := fmt.Sprintf(`SELECT Table_priv, Column_priv FROM %s.%s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s";`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return "", "", errors.Trace(err) - } - defer rs.Close() - row, err := rs.Next() - if err != nil { - return "", "", errors.Trace(err) - } - var tPriv, cPriv string - if row.Data[0].Kind() == types.KindMysqlSet { - tablePriv := row.Data[0].GetMysqlSet() - tPriv = tablePriv.Name - } - if row.Data[1].Kind() == types.KindMysqlSet { - columnPriv := row.Data[1].GetMysqlSet() - cPriv = columnPriv.Name - } - return tPriv, cPriv, nil -} - -// Get current column scope privilege set from mysql.Columns_priv. -// Return Column_priv. -func getColumnPriv(ctx context.Context, name string, host string, db string, tbl string, col string) (string, error) { - sql := fmt.Sprintf(`SELECT Column_priv FROM %s.%s WHERE User="%s" AND Host="%s" AND DB="%s" AND Table_name="%s" AND Column_name="%s";`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return "", errors.Trace(err) - } - defer rs.Close() - row, err := rs.Next() - if err != nil { - return "", errors.Trace(err) - } - cPriv := "" - if row.Data[0].Kind() == types.KindMysqlSet { - cPriv = row.Data[0].GetMysqlSet().Name - } - return cPriv, nil -} - -// Find the schema by dbName. -func (e *GrantExec) getTargetSchema() (*model.DBInfo, error) { - dbName := e.Level.DBName - if len(dbName) == 0 { - // Grant *, use current schema - dbName = db.GetCurrentSchema(e.ctx) - if len(dbName) == 0 { - return nil, errors.New("Miss DB name for grant privilege.") - } - } - //check if db exists - schema := model.NewCIStr(dbName) - is := sessionctx.GetDomain(e.ctx).InfoSchema() - db, ok := is.SchemaByName(schema) - if !ok { - return nil, errors.Errorf("Unknown schema name: %s", dbName) - } - return db, nil -} - -// Find the schema and table by dbName and tableName. -func (e *GrantExec) getTargetSchemaAndTable() (*model.DBInfo, table.Table, error) { - db, err := e.getTargetSchema() - if err != nil { - return nil, nil, errors.Trace(err) - } - name := model.NewCIStr(e.Level.TableName) - is := sessionctx.GetDomain(e.ctx).InfoSchema() - tbl, err := is.TableByName(db.Name, name) - if err != nil { - return nil, nil, errors.Trace(err) - } - return db, tbl, nil -} diff --git a/vendor/github.com/pingcap/tidb/executor/prepared.go b/vendor/github.com/pingcap/tidb/executor/prepared.go deleted file mode 100644 index 01371246ee6e..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/prepared.go +++ /dev/null @@ -1,277 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "sort" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/optimizer" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/variable" -) - -var ( - _ Executor = &DeallocateExec{} - _ Executor = &ExecuteExec{} - _ Executor = &PrepareExec{} -) - -type paramMarkerSorter struct { - markers []*ast.ParamMarkerExpr -} - -func (p *paramMarkerSorter) Len() int { - return len(p.markers) -} - -func (p *paramMarkerSorter) Less(i, j int) bool { - return p.markers[i].Offset < p.markers[j].Offset -} - -func (p *paramMarkerSorter) Swap(i, j int) { - p.markers[i], p.markers[j] = p.markers[j], p.markers[i] -} - -type paramMarkerExtractor struct { - markers []*ast.ParamMarkerExpr -} - -func (e *paramMarkerExtractor) Enter(in ast.Node) (ast.Node, bool) { - return in, false -} - -func (e *paramMarkerExtractor) Leave(in ast.Node) (ast.Node, bool) { - if x, ok := in.(*ast.ParamMarkerExpr); ok { - e.markers = append(e.markers, x) - } - return in, true -} - -// Prepared represents a prepared statement. -type Prepared struct { - Stmt ast.StmtNode - Params []*ast.ParamMarkerExpr - SchemaVersion int64 -} - -// PrepareExec represents a PREPARE executor. -type PrepareExec struct { - IS infoschema.InfoSchema - Ctx context.Context - Name string - SQLText string - - ID uint32 - ResultFields []*ast.ResultField - ParamCount int - Err error -} - -// Fields implements Executor Fields interface. -func (e *PrepareExec) Fields() []*ast.ResultField { - // returns nil to indicate prepare will not return Recordset. - return nil -} - -// Next implements Executor Next interface. -func (e *PrepareExec) Next() (*Row, error) { - e.DoPrepare() - return nil, e.Err -} - -// Close implements plan.Plan Close interface. -func (e *PrepareExec) Close() error { - return nil -} - -// DoPrepare prepares the statement, it can be called multiple times without -// side effect. -func (e *PrepareExec) DoPrepare() { - vars := variable.GetSessionVars(e.Ctx) - if e.ID != 0 { - // Must be the case when we retry a prepare. - // Make sure it is idempotent. - _, ok := vars.PreparedStmts[e.ID] - if ok { - return - } - } - charset, collation := variable.GetCharsetInfo(e.Ctx) - stmts, err := parser.Parse(e.SQLText, charset, collation) - if err != nil { - e.Err = errors.Trace(err) - return - } - if len(stmts) != 1 { - e.Err = ErrPrepareMulti - return - } - stmt := stmts[0] - var extractor paramMarkerExtractor - stmt.Accept(&extractor) - - // The parameter markers are appended in visiting order, which may not - // be the same as the position order in the query string. We need to - // sort it by position. - sorter := ¶mMarkerSorter{markers: extractor.markers} - sort.Sort(sorter) - e.ParamCount = len(sorter.markers) - prepared := &Prepared{ - Stmt: stmt, - Params: sorter.markers, - SchemaVersion: e.IS.SchemaMetaVersion(), - } - - err = optimizer.Prepare(e.IS, e.Ctx, stmt) - if err != nil { - e.Err = errors.Trace(err) - return - } - if resultSetNode, ok := stmt.(ast.ResultSetNode); ok { - e.ResultFields = resultSetNode.GetResultFields() - } - - if e.ID == 0 { - e.ID = vars.GetNextPreparedStmtID() - } - if e.Name != "" { - vars.PreparedStmtNameToID[e.Name] = e.ID - } - vars.PreparedStmts[e.ID] = prepared -} - -// ExecuteExec represents an EXECUTE executor. -// It executes a prepared statement. -type ExecuteExec struct { - IS infoschema.InfoSchema - Ctx context.Context - Name string - UsingVars []ast.ExprNode - ID uint32 - StmtExec Executor -} - -// Fields implements Executor Fields interface. -func (e *ExecuteExec) Fields() []*ast.ResultField { - // Will never be called. - return nil -} - -// Next implements Executor Next interface. -func (e *ExecuteExec) Next() (*Row, error) { - // Will never be called. - return nil, nil -} - -// Close implements plan.Plan Close interface. -func (e *ExecuteExec) Close() error { - // Will never be called. - return nil -} - -// Build builds a prepared statement into an executor. -func (e *ExecuteExec) Build() error { - vars := variable.GetSessionVars(e.Ctx) - if e.Name != "" { - e.ID = vars.PreparedStmtNameToID[e.Name] - } - v := vars.PreparedStmts[e.ID] - if v == nil { - return ErrStmtNotFound - } - prepared := v.(*Prepared) - - if len(prepared.Params) != len(e.UsingVars) { - return ErrWrongParamCount - } - - for i, usingVar := range e.UsingVars { - val, err := evaluator.Eval(e.Ctx, usingVar) - if err != nil { - return errors.Trace(err) - } - prepared.Params[i].SetValue(val) - } - - if prepared.SchemaVersion != e.IS.SchemaMetaVersion() { - // If the schema version has changed we need to prepare it again, - // if this time it failed, the real reason for the error is schema changed. - err := optimizer.Prepare(e.IS, e.Ctx, prepared.Stmt) - if err != nil { - return ErrSchemaChanged.Gen("Schema change casued error: %s", err.Error()) - } - prepared.SchemaVersion = e.IS.SchemaMetaVersion() - } - sb := &subqueryBuilder{is: e.IS} - plan, err := optimizer.Optimize(e.Ctx, prepared.Stmt, sb) - if err != nil { - return errors.Trace(err) - } - b := newExecutorBuilder(e.Ctx, e.IS) - stmtExec := b.build(plan) - if b.err != nil { - return errors.Trace(b.err) - } - e.StmtExec = stmtExec - return nil -} - -// DeallocateExec represent a DEALLOCATE executor. -type DeallocateExec struct { - Name string - ctx context.Context -} - -// Fields implements Executor Fields interface. -func (e *DeallocateExec) Fields() []*ast.ResultField { - return nil -} - -// Next implements Executor Next interface. -func (e *DeallocateExec) Next() (*Row, error) { - vars := variable.GetSessionVars(e.ctx) - id, ok := vars.PreparedStmtNameToID[e.Name] - if !ok { - return nil, ErrStmtNotFound - } - delete(vars.PreparedStmtNameToID, e.Name) - delete(vars.PreparedStmts, id) - return nil, nil -} - -// Close implements plan.Plan Close interface. -func (e *DeallocateExec) Close() error { - return nil -} - -// CompileExecutePreparedStmt compiles a session Execute command to a stmt.Statement. -func CompileExecutePreparedStmt(ctx context.Context, ID uint32, args ...interface{}) ast.Statement { - execPlan := &plan.Execute{ID: ID} - execPlan.UsingVars = make([]ast.ExprNode, len(args)) - for i, val := range args { - execPlan.UsingVars[i] = ast.NewValueExpr(val) - } - sa := &statement{ - is: sessionctx.GetDomain(ctx).InfoSchema(), - plan: execPlan, - } - return sa -} diff --git a/vendor/github.com/pingcap/tidb/executor/show.go b/vendor/github.com/pingcap/tidb/executor/show.go deleted file mode 100644 index 7a4a2bdc313a..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/show.go +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "bytes" - "fmt" - "sort" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/privilege" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -// ShowExec represents a show executor. -type ShowExec struct { - Tp ast.ShowStmtType // Databases/Tables/Columns/.... - DBName model.CIStr - Table *ast.TableName // Used for showing columns. - Column *ast.ColumnName // Used for `desc table column`. - Flag int // Some flag parsed from sql, such as FULL. - Full bool - User string // Used for show grants. - - // Used by show variables - GlobalScope bool - - fields []*ast.ResultField - ctx context.Context - is infoschema.InfoSchema - - fetched bool - rows []*Row - cursor int -} - -// Fields implements Executor Fields interface. -func (e *ShowExec) Fields() []*ast.ResultField { - return e.fields -} - -// Next implements Execution Next interface. -func (e *ShowExec) Next() (*Row, error) { - if e.rows == nil { - err := e.fetchAll() - if err != nil { - return nil, errors.Trace(err) - } - } - if e.cursor >= len(e.rows) { - return nil, nil - } - row := e.rows[e.cursor] - for i, field := range e.fields { - field.Expr.SetValue(row.Data[i].GetValue()) - } - e.cursor++ - return row, nil -} - -func (e *ShowExec) fetchAll() error { - switch e.Tp { - case ast.ShowCharset: - return e.fetchShowCharset() - case ast.ShowCollation: - return e.fetchShowCollation() - case ast.ShowColumns: - return e.fetchShowColumns() - case ast.ShowCreateTable: - return e.fetchShowCreateTable() - case ast.ShowDatabases: - return e.fetchShowDatabases() - case ast.ShowEngines: - return e.fetchShowEngines() - case ast.ShowGrants: - return e.fetchShowGrants() - case ast.ShowIndex: - return e.fetchShowIndex() - case ast.ShowProcedureStatus: - return e.fetchShowProcedureStatus() - case ast.ShowStatus: - return e.fetchShowStatus() - case ast.ShowTables: - return e.fetchShowTables() - case ast.ShowTableStatus: - return e.fetchShowTableStatus() - case ast.ShowTriggers: - return e.fetchShowTriggers() - case ast.ShowVariables: - return e.fetchShowVariables() - case ast.ShowWarnings: - // empty result - } - return nil -} - -func (e *ShowExec) fetchShowEngines() error { - row := &Row{ - Data: types.MakeDatums( - "InnoDB", - "DEFAULT", - "Supports transactions, row-level locking, and foreign keys", - "YES", - "YES", - "YES", - ), - } - e.rows = append(e.rows, row) - return nil -} - -func (e *ShowExec) fetchShowDatabases() error { - dbs := e.is.AllSchemaNames() - // TODO: let information_schema be the first database - sort.Strings(dbs) - for _, d := range dbs { - e.rows = append(e.rows, &Row{Data: types.MakeDatums(d)}) - } - return nil -} - -func (e *ShowExec) fetchShowTables() error { - if !e.is.SchemaExists(e.DBName) { - return errors.Errorf("Can not find DB: %s", e.DBName) - } - // sort for tables - var tableNames []string - for _, v := range e.is.SchemaTables(e.DBName) { - tableNames = append(tableNames, v.Meta().Name.L) - } - sort.Strings(tableNames) - for _, v := range tableNames { - data := types.MakeDatums(v) - if e.Full { - // TODO: support "VIEW" later if we have supported view feature. - // now, just use "BASE TABLE". - data = append(data, types.NewDatum("BASE TABLE")) - } - e.rows = append(e.rows, &Row{Data: data}) - } - return nil -} - -func (e *ShowExec) fetchShowTableStatus() error { - if !e.is.SchemaExists(e.DBName) { - return errors.Errorf("Can not find DB: %s", e.DBName) - } - - // sort for tables - var tableNames []string - for _, v := range e.is.SchemaTables(e.DBName) { - tableNames = append(tableNames, v.Meta().Name.L) - } - sort.Strings(tableNames) - - for _, v := range tableNames { - now := mysql.CurrentTime(mysql.TypeDatetime) - data := types.MakeDatums(v, "InnoDB", "10", "Compact", 100, 100, 100, 100, 100, 100, 100, - now, now, now, "utf8_general_ci", "", "", "") - e.rows = append(e.rows, &Row{Data: data}) - } - return nil -} - -func (e *ShowExec) fetchShowColumns() error { - tb, err := e.getTable() - if err != nil { - return errors.Trace(err) - } - cols := tb.Cols() - for _, col := range cols { - if e.Column != nil && e.Column.Name.L != col.Name.L { - continue - } - - desc := column.NewColDesc(col) - - // The FULL keyword causes the output to include the column collation and comments, - // as well as the privileges you have for each column. - row := &Row{} - if e.Full { - row.Data = types.MakeDatums( - desc.Field, - desc.Type, - desc.Collation, - desc.Null, - desc.Key, - desc.DefaultValue, - desc.Extra, - desc.Privileges, - desc.Comment, - ) - } else { - row.Data = types.MakeDatums( - desc.Field, - desc.Type, - desc.Null, - desc.Key, - desc.DefaultValue, - desc.Extra, - ) - } - e.rows = append(e.rows, row) - } - return nil -} - -func (e *ShowExec) fetchShowIndex() error { - tb, err := e.getTable() - if err != nil { - return errors.Trace(err) - } - for _, idx := range tb.Indices() { - for i, col := range idx.Columns { - nonUniq := 1 - if idx.Unique { - nonUniq = 0 - } - var subPart interface{} - if col.Length != types.UnspecifiedLength { - subPart = col.Length - } - data := types.MakeDatums( - tb.Meta().Name.O, // Table - nonUniq, // Non_unique - idx.Name.O, // Key_name - i+1, // Seq_in_index - col.Name.O, // Column_name - "utf8_bin", // Colation - 0, // Cardinality - subPart, // Sub_part - nil, // Packed - "YES", // Null - idx.Tp.String(), // Index_type - "", // Comment - idx.Comment, // Index_comment - ) - e.rows = append(e.rows, &Row{Data: data}) - } - } - return nil -} - -func (e *ShowExec) fetchShowCharset() error { - // See: http://dev.mysql.com/doc/refman/5.7/en/show-character-set.html - descs := charset.GetAllCharsets() - for _, desc := range descs { - row := &Row{ - Data: types.MakeDatums( - desc.Name, - desc.Desc, - desc.DefaultCollation, - desc.Maxlen, - ), - } - e.rows = append(e.rows, row) - } - return nil -} - -func (e *ShowExec) fetchShowVariables() error { - sessionVars := variable.GetSessionVars(e.ctx) - globalVars := variable.GetGlobalVarAccessor(e.ctx) - for _, v := range variable.SysVars { - var err error - var value string - if !e.GlobalScope { - // Try to get Session Scope variable value first. - sv, ok := sessionVars.Systems[v.Name] - if ok { - value = sv - } else { - // If session scope variable is not set, get the global scope value. - value, err = globalVars.GetGlobalSysVar(e.ctx, v.Name) - if err != nil { - return errors.Trace(err) - } - } - } else { - value, err = globalVars.GetGlobalSysVar(e.ctx, v.Name) - if err != nil { - return errors.Trace(err) - } - } - row := &Row{Data: types.MakeDatums(v.Name, value)} - e.rows = append(e.rows, row) - } - return nil -} - -func (e *ShowExec) fetchShowStatus() error { - statusVars, err := variable.GetStatusVars() - if err != nil { - return errors.Trace(err) - } - for status, v := range statusVars { - if e.GlobalScope && v.Scope == variable.ScopeSession { - continue - } - value, err := types.ToString(v.Value) - if err != nil { - return errors.Trace(err) - } - row := &Row{Data: types.MakeDatums(status, value)} - e.rows = append(e.rows, row) - } - return nil -} - -func (e *ShowExec) fetchShowCreateTable() error { - tb, err := e.getTable() - if err != nil { - return errors.Trace(err) - } - - // TODO: let the result more like MySQL. - var buf bytes.Buffer - buf.WriteString(fmt.Sprintf("CREATE TABLE `%s` (\n", tb.Meta().Name.O)) - for i, col := range tb.Cols() { - buf.WriteString(fmt.Sprintf(" `%s` %s", col.Name.O, col.GetTypeDesc())) - if mysql.HasAutoIncrementFlag(col.Flag) { - buf.WriteString(" NOT NULL AUTO_INCREMENT") - } else { - if mysql.HasNotNullFlag(col.Flag) { - buf.WriteString(" NOT NULL") - } - switch col.DefaultValue { - case nil: - buf.WriteString(" DEFAULT NULL") - case "CURRENT_TIMESTAMP": - buf.WriteString(" DEFAULT CURRENT_TIMESTAMP") - default: - buf.WriteString(fmt.Sprintf(" DEFAULT '%v'", col.DefaultValue)) - } - - if mysql.HasOnUpdateNowFlag(col.Flag) { - buf.WriteString(" ON UPDATE CURRENT_TIMESTAMP") - } - } - if i != len(tb.Cols())-1 { - buf.WriteString(",\n") - } - } - - if len(tb.Indices()) > 0 { - buf.WriteString(",\n") - } - - for i, idx := range tb.Indices() { - if idx.Primary { - buf.WriteString(" PRIMARY KEY ") - } else if idx.Unique { - buf.WriteString(fmt.Sprintf(" UNIQUE KEY `%s` ", idx.Name.O)) - } else { - buf.WriteString(fmt.Sprintf(" KEY `%s` ", idx.Name.O)) - } - - cols := make([]string, 0, len(idx.Columns)) - for _, c := range idx.Columns { - cols = append(cols, c.Name.O) - } - buf.WriteString(fmt.Sprintf("(`%s`)", strings.Join(cols, "`,`"))) - if i != len(tb.Indices())-1 { - buf.WriteString(",\n") - } - } - buf.WriteString("\n") - - buf.WriteString(") ENGINE=InnoDB") - if s := tb.Meta().Charset; len(s) > 0 { - buf.WriteString(fmt.Sprintf(" DEFAULT CHARSET=%s", s)) - } else { - buf.WriteString(" DEFAULT CHARSET=latin1") - } - - data := types.MakeDatums(tb.Meta().Name.O, buf.String()) - e.rows = append(e.rows, &Row{Data: data}) - return nil -} - -func (e *ShowExec) fetchShowCollation() error { - collations := charset.GetCollations() - for _, v := range collations { - isDefault := "" - if v.IsDefault { - isDefault = "Yes" - } - row := &Row{Data: types.MakeDatums( - v.Name, - v.CharsetName, - v.ID, - isDefault, - "Yes", - 1, - )} - e.rows = append(e.rows, row) - } - return nil -} - -func (e *ShowExec) fetchShowGrants() error { - // Get checker - checker := privilege.GetPrivilegeChecker(e.ctx) - if checker == nil { - return errors.New("Miss privilege checker!") - } - gs, err := checker.ShowGrants(e.ctx, e.User) - if err != nil { - return errors.Trace(err) - } - for _, g := range gs { - data := types.MakeDatums(g) - e.rows = append(e.rows, &Row{Data: data}) - } - return nil -} - -func (e *ShowExec) fetchShowTriggers() error { - return nil -} - -func (e *ShowExec) fetchShowProcedureStatus() error { - return nil -} - -func (e *ShowExec) getTable() (table.Table, error) { - if e.Table == nil { - return nil, errors.New("table not found") - } - tb, ok := e.is.TableByID(e.Table.TableInfo.ID) - if !ok { - return nil, errors.Errorf("table %s not found", e.Table.Name) - } - return tb, nil -} - -// Close implements Executor Close interface. -func (e *ShowExec) Close() error { - return nil -} diff --git a/vendor/github.com/pingcap/tidb/executor/subquery.go b/vendor/github.com/pingcap/tidb/executor/subquery.go deleted file mode 100644 index d12001112243..000000000000 --- a/vendor/github.com/pingcap/tidb/executor/subquery.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/util/types" -) - -var _ ast.SubqueryExec = &subquery{} - -// subquery is an exprNode with a plan. -type subquery struct { - types.Datum - Type *types.FieldType - flag uint64 - text string - plan plan.Plan - is infoschema.InfoSchema -} - -// SetDatum implements Expression interface. -func (sq *subquery) SetDatum(datum types.Datum) { - sq.Datum = datum -} - -// GetDatum implements Expression interface. -func (sq *subquery) GetDatum() *types.Datum { - return &sq.Datum -} - -// SetFlag implements Expression interface. -func (sq *subquery) SetFlag(flag uint64) { - sq.flag = flag -} - -// GetFlag implements Expression interface. -func (sq *subquery) GetFlag() uint64 { - return sq.flag -} - -// SetText implements Node interface. -func (sq *subquery) SetText(text string) { - sq.text = text -} - -// Text implements Node interface. -func (sq *subquery) Text() string { - return sq.text -} - -// SetType implements Expression interface. -func (sq *subquery) SetType(tp *types.FieldType) { - sq.Type = tp -} - -// GetType implements Expression interface. -func (sq *subquery) GetType() *types.FieldType { - return sq.Type -} - -func (sq *subquery) Accept(v ast.Visitor) (ast.Node, bool) { - // SubQuery is not a normal ExprNode. - newNode, skipChildren := v.Enter(sq) - if skipChildren { - return v.Leave(newNode) - } - sq = newNode.(*subquery) - return v.Leave(sq) -} - -func (sq *subquery) EvalRows(ctx context.Context, rowCount int) ([]interface{}, error) { - b := newExecutorBuilder(ctx, sq.is) - plan.Refine(sq.plan) - e := b.build(sq.plan) - if b.err != nil { - return nil, errors.Trace(b.err) - } - defer e.Close() - if len(e.Fields()) == 0 { - // No result fields means no Recordset. - for { - row, err := e.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - return nil, nil - } - } - } - var ( - err error - row *Row - rows = []interface{}{} - ) - for rowCount != 0 { - row, err = e.Next() - if err != nil { - return rows, errors.Trace(err) - } - if row == nil { - break - } - if len(row.Data) == 1 { - rows = append(rows, row.Data[0].GetValue()) - } else { - rows = append(rows, types.DatumsToInterfaces(row.Data)) - } - if rowCount > 0 { - rowCount-- - } - } - return rows, nil -} - -func (sq *subquery) ColumnCount() (int, error) { - return len(sq.plan.Fields()), nil -} - -type subqueryBuilder struct { - is infoschema.InfoSchema -} - -func (sb *subqueryBuilder) Build(p plan.Plan) ast.SubqueryExec { - return &subquery{ - is: sb.is, - plan: p, - } -} diff --git a/vendor/github.com/pingcap/tidb/infoschema/infoschema.go b/vendor/github.com/pingcap/tidb/infoschema/infoschema.go deleted file mode 100644 index d2b12cdb0510..000000000000 --- a/vendor/github.com/pingcap/tidb/infoschema/infoschema.go +++ /dev/null @@ -1,499 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package infoschema - -import ( - "strings" - "sync/atomic" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/perfschema" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" - // import table implementation to init table.TableFromMeta - _ "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/util/types" -) - -// InfoSchema is the interface used to retrieve the schema information. -// It works as a in memory cache and doesn't handle any schema change. -// InfoSchema is read-only, and the returned value is a copy. -// TODO: add more methods to retrieve tables and columns. -type InfoSchema interface { - SchemaByName(schema model.CIStr) (*model.DBInfo, bool) - SchemaExists(schema model.CIStr) bool - TableByName(schema, table model.CIStr) (table.Table, error) - TableExists(schema, table model.CIStr) bool - ColumnByName(schema, table, column model.CIStr) (*model.ColumnInfo, bool) - ColumnExists(schema, table, column model.CIStr) bool - IndexByName(schema, table, index model.CIStr) (*model.IndexInfo, bool) - SchemaByID(id int64) (*model.DBInfo, bool) - TableByID(id int64) (table.Table, bool) - AllocByID(id int64) (autoid.Allocator, bool) - ColumnByID(id int64) (*model.ColumnInfo, bool) - ColumnIndicesByID(id int64) ([]*model.IndexInfo, bool) - AllSchemaNames() []string - AllSchemas() []*model.DBInfo - Clone() (result []*model.DBInfo) - SchemaTables(schema model.CIStr) []table.Table - SchemaMetaVersion() int64 -} - -// Infomation Schema Name. -const ( - Name = "INFORMATION_SCHEMA" -) - -type infoSchema struct { - schemaNameToID map[string]int64 - tableNameToID map[tableName]int64 - columnNameToID map[columnName]int64 - schemas map[int64]*model.DBInfo - tables map[int64]table.Table - tableAllocators map[int64]autoid.Allocator - columns map[int64]*model.ColumnInfo - indices map[indexName]*model.IndexInfo - columnIndices map[int64][]*model.IndexInfo - - // We should check version when change schema. - schemaMetaVersion int64 -} - -var _ InfoSchema = (*infoSchema)(nil) - -type tableName struct { - schema string - table string -} - -type columnName struct { - tableName - name string -} - -type indexName struct { - tableName - name string -} - -func (is *infoSchema) SchemaByName(schema model.CIStr) (val *model.DBInfo, ok bool) { - id, ok := is.schemaNameToID[schema.L] - if !ok { - return - } - val, ok = is.schemas[id] - return -} - -func (is *infoSchema) SchemaMetaVersion() int64 { - return is.schemaMetaVersion -} - -func (is *infoSchema) SchemaExists(schema model.CIStr) bool { - _, ok := is.schemaNameToID[schema.L] - return ok -} - -func (is *infoSchema) TableByName(schema, table model.CIStr) (t table.Table, err error) { - id, ok := is.tableNameToID[tableName{schema: schema.L, table: table.L}] - if !ok { - return nil, TableNotExists.Gen("table %s.%s does not exist", schema, table) - } - t = is.tables[id] - return -} - -func (is *infoSchema) TableExists(schema, table model.CIStr) bool { - _, ok := is.tableNameToID[tableName{schema: schema.L, table: table.L}] - return ok -} - -func (is *infoSchema) ColumnByName(schema, table, column model.CIStr) (val *model.ColumnInfo, ok bool) { - id, ok := is.columnNameToID[columnName{tableName: tableName{schema: schema.L, table: table.L}, name: column.L}] - if !ok { - return - } - val, ok = is.columns[id] - return -} - -func (is *infoSchema) ColumnExists(schema, table, column model.CIStr) bool { - _, ok := is.columnNameToID[columnName{tableName: tableName{schema: schema.L, table: table.L}, name: column.L}] - return ok -} - -func (is *infoSchema) IndexByName(schema, table, index model.CIStr) (val *model.IndexInfo, ok bool) { - val, ok = is.indices[indexName{tableName: tableName{schema: schema.L, table: table.L}, name: index.L}] - return -} - -func (is *infoSchema) SchemaByID(id int64) (val *model.DBInfo, ok bool) { - val, ok = is.schemas[id] - return -} - -func (is *infoSchema) TableByID(id int64) (val table.Table, ok bool) { - val, ok = is.tables[id] - return -} - -func (is *infoSchema) AllocByID(id int64) (val autoid.Allocator, ok bool) { - val, ok = is.tableAllocators[id] - return -} - -func (is *infoSchema) ColumnByID(id int64) (val *model.ColumnInfo, ok bool) { - val, ok = is.columns[id] - return -} - -func (is *infoSchema) ColumnIndicesByID(id int64) (indices []*model.IndexInfo, ok bool) { - indices, ok = is.columnIndices[id] - return -} - -func (is *infoSchema) AllSchemaNames() (names []string) { - for _, v := range is.schemas { - names = append(names, v.Name.O) - } - return -} - -func (is *infoSchema) AllSchemas() (schemas []*model.DBInfo) { - for _, v := range is.schemas { - schemas = append(schemas, v) - } - return -} - -func (is *infoSchema) SchemaTables(schema model.CIStr) (tables []table.Table) { - di, ok := is.SchemaByName(schema) - if !ok { - return - } - for _, ti := range di.Tables { - tables = append(tables, is.tables[ti.ID]) - } - return -} - -func (is *infoSchema) Clone() (result []*model.DBInfo) { - for _, v := range is.schemas { - result = append(result, v.Clone()) - } - return -} - -// Handle handles information schema, including getting and setting. -type Handle struct { - value atomic.Value - store kv.Storage -} - -// NewHandle creates a new Handle. -func NewHandle(store kv.Storage) *Handle { - h := &Handle{ - store: store, - } - // init memory tables - initMemoryTables(store) - initPerfSchema(store) - return h -} - -func initPerfSchema(store kv.Storage) { - perfHandle = perfschema.NewPerfHandle(store) -} - -func genGlobalID(store kv.Storage) (int64, error) { - var globalID int64 - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - var err error - globalID, err = meta.NewMeta(txn).GenGlobalID() - return errors.Trace(err) - }) - return globalID, errors.Trace(err) -} - -var ( - // Information_Schema - isDB *model.DBInfo - schemataTbl table.Table - tablesTbl table.Table - columnsTbl table.Table - statisticsTbl table.Table - charsetTbl table.Table - collationsTbl table.Table - filesTbl table.Table - defTbl table.Table - profilingTbl table.Table - nameToTable map[string]table.Table - - perfHandle perfschema.PerfSchema -) - -func setColumnID(meta *model.TableInfo, store kv.Storage) error { - var err error - for _, c := range meta.Columns { - c.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func initMemoryTables(store kv.Storage) error { - // Init Information_Schema - var ( - err error - tbl table.Table - ) - dbID, err := genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - nameToTable = make(map[string]table.Table) - isTables := make([]*model.TableInfo, 0, len(tableNameToColumns)) - for name, cols := range tableNameToColumns { - meta := buildTableMeta(name, cols) - isTables = append(isTables, meta) - meta.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - err = setColumnID(meta, store) - if err != nil { - return errors.Trace(err) - } - alloc := autoid.NewMemoryAllocator(dbID) - tbl, err = createMemoryTable(meta, alloc) - if err != nil { - return errors.Trace(err) - } - nameToTable[meta.Name.L] = tbl - } - schemataTbl = nameToTable[strings.ToLower(tableSchemata)] - tablesTbl = nameToTable[strings.ToLower(tableTables)] - columnsTbl = nameToTable[strings.ToLower(tableColumns)] - statisticsTbl = nameToTable[strings.ToLower(tableStatistics)] - charsetTbl = nameToTable[strings.ToLower(tableCharacterSets)] - collationsTbl = nameToTable[strings.ToLower(tableCollations)] - - // CharacterSets/Collations contain static data. Init them now. - err = insertData(charsetTbl, dataForCharacterSets()) - if err != nil { - return errors.Trace(err) - } - err = insertData(collationsTbl, dataForColltions()) - if err != nil { - return errors.Trace(err) - } - // create db - isDB = &model.DBInfo{ - ID: dbID, - Name: model.NewCIStr(Name), - Charset: mysql.DefaultCharset, - Collate: mysql.DefaultCollationName, - Tables: isTables, - } - return nil -} - -func insertData(tbl table.Table, rows [][]types.Datum) error { - for _, r := range rows { - _, err := tbl.AddRecord(nil, r) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func refillTable(tbl table.Table, rows [][]types.Datum) error { - err := tbl.Truncate(nil) - if err != nil { - return errors.Trace(err) - } - return insertData(tbl, rows) -} - -// Set sets DBInfo to information schema. -func (h *Handle) Set(newInfo []*model.DBInfo, schemaMetaVersion int64) error { - info := &infoSchema{ - schemaNameToID: map[string]int64{}, - tableNameToID: map[tableName]int64{}, - columnNameToID: map[columnName]int64{}, - schemas: map[int64]*model.DBInfo{}, - tables: map[int64]table.Table{}, - tableAllocators: map[int64]autoid.Allocator{}, - columns: map[int64]*model.ColumnInfo{}, - indices: map[indexName]*model.IndexInfo{}, - columnIndices: map[int64][]*model.IndexInfo{}, - schemaMetaVersion: schemaMetaVersion, - } - var err error - var hasOldInfo bool - infoschema := h.Get() - if infoschema != nil { - hasOldInfo = true - } - for _, di := range newInfo { - info.schemas[di.ID] = di - info.schemaNameToID[di.Name.L] = di.ID - for _, t := range di.Tables { - alloc := autoid.NewAllocator(h.store, di.ID) - if hasOldInfo { - val, ok := infoschema.AllocByID(t.ID) - if ok { - alloc = val - } - } - info.tableAllocators[t.ID] = alloc - info.tables[t.ID], err = table.TableFromMeta(alloc, t) - if err != nil { - return errors.Trace(err) - } - tname := tableName{di.Name.L, t.Name.L} - info.tableNameToID[tname] = t.ID - for _, c := range t.Columns { - info.columns[c.ID] = c - info.columnNameToID[columnName{tname, c.Name.L}] = c.ID - } - for _, idx := range t.Indices { - info.indices[indexName{tname, idx.Name.L}] = idx - for _, idxCol := range idx.Columns { - columnID := t.Columns[idxCol.Offset].ID - columnIndices := info.columnIndices[columnID] - info.columnIndices[columnID] = append(columnIndices, idx) - } - } - } - } - // Build Information_Schema - info.schemaNameToID[isDB.Name.L] = isDB.ID - info.schemas[isDB.ID] = isDB - for _, t := range isDB.Tables { - tbl, ok := nameToTable[t.Name.L] - if !ok { - return errors.Errorf("table `%s` is missing.", t.Name) - } - info.tables[t.ID] = tbl - tname := tableName{isDB.Name.L, t.Name.L} - info.tableNameToID[tname] = t.ID - for _, c := range t.Columns { - info.columns[c.ID] = c - info.columnNameToID[columnName{tname, c.Name.L}] = c.ID - } - } - - // Add Performance_Schema - psDB := perfHandle.GetDBMeta() - info.schemaNameToID[psDB.Name.L] = psDB.ID - info.schemas[psDB.ID] = psDB - for _, t := range psDB.Tables { - tbl, ok := perfHandle.GetTable(t.Name.O) - if !ok { - return errors.Errorf("table `%s` is missing.", t.Name) - } - info.tables[t.ID] = tbl - tname := tableName{psDB.Name.L, t.Name.L} - info.tableNameToID[tname] = t.ID - for _, c := range t.Columns { - info.columns[c.ID] = c - info.columnNameToID[columnName{tname, c.Name.L}] = c.ID - } - } - // Should refill some tables in Information_Schema. - // schemata/tables/columns/statistics - dbNames := make([]string, 0, len(info.schemas)) - dbInfos := make([]*model.DBInfo, 0, len(info.schemas)) - for _, v := range info.schemas { - dbNames = append(dbNames, v.Name.L) - dbInfos = append(dbInfos, v) - } - err = refillTable(schemataTbl, dataForSchemata(dbNames)) - if err != nil { - return errors.Trace(err) - } - err = refillTable(tablesTbl, dataForTables(dbInfos)) - if err != nil { - return errors.Trace(err) - } - err = refillTable(columnsTbl, dataForColumns(dbInfos)) - if err != nil { - return errors.Trace(err) - } - err = refillTable(statisticsTbl, dataForStatistics(dbInfos)) - if err != nil { - return errors.Trace(err) - } - h.value.Store(info) - return nil -} - -// Get gets information schema from Handle. -func (h *Handle) Get() InfoSchema { - v := h.value.Load() - schema, _ := v.(InfoSchema) - return schema -} - -// Schema error codes. -const ( - CodeDbDropExists terror.ErrCode = 1008 - CodeDatabaseNotExists = 1049 - CodeTableNotExists = 1146 - CodeColumnNotExists = 1054 - - CodeDatabaseExists = 1007 - CodeTableExists = 1050 - CodeBadTable = 1051 -) - -var ( - // DatabaseDropExists returns for drop an unexist database. - DatabaseDropExists = terror.ClassSchema.New(CodeDbDropExists, "database doesn't exist") - // DatabaseNotExists returns for database not exists. - DatabaseNotExists = terror.ClassSchema.New(CodeDatabaseNotExists, "database not exists") - // TableNotExists returns for table not exists. - TableNotExists = terror.ClassSchema.New(CodeTableNotExists, "table not exists") - // ColumnNotExists returns for column not exists. - ColumnNotExists = terror.ClassSchema.New(CodeColumnNotExists, "field not exists") - - // DatabaseExists returns for database already exists. - DatabaseExists = terror.ClassSchema.New(CodeDatabaseExists, "database already exists") - // TableExists returns for table already exists. - TableExists = terror.ClassSchema.New(CodeTableExists, "table already exists") - // TableDropExists returns for drop an unexist table. - TableDropExists = terror.ClassSchema.New(CodeBadTable, "unknown table") -) - -func init() { - schemaMySQLErrCodes := map[terror.ErrCode]uint16{ - CodeDbDropExists: mysql.ErrDbDropExists, - CodeDatabaseNotExists: mysql.ErrBadDb, - CodeTableNotExists: mysql.ErrNoSuchTable, - CodeColumnNotExists: mysql.ErrBadField, - CodeDatabaseExists: mysql.ErrDbCreateExists, - CodeTableExists: mysql.ErrTableExists, - CodeBadTable: mysql.ErrBadTable, - } - terror.ErrClassToMySQLCodes[terror.ClassSchema] = schemaMySQLErrCodes -} diff --git a/vendor/github.com/pingcap/tidb/infoschema/tables.go b/vendor/github.com/pingcap/tidb/infoschema/tables.go deleted file mode 100644 index 3069eb3cb6e9..000000000000 --- a/vendor/github.com/pingcap/tidb/infoschema/tables.go +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package infoschema - -import ( - "fmt" - "sort" - - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -const ( - tableSchemata = "SCHEMATA" - tableTables = "TABLES" - tableColumns = "COLUMNS" - tableStatistics = "STATISTICS" - tableCharacterSets = "CHARACTER_SETS" - tableCollations = "COLLATIONS" - tableFiles = "FILES" - catalogVal = "def" - tableProfiling = "PROFILING" -) - -type columnInfo struct { - name string - tp byte - size int - flag uint - deflt interface{} - elems []string -} - -func buildColumnInfo(tableName string, col columnInfo) *model.ColumnInfo { - mCharset := charset.CharsetBin - mCollation := charset.CharsetBin - mFlag := mysql.UnsignedFlag - if col.tp == mysql.TypeVarchar || col.tp == mysql.TypeBlob { - mCharset = mysql.DefaultCharset - mCollation = mysql.DefaultCollationName - mFlag = 0 - } - fieldType := types.FieldType{ - Charset: mCharset, - Collate: mCollation, - Tp: col.tp, - Flen: col.size, - Flag: uint(mFlag), - } - return &model.ColumnInfo{ - Name: model.NewCIStr(col.name), - FieldType: fieldType, - State: model.StatePublic, - } -} - -func buildTableMeta(tableName string, cs []columnInfo) *model.TableInfo { - cols := make([]*model.ColumnInfo, 0, len(cs)) - for _, c := range cs { - cols = append(cols, buildColumnInfo(tableName, c)) - } - for i, col := range cols { - col.Offset = i - } - return &model.TableInfo{ - Name: model.NewCIStr(tableName), - Columns: cols, - State: model.StatePublic, - } -} - -var schemataCols = []columnInfo{ - {"CATALOG_NAME", mysql.TypeVarchar, 512, 0, nil, nil}, - {"SCHEMA_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"DEFAULT_CHARACTER_SET_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"DEFAULT_COLLATION_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"SQL_PATH", mysql.TypeVarchar, 512, 0, nil, nil}, -} - -var tablesCols = []columnInfo{ - {"TABLE_CATALOG", mysql.TypeVarchar, 512, 0, nil, nil}, - {"TABLE_SCHEMA", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_TYPE", mysql.TypeVarchar, 64, 0, nil, nil}, - {"ENGINE", mysql.TypeVarchar, 64, 0, nil, nil}, - {"VERSION", mysql.TypeLonglong, 21, 0, nil, nil}, - {"ROW_FORMAT", mysql.TypeVarchar, 10, 0, nil, nil}, - {"TABLE_ROWS", mysql.TypeLonglong, 21, 0, nil, nil}, - {"AVG_ROW_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"DATA_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"MAX_DATA_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"INDEX_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"DATA_FREE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"AUTO_INCREMENT", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CREATE_TIME", mysql.TypeDatetime, 19, 0, nil, nil}, - {"UPDATE_TIME", mysql.TypeDatetime, 19, 0, nil, nil}, - {"CHECK_TIME", mysql.TypeDatetime, 19, 0, nil, nil}, - {"TABLE_COLLATION", mysql.TypeVarchar, 32, 0, nil, nil}, - {"CHECK_SUM", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CREATE_OPTIONS", mysql.TypeVarchar, 255, 0, nil, nil}, - {"TABLE_COMMENT", mysql.TypeVarchar, 2048, 0, nil, nil}, -} - -var columnsCols = []columnInfo{ - {"TABLE_CATALOG", mysql.TypeVarchar, 512, 0, nil, nil}, - {"TABLE_SCHEMA", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"COLUMN_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"ORIGINAL_POSITION", mysql.TypeLonglong, 64, 0, nil, nil}, - {"COLUMN_DEFAULT", mysql.TypeBlob, 196606, 0, nil, nil}, - {"IS_NULLABLE", mysql.TypeVarchar, 3, 0, nil, nil}, - {"DATA_TYPE", mysql.TypeVarchar, 64, 0, nil, nil}, - {"CHARACTER_MAXIMUM_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CHARACTOR_OCTET_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"NUMERIC_PRECISION", mysql.TypeLonglong, 21, 0, nil, nil}, - {"NUMERIC_SCALE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"DATETIME_PRECISION", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CHARACTER_SET_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"COLLATION_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"COLUMN_TYPE", mysql.TypeBlob, 196606, 0, nil, nil}, - {"COLUMN_KEY", mysql.TypeVarchar, 3, 0, nil, nil}, - {"EXTRA", mysql.TypeVarchar, 30, 0, nil, nil}, - {"PRIVILEGES", mysql.TypeVarchar, 80, 0, nil, nil}, - {"COLUMN_COMMENT", mysql.TypeVarchar, 1024, 0, nil, nil}, -} - -var statisticsCols = []columnInfo{ - {"TABLE_CATALOG", mysql.TypeVarchar, 512, 0, nil, nil}, - {"TABLE_SCHEMA", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"NON_UNIQUE", mysql.TypeVarchar, 1, 0, nil, nil}, - {"INDEX_SCHEMA", mysql.TypeVarchar, 64, 0, nil, nil}, - {"INDEX_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"SEQ_IN_INDEX", mysql.TypeLonglong, 2, 0, nil, nil}, - {"COLUMN_NAME", mysql.TypeVarchar, 21, 0, nil, nil}, - {"COLLATION", mysql.TypeVarchar, 1, 0, nil, nil}, - {"CARDINALITY", mysql.TypeLonglong, 21, 0, nil, nil}, - {"SUB_PART", mysql.TypeLonglong, 3, 0, nil, nil}, - {"PACKED", mysql.TypeVarchar, 10, 0, nil, nil}, - {"NULLABLE", mysql.TypeVarchar, 3, 0, nil, nil}, - {"INDEX_TYPE", mysql.TypeVarchar, 16, 0, nil, nil}, - {"COMMENT", mysql.TypeVarchar, 16, 0, nil, nil}, - {"INDEX_COMMENT", mysql.TypeVarchar, 1024, 0, nil, nil}, -} - -var profilingCols = []columnInfo{ - {"QUERY_ID", mysql.TypeLong, 20, 0, nil, nil}, - {"SEQ", mysql.TypeLong, 20, 0, nil, nil}, - {"STATE", mysql.TypeVarchar, 30, 0, nil, nil}, - {"DURATION", mysql.TypeNewDecimal, 9, 0, nil, nil}, - {"CPU_USER", mysql.TypeNewDecimal, 9, 0, nil, nil}, - {"CPU_SYSTEM", mysql.TypeNewDecimal, 9, 0, nil, nil}, - {"CONTEXT_VOLUNTARY", mysql.TypeLong, 20, 0, nil, nil}, - {"CONTEXT_INVOLUNTARY", mysql.TypeLong, 20, 0, nil, nil}, - {"BLOCK_OPS_IN", mysql.TypeLong, 20, 0, nil, nil}, - {"BLOCK_OPS_OUT", mysql.TypeLong, 20, 0, nil, nil}, - {"MESSAGES_SENT", mysql.TypeLong, 20, 0, nil, nil}, - {"MESSAGES_RECEIVED", mysql.TypeLong, 20, 0, nil, nil}, - {"PAGE_FAULTS_MAJOR", mysql.TypeLong, 20, 0, nil, nil}, - {"PAGE_FAULTS_MINOR", mysql.TypeLong, 20, 0, nil, nil}, - {"SWAPS", mysql.TypeLong, 20, 0, nil, nil}, - {"SOURCE_FUNCTION", mysql.TypeVarchar, 30, 0, nil, nil}, - {"SOURCE_FILE", mysql.TypeVarchar, 20, 0, nil, nil}, - {"SOURCE_LINE", mysql.TypeLong, 20, 0, nil, nil}, -} - -var charsetCols = []columnInfo{ - {"CHARACTER_SET_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"DEFAULT_COLLATE_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"DESCRIPTION", mysql.TypeVarchar, 60, 0, nil, nil}, - {"MAXLEN", mysql.TypeLonglong, 3, 0, nil, nil}, -} - -var collationsCols = []columnInfo{ - {"COLLATION_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"CHARACTER_SET_NAME", mysql.TypeVarchar, 32, 0, nil, nil}, - {"ID", mysql.TypeLonglong, 11, 0, nil, nil}, - {"IS_DEFAULT", mysql.TypeVarchar, 3, 0, nil, nil}, - {"IS_COMPILED", mysql.TypeVarchar, 3, 0, nil, nil}, - {"SORTLEN", mysql.TypeLonglong, 3, 0, nil, nil}, -} - -func dataForCharacterSets() (records [][]types.Datum) { - records = append(records, - types.MakeDatums("ascii", "ascii_general_ci", "US ASCII", 1), - types.MakeDatums("binary", "binary", "Binary pseudo charset", 1), - types.MakeDatums("latin1", "latin1_swedish_ci", "cp1252 West European", 1), - types.MakeDatums("utf8", "utf8_general_ci", "UTF-8 Unicode", 3), - types.MakeDatums("utf8mb4", "utf8mb4_general_ci", "UTF-8 Unicode", 4), - ) - return records -} - -func dataForColltions() (records [][]types.Datum) { - records = append(records, - types.MakeDatums("ascii_general_ci", "ascii", 1, "Yes", "Yes", 1), - types.MakeDatums("binary", "binary", 2, "Yes", "Yes", 1), - types.MakeDatums("latin1_swedish_ci", "latin1", 3, "Yes", "Yes", 1), - types.MakeDatums("utf8_general_ci", "utf8", 4, "Yes", "Yes", 1), - types.MakeDatums("utf8mb4_general_ci", "utf8mb4", 5, "Yes", "Yes", 1), - ) - return records -} - -var filesCols = []columnInfo{ - {"FILE_ID", mysql.TypeLonglong, 4, 0, nil, nil}, - {"FILE_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLESPACE_NAME", mysql.TypeVarchar, 20, 0, nil, nil}, - {"TABLE_CATALOG", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_SCHEMA", mysql.TypeVarchar, 64, 0, nil, nil}, - {"TABLE_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"LOGFILE_GROUP_NAME", mysql.TypeVarchar, 64, 0, nil, nil}, - {"LOGFILE_GROUP_NUMBER", mysql.TypeLonglong, 32, 0, nil, nil}, - {"ENGINE", mysql.TypeVarchar, 64, 0, nil, nil}, - {"FULLTEXT_KEYS", mysql.TypeVarchar, 64, 0, nil, nil}, - {"DELETED_ROWS", mysql.TypeLonglong, 4, 0, nil, nil}, - {"UPDATE_COUNT", mysql.TypeLonglong, 4, 0, nil, nil}, - {"FREE_EXTENTS", mysql.TypeLonglong, 4, 0, nil, nil}, - {"TOTAL_EXTENTS", mysql.TypeLonglong, 4, 0, nil, nil}, - {"EXTENT_SIZE", mysql.TypeLonglong, 4, 0, nil, nil}, - {"INITIAL_SIZE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"MAXIMUM_SIZE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"AUTOEXTEND_SIZE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CREATION_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"LAST_UPDATE_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"LAST_ACCESS_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"RECOVER_TIME", mysql.TypeLonglong, 4, 0, nil, nil}, - {"TRANSACTION_COUNTER", mysql.TypeLonglong, 4, 0, nil, nil}, - {"VERSION", mysql.TypeLonglong, 21, 0, nil, nil}, - {"ROW_FORMAT", mysql.TypeVarchar, 21, 0, nil, nil}, - {"TABLE_ROWS", mysql.TypeLonglong, 21, 0, nil, nil}, - {"AVG_ROW_LENGTH", mysql.TypeLonglong, 21, 0, nil, nil}, - {"DATA_FREE", mysql.TypeLonglong, 21, 0, nil, nil}, - {"CREATE_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"UPDATE_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"CHECK_TIME", mysql.TypeDatetime, -1, 0, nil, nil}, - {"CHECKSUM", mysql.TypeLonglong, 21, 0, nil, nil}, - {"STATUS", mysql.TypeVarchar, 20, 0, nil, nil}, - {"EXTRA", mysql.TypeVarchar, 255, 0, nil, nil}, -} - -func dataForSchemata(schemas []string) [][]types.Datum { - sort.Strings(schemas) - rows := [][]types.Datum{} - for _, schema := range schemas { - record := types.MakeDatums( - catalogVal, // CATALOG_NAME - schema, // SCHEMA_NAME - mysql.DefaultCharset, // DEFAULT_CHARACTER_SET_NAME - mysql.DefaultCollationName, // DEFAULT_COLLATION_NAME - nil, - ) - rows = append(rows, record) - } - return rows -} - -func dataForTables(schemas []*model.DBInfo) [][]types.Datum { - rows := [][]types.Datum{} - for _, schema := range schemas { - for _, table := range schema.Tables { - record := types.MakeDatums( - catalogVal, // TABLE_CATALOG - schema.Name.O, // TABLE_SCHEMA - table.Name.O, // TABLE_NAME - "BASE_TABLE", // TABLE_TYPE - "InnoDB", // ENGINE - uint64(10), // VERSION - "Compact", // ROW_FORMAT - uint64(0), // TABLE_ROWS - uint64(0), // AVG_ROW_LENGTH - uint64(16384), // DATA_LENGTH - uint64(0), // MAX_DATA_LENGTH - uint64(0), // INDEX_LENGTH - uint64(0), // DATA_FREE - nil, // AUTO_INCREMENT - nil, // CREATE_TIME - nil, // UPDATE_TIME - nil, // CHECK_TIME - "latin1_swedish_ci", // TABLE_COLLATION - nil, // CHECKSUM - "", // CREATE_OPTIONS - "", // TABLE_COMMENT - ) - rows = append(rows, record) - } - } - return rows -} - -func dataForColumns(schemas []*model.DBInfo) [][]types.Datum { - rows := [][]types.Datum{} - for _, schema := range schemas { - for _, table := range schema.Tables { - rs := dataForColumnsInTable(schema, table) - for _, r := range rs { - rows = append(rows, r) - } - } - } - return rows -} - -func dataForColumnsInTable(schema *model.DBInfo, table *model.TableInfo) [][]types.Datum { - rows := [][]types.Datum{} - for i, col := range table.Columns { - colLen := col.Flen - if colLen == types.UnspecifiedLength { - colLen = mysql.GetDefaultFieldLength(col.Tp) - } - decimal := col.Decimal - if decimal == types.UnspecifiedLength { - decimal = 0 - } - columnType := col.FieldType.CompactStr() - columnDesc := column.NewColDesc(&column.Col{ColumnInfo: *col}) - var columnDefault interface{} - if columnDesc.DefaultValue != nil { - columnDefault = fmt.Sprintf("%v", columnDesc.DefaultValue) - } - record := types.MakeDatums( - catalogVal, // TABLE_CATALOG - schema.Name.O, // TABLE_SCHEMA - table.Name.O, // TABLE_NAME - col.Name.O, // COLUMN_NAME - i+1, // ORIGINAL_POSITION - columnDefault, // COLUMN_DEFAULT - columnDesc.Null, // IS_NULLABLE - types.TypeToStr(col.Tp, col.Charset), // DATA_TYPE - colLen, // CHARACTER_MAXIMUM_LENGTH - colLen, // CHARACTOR_OCTET_LENGTH - decimal, // NUMERIC_PRECISION - 0, // NUMERIC_SCALE - 0, // DATETIME_PRECISION - col.Charset, // CHARACTER_SET_NAME - col.Collate, // COLLATION_NAME - columnType, // COLUMN_TYPE - columnDesc.Key, // COLUMN_KEY - columnDesc.Extra, // EXTRA - "select,insert,update,references", // PRIVILEGES - "", // COLUMN_COMMENT - ) - rows = append(rows, record) - } - return rows -} - -func dataForStatistics(schemas []*model.DBInfo) [][]types.Datum { - rows := [][]types.Datum{} - for _, schema := range schemas { - for _, table := range schema.Tables { - rs := dataForStatisticsInTable(schema, table) - for _, r := range rs { - rows = append(rows, r) - } - } - } - return rows -} - -func dataForStatisticsInTable(schema *model.DBInfo, table *model.TableInfo) [][]types.Datum { - rows := [][]types.Datum{} - if table.PKIsHandle { - for _, col := range table.Columns { - if mysql.HasPriKeyFlag(col.Flag) { - record := types.MakeDatums( - catalogVal, // TABLE_CATALOG - schema.Name.O, // TABLE_SCHEMA - table.Name.O, // TABLE_NAME - "0", // NON_UNIQUE - schema.Name.O, // INDEX_SCHEMA - "PRIMARY", // INDEX_NAME - 1, // SEQ_IN_INDEX - col.Name.O, // COLUMN_NAME - "A", // COLLATION - 0, // CARDINALITY - nil, // SUB_PART - nil, // PACKED - "", // NULLABLE - "BTREE", // INDEX_TYPE - "", // COMMENT - "", // INDEX_COMMENT - ) - rows = append(rows, record) - } - } - } - nameToCol := make(map[string]*model.ColumnInfo, len(table.Columns)) - for _, c := range table.Columns { - nameToCol[c.Name.L] = c - } - for _, index := range table.Indices { - nonUnique := "1" - if index.Unique { - nonUnique = "0" - } - for i, key := range index.Columns { - col := nameToCol[key.Name.L] - nullable := "YES" - if mysql.HasNotNullFlag(col.Flag) { - nullable = "" - } - record := types.MakeDatums( - catalogVal, // TABLE_CATALOG - schema.Name.O, // TABLE_SCHEMA - table.Name.O, // TABLE_NAME - nonUnique, // NON_UNIQUE - schema.Name.O, // INDEX_SCHEMA - index.Name.O, // INDEX_NAME - i+1, // SEQ_IN_INDEX - key.Name.O, // COLUMN_NAME - "A", // COLLATION - 0, // CARDINALITY - nil, // SUB_PART - nil, // PACKED - nullable, // NULLABLE - "BTREE", // INDEX_TYPE - "", // COMMENT - "", // INDEX_COMMENT - ) - rows = append(rows, record) - } - } - return rows -} - -var tableNameToColumns = map[string]([]columnInfo){ - tableSchemata: schemataCols, - tableTables: tablesCols, - tableColumns: columnsCols, - tableStatistics: statisticsCols, - tableCharacterSets: charsetCols, - tableCollations: collationsCols, - tableFiles: filesCols, - tableProfiling: profilingCols, -} - -func createMemoryTable(meta *model.TableInfo, alloc autoid.Allocator) (table.Table, error) { - tbl, _ := tables.MemoryTableFromMeta(alloc, meta) - return tbl, nil -} diff --git a/vendor/github.com/pingcap/tidb/inspectkv/inspectkv.go b/vendor/github.com/pingcap/tidb/inspectkv/inspectkv.go deleted file mode 100644 index 1a0efd2b1c48..000000000000 --- a/vendor/github.com/pingcap/tidb/inspectkv/inspectkv.go +++ /dev/null @@ -1,452 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package inspectkv - -import ( - "io" - "reflect" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/types" -) - -// DDLInfo is for DDL information. -type DDLInfo struct { - SchemaVer int64 - ReorgHandle int64 // it's only used for DDL information. - Owner *model.Owner - Job *model.Job -} - -// GetDDLInfo returns DDL information. -func GetDDLInfo(txn kv.Transaction) (*DDLInfo, error) { - var err error - info := &DDLInfo{} - t := meta.NewMeta(txn) - - info.Owner, err = t.GetDDLJobOwner() - if err != nil { - return nil, errors.Trace(err) - } - info.Job, err = t.GetDDLJob(0) - if err != nil { - return nil, errors.Trace(err) - } - info.SchemaVer, err = t.GetSchemaVersion() - if err != nil { - return nil, errors.Trace(err) - } - if info.Job == nil { - return info, nil - } - - info.ReorgHandle, err = t.GetDDLReorgHandle(info.Job) - if err != nil { - return nil, errors.Trace(err) - } - - return info, nil -} - -// GetBgDDLInfo returns background DDL information. -func GetBgDDLInfo(txn kv.Transaction) (*DDLInfo, error) { - var err error - info := &DDLInfo{} - t := meta.NewMeta(txn) - - info.Owner, err = t.GetBgJobOwner() - if err != nil { - return nil, errors.Trace(err) - } - info.Job, err = t.GetBgJob(0) - if err != nil { - return nil, errors.Trace(err) - } - info.SchemaVer, err = t.GetSchemaVersion() - if err != nil { - return nil, errors.Trace(err) - } - - return info, nil -} - -func nextIndexVals(data []types.Datum) []types.Datum { - // Add 0x0 to the end of data. - return append(data, types.Datum{}) -} - -// RecordData is the record data composed of a handle and values. -type RecordData struct { - Handle int64 - Values []types.Datum -} - -// GetIndexRecordsCount returns the total number of the index records from startVals. -// If startVals = nil, returns the total number of the index records. -func GetIndexRecordsCount(txn kv.Transaction, kvIndex kv.Index, startVals []types.Datum) (int64, error) { - it, _, err := kvIndex.Seek(txn, startVals) - if err != nil { - return 0, errors.Trace(err) - } - defer it.Close() - - var cnt int64 - for { - _, _, err := it.Next() - if terror.ErrorEqual(err, io.EOF) { - break - } else if err != nil { - return 0, errors.Trace(err) - } - cnt++ - } - - return cnt, nil -} - -// ScanIndexData scans the index handles and values in a limited number, according to the index information. -// It returns data and the next startVals until it doesn't have data, then returns data is nil and -// the next startVals is the values which can't get data. If startVals = nil and limit = -1, -// it returns the index data of the whole. -func ScanIndexData(txn kv.Transaction, kvIndex kv.Index, startVals []types.Datum, limit int64) ( - []*RecordData, []types.Datum, error) { - it, _, err := kvIndex.Seek(txn, startVals) - if err != nil { - return nil, nil, errors.Trace(err) - } - defer it.Close() - - var idxRows []*RecordData - var curVals []types.Datum - for limit != 0 { - val, h, err1 := it.Next() - if terror.ErrorEqual(err1, io.EOF) { - return idxRows, nextIndexVals(curVals), nil - } else if err1 != nil { - return nil, nil, errors.Trace(err1) - } - idxRows = append(idxRows, &RecordData{Handle: h, Values: val}) - limit-- - curVals = val - } - - nextVals, _, err := it.Next() - if terror.ErrorEqual(err, io.EOF) { - return idxRows, nextIndexVals(curVals), nil - } else if err != nil { - return nil, nil, errors.Trace(err) - } - - return idxRows, nextVals, nil -} - -// CompareIndexData compares index data one by one. -// It returns nil if the data from the index is equal to the data from the table columns, -// otherwise it returns an error with a different set of records. -func CompareIndexData(txn kv.Transaction, t table.Table, idx *column.IndexedCol) error { - err := checkIndexAndRecord(txn, t, idx) - if err != nil { - return errors.Trace(err) - } - - return checkRecordAndIndex(txn, t, idx) -} - -func checkIndexAndRecord(txn kv.Transaction, t table.Table, idx *column.IndexedCol) error { - kvIndex := kv.NewKVIndex(t.IndexPrefix(), idx.Name.L, idx.ID, idx.Unique) - it, err := kvIndex.SeekFirst(txn) - if err != nil { - return errors.Trace(err) - } - defer it.Close() - - cols := make([]*column.Col, len(idx.Columns)) - for i, col := range idx.Columns { - cols[i] = t.Cols()[col.Offset] - } - - for { - vals1, h, err := it.Next() - if terror.ErrorEqual(err, io.EOF) { - break - } else if err != nil { - return errors.Trace(err) - } - - vals2, err := rowWithCols(txn, t, h, cols) - if terror.ErrorEqual(err, kv.ErrNotExist) { - record := &RecordData{Handle: h, Values: vals1} - err = errors.Errorf("index:%v != record:%v", record, nil) - } - if err != nil { - return errors.Trace(err) - } - if !reflect.DeepEqual(vals1, vals2) { - record1 := &RecordData{Handle: h, Values: vals1} - record2 := &RecordData{Handle: h, Values: vals2} - return errors.Errorf("index:%v != record:%v", record1, record2) - } - } - - return nil -} - -func checkRecordAndIndex(txn kv.Transaction, t table.Table, idx *column.IndexedCol) error { - cols := make([]*column.Col, len(idx.Columns)) - for i, col := range idx.Columns { - cols[i] = t.Cols()[col.Offset] - } - - startKey := t.RecordKey(0, nil) - kvIndex := kv.NewKVIndex(t.IndexPrefix(), idx.Name.L, idx.ID, idx.Unique) - filterFunc := func(h1 int64, vals1 []types.Datum, cols []*column.Col) (bool, error) { - isExist, h2, err := kvIndex.Exist(txn, vals1, h1) - if terror.ErrorEqual(err, kv.ErrKeyExists) { - record1 := &RecordData{Handle: h1, Values: vals1} - record2 := &RecordData{Handle: h2, Values: vals1} - return false, errors.Errorf("index:%v != record:%v", record2, record1) - } - if err != nil { - return false, errors.Trace(err) - } - if !isExist { - record := &RecordData{Handle: h1, Values: vals1} - return false, errors.Errorf("index:%v != record:%v", nil, record) - } - - return true, nil - } - err := iterRecords(txn, t, startKey, cols, filterFunc) - - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func scanTableData(retriever kv.Retriever, t table.Table, cols []*column.Col, startHandle, limit int64) ( - []*RecordData, int64, error) { - var records []*RecordData - - startKey := t.RecordKey(startHandle, nil) - filterFunc := func(h int64, d []types.Datum, cols []*column.Col) (bool, error) { - if limit != 0 { - r := &RecordData{ - Handle: h, - Values: d, - } - records = append(records, r) - limit-- - return true, nil - } - - return false, nil - } - err := iterRecords(retriever, t, startKey, cols, filterFunc) - if err != nil { - return nil, 0, errors.Trace(err) - } - - if len(records) == 0 { - return records, startHandle, nil - } - - nextHandle := records[len(records)-1].Handle + 1 - - return records, nextHandle, nil -} - -// ScanTableRecord scans table row handles and column values in a limited number. -// It returns data and the next startHandle until it doesn't have data, then returns data is nil and -// the next startHandle is the handle which can't get data. If startHandle = 0 and limit = -1, -// it returns the table data of the whole. -func ScanTableRecord(retriever kv.Retriever, t table.Table, startHandle, limit int64) ( - []*RecordData, int64, error) { - return scanTableData(retriever, t, t.Cols(), startHandle, limit) -} - -// ScanSnapshotTableRecord scans the ver version of the table data in a limited number. -// It returns data and the next startHandle until it doesn't have data, then returns data is nil and -// the next startHandle is the handle which can't get data. If startHandle = 0 and limit = -1, -// it returns the table data of the whole. -func ScanSnapshotTableRecord(store kv.Storage, ver kv.Version, t table.Table, startHandle, limit int64) ( - []*RecordData, int64, error) { - snap, err := store.GetSnapshot(ver) - if err != nil { - return nil, 0, errors.Trace(err) - } - defer snap.Release() - - records, nextHandle, err := ScanTableRecord(snap, t, startHandle, limit) - - return records, nextHandle, errors.Trace(err) -} - -// CompareTableRecord compares data and the corresponding table data one by one. -// It returns nil if data is equal to the data that scans from table, otherwise -// it returns an error with a different set of records. If exact is false, only compares handle. -func CompareTableRecord(txn kv.Transaction, t table.Table, data []*RecordData, exact bool) error { - m := make(map[int64][]types.Datum, len(data)) - for _, r := range data { - if _, ok := m[r.Handle]; ok { - return errors.Errorf("handle:%d is repeated in data", r.Handle) - } - m[r.Handle] = r.Values - } - - startKey := t.RecordKey(0, nil) - filterFunc := func(h int64, vals []types.Datum, cols []*column.Col) (bool, error) { - vals2, ok := m[h] - if !ok { - record := &RecordData{Handle: h, Values: vals} - return false, errors.Errorf("data:%v != record:%v", nil, record) - } - if !exact { - delete(m, h) - return true, nil - } - - if !reflect.DeepEqual(vals, vals2) { - record1 := &RecordData{Handle: h, Values: vals2} - record2 := &RecordData{Handle: h, Values: vals} - return false, errors.Errorf("data:%v != record:%v", record1, record2) - } - - delete(m, h) - - return true, nil - } - err := iterRecords(txn, t, startKey, t.Cols(), filterFunc) - if err != nil { - return errors.Trace(err) - } - - for h, vals := range m { - record := &RecordData{Handle: h, Values: vals} - return errors.Errorf("data:%v != record:%v", record, nil) - } - - return nil -} - -// GetTableRecordsCount returns the total number of table records from startHandle. -// If startHandle = 0, returns the total number of table records. -func GetTableRecordsCount(txn kv.Transaction, t table.Table, startHandle int64) (int64, error) { - startKey := t.RecordKey(startHandle, nil) - it, err := txn.Seek(startKey) - if err != nil { - return 0, errors.Trace(err) - } - - var cnt int64 - prefix := t.RecordPrefix() - for it.Valid() && it.Key().HasPrefix(prefix) { - handle, err := tables.DecodeRecordKeyHandle(it.Key()) - if err != nil { - return 0, errors.Trace(err) - } - - it.Close() - rk := t.RecordKey(handle+1, nil) - it, err = txn.Seek(rk) - if err != nil { - return 0, errors.Trace(err) - } - - cnt++ - } - - it.Close() - - return cnt, nil -} - -func rowWithCols(txn kv.Retriever, t table.Table, h int64, cols []*column.Col) ([]types.Datum, error) { - v := make([]types.Datum, len(cols)) - for i, col := range cols { - if col.State != model.StatePublic { - return nil, errors.Errorf("Cannot use none public column - %v", cols) - } - if col.IsPKHandleColumn(t.Meta()) { - v[i].SetInt64(h) - continue - } - - k := t.RecordKey(h, col) - data, err := txn.Get(k) - if err != nil { - return nil, errors.Trace(err) - } - - val, err := tables.DecodeValue(data, &col.FieldType) - if err != nil { - return nil, errors.Trace(err) - } - v[i] = val - } - return v, nil -} - -func iterRecords(retriever kv.Retriever, t table.Table, startKey kv.Key, cols []*column.Col, - fn table.RecordIterFunc) error { - it, err := retriever.Seek(startKey) - if err != nil { - return errors.Trace(err) - } - defer it.Close() - - if !it.Valid() { - return nil - } - - log.Debugf("startKey:%q, key:%q, value:%q", startKey, it.Key(), it.Value()) - - prefix := t.RecordPrefix() - for it.Valid() && it.Key().HasPrefix(prefix) { - // first kv pair is row lock information. - // TODO: check valid lock - // get row handle - handle, err := tables.DecodeRecordKeyHandle(it.Key()) - if err != nil { - return errors.Trace(err) - } - - data, err := rowWithCols(retriever, t, handle, cols) - if err != nil { - return errors.Trace(err) - } - more, err := fn(handle, data, cols) - if !more || err != nil { - return errors.Trace(err) - } - - rk := t.RecordKey(handle, nil) - err = kv.NextUntil(it, util.RowKeyPrefixFilter(rk)) - if err != nil { - return errors.Trace(err) - } - } - - return nil -} diff --git a/vendor/github.com/pingcap/tidb/kv/btree_buffer.go b/vendor/github.com/pingcap/tidb/kv/btree_buffer.go deleted file mode 100644 index efa43357130e..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/btree_buffer.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Copyright 2015 Wenbin Xiao -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "io" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv/memkv" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/types" -) - -type btreeBuffer struct { - tree *memkv.Tree -} - -// NewBTreeBuffer returns a breeBuffer. -func NewBTreeBuffer() MemBuffer { - return &btreeBuffer{ - tree: memkv.NewTree(types.Collators[true]), - } -} - -// Get returns the value associated with the key; ErrNotExist error if the key does not exist. -func (b *btreeBuffer) Get(k Key) ([]byte, error) { - v, ok := b.tree.Get(toIfaces(k)) - if !ok { - return nil, ErrNotExist - } - return fromIfaces(v), nil -} - -// Set associates the key with the value. -func (b *btreeBuffer) Set(k Key, v []byte) error { - if len(v) == 0 { - return errors.Trace(ErrCannotSetNilValue) - } - b.tree.Set(toIfaces(k), toIfaces(v)) - return nil -} - -// Delete removes the entry from buffer with provided key. -func (b *btreeBuffer) Delete(k Key) error { - b.tree.Set(toIfaces(k), nil) - return nil -} - -// Release clear the whole buffer. -func (b *btreeBuffer) Release() { - b.tree.Clear() -} - -type btreeIter struct { - e *memkv.Enumerator - k Key - v []byte - ok bool -} - -// Seek creates a new Iterator based on the provided key. -func (b *btreeBuffer) Seek(k Key) (Iterator, error) { - var e *memkv.Enumerator - var err error - if k == nil { - e, err = b.tree.SeekFirst() - if err != nil { - if terror.ErrorEqual(err, io.EOF) { - return &btreeIter{ok: false}, nil - } - return &btreeIter{ok: false}, errors.Trace(err) - } - } else { - key := toIfaces([]byte(k)) - e, _ = b.tree.Seek(key) - } - iter := &btreeIter{e: e} - // the initial push... - err = iter.Next() - if err != nil { - return &btreeIter{ok: false}, errors.Trace(err) - } - return iter, nil -} - -// Close implements Iterator Close. -func (i *btreeIter) Close() { - //noop -} - -// Key implements Iterator Key. -func (i *btreeIter) Key() Key { - return i.k -} - -// Value implements Iterator Value. -func (i *btreeIter) Value() []byte { - return i.v -} - -// Next implements Iterator Next. -func (i *btreeIter) Next() error { - k, v, err := i.e.Next() - if err != nil { - i.ok = false - if terror.ErrorEqual(err, io.EOF) { - return nil - } - return errors.Trace(err) - } - i.k, i.v, i.ok = fromIfaces(k), fromIfaces(v), true - return nil -} - -// Valid implements Iterator Valid. -func (i *btreeIter) Valid() bool { - return i.ok -} - -func toIfaces(v []byte) []interface{} { - return []interface{}{v} -} - -func fromIfaces(v []interface{}) []byte { - if v == nil { - return nil - } - return v[0].([]byte) -} diff --git a/vendor/github.com/pingcap/tidb/kv/buffer_store.go b/vendor/github.com/pingcap/tidb/kv/buffer_store.go deleted file mode 100644 index e211aae8de3d..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/buffer_store.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "github.com/juju/errors" -) - -// BufferStore wraps a Retriever for read and a MemBuffer for buffered write. -// Common usage pattern: -// bs := NewBufferStore(r) // use BufferStore to wrap a Retriever -// defer bs.Release() // make sure it will be released -// // ... -// // read/write on bs -// // ... -// bs.SaveTo(m) // save above operations to a Mutator -type BufferStore struct { - MemBuffer - r Retriever -} - -// NewBufferStore creates a BufferStore using r for read. -func NewBufferStore(r Retriever) *BufferStore { - return &BufferStore{ - r: r, - MemBuffer: &lazyMemBuffer{}, - } -} - -// Get implements the Retriever interface. -func (s *BufferStore) Get(k Key) ([]byte, error) { - val, err := s.MemBuffer.Get(k) - if IsErrNotFound(err) { - val, err = s.r.Get(k) - } - if err != nil { - return nil, errors.Trace(err) - } - if len(val) == 0 { - return nil, errors.Trace(ErrNotExist) - } - return val, nil -} - -// Seek implements the Retriever interface. -func (s *BufferStore) Seek(k Key) (Iterator, error) { - bufferIt, err := s.MemBuffer.Seek(k) - if err != nil { - return nil, errors.Trace(err) - } - retrieverIt, err := s.r.Seek(k) - if err != nil { - return nil, errors.Trace(err) - } - return newUnionIter(bufferIt, retrieverIt), nil -} - -// WalkBuffer iterates all buffered kv pairs. -func (s *BufferStore) WalkBuffer(f func(k Key, v []byte) error) error { - iter, err := s.MemBuffer.Seek(nil) - if err != nil { - return errors.Trace(err) - } - defer iter.Close() - for ; iter.Valid(); iter.Next() { - if err := f(iter.Key(), iter.Value()); err != nil { - return errors.Trace(err) - } - } - return nil -} - -// SaveTo saves all buffered kv pairs into a Mutator. -func (s *BufferStore) SaveTo(m Mutator) error { - err := s.WalkBuffer(func(k Key, v []byte) error { - if len(v) == 0 { - return errors.Trace(m.Delete(k)) - } - return errors.Trace(m.Set(k, v)) - }) - return errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/kv/bufpool.go b/vendor/github.com/pingcap/tidb/kv/bufpool.go deleted file mode 100644 index 0e02e1951ea2..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/bufpool.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "sync" - - "github.com/ngaut/log" -) - -// A cache holds a set of reusable objects. -// The slice is a stack (LIFO). -// If more are needed, the cache creates them by calling new. -type cache struct { - mu sync.Mutex - name string - saved []MemBuffer - // factory - fact func() MemBuffer -} - -func (c *cache) put(x MemBuffer) { - c.mu.Lock() - if len(c.saved) < cap(c.saved) { - c.saved = append(c.saved, x) - } else { - log.Warnf("%s is full, size: %d, you may need to increase pool size", c.name, len(c.saved)) - } - c.mu.Unlock() -} - -func (c *cache) get() MemBuffer { - c.mu.Lock() - n := len(c.saved) - if n == 0 { - c.mu.Unlock() - return c.fact() - } - x := c.saved[n-1] - c.saved = c.saved[0 : n-1] - c.mu.Unlock() - return x -} - -func newCache(name string, cap int, fact func() MemBuffer) *cache { - return &cache{name: name, saved: make([]MemBuffer, 0, cap), fact: fact} -} diff --git a/vendor/github.com/pingcap/tidb/kv/error.go b/vendor/github.com/pingcap/tidb/kv/error.go deleted file mode 100644 index 831c01c227ff..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/error.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "errors" - "strings" - - "github.com/pingcap/go-themis" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" -) - -// KV error codes. -const ( - CodeIncompatibleDBFormat terror.ErrCode = 1 - CodeNoDataForHandle terror.ErrCode = 2 - CodeKeyExists terror.ErrCode = 3 -) - -var ( - // ErrClosed is used when close an already closed txn. - ErrClosed = errors.New("Error: Transaction already closed") - // ErrNotExist is used when try to get an entry with an unexist key from KV store. - ErrNotExist = errors.New("Error: key not exist") - // ErrConditionNotMatch is used when condition is not met. - ErrConditionNotMatch = errors.New("Error: Condition not match") - // ErrLockConflict is used when try to lock an already locked key. - ErrLockConflict = errors.New("Error: Lock conflict") - // ErrLazyConditionPairsNotMatch is used when value in store differs from expect pairs. - ErrLazyConditionPairsNotMatch = errors.New("Error: Lazy condition pairs not match") - // ErrRetryable is used when KV store occurs RPC error or some other - // errors which SQL layer can safely retry. - ErrRetryable = errors.New("Error: KV error safe to retry") - // ErrCannotSetNilValue is the error when sets an empty value. - ErrCannotSetNilValue = errors.New("can not set nil value") - // ErrInvalidTxn is the error when commits or rollbacks in an invalid transaction. - ErrInvalidTxn = errors.New("invalid transaction") - - // ErrNotCommitted is the error returned by CommitVersion when this - // transaction is not committed. - ErrNotCommitted = errors.New("this transaction has not committed") - - // ErrKeyExists returns when key is already exist. - ErrKeyExists = terror.ClassKV.New(CodeKeyExists, "key already exist") -) - -func init() { - kvMySQLErrCodes := map[terror.ErrCode]uint16{ - CodeKeyExists: mysql.ErrDupEntry, - } - terror.ErrClassToMySQLCodes[terror.ClassKV] = kvMySQLErrCodes -} - -// IsRetryableError checks if the err is a fatal error and the under going operation is worth to retry. -func IsRetryableError(err error) bool { - if err == nil { - return false - } - - if terror.ErrorEqual(err, ErrRetryable) || - terror.ErrorEqual(err, ErrLockConflict) || - terror.ErrorEqual(err, ErrConditionNotMatch) || - terror.ErrorEqual(err, themis.ErrRetryable) || - // HBase exception message will tell you if you should retry or not - strings.Contains(err.Error(), "try again later") { - return true - } - - return false -} - -// IsErrNotFound checks if err is a kind of NotFound error. -func IsErrNotFound(err error) bool { - if terror.ErrorEqual(err, ErrNotExist) { - return true - } - - return false -} diff --git a/vendor/github.com/pingcap/tidb/kv/index_iter.go b/vendor/github.com/pingcap/tidb/kv/index_iter.go deleted file mode 100644 index 50884ddc9502..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/index_iter.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "bytes" - "encoding/binary" - "io" - - "github.com/juju/errors" - "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/types" -) - -var ( - _ Index = (*kvIndex)(nil) - _ IndexIterator = (*indexIter)(nil) -) - -// IndexIterator is the interface for iterator of index data on KV store. -type IndexIterator interface { - Next() (k []types.Datum, h int64, err error) - Close() -} - -// Index is the interface for index data on KV store. -type Index interface { - // Create supports insert into statement. - Create(rm RetrieverMutator, indexedValues []types.Datum, h int64) error - // Delete supports delete from statement. - Delete(m Mutator, indexedValues []types.Datum, h int64) error - // Drop supports drop table, drop index statements. - Drop(rm RetrieverMutator) error - // Exist supports check index exists or not. - Exist(rm RetrieverMutator, indexedValues []types.Datum, h int64) (bool, int64, error) - // GenIndexKey generates an index key. - GenIndexKey(indexedValues []types.Datum, h int64) (key []byte, distinct bool, err error) - // Seek supports where clause. - Seek(r Retriever, indexedValues []types.Datum) (iter IndexIterator, hit bool, err error) - // SeekFirst supports aggregate min and ascend order by. - SeekFirst(r Retriever) (iter IndexIterator, err error) -} - -func encodeHandle(h int64) []byte { - buf := &bytes.Buffer{} - err := binary.Write(buf, binary.BigEndian, h) - if err != nil { - panic(err) - } - return buf.Bytes() -} - -func decodeHandle(data []byte) (int64, error) { - var h int64 - buf := bytes.NewBuffer(data) - err := binary.Read(buf, binary.BigEndian, &h) - return h, errors.Trace(err) -} - -// indexIter is for KV store index iterator. -type indexIter struct { - it Iterator - idx *kvIndex - prefix Key -} - -// Close does the clean up works when KV store index iterator is closed. -func (c *indexIter) Close() { - if c.it != nil { - c.it.Close() - c.it = nil - } -} - -// Next returns current key and moves iterator to the next step. -func (c *indexIter) Next() (val []types.Datum, h int64, err error) { - if !c.it.Valid() { - return nil, 0, errors.Trace(io.EOF) - } - if !c.it.Key().HasPrefix(c.prefix) { - return nil, 0, errors.Trace(io.EOF) - } - // get indexedValues - buf := c.it.Key()[len(c.prefix):] - vv, err := codec.Decode(buf) - if err != nil { - return nil, 0, errors.Trace(err) - } - // if index is *not* unique, the handle is in keybuf - if !c.idx.unique { - h = vv[len(vv)-1].GetInt64() - val = vv[0 : len(vv)-1] - } else { - // otherwise handle is value - h, err = decodeHandle(c.it.Value()) - if err != nil { - return nil, 0, errors.Trace(err) - } - val = vv - } - // update new iter to next - err = c.it.Next() - if err != nil { - return nil, 0, errors.Trace(err) - } - return -} - -// kvIndex is the data structure for index data in the KV store. -type kvIndex struct { - indexName string - indexID int64 - unique bool - prefix Key -} - -// GenIndexPrefix generates the index prefix. -func GenIndexPrefix(indexPrefix Key, indexID int64) Key { - buf := make([]byte, 0, len(indexPrefix)+8) - buf = append(buf, indexPrefix...) - buf = codec.EncodeInt(buf, indexID) - return buf -} - -// NewKVIndex builds a new kvIndex object. -func NewKVIndex(indexPrefix Key, indexName string, indexID int64, unique bool) Index { - index := &kvIndex{ - indexName: indexName, - indexID: indexID, - unique: unique, - prefix: GenIndexPrefix(indexPrefix, indexID), - } - - return index -} - -// GenIndexKey generates storage key for index values. Returned distinct indicates whether the -// indexed values should be distinct in storage (i.e. whether handle is encoded in the key). -func (c *kvIndex) GenIndexKey(indexedValues []types.Datum, h int64) (key []byte, distinct bool, err error) { - if c.unique { - // See: https://dev.mysql.com/doc/refman/5.7/en/create-index.html - // A UNIQUE index creates a constraint such that all values in the index must be distinct. - // An error occurs if you try to add a new row with a key value that matches an existing row. - // For all engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL. - distinct = true - for _, cv := range indexedValues { - if cv.Kind() == types.KindNull { - distinct = false - break - } - } - } - - key = append(key, c.prefix...) - if distinct { - key, err = codec.EncodeKey(key, indexedValues...) - } else { - key, err = codec.EncodeKey(key, append(indexedValues, types.NewDatum(h))...) - } - if err != nil { - return nil, false, errors.Trace(err) - } - return -} - -// Create creates a new entry in the kvIndex data. -// If the index is unique and there is an existing entry with the same key, Create will return ErrKeyExists. -func (c *kvIndex) Create(rm RetrieverMutator, indexedValues []types.Datum, h int64) error { - key, distinct, err := c.GenIndexKey(indexedValues, h) - if err != nil { - return errors.Trace(err) - } - if !distinct { - // TODO: reconsider value - err = rm.Set(key, []byte("timestamp?")) - return errors.Trace(err) - } - - _, err = rm.Get(key) - if IsErrNotFound(err) { - err = rm.Set(key, encodeHandle(h)) - return errors.Trace(err) - } - - return errors.Trace(ErrKeyExists) -} - -// Delete removes the entry for handle h and indexdValues from KV index. -func (c *kvIndex) Delete(m Mutator, indexedValues []types.Datum, h int64) error { - key, _, err := c.GenIndexKey(indexedValues, h) - if err != nil { - return errors.Trace(err) - } - err = m.Delete(key) - return errors.Trace(err) -} - -// Drop removes the KV index from store. -func (c *kvIndex) Drop(rm RetrieverMutator) error { - it, err := rm.Seek(c.prefix) - if err != nil { - return errors.Trace(err) - } - defer it.Close() - - // remove all indices - for it.Valid() { - if !it.Key().HasPrefix(c.prefix) { - break - } - err := rm.Delete(it.Key()) - if err != nil { - return errors.Trace(err) - } - err = it.Next() - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// Seek searches KV index for the entry with indexedValues. -func (c *kvIndex) Seek(r Retriever, indexedValues []types.Datum) (iter IndexIterator, hit bool, err error) { - key, _, err := c.GenIndexKey(indexedValues, 0) - if err != nil { - return nil, false, errors.Trace(err) - } - it, err := r.Seek(key) - if err != nil { - return nil, false, errors.Trace(err) - } - // check if hit - hit = false - if it.Valid() && it.Key().Cmp(key) == 0 { - hit = true - } - return &indexIter{it: it, idx: c, prefix: c.prefix}, hit, nil -} - -// SeekFirst returns an iterator which points to the first entry of the KV index. -func (c *kvIndex) SeekFirst(r Retriever) (iter IndexIterator, err error) { - it, err := r.Seek(c.prefix) - if err != nil { - return nil, errors.Trace(err) - } - return &indexIter{it: it, idx: c, prefix: c.prefix}, nil -} - -func (c *kvIndex) Exist(rm RetrieverMutator, indexedValues []types.Datum, h int64) (bool, int64, error) { - key, distinct, err := c.GenIndexKey(indexedValues, h) - if err != nil { - return false, 0, errors.Trace(err) - } - - value, err := rm.Get(key) - if IsErrNotFound(err) { - return false, 0, nil - } - if err != nil { - return false, 0, errors.Trace(err) - } - - // For distinct index, the value of key is handle. - if distinct { - handle, err := decodeHandle(value) - if err != nil { - return false, 0, errors.Trace(err) - } - - if handle != h { - return true, handle, errors.Trace(ErrKeyExists) - } - - return true, handle, nil - } - - return true, h, nil -} diff --git a/vendor/github.com/pingcap/tidb/kv/iter.go b/vendor/github.com/pingcap/tidb/kv/iter.go deleted file mode 100644 index 2c337be3ca77..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/iter.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import "github.com/juju/errors" - -// NextUntil applies FnKeyCmp to each entry of the iterator until meets some condition. -// It will stop when fn returns true, or iterator is invalid or an error occurs. -func NextUntil(it Iterator, fn FnKeyCmp) error { - var err error - for it.Valid() && !fn(it.Key()) { - err = it.Next() - if err != nil { - return errors.Trace(err) - } - } - return nil -} diff --git a/vendor/github.com/pingcap/tidb/kv/key.go b/vendor/github.com/pingcap/tidb/kv/key.go deleted file mode 100644 index fed902ff20d7..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/key.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import "bytes" - -// Key represents high-level Key type. -type Key []byte - -// Next returns the next key in byte-order. -func (k Key) Next() Key { - // add 0x0 to the end of key - buf := make([]byte, len([]byte(k))+1) - copy(buf, []byte(k)) - return buf -} - -// Cmp returns the comparison result of two key. -// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. -func (k Key) Cmp(another Key) int { - return bytes.Compare(k, another) -} - -// HasPrefix tests whether the Key begins with prefix. -func (k Key) HasPrefix(prefix Key) bool { - return bytes.HasPrefix(k, prefix) -} - -// Clone returns a copy of the Key. -func (k Key) Clone() Key { - return append([]byte(nil), k...) -} - -// EncodedKey represents encoded key in low-level storage engine. -type EncodedKey []byte - -// Cmp returns the comparison result of two key. -// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. -func (k EncodedKey) Cmp(another EncodedKey) int { - return bytes.Compare(k, another) -} - -// Next returns the next key in byte-order. -func (k EncodedKey) Next() EncodedKey { - return EncodedKey(bytes.Join([][]byte{k, Key{0}}, nil)) -} diff --git a/vendor/github.com/pingcap/tidb/kv/kv.go b/vendor/github.com/pingcap/tidb/kv/kv.go deleted file mode 100644 index fb75e4944aa3..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/kv.go +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import "io" - -const ( - // PresumeKeyNotExists directives that when dealing with a Get operation but failing to read data from cache, - // we presume that the key does not exist in Store. The actual existence will be checked before the - // transaction's commit. - // This option is an optimization for frequent checks during a transaction, e.g. batch inserts. - PresumeKeyNotExists Option = iota + 1 - // PresumeKeyNotExistsError is the option key for error. - // When PresumeKeyNotExists is set and condition is not match, should throw the error. - PresumeKeyNotExistsError -) - -// Retriever is the interface wraps the basic Get and Seek methods. -type Retriever interface { - // Get gets the value for key k from kv store. - // If corresponding kv pair does not exist, it returns nil and ErrNotExist. - Get(k Key) ([]byte, error) - // Seek creates an Iterator positioned on the first entry that k <= entry's key. - // If such entry is not found, it returns an invalid Iterator with no error. - // The Iterator must be Closed after use. - Seek(k Key) (Iterator, error) -} - -// Mutator is the interface wraps the basic Set and Delete methods. -type Mutator interface { - // Set sets the value for key k as v into kv store. - // v must NOT be nil or empty, otherwise it returns ErrCannotSetNilValue. - Set(k Key, v []byte) error - // Delete removes the entry for key k from kv store. - Delete(k Key) error -} - -// RetrieverMutator is the interface that groups Retriever and Mutator interfaces. -type RetrieverMutator interface { - Retriever - Mutator -} - -// MemBuffer is an in-memory kv collection. It should be released after use. -type MemBuffer interface { - RetrieverMutator - // Release releases the buffer. - Release() -} - -// Transaction defines the interface for operations inside a Transaction. -// This is not thread safe. -type Transaction interface { - RetrieverMutator - // Commit commits the transaction operations to KV store. - Commit() error - // Rollback undoes the transaction operations to KV store. - Rollback() error - // String implements fmt.Stringer interface. - String() string - // LockKeys tries to lock the entries with the keys in KV store. - LockKeys(keys ...Key) error - // SetOption sets an option with a value, when val is nil, uses the default - // value of this option. - SetOption(opt Option, val interface{}) - // DelOption deletes an option. - DelOption(opt Option) - // IsReadOnly checks if the transaction has only performed read operations. - IsReadOnly() bool - // GetClient gets a client instance. - GetClient() Client - // StartTS returns the transaction start timestamp. - StartTS() int64 -} - -// Client is used to send request to KV layer. -type Client interface { - // Send sends request to KV layer, returns a Response. - Send(req *Request) Response - - // SupportRequestType checks if reqType and subType is supported. - SupportRequestType(reqType, subType int64) bool -} - -// ReqTypes. -const ( - ReqTypeSelect = 101 - ReqTypeIndex = 102 -) - -// KeyRange represents a range where StartKey <= key < EndKey. -type KeyRange struct { - StartKey Key - EndKey Key -} - -// Request represents a kv request. -type Request struct { - // The request type. - Tp int64 - Data []byte - // Key Ranges - KeyRanges []KeyRange - // If desc is true, the request is sent in descending order. - Desc bool - // If concurrency is 1, it only sends the request to a single storage unit when - // ResponseIterator.Next is called. If concurrency is greater than 1, the request will be - // sent to multiple storage units concurrently. - Concurrency int -} - -// Response represents the response returned from KV layer. -type Response interface { - // Next returns a resultSubset from a single storage unit. - // When full result set is returned, nil is returned. - Next() (resultSubset io.ReadCloser, err error) -} - -// Snapshot defines the interface for the snapshot fetched from KV store. -type Snapshot interface { - Retriever - // BatchGet gets a batch of values from snapshot. - BatchGet(keys []Key) (map[string][]byte, error) - // Release releases the snapshot to store. - Release() -} - -// Driver is the interface that must be implemented by a KV storage. -type Driver interface { - // Open returns a new Storage. - // The path is the string for storage specific format. - Open(path string) (Storage, error) -} - -// Storage defines the interface for storage. -// Isolation should be at least SI(SNAPSHOT ISOLATION) -type Storage interface { - // Begin transaction - Begin() (Transaction, error) - // GetSnapshot gets a snapshot that is able to read any data which data is <= ver. - // if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. - GetSnapshot(ver Version) (Snapshot, error) - // Close store - Close() error - // Storage's unique ID - UUID() string - // CurrentVersion returns current max committed version. - CurrentVersion() (Version, error) -} - -// FnKeyCmp is the function for iterator the keys -type FnKeyCmp func(key Key) bool - -// Iterator is the interface for a iterator on KV store. -type Iterator interface { - Valid() bool - Key() Key - Value() []byte - Next() error - Close() -} diff --git a/vendor/github.com/pingcap/tidb/kv/memdb_buffer.go b/vendor/github.com/pingcap/tidb/kv/memdb_buffer.go deleted file mode 100644 index 82c897ee4785..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/memdb_buffer.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Copyright 2015 Wenbin Xiao -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/terror" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type memDbBuffer struct { - db *memdb.DB -} - -type memDbIter struct { - iter iterator.Iterator -} - -// NewMemDbBuffer creates a new memDbBuffer. -func NewMemDbBuffer() MemBuffer { - return &memDbBuffer{db: memdb.New(comparer.DefaultComparer, 4*1024)} -} - -// Seek creates an Iterator. -func (m *memDbBuffer) Seek(k Key) (Iterator, error) { - var i Iterator - if k == nil { - i = &memDbIter{iter: m.db.NewIterator(&util.Range{})} - } else { - i = &memDbIter{iter: m.db.NewIterator(&util.Range{Start: []byte(k)})} - } - i.Next() - return i, nil -} - -// Get returns the value associated with key. -func (m *memDbBuffer) Get(k Key) ([]byte, error) { - v, err := m.db.Get(k) - if terror.ErrorEqual(err, leveldb.ErrNotFound) { - return nil, ErrNotExist - } - return v, nil -} - -// Set associates key with value. -func (m *memDbBuffer) Set(k Key, v []byte) error { - if len(v) == 0 { - return errors.Trace(ErrCannotSetNilValue) - } - err := m.db.Put(k, v) - return errors.Trace(err) -} - -// Delete removes the entry from buffer with provided key. -func (m *memDbBuffer) Delete(k Key) error { - err := m.db.Put(k, nil) - return errors.Trace(err) -} - -// Release reset the buffer. -func (m *memDbBuffer) Release() { - m.db.Reset() -} - -// Next implements the Iterator Next. -func (i *memDbIter) Next() error { - i.iter.Next() - return nil -} - -// Valid implements the Iterator Valid. -func (i *memDbIter) Valid() bool { - return i.iter.Valid() -} - -// Key implements the Iterator Key. -func (i *memDbIter) Key() Key { - return i.iter.Key() -} - -// Value implements the Iterator Value. -func (i *memDbIter) Value() []byte { - return i.iter.Value() -} - -// Close Implements the Iterator Close. -func (i *memDbIter) Close() { - i.iter.Release() -} diff --git a/vendor/github.com/pingcap/tidb/kv/memkv/btree.go b/vendor/github.com/pingcap/tidb/kv/memkv/btree.go deleted file mode 100644 index 34e249162b94..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/memkv/btree.go +++ /dev/null @@ -1,739 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package memkv - -import ( - "io" -) - -const ( - kx = 128 //DONE benchmark tune this number if using custom key/value type(s). - kd = 64 //DONE benchmark tune this number if using custom key/value type(s). -) - -type ( - // cmp compares a and b. Return value is: - // - // < 0 if a < b - // 0 if a == b - // > 0 if a > b - // - cmp func(a, b []interface{}) int - - d struct { // data page - c int - d [2*kd + 1]de - n *d - p *d - } - - de struct { // d element - k []interface{} - v []interface{} - } - - // Enumerator is the iterator for btree - Enumerator struct { - err error - hit bool - i int - k []interface{} - q *d - t *Tree - ver int64 - } - - // Tree is a B+tree. - Tree struct { - c int - cmp cmp - first *d - last *d - r interface{} - ver int64 - } - - xe struct { // x element - ch interface{} - sep *d - } - - x struct { // index page - c int - x [2*kx + 2]xe - } -) - -var ( // R/O zero values - zd d - zde de - zx x - zxe xe -) - -func clr(q interface{}) { - switch z := q.(type) { - case *x: - for i := 0; i <= z.c; i++ { // Ch0 Sep0 ... Chn-1 Sepn-1 Chn - clr(z.x[i].ch) - } - *z = zx // GC - case *d: - *z = zd // GC - } -} - -// -------------------------------------------------------------------------- x - -func newX(ch0 interface{}) *x { - r := &x{} - r.x[0].ch = ch0 - return r -} - -func (q *x) extract(i int) { - q.c-- - if i < q.c { - copy(q.x[i:], q.x[i+1:q.c+1]) - q.x[q.c].ch = q.x[q.c+1].ch - q.x[q.c].sep = nil // GC - q.x[q.c+1] = zxe // GC - } -} - -func (q *x) insert(i int, d *d, ch interface{}) *x { - c := q.c - if i < c { - q.x[c+1].ch = q.x[c].ch - copy(q.x[i+2:], q.x[i+1:c]) - q.x[i+1].sep = q.x[i].sep - } - c++ - q.c = c - q.x[i].sep = d - q.x[i+1].ch = ch - return q -} - -func (q *x) siblings(i int) (l, r *d) { - if i >= 0 { - if i > 0 { - l = q.x[i-1].ch.(*d) - } - if i < q.c { - r = q.x[i+1].ch.(*d) - } - } - return -} - -// -------------------------------------------------------------------------- d - -func (l *d) mvL(r *d, c int) { - copy(l.d[l.c:], r.d[:c]) - copy(r.d[:], r.d[c:r.c]) - l.c += c - r.c -= c -} - -func (l *d) mvR(r *d, c int) { - copy(r.d[c:], r.d[:r.c]) - copy(r.d[:c], l.d[l.c-c:]) - r.c += c - l.c -= c -} - -// ----------------------------------------------------------------------- tree - -// NewTree returns a newly created, empty tree. The compare function is used -// for key collation. -func NewTree(cmp cmp) *Tree { - return &Tree{cmp: cmp} -} - -// Clear removes all K/V pairs from the tree. -func (t *Tree) Clear() { - if t.r == nil { - return - } - - clr(t.r) - t.c, t.first, t.last, t.r = 0, nil, nil, nil - t.ver++ -} - -func (t *Tree) cat(p *x, q, r *d, pi int) { - t.ver++ - q.mvL(r, r.c) - if r.n != nil { - r.n.p = q - } else { - t.last = q - } - q.n = r.n - if p.c > 1 { - p.extract(pi) - p.x[pi].ch = q - } else { - t.r = q - } -} - -func (t *Tree) catX(p, q, r *x, pi int) { - t.ver++ - q.x[q.c].sep = p.x[pi].sep - copy(q.x[q.c+1:], r.x[:r.c]) - q.c += r.c + 1 - q.x[q.c].ch = r.x[r.c].ch - if p.c > 1 { - p.c-- - pc := p.c - if pi < pc { - p.x[pi].sep = p.x[pi+1].sep - copy(p.x[pi+1:], p.x[pi+2:pc+1]) - p.x[pc].ch = p.x[pc+1].ch - p.x[pc].sep = nil // GC - p.x[pc+1].ch = nil // GC - } - return - } - - t.r = q -} - -//Delete removes the k's KV pair, if it exists, in which case Delete returns -//true. -func (t *Tree) Delete(k []interface{}) (ok bool) { - pi := -1 - var p *x - q := t.r - if q == nil { - return - } - - for { - var i int - i, ok = t.find(q, k) - if ok { - switch z := q.(type) { - case *x: - dp := z.x[i].sep - switch { - case dp.c > kd: - t.extract(dp, 0) - default: - if z.c < kx && q != t.r { - t.underflowX(p, &z, pi, &i) - } - pi = i + 1 - p = z - q = z.x[pi].ch - ok = false - continue - } - case *d: - t.extract(z, i) - if z.c >= kd { - return - } - - if q != t.r { - t.underflow(p, z, pi) - } else if t.c == 0 { - t.Clear() - } - } - return - } - - switch z := q.(type) { - case *x: - if z.c < kx && q != t.r { - t.underflowX(p, &z, pi, &i) - } - pi = i - p = z - q = z.x[i].ch - case *d: - return - } - } -} - -func (t *Tree) extract(q *d, i int) { // (r []interface{}) { - t.ver++ - //r = q.d[i].v // prepared for Extract - q.c-- - if i < q.c { - copy(q.d[i:], q.d[i+1:q.c+1]) - } - q.d[q.c] = zde // GC - t.c-- - return -} - -func (t *Tree) find(q interface{}, k []interface{}) (i int, ok bool) { - var mk []interface{} - l := 0 - switch z := q.(type) { - case *x: - h := z.c - 1 - for l <= h { - m := (l + h) >> 1 - mk = z.x[m].sep.d[0].k - switch cmp := t.cmp(k, mk); { - case cmp > 0: - l = m + 1 - case cmp == 0: - return m, true - default: - h = m - 1 - } - } - case *d: - h := z.c - 1 - for l <= h { - m := (l + h) >> 1 - mk = z.d[m].k - switch cmp := t.cmp(k, mk); { - case cmp > 0: - l = m + 1 - case cmp == 0: - return m, true - default: - h = m - 1 - } - } - } - return l, false -} - -// First returns the first item of the tree in the key collating order, or -// (nil, nil) if the tree is empty. -func (t *Tree) First() (k []interface{}, v []interface{}) { - if q := t.first; q != nil { - q := &q.d[0] - k, v = q.k, q.v - } - return -} - -// Get returns the value associated with k and true if it exists. Otherwise Get -// returns (nil, false). -func (t *Tree) Get(k []interface{}) (v []interface{}, ok bool) { - q := t.r - if q == nil { - return - } - - for { - var i int - if i, ok = t.find(q, k); ok { - switch z := q.(type) { - case *x: - return z.x[i].sep.d[0].v, true - case *d: - return z.d[i].v, true - } - } - switch z := q.(type) { - case *x: - q = z.x[i].ch - default: - return - } - } -} - -func (t *Tree) insert(q *d, i int, k []interface{}, v []interface{}) *d { - t.ver++ - c := q.c - if i < c { - copy(q.d[i+1:], q.d[i:c]) - } - c++ - q.c = c - q.d[i].k, q.d[i].v = k, v - t.c++ - return q -} - -// Last returns the last item of the tree in the key collating order, or (nil, -// nil) if the tree is empty. -func (t *Tree) Last() (k []interface{}, v []interface{}) { - if q := t.last; q != nil { - q := &q.d[q.c-1] - k, v = q.k, q.v - } - return -} - -// Len returns the number of items in the tree. -func (t *Tree) Len() int { - return t.c -} - -func (t *Tree) overflow(p *x, q *d, pi, i int, k []interface{}, v []interface{}) { - t.ver++ - l, r := p.siblings(pi) - - if l != nil && l.c < 2*kd { - l.mvL(q, 1) - t.insert(q, i-1, k, v) - return - } - - if r != nil && r.c < 2*kd { - if i < 2*kd { - q.mvR(r, 1) - t.insert(q, i, k, v) - } else { - t.insert(r, 0, k, v) - } - return - } - - t.split(p, q, pi, i, k, v) -} - -// Seek returns an Enumerator positioned on a an item such that k >= item's -// key. ok reports if k == item.key The Enumerator's position is possibly -// after the last item in the tree. -func (t *Tree) Seek(k []interface{}) (e *Enumerator, ok bool) { - q := t.r - if q == nil { - e = &Enumerator{nil, false, 0, k, nil, t, t.ver} - return - } - - for { - var i int - if i, ok = t.find(q, k); ok { - switch z := q.(type) { - case *x: - e = &Enumerator{nil, ok, 0, k, z.x[i].sep, t, t.ver} - return - case *d: - e = &Enumerator{nil, ok, i, k, z, t, t.ver} - return - } - } - switch z := q.(type) { - case *x: - q = z.x[i].ch - case *d: - e = &Enumerator{nil, ok, i, k, z, t, t.ver} - return - } - } -} - -// SeekFirst returns an Enumerator positioned on the first KV pair in the tree, -// if any. For an empty tree, err == io.EOF is returned and e will be nil. -func (t *Tree) SeekFirst() (e *Enumerator, err error) { - q := t.first - if q == nil { - return nil, io.EOF - } - - return &Enumerator{nil, true, 0, q.d[0].k, q, t, t.ver}, nil -} - -// SeekLast returns an Enumerator positioned on the last KV pair in the tree, -// if any. For an empty tree, err == io.EOF is returned and e will be nil. -func (t *Tree) SeekLast() (e *Enumerator, err error) { - q := t.last - if q == nil { - return nil, io.EOF - } - - return &Enumerator{nil, true, q.c - 1, q.d[q.c-1].k, q, t, t.ver}, nil -} - -// Set sets the value associated with k. -func (t *Tree) Set(k []interface{}, v []interface{}) { - pi := -1 - var p *x - q := t.r - if q != nil { - for { - i, ok := t.find(q, k) - if ok { - switch z := q.(type) { - case *x: - z.x[i].sep.d[0].v = v - case *d: - z.d[i].v = v - } - return - } - - switch z := q.(type) { - case *x: - if z.c > 2*kx { - t.splitX(p, &z, pi, &i) - } - pi = i - p = z - q = z.x[i].ch - case *d: - switch { - case z.c < 2*kd: - t.insert(z, i, k, v) - default: - t.overflow(p, z, pi, i, k, v) - } - return - } - } - } - - z := t.insert(&d{}, 0, k, v) - t.r, t.first, t.last = z, z, z - return -} - -func (t *Tree) split(p *x, q *d, pi, i int, k []interface{}, v []interface{}) { - t.ver++ - r := &d{} - if q.n != nil { - r.n = q.n - r.n.p = r - } else { - t.last = r - } - q.n = r - r.p = q - - copy(r.d[:], q.d[kd:2*kd]) - for i := range q.d[kd:] { - q.d[kd+i] = zde - } - q.c = kd - r.c = kd - if pi >= 0 { - p.insert(pi, r, r) - } else { - t.r = newX(q).insert(0, r, r) - } - if i > kd { - t.insert(r, i-kd, k, v) - return - } - - t.insert(q, i, k, v) -} - -func (t *Tree) splitX(p *x, pp **x, pi int, i *int) { - t.ver++ - q := *pp - r := &x{} - copy(r.x[:], q.x[kx+1:]) - q.c = kx - r.c = kx - if pi >= 0 { - p.insert(pi, q.x[kx].sep, r) - } else { - t.r = newX(q).insert(0, q.x[kx].sep, r) - } - q.x[kx].sep = nil - for i := range q.x[kx+1:] { - q.x[kx+i+1] = zxe - } - if *i > kx { - *pp = r - *i -= kx + 1 - } -} - -func (t *Tree) underflow(p *x, q *d, pi int) { - t.ver++ - l, r := p.siblings(pi) - - if l != nil && l.c+q.c >= 2*kd { - l.mvR(q, 1) - } else if r != nil && q.c+r.c >= 2*kd { - q.mvL(r, 1) - r.d[r.c] = zde // GC - } else if l != nil { - t.cat(p, l, q, pi-1) - } else { - t.cat(p, q, r, pi) - } -} - -func (t *Tree) underflowX(p *x, pp **x, pi int, i *int) { - t.ver++ - var l, r *x - q := *pp - - if pi >= 0 { - if pi > 0 { - l = p.x[pi-1].ch.(*x) - } - if pi < p.c { - r = p.x[pi+1].ch.(*x) - } - } - - if l != nil && l.c > kx { - q.x[q.c+1].ch = q.x[q.c].ch - copy(q.x[1:], q.x[:q.c]) - q.x[0].ch = l.x[l.c].ch - q.x[0].sep = p.x[pi-1].sep - q.c++ - *i++ - l.c-- - p.x[pi-1].sep = l.x[l.c].sep - return - } - - if r != nil && r.c > kx { - q.x[q.c].sep = p.x[pi].sep - q.c++ - q.x[q.c].ch = r.x[0].ch - p.x[pi].sep = r.x[0].sep - copy(r.x[:], r.x[1:r.c]) - r.c-- - rc := r.c - r.x[rc].ch = r.x[rc+1].ch - r.x[rc].sep = nil - r.x[rc+1].ch = nil - return - } - - if l != nil { - *i += l.c + 1 - t.catX(p, l, q, pi-1) - *pp = l - return - } - - t.catX(p, q, r, pi) -} - -// ----------------------------------------------------------------- Enumerator - -// Next returns the currently enumerated item, if it exists and moves to the -// next item in the key collation order. If there is no item to return, err == -// io.EOF is returned. -func (e *Enumerator) Next() (k []interface{}, v []interface{}, err error) { - if err = e.err; err != nil { - return - } - - if e.ver != e.t.ver { - f, hit := e.t.Seek(e.k) - if !e.hit && hit { - if err = f.next(); err != nil { - return - } - } - - *e = *f - } - if e.q == nil { - e.err, err = io.EOF, io.EOF - return - } - - if e.i >= e.q.c { - if err = e.next(); err != nil { - return - } - } - - i := e.q.d[e.i] - k, v = i.k, i.v - e.k, e.hit = k, false - e.next() - return -} - -func (e *Enumerator) next() error { - if e.q == nil { - e.err = io.EOF - return io.EOF - } - - switch { - case e.i < e.q.c-1: - e.i++ - default: - if e.q, e.i = e.q.n, 0; e.q == nil { - e.err = io.EOF - } - } - return e.err -} - -// Prev returns the currently enumerated item, if it exists and moves to the -// previous item in the key collation order. If there is no item to return, err -// == io.EOF is returned. -func (e *Enumerator) Prev() (k []interface{}, v []interface{}, err error) { - if err = e.err; err != nil { - return - } - - if e.ver != e.t.ver { - f, hit := e.t.Seek(e.k) - if !e.hit && hit { - if err = f.prev(); err != nil { - return - } - } - - *e = *f - } - if e.q == nil { - e.err, err = io.EOF, io.EOF - return - } - - if e.i >= e.q.c { - if err = e.next(); err != nil { - return - } - } - - i := e.q.d[e.i] - k, v = i.k, i.v - e.k, e.hit = k, false - e.prev() - return -} - -func (e *Enumerator) prev() error { - if e.q == nil { - e.err = io.EOF - return io.EOF - } - - switch { - case e.i > 0: - e.i-- - default: - if e.q = e.q.p; e.q == nil { - e.err = io.EOF - break - } - - e.i = e.q.c - 1 - } - return e.err -} diff --git a/vendor/github.com/pingcap/tidb/kv/memkv/temp.go b/vendor/github.com/pingcap/tidb/kv/memkv/temp.go deleted file mode 100644 index 01e9d43d059a..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/memkv/temp.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package memkv - -import ( - "github.com/pingcap/tidb/util/types" -) - -type btreeIterator interface { - Next() (k, v []interface{}, err error) -} - -// Temp is the interface of a memory kv storage -type Temp interface { - Drop() (err error) - Get(k []interface{}) (v []interface{}, err error) - SeekFirst() (e btreeIterator, err error) - Set(k, v []interface{}) (err error) -} - -// memtemp for join/groupby or any aggregation operation -type memTemp struct { - // memory btree - tree *Tree -} - -// CreateTemp returns a new empty memory kv -func CreateTemp(asc bool) (_ Temp, err error) { - return &memTemp{ - tree: NewTree(types.Collators[asc]), - }, nil -} - -func (t *memTemp) Get(k []interface{}) (v []interface{}, err error) { - v, _ = t.tree.Get(k) - return -} - -func (t *memTemp) Drop() (err error) { return } - -func (t *memTemp) Set(k, v []interface{}) (err error) { - vv, err := types.Clone(v) - if err != nil { - return err - } - t.tree.Set(append([]interface{}(nil), k...), vv.([]interface{})) - return -} - -func (t *memTemp) SeekFirst() (e btreeIterator, err error) { - it, err := t.tree.SeekFirst() - if err != nil { - return - } - - return it, nil -} diff --git a/vendor/github.com/pingcap/tidb/kv/txn.go b/vendor/github.com/pingcap/tidb/kv/txn.go deleted file mode 100644 index 18515380bf90..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/txn.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "math" - "math/rand" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" -) - -// RunInNewTxn will run the f in a new transaction environment. -func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) error { - for i := 0; i < maxRetryCnt; i++ { - txn, err := store.Begin() - if err != nil { - log.Errorf("[kv] RunInNewTxn error - %v", err) - return errors.Trace(err) - } - - err = f(txn) - if retryable && IsRetryableError(err) { - log.Warnf("[kv] Retry txn %v", txn) - txn.Rollback() - continue - } - if err != nil { - txn.Rollback() - return errors.Trace(err) - } - - err = txn.Commit() - if retryable && IsRetryableError(err) { - log.Warnf("[kv] Retry txn %v", txn) - txn.Rollback() - BackOff(i) - continue - } - if err != nil { - return errors.Trace(err) - } - break - } - - return nil -} - -var ( - // Max retry count in RunInNewTxn - maxRetryCnt = 100 - // retryBackOffBase is the initial duration, in microsecond, a failed transaction stays dormancy before it retries - retryBackOffBase = 1 - // retryBackOffCap is the max amount of duration, in microsecond, a failed transaction stays dormancy before it retries - retryBackOffCap = 100 -) - -// BackOff Implements exponential backoff with full jitter. -// Returns real back off time in microsecond. -// See: http://www.awsarchitectureblog.com/2015/03/backoff.html. -func BackOff(attempts int) int { - upper := int(math.Min(float64(retryBackOffCap), float64(retryBackOffBase)*math.Pow(2.0, float64(attempts)))) - sleep := time.Duration(rand.Intn(upper)) * time.Millisecond - time.Sleep(sleep) - return int(sleep) -} diff --git a/vendor/github.com/pingcap/tidb/kv/union_iter.go b/vendor/github.com/pingcap/tidb/kv/union_iter.go deleted file mode 100644 index 41fc795f26ca..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/union_iter.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import "github.com/ngaut/log" - -// UnionIter is the iterator on an UnionStore. -type UnionIter struct { - dirtyIt Iterator - snapshotIt Iterator - - dirtyValid bool - snapshotValid bool - - curIsDirty bool - isValid bool -} - -func newUnionIter(dirtyIt Iterator, snapshotIt Iterator) *UnionIter { - it := &UnionIter{ - dirtyIt: dirtyIt, - snapshotIt: snapshotIt, - dirtyValid: dirtyIt.Valid(), - snapshotValid: snapshotIt.Valid(), - } - it.updateCur() - return it -} - -// Go next and update valid status. -func (iter *UnionIter) dirtyNext() { - iter.dirtyIt.Next() - iter.dirtyValid = iter.dirtyIt.Valid() -} - -// Go next and update valid status. -func (iter *UnionIter) snapshotNext() { - iter.snapshotIt.Next() - iter.snapshotValid = iter.snapshotIt.Valid() -} - -func (iter *UnionIter) updateCur() { - iter.isValid = true - for { - if !iter.dirtyValid && !iter.snapshotValid { - iter.isValid = false - return - } - - if !iter.dirtyValid { - iter.curIsDirty = false - return - } - - if !iter.snapshotValid { - iter.curIsDirty = true - // if delete it - if len(iter.dirtyIt.Value()) == 0 { - iter.dirtyNext() - continue - } - break - } - - // both valid - if iter.snapshotValid && iter.dirtyValid { - snapshotKey := iter.snapshotIt.Key() - dirtyKey := iter.dirtyIt.Key() - cmp := dirtyKey.Cmp(snapshotKey) - // if equal, means both have value - if cmp == 0 { - if len(iter.dirtyIt.Value()) == 0 { - // snapshot has a record, but txn says we have deleted it - // just go next - iter.dirtyNext() - iter.snapshotNext() - continue - } - // both go next - iter.snapshotNext() - iter.curIsDirty = true - break - } else if cmp > 0 { - // record from snapshot comes first - iter.curIsDirty = false - break - } else { - // record from dirty comes first - if len(iter.dirtyIt.Value()) == 0 { - log.Warnf("[kv] delete a record not exists? k = %q", iter.dirtyIt.Key()) - // jump over this deletion - iter.dirtyNext() - continue - } - iter.curIsDirty = true - break - } - } - } -} - -// Next implements the Iterator Next interface. -func (iter *UnionIter) Next() error { - if !iter.curIsDirty { - iter.snapshotNext() - } else { - iter.dirtyNext() - } - iter.updateCur() - return nil -} - -// Value implements the Iterator Value interface. -// Multi columns -func (iter *UnionIter) Value() []byte { - if !iter.curIsDirty { - return iter.snapshotIt.Value() - } - return iter.dirtyIt.Value() -} - -// Key implements the Iterator Key interface. -func (iter *UnionIter) Key() Key { - if !iter.curIsDirty { - return iter.snapshotIt.Key() - } - return iter.dirtyIt.Key() -} - -// Valid implements the Iterator Valid interface. -func (iter *UnionIter) Valid() bool { - return iter.isValid -} - -// Close implements the Iterator Close interface. -func (iter *UnionIter) Close() { - if iter.snapshotIt != nil { - iter.snapshotIt.Close() - iter.snapshotIt = nil - } - if iter.dirtyIt != nil { - iter.dirtyIt.Close() - iter.dirtyIt = nil - } -} diff --git a/vendor/github.com/pingcap/tidb/kv/union_store.go b/vendor/github.com/pingcap/tidb/kv/union_store.go deleted file mode 100644 index b5a093e0882d..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/union_store.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "bytes" - - "github.com/juju/errors" -) - -// UnionStore is a store that wraps a snapshot for read and a BufferStore for buffered write. -// Also, it provides some transaction related utilities. -type UnionStore interface { - MemBuffer - // CheckLazyConditionPairs loads all lazy values from store then checks if all values are matched. - // Lazy condition pairs should be checked before transaction commit. - CheckLazyConditionPairs() error - // WalkBuffer iterates all buffered kv pairs. - WalkBuffer(f func(k Key, v []byte) error) error - // SetOption sets an option with a value, when val is nil, uses the default - // value of this option. - SetOption(opt Option, val interface{}) - // DelOption deletes an option. - DelOption(opt Option) -} - -// Option is used for customizing kv store's behaviors during a transaction. -type Option int - -// Options is an interface of a set of options. Each option is associated with a value. -type Options interface { - // Get gets an option value. - Get(opt Option) (v interface{}, ok bool) -} - -var ( - p = newCache("memdb pool", 100, func() MemBuffer { - return NewMemDbBuffer() - }) -) - -// conditionPair is used to store lazy check condition. -// If condition not match (value is not equal as expected one), returns err. -type conditionPair struct { - key Key - value []byte - err error -} - -// UnionStore is an in-memory Store which contains a buffer for write and a -// snapshot for read. -type unionStore struct { - *BufferStore - snapshot Snapshot // for read - lazyConditionPairs map[string](*conditionPair) // for delay check - opts options -} - -// NewUnionStore builds a new UnionStore. -func NewUnionStore(snapshot Snapshot) UnionStore { - return &unionStore{ - BufferStore: NewBufferStore(snapshot), - snapshot: snapshot, - lazyConditionPairs: make(map[string](*conditionPair)), - opts: make(map[Option]interface{}), - } -} - -type lazyMemBuffer struct { - mb MemBuffer -} - -func (lmb *lazyMemBuffer) Get(k Key) ([]byte, error) { - if lmb.mb == nil { - return nil, ErrNotExist - } - - return lmb.mb.Get(k) -} - -func (lmb *lazyMemBuffer) Set(key Key, value []byte) error { - if lmb.mb == nil { - lmb.mb = p.get() - } - - return lmb.mb.Set(key, value) -} - -func (lmb *lazyMemBuffer) Delete(k Key) error { - if lmb.mb == nil { - lmb.mb = p.get() - } - - return lmb.mb.Delete(k) -} - -func (lmb *lazyMemBuffer) Seek(k Key) (Iterator, error) { - if lmb.mb == nil { - lmb.mb = p.get() - } - - return lmb.mb.Seek(k) -} - -func (lmb *lazyMemBuffer) Release() { - if lmb.mb == nil { - return - } - - lmb.mb.Release() - - p.put(lmb.mb) - lmb.mb = nil -} - -// Get implements the Retriever interface. -func (us *unionStore) Get(k Key) ([]byte, error) { - v, err := us.MemBuffer.Get(k) - if IsErrNotFound(err) { - if _, ok := us.opts.Get(PresumeKeyNotExists); ok { - e, ok := us.opts.Get(PresumeKeyNotExistsError) - if ok && e != nil { - us.markLazyConditionPair(k, nil, e.(error)) - } else { - us.markLazyConditionPair(k, nil, ErrKeyExists) - } - return nil, errors.Trace(ErrNotExist) - } - } - if IsErrNotFound(err) { - v, err = us.BufferStore.r.Get(k) - } - if err != nil { - return v, errors.Trace(err) - } - if len(v) == 0 { - return nil, errors.Trace(ErrNotExist) - } - return v, nil -} - -// markLazyConditionPair marks a kv pair for later check. -// If condition not match, should return e as error. -func (us *unionStore) markLazyConditionPair(k Key, v []byte, e error) { - us.lazyConditionPairs[string(k)] = &conditionPair{ - key: k.Clone(), - value: v, - err: e, - } -} - -// CheckLazyConditionPairs implements the UnionStore interface. -func (us *unionStore) CheckLazyConditionPairs() error { - if len(us.lazyConditionPairs) == 0 { - return nil - } - keys := make([]Key, 0, len(us.lazyConditionPairs)) - for _, v := range us.lazyConditionPairs { - keys = append(keys, v.key) - } - values, err := us.snapshot.BatchGet(keys) - if err != nil { - return errors.Trace(err) - } - - for k, v := range us.lazyConditionPairs { - if len(v.value) == 0 { - if _, exist := values[k]; exist { - return errors.Trace(v.err) - } - } else { - if bytes.Compare(values[k], v.value) != 0 { - return errors.Trace(ErrLazyConditionPairsNotMatch) - } - } - } - return nil -} - -// SetOption implements the UnionStore SetOption interface. -func (us *unionStore) SetOption(opt Option, val interface{}) { - us.opts[opt] = val -} - -// DelOption implements the UnionStore DelOption interface. -func (us *unionStore) DelOption(opt Option) { - delete(us.opts, opt) -} - -// Release implements the UnionStore Release interface. -func (us *unionStore) Release() { - us.snapshot.Release() - us.BufferStore.Release() -} - -type options map[Option]interface{} - -func (opts options) Get(opt Option) (interface{}, bool) { - v, ok := opts[opt] - return v, ok -} diff --git a/vendor/github.com/pingcap/tidb/kv/utils.go b/vendor/github.com/pingcap/tidb/kv/utils.go deleted file mode 100644 index 8fb08d13faed..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/utils.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import ( - "strconv" - - "github.com/juju/errors" -) - -// IncInt64 increases the value for key k in kv store by step. -func IncInt64(rm RetrieverMutator, k Key, step int64) (int64, error) { - val, err := rm.Get(k) - if IsErrNotFound(err) { - err = rm.Set(k, []byte(strconv.FormatInt(step, 10))) - if err != nil { - return 0, errors.Trace(err) - } - return step, nil - } - if err != nil { - return 0, errors.Trace(err) - } - - intVal, err := strconv.ParseInt(string(val), 10, 0) - if err != nil { - return 0, errors.Trace(err) - } - - intVal += step - err = rm.Set(k, []byte(strconv.FormatInt(intVal, 10))) - if err != nil { - return 0, errors.Trace(err) - } - return intVal, nil -} - -// GetInt64 get int64 value which created by IncInt64 method. -func GetInt64(r Retriever, k Key) (int64, error) { - val, err := r.Get(k) - if IsErrNotFound(err) { - return 0, nil - } - if err != nil { - return 0, errors.Trace(err) - } - intVal, err := strconv.ParseInt(string(val), 10, 0) - return intVal, errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/kv/version.go b/vendor/github.com/pingcap/tidb/kv/version.go deleted file mode 100644 index f009215863e8..000000000000 --- a/vendor/github.com/pingcap/tidb/kv/version.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package kv - -import "math" - -// VersionProvider provides increasing IDs. -type VersionProvider interface { - CurrentVersion() (Version, error) -} - -// Version is the wrapper of KV's version. -type Version struct { - Ver uint64 -} - -var ( - // MaxVersion is the maximum version, notice that it's not a valid version. - MaxVersion = Version{Ver: math.MaxUint64} - // MinVersion is the minimum version, it's not a valid version, too. - MinVersion = Version{Ver: 0} -) - -// NewVersion creates a new Version struct. -func NewVersion(v uint64) Version { - return Version{ - Ver: v, - } -} - -// Cmp returns the comparison result of two versions. -// The result will be 0 if a==b, -1 if a < b, and +1 if a > b. -func (v Version) Cmp(another Version) int { - if v.Ver > another.Ver { - return 1 - } else if v.Ver < another.Ver { - return -1 - } - return 0 -} diff --git a/vendor/github.com/pingcap/tidb/meta/autoid/autoid.go b/vendor/github.com/pingcap/tidb/meta/autoid/autoid.go deleted file mode 100644 index b9385e9edac5..000000000000 --- a/vendor/github.com/pingcap/tidb/meta/autoid/autoid.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package autoid - -import ( - "sync" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" -) - -const ( - step = 1000 -) - -// Allocator is an auto increment id generator. -// Just keep id unique actually. -type Allocator interface { - // Alloc allocs the next autoID for table with tableID. - // It gets a batch of autoIDs at a time. So it does not need to access storage for each call. - Alloc(tableID int64) (int64, error) - // Rebase rebases the autoID base for table with tableID and the new base value. - // If allocIDs is true, it will allocate some IDs and save to the cache. - // If allocIDs is false, it will not allocate IDs. - Rebase(tableID, newBase int64, allocIDs bool) error -} - -type allocator struct { - mu sync.Mutex - base int64 - end int64 - store kv.Storage - dbID int64 -} - -// Rebase implements autoid.Allocator Rebase interface. -func (alloc *allocator) Rebase(tableID, newBase int64, allocIDs bool) error { - if tableID == 0 { - return errors.New("Invalid tableID") - } - - alloc.mu.Lock() - defer alloc.mu.Unlock() - if newBase <= alloc.base { - return nil - } - if newBase <= alloc.end { - alloc.base = newBase - return nil - } - - return kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { - m := meta.NewMeta(txn) - end, err := m.GetAutoTableID(alloc.dbID, tableID) - if err != nil { - return errors.Trace(err) - } - - if newBase <= end { - return nil - } - newStep := newBase - end + step - if !allocIDs { - newStep = newBase - end - } - end, err = m.GenAutoTableID(alloc.dbID, tableID, newStep) - if err != nil { - return errors.Trace(err) - } - - alloc.end = end - alloc.base = newBase - if !allocIDs { - alloc.base = alloc.end - } - return nil - }) -} - -// Alloc implements autoid.Allocator Alloc interface. -func (alloc *allocator) Alloc(tableID int64) (int64, error) { - if tableID == 0 { - return 0, errors.New("Invalid tableID") - } - alloc.mu.Lock() - defer alloc.mu.Unlock() - if alloc.base == alloc.end { // step - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { - m := meta.NewMeta(txn) - base, err1 := m.GetAutoTableID(alloc.dbID, tableID) - if err1 != nil { - return errors.Trace(err1) - } - end, err1 := m.GenAutoTableID(alloc.dbID, tableID, step) - if err1 != nil { - return errors.Trace(err1) - } - - alloc.end = end - if end == step { - alloc.base = base - } else { - alloc.base = end - step - } - return nil - }) - - if err != nil { - return 0, errors.Trace(err) - } - } - - alloc.base++ - log.Debugf("[kv] Alloc id %d, table ID:%d, from %p, database ID:%d", alloc.base, tableID, alloc, alloc.dbID) - return alloc.base, nil -} - -var ( - memID int64 - memIDLock sync.Mutex -) - -type memoryAllocator struct { - mu sync.Mutex - base int64 - end int64 - dbID int64 -} - -// Rebase implements autoid.Allocator Rebase interface. -func (alloc *memoryAllocator) Rebase(tableID, newBase int64, allocIDs bool) error { - // TODO: implement it. - return nil -} - -// Alloc implements autoid.Allocator Alloc interface. -func (alloc *memoryAllocator) Alloc(tableID int64) (int64, error) { - if tableID == 0 { - return 0, errors.New("Invalid tableID") - } - alloc.mu.Lock() - defer alloc.mu.Unlock() - if alloc.base == alloc.end { // step - memIDLock.Lock() - memID = memID + step - alloc.end = memID - alloc.base = alloc.end - step - memIDLock.Unlock() - } - alloc.base++ - return alloc.base, nil -} - -// NewAllocator returns a new auto increment id generator on the store. -func NewAllocator(store kv.Storage, dbID int64) Allocator { - return &allocator{ - store: store, - dbID: dbID, - } -} - -// NewMemoryAllocator returns a new auto increment id generator in memory. -func NewMemoryAllocator(dbID int64) Allocator { - return &memoryAllocator{ - dbID: dbID, - } -} diff --git a/vendor/github.com/pingcap/tidb/meta/meta.go b/vendor/github.com/pingcap/tidb/meta/meta.go deleted file mode 100644 index ff8b31679d33..000000000000 --- a/vendor/github.com/pingcap/tidb/meta/meta.go +++ /dev/null @@ -1,650 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package meta - -import ( - "encoding/binary" - "encoding/json" - "fmt" - "strconv" - "strings" - "sync" - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/structure" -) - -var ( - globalIDMutex sync.Mutex -) - -// Meta structure: -// NextGlobalID -> int64 -// SchemaVersion -> int64 -// DBs -> { -// DB:1 -> db meta data []byte -// DB:2 -> db meta data []byte -// } -// DB:1 -> { -// Table:1 -> table meta data []byte -// Table:2 -> table meta data []byte -// TID:1 -> int64 -// TID:2 -> int64 -// } -// - -var ( - mNextGlobalIDKey = []byte("NextGlobalID") - mSchemaVersionKey = []byte("SchemaVersionKey") - mDBs = []byte("DBs") - mDBPrefix = "DB" - mTablePrefix = "Table" - mTableIDPrefix = "TID" - mBootstrapKey = []byte("BootstrapKey") -) - -var ( - // ErrDBExists is the error for db exists. - ErrDBExists = errors.New("database already exists") - // ErrDBNotExists is the error for db not exists. - ErrDBNotExists = errors.New("database doesn't exist") - // ErrTableExists is the error for table exists. - ErrTableExists = errors.New("table already exists") - // ErrTableNotExists is the error for table not exists. - ErrTableNotExists = errors.New("table doesn't exist") -) - -// Meta is for handling meta information in a transaction. -type Meta struct { - txn *structure.TxStructure -} - -// NewMeta creates a Meta in transaction txn. -func NewMeta(txn kv.Transaction) *Meta { - t := structure.NewStructure(txn, []byte{'m'}) - return &Meta{txn: t} -} - -// GenGlobalID generates next id globally. -func (m *Meta) GenGlobalID() (int64, error) { - globalIDMutex.Lock() - defer globalIDMutex.Unlock() - - return m.txn.Inc(mNextGlobalIDKey, 1) -} - -// GetGlobalID gets current global id. -func (m *Meta) GetGlobalID() (int64, error) { - return m.txn.GetInt64(mNextGlobalIDKey) -} - -func (m *Meta) dbKey(dbID int64) []byte { - return []byte(fmt.Sprintf("%s:%d", mDBPrefix, dbID)) -} - -func (m *Meta) parseDatabaseID(key string) (int64, error) { - seps := strings.Split(key, ":") - if len(seps) != 2 { - return 0, errors.Errorf("invalid db key %s", key) - } - - n, err := strconv.ParseInt(seps[1], 10, 64) - return n, errors.Trace(err) -} - -func (m *Meta) autoTalbeIDKey(tableID int64) []byte { - return []byte(fmt.Sprintf("%s:%d", mTableIDPrefix, tableID)) -} - -func (m *Meta) tableKey(tableID int64) []byte { - return []byte(fmt.Sprintf("%s:%d", mTablePrefix, tableID)) -} - -func (m *Meta) parseTableID(key string) (int64, error) { - seps := strings.Split(key, ":") - if len(seps) != 2 { - return 0, errors.Errorf("invalid table meta key %s", key) - } - - n, err := strconv.ParseInt(seps[1], 10, 64) - return n, errors.Trace(err) -} - -// GenAutoTableID adds step to the auto id of the table and returns the sum. -func (m *Meta) GenAutoTableID(dbID int64, tableID int64, step int64) (int64, error) { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return 0, errors.Trace(err) - } - - // Check if table exists. - tableKey := m.tableKey(tableID) - if err := m.checkTableExists(dbKey, tableKey); err != nil { - return 0, errors.Trace(err) - } - - return m.txn.HInc(dbKey, m.autoTalbeIDKey(tableID), step) -} - -// GetAutoTableID gets current auto id with table id. -func (m *Meta) GetAutoTableID(dbID int64, tableID int64) (int64, error) { - return m.txn.HGetInt64(m.dbKey(dbID), m.autoTalbeIDKey(tableID)) -} - -// GetSchemaVersion gets current global schema version. -func (m *Meta) GetSchemaVersion() (int64, error) { - return m.txn.GetInt64(mSchemaVersionKey) -} - -// GenSchemaVersion generates next schema version. -func (m *Meta) GenSchemaVersion() (int64, error) { - return m.txn.Inc(mSchemaVersionKey, 1) -} - -func (m *Meta) checkDBExists(dbKey []byte) error { - v, err := m.txn.HGet(mDBs, dbKey) - if err != nil { - return errors.Trace(err) - } else if v == nil { - return ErrDBNotExists - } - - return nil -} - -func (m *Meta) checkDBNotExists(dbKey []byte) error { - v, err := m.txn.HGet(mDBs, dbKey) - if err != nil { - return errors.Trace(err) - } - - if v != nil { - return ErrDBExists - } - - return nil -} - -func (m *Meta) checkTableExists(dbKey []byte, tableKey []byte) error { - v, err := m.txn.HGet(dbKey, tableKey) - if err != nil { - return errors.Trace(err) - } - - if v == nil { - return ErrTableNotExists - } - - return nil -} - -func (m *Meta) checkTableNotExists(dbKey []byte, tableKey []byte) error { - v, err := m.txn.HGet(dbKey, tableKey) - if err != nil { - return errors.Trace(err) - } - - if v != nil { - return ErrTableExists - } - - return nil -} - -// CreateDatabase creates a database with db info. -func (m *Meta) CreateDatabase(dbInfo *model.DBInfo) error { - dbKey := m.dbKey(dbInfo.ID) - - if err := m.checkDBNotExists(dbKey); err != nil { - return errors.Trace(err) - } - - data, err := json.Marshal(dbInfo) - if err != nil { - return errors.Trace(err) - } - - return m.txn.HSet(mDBs, dbKey, data) -} - -// UpdateDatabase updates a database with db info. -func (m *Meta) UpdateDatabase(dbInfo *model.DBInfo) error { - dbKey := m.dbKey(dbInfo.ID) - - if err := m.checkDBExists(dbKey); err != nil { - return errors.Trace(err) - } - - data, err := json.Marshal(dbInfo) - if err != nil { - return errors.Trace(err) - } - - return m.txn.HSet(mDBs, dbKey, data) -} - -// CreateTable creates a table with tableInfo in database. -func (m *Meta) CreateTable(dbID int64, tableInfo *model.TableInfo) error { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return errors.Trace(err) - } - - // Check if table exists. - tableKey := m.tableKey(tableInfo.ID) - if err := m.checkTableNotExists(dbKey, tableKey); err != nil { - return errors.Trace(err) - } - - data, err := json.Marshal(tableInfo) - if err != nil { - return errors.Trace(err) - } - - return m.txn.HSet(dbKey, tableKey, data) -} - -// DropDatabase drops whole database. -func (m *Meta) DropDatabase(dbID int64) error { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.txn.HClear(dbKey); err != nil { - return errors.Trace(err) - } - - if err := m.txn.HDel(mDBs, dbKey); err != nil { - return errors.Trace(err) - } - - return nil -} - -// DropTable drops table in database. -func (m *Meta) DropTable(dbID int64, tableID int64) error { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return errors.Trace(err) - } - - // Check if table exists. - tableKey := m.tableKey(tableID) - if err := m.checkTableExists(dbKey, tableKey); err != nil { - return errors.Trace(err) - } - - if err := m.txn.HDel(dbKey, tableKey); err != nil { - return errors.Trace(err) - } - - if err := m.txn.HDel(dbKey, m.autoTalbeIDKey(tableID)); err != nil { - return errors.Trace(err) - } - - return nil -} - -// UpdateTable updates the table with table info. -func (m *Meta) UpdateTable(dbID int64, tableInfo *model.TableInfo) error { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return errors.Trace(err) - } - - // Check if table exists. - tableKey := m.tableKey(tableInfo.ID) - if err := m.checkTableExists(dbKey, tableKey); err != nil { - return errors.Trace(err) - } - - data, err := json.Marshal(tableInfo) - if err != nil { - return errors.Trace(err) - } - - err = m.txn.HSet(dbKey, tableKey, data) - return errors.Trace(err) -} - -// ListTables shows all tables in database. -func (m *Meta) ListTables(dbID int64) ([]*model.TableInfo, error) { - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return nil, errors.Trace(err) - } - - res, err := m.txn.HGetAll(dbKey) - if err != nil { - return nil, errors.Trace(err) - } - - tables := make([]*model.TableInfo, 0, len(res)/2) - for _, r := range res { - // only handle table meta - tableKey := string(r.Field) - if !strings.HasPrefix(tableKey, mTablePrefix) { - continue - } - - tbInfo := &model.TableInfo{} - err = json.Unmarshal(r.Value, tbInfo) - if err != nil { - return nil, errors.Trace(err) - } - - tables = append(tables, tbInfo) - } - - return tables, nil -} - -// ListDatabases shows all databases. -func (m *Meta) ListDatabases() ([]*model.DBInfo, error) { - res, err := m.txn.HGetAll(mDBs) - if err != nil { - return nil, errors.Trace(err) - } - - dbs := make([]*model.DBInfo, 0, len(res)) - for _, r := range res { - dbInfo := &model.DBInfo{} - err = json.Unmarshal(r.Value, dbInfo) - if err != nil { - return nil, errors.Trace(err) - } - dbs = append(dbs, dbInfo) - } - return dbs, nil -} - -// GetDatabase gets the database value with ID. -func (m *Meta) GetDatabase(dbID int64) (*model.DBInfo, error) { - dbKey := m.dbKey(dbID) - value, err := m.txn.HGet(mDBs, dbKey) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - dbInfo := &model.DBInfo{} - err = json.Unmarshal(value, dbInfo) - return dbInfo, errors.Trace(err) -} - -// GetTable gets the table value in database with tableID. -func (m *Meta) GetTable(dbID int64, tableID int64) (*model.TableInfo, error) { - // Check if db exists. - dbKey := m.dbKey(dbID) - if err := m.checkDBExists(dbKey); err != nil { - return nil, errors.Trace(err) - } - - tableKey := m.tableKey(tableID) - value, err := m.txn.HGet(dbKey, tableKey) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - tableInfo := &model.TableInfo{} - err = json.Unmarshal(value, tableInfo) - return tableInfo, errors.Trace(err) -} - -// DDL job structure -// DDLOnwer: []byte -// DDLJobList: list jobs -// DDLJobHistory: hash -// DDLJobReorg: hash -// -// for multi DDL workers, only one can become the owner -// to operate DDL jobs, and dispatch them to MR Jobs. - -var ( - mDDLJobOwnerKey = []byte("DDLJobOwner") - mDDLJobListKey = []byte("DDLJobList") - mDDLJobHistoryKey = []byte("DDLJobHistory") - mDDLJobReorgKey = []byte("DDLJobReorg") -) - -func (m *Meta) getJobOwner(key []byte) (*model.Owner, error) { - value, err := m.txn.Get(key) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - owner := &model.Owner{} - err = json.Unmarshal(value, owner) - return owner, errors.Trace(err) -} - -// GetDDLJobOwner gets the current owner for DDL. -func (m *Meta) GetDDLJobOwner() (*model.Owner, error) { - return m.getJobOwner(mDDLJobOwnerKey) -} - -func (m *Meta) setJobOwner(key []byte, o *model.Owner) error { - b, err := json.Marshal(o) - if err != nil { - return errors.Trace(err) - } - return m.txn.Set(key, b) -} - -// SetDDLJobOwner sets the current owner for DDL. -func (m *Meta) SetDDLJobOwner(o *model.Owner) error { - return m.setJobOwner(mDDLJobOwnerKey, o) -} - -func (m *Meta) enQueueDDLJob(key []byte, job *model.Job) error { - b, err := job.Encode() - if err != nil { - return errors.Trace(err) - } - return m.txn.RPush(key, b) -} - -// EnQueueDDLJob adds a DDL job to the list. -func (m *Meta) EnQueueDDLJob(job *model.Job) error { - return m.enQueueDDLJob(mDDLJobListKey, job) -} - -func (m *Meta) deQueueDDLJob(key []byte) (*model.Job, error) { - value, err := m.txn.LPop(key) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - job := &model.Job{} - err = job.Decode(value) - return job, errors.Trace(err) -} - -// DeQueueDDLJob pops a DDL job from the list. -func (m *Meta) DeQueueDDLJob() (*model.Job, error) { - return m.deQueueDDLJob(mDDLJobListKey) -} - -func (m *Meta) getDDLJob(key []byte, index int64) (*model.Job, error) { - value, err := m.txn.LIndex(key, index) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - job := &model.Job{} - err = job.Decode(value) - return job, errors.Trace(err) -} - -// GetDDLJob returns the DDL job with index. -func (m *Meta) GetDDLJob(index int64) (*model.Job, error) { - job, err := m.getDDLJob(mDDLJobListKey, index) - return job, errors.Trace(err) -} - -func (m *Meta) updateDDLJob(index int64, job *model.Job, key []byte) error { - // TODO: use timestamp allocated by TSO - job.LastUpdateTS = time.Now().UnixNano() - b, err := job.Encode() - if err != nil { - return errors.Trace(err) - } - return m.txn.LSet(key, index, b) -} - -// UpdateDDLJob updates the DDL job with index. -func (m *Meta) UpdateDDLJob(index int64, job *model.Job) error { - return m.updateDDLJob(index, job, mDDLJobListKey) -} - -// DDLJobQueueLen returns the DDL job queue length. -func (m *Meta) DDLJobQueueLen() (int64, error) { - return m.txn.LLen(mDDLJobListKey) -} - -func (m *Meta) jobIDKey(id int64) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(id)) - return b -} - -func (m *Meta) addHistoryDDLJob(key []byte, job *model.Job) error { - b, err := job.Encode() - if err != nil { - return errors.Trace(err) - } - - return m.txn.HSet(key, m.jobIDKey(job.ID), b) -} - -// AddHistoryDDLJob adds DDL job to history. -func (m *Meta) AddHistoryDDLJob(job *model.Job) error { - return m.addHistoryDDLJob(mDDLJobHistoryKey, job) -} - -func (m *Meta) getHistoryDDLJob(key []byte, id int64) (*model.Job, error) { - value, err := m.txn.HGet(key, m.jobIDKey(id)) - if err != nil || value == nil { - return nil, errors.Trace(err) - } - - job := &model.Job{} - err = job.Decode(value) - return job, errors.Trace(err) -} - -// GetHistoryDDLJob gets a history DDL job. -func (m *Meta) GetHistoryDDLJob(id int64) (*model.Job, error) { - return m.getHistoryDDLJob(mDDLJobHistoryKey, id) -} - -// IsBootstrapped returns whether we have already run bootstrap or not. -// return true means we don't need doing any other bootstrap. -func (m *Meta) IsBootstrapped() (bool, error) { - value, err := m.txn.GetInt64(mBootstrapKey) - if err != nil { - return false, errors.Trace(err) - } - return value == 1, nil -} - -// FinishBootstrap finishes bootstrap. -func (m *Meta) FinishBootstrap() error { - err := m.txn.Set(mBootstrapKey, []byte("1")) - return errors.Trace(err) -} - -// UpdateDDLReorgHandle saves the job reorganization latest processed handle for later resuming. -func (m *Meta) UpdateDDLReorgHandle(job *model.Job, handle int64) error { - err := m.txn.HSet(mDDLJobReorgKey, m.jobIDKey(job.ID), []byte(strconv.FormatInt(handle, 10))) - return errors.Trace(err) -} - -// RemoveDDLReorgHandle removes the job reorganization handle. -func (m *Meta) RemoveDDLReorgHandle(job *model.Job) error { - err := m.txn.HDel(mDDLJobReorgKey, m.jobIDKey(job.ID)) - return errors.Trace(err) -} - -// GetDDLReorgHandle gets the latest processed handle. -func (m *Meta) GetDDLReorgHandle(job *model.Job) (int64, error) { - value, err := m.txn.HGetInt64(mDDLJobReorgKey, m.jobIDKey(job.ID)) - return value, errors.Trace(err) -} - -// DDL background job structure -// BgJobOnwer: []byte -// BgJobList: list jobs -// BgJobHistory: hash -// BgJobReorg: hash -// -// for multi background worker, only one can become the owner -// to operate background job, and dispatch them to MR background job. - -var ( - mBgJobOwnerKey = []byte("BgJobOwner") - mBgJobListKey = []byte("BgJobList") - mBgJobHistoryKey = []byte("BgJobHistory") -) - -// UpdateBgJob updates the background job with index. -func (m *Meta) UpdateBgJob(index int64, job *model.Job) error { - return m.updateDDLJob(index, job, mBgJobListKey) -} - -// GetBgJob returns the background job with index. -func (m *Meta) GetBgJob(index int64) (*model.Job, error) { - job, err := m.getDDLJob(mBgJobListKey, index) - - return job, errors.Trace(err) -} - -// EnQueueBgJob adds a background job to the list. -func (m *Meta) EnQueueBgJob(job *model.Job) error { - return m.enQueueDDLJob(mBgJobListKey, job) -} - -// BgJobQueueLen returns the background job queue length. -func (m *Meta) BgJobQueueLen() (int64, error) { - return m.txn.LLen(mBgJobListKey) -} - -// AddHistoryBgJob adds background job to history. -func (m *Meta) AddHistoryBgJob(job *model.Job) error { - return m.addHistoryDDLJob(mBgJobHistoryKey, job) -} - -// GetHistoryBgJob gets a history background job. -func (m *Meta) GetHistoryBgJob(id int64) (*model.Job, error) { - return m.getHistoryDDLJob(mBgJobHistoryKey, id) -} - -// DeQueueBgJob pops a background job from the list. -func (m *Meta) DeQueueBgJob() (*model.Job, error) { - return m.deQueueDDLJob(mBgJobListKey) -} - -// GetBgJobOwner gets the current background job owner. -func (m *Meta) GetBgJobOwner() (*model.Owner, error) { - return m.getJobOwner(mBgJobOwnerKey) -} - -// SetBgJobOwner sets the current background job owner. -func (m *Meta) SetBgJobOwner(o *model.Owner) error { - return m.setJobOwner(mBgJobOwnerKey, o) -} diff --git a/vendor/github.com/pingcap/tidb/model/ddl.go b/vendor/github.com/pingcap/tidb/model/ddl.go deleted file mode 100644 index d8809dac140c..000000000000 --- a/vendor/github.com/pingcap/tidb/model/ddl.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "encoding/json" - "fmt" - - "github.com/juju/errors" -) - -// ActionType is the type for DDL action. -type ActionType byte - -// List DDL actions. -const ( - ActionNone ActionType = iota - ActionCreateSchema - ActionDropSchema - ActionCreateTable - ActionDropTable - ActionAddColumn - ActionDropColumn - ActionAddIndex - ActionDropIndex -) - -func (action ActionType) String() string { - switch action { - case ActionCreateSchema: - return "create schema" - case ActionDropSchema: - return "drop schema" - case ActionCreateTable: - return "create table" - case ActionDropTable: - return "drop table" - case ActionAddColumn: - return "add column" - case ActionDropColumn: - return "drop column" - case ActionAddIndex: - return "add index" - case ActionDropIndex: - return "drop index" - default: - return "none" - } -} - -// Job is for a DDL operation. -type Job struct { - ID int64 `json:"id"` - Type ActionType `json:"type"` - SchemaID int64 `json:"schema_id"` - TableID int64 `json:"table_id"` - State JobState `json:"state"` - Error string `json:"err"` - // every time we meet an error when running job, we will increase it - ErrorCount int64 `json:"err_count"` - Args []interface{} `json:"-"` - // we must use json raw message for delay parsing special args. - RawArgs json.RawMessage `json:"raw_args"` - SchemaState SchemaState `json:"schema_state"` - // snapshot version for this job. - SnapshotVer uint64 `json:"snapshot_ver"` - // unix nano seconds - // TODO: use timestamp allocated by TSO - LastUpdateTS int64 `json:"last_update_ts"` -} - -// Encode encodes job with json format. -func (job *Job) Encode() ([]byte, error) { - var err error - job.RawArgs, err = json.Marshal(job.Args) - if err != nil { - return nil, errors.Trace(err) - } - - var b []byte - b, err = json.Marshal(job) - return b, errors.Trace(err) -} - -// Decode decodes job from the json buffer, we must use DecodeArgs later to -// decode special args for this job. -func (job *Job) Decode(b []byte) error { - err := json.Unmarshal(b, job) - return errors.Trace(err) -} - -// DecodeArgs decodes job args. -func (job *Job) DecodeArgs(args ...interface{}) error { - job.Args = args - err := json.Unmarshal(job.RawArgs, &job.Args) - return errors.Trace(err) -} - -// String implements fmt.Stringer interface. -func (job *Job) String() string { - return fmt.Sprintf("ID:%d, Type:%s, State:%s, SchemaState:%s, SchemaID:%d, TableID:%d, Args:%s", - job.ID, job.Type, job.State, job.SchemaState, job.SchemaID, job.TableID, job.RawArgs) -} - -// IsFinished returns whether job is finished or not. -// If the job state is Done or Cancelled, it is finished. -func (job *Job) IsFinished() bool { - return job.State == JobDone || job.State == JobCancelled -} - -// IsRunning returns whether job is still running or not. -func (job *Job) IsRunning() bool { - return job.State == JobRunning -} - -// JobState is for job state. -type JobState byte - -// List job states. -const ( - JobNone JobState = iota - JobRunning - JobDone - JobCancelled -) - -// String implements fmt.Stringer interface. -func (s JobState) String() string { - switch s { - case JobRunning: - return "running" - case JobDone: - return "done" - case JobCancelled: - return "cancelled" - default: - return "none" - } -} - -// Owner is for DDL Owner. -type Owner struct { - OwnerID string `json:"owner_id"` - // unix nano seconds - // TODO: use timestamp allocated by TSO - LastUpdateTS int64 `json:"last_update_ts"` -} - -// String implements fmt.Stringer interface. -func (o *Owner) String() string { - return fmt.Sprintf("ID:%s, LastUpdateTS:%d", o.OwnerID, o.LastUpdateTS) -} diff --git a/vendor/github.com/pingcap/tidb/model/model.go b/vendor/github.com/pingcap/tidb/model/model.go deleted file mode 100644 index 6c19baead001..000000000000 --- a/vendor/github.com/pingcap/tidb/model/model.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package model - -import ( - "strings" - - "github.com/pingcap/tidb/util/types" -) - -// SchemaState is the state for schema elements. -type SchemaState byte - -const ( - // StateNone means this schema element is absent and can't be used. - StateNone SchemaState = iota - // StateDeleteOnly means we can only delete items for this schema element. - StateDeleteOnly - // StateWriteOnly means we can use any write operation on this schema element, - // but outer can't read the changed data. - StateWriteOnly - // StateWriteReorganization means we are re-organizating whole data after write only state. - StateWriteReorganization - // StateDeleteReorganization means we are re-organizating whole data after delete only state. - StateDeleteReorganization - // StatePublic means this schema element is ok for all write and read operations. - StatePublic -) - -// String implements fmt.Stringer interface. -func (s SchemaState) String() string { - switch s { - case StateDeleteOnly: - return "delete only" - case StateWriteOnly: - return "write only" - case StateWriteReorganization: - return "write reorganization" - case StateDeleteReorganization: - return "delete reorganization" - case StatePublic: - return "public" - default: - return "none" - } -} - -// ColumnInfo provides meta data describing of a table column. -type ColumnInfo struct { - ID int64 `json:"id"` - Name CIStr `json:"name"` - Offset int `json:"offset"` - DefaultValue interface{} `json:"default"` - types.FieldType `json:"type"` - State SchemaState `json:"state"` -} - -// Clone clones ColumnInfo. -func (c *ColumnInfo) Clone() *ColumnInfo { - nc := *c - return &nc -} - -// TableInfo provides meta data describing a DB table. -type TableInfo struct { - ID int64 `json:"id"` - Name CIStr `json:"name"` - Charset string `json:"charset"` - Collate string `json:"collate"` - // Columns are listed in the order in which they appear in the schema. - Columns []*ColumnInfo `json:"cols"` - Indices []*IndexInfo `json:"index_info"` - State SchemaState `json:"state"` - PKIsHandle bool `json:"pk_is_handle"` - Comment string `json:"comment"` -} - -// Clone clones TableInfo. -func (t *TableInfo) Clone() *TableInfo { - nt := *t - nt.Columns = make([]*ColumnInfo, len(t.Columns)) - nt.Indices = make([]*IndexInfo, len(t.Indices)) - - for i := range t.Columns { - nt.Columns[i] = t.Columns[i].Clone() - } - - for i := range t.Indices { - nt.Indices[i] = t.Indices[i].Clone() - } - return &nt -} - -// IndexColumn provides index column info. -type IndexColumn struct { - Name CIStr `json:"name"` // Index name - Offset int `json:"offset"` // Index offset - Length int `json:"length"` // Index length -} - -// Clone clones IndexColumn. -func (i *IndexColumn) Clone() *IndexColumn { - ni := *i - return &ni -} - -// IndexType is the type of index -type IndexType int - -// String implements Stringer interface. -func (t IndexType) String() string { - switch t { - case IndexTypeBtree: - return "BTREE" - case IndexTypeHash: - return "HASH" - } - return "" -} - -// IndexTypes -const ( - IndexTypeBtree IndexType = iota + 1 - IndexTypeHash -) - -// IndexInfo provides meta data describing a DB index. -// It corresponds to the statement `CREATE INDEX Name ON Table (Column);` -// See: https://dev.mysql.com/doc/refman/5.7/en/create-index.html -type IndexInfo struct { - ID int64 `json:"id"` - Name CIStr `json:"idx_name"` // Index name. - Table CIStr `json:"tbl_name"` // Table name. - Columns []*IndexColumn `json:"idx_cols"` // Index columns. - Unique bool `json:"is_unique"` // Whether the index is unique. - Primary bool `json:"is_primary"` // Whether the index is primary key. - State SchemaState `json:"state"` - Comment string `json:"comment"` // Comment - Tp IndexType `json:"index_type"` // Index type: Btree or Hash -} - -// Clone clones IndexInfo. -func (index *IndexInfo) Clone() *IndexInfo { - ni := *index - ni.Columns = make([]*IndexColumn, len(index.Columns)) - for i := range index.Columns { - ni.Columns[i] = index.Columns[i].Clone() - } - return &ni -} - -// DBInfo provides meta data describing a DB. -type DBInfo struct { - ID int64 `json:"id"` // Database ID - Name CIStr `json:"db_name"` // DB name. - Charset string `json:"charset"` - Collate string `json:"collate"` - Tables []*TableInfo `json:"-"` // Tables in the DB. - State SchemaState `json:"state"` -} - -// Clone clones DBInfo. -func (db *DBInfo) Clone() *DBInfo { - newInfo := *db - newInfo.Tables = make([]*TableInfo, len(db.Tables)) - for i := range db.Tables { - newInfo.Tables[i] = db.Tables[i].Clone() - } - return &newInfo -} - -// CIStr is case insensitve string. -type CIStr struct { - O string `json:"O"` // Original string. - L string `json:"L"` // Lower case string. -} - -// String implements fmt.Stringer interface. -func (cis CIStr) String() string { - return cis.O -} - -// NewCIStr creates a new CIStr. -func NewCIStr(s string) (cs CIStr) { - cs.O = s - cs.L = strings.ToLower(s) - return -} diff --git a/vendor/github.com/pingcap/tidb/mysql/bit.go b/vendor/github.com/pingcap/tidb/mysql/bit.go deleted file mode 100644 index 4f76dceb1824..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/bit.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "fmt" - "strconv" - "strings" - - "github.com/juju/errors" -) - -// Bit is for mysql bit type. -type Bit struct { - // Value holds the value for bit type. - Value uint64 - - // Width is the display with for bit value. - // e.g, with is 8, 0 is for 0b00000000. - Width int -} - -// String implements fmt.Stringer interface. -func (b Bit) String() string { - format := fmt.Sprintf("0b%%0%db", b.Width) - return fmt.Sprintf(format, b.Value) -} - -// ToNumber changes bit type to float64 for numeric operation. -// MySQL treats bit as double type. -func (b Bit) ToNumber() float64 { - return float64(b.Value) -} - -// ToString returns the binary string for bit type. -func (b Bit) ToString() string { - byteSize := (b.Width + 7) / 8 - buf := make([]byte, byteSize) - for i := byteSize - 1; i >= 0; i-- { - buf[byteSize-i-1] = byte(b.Value >> uint(i*8)) - } - return string(buf) -} - -// Min and Max bit width. -const ( - MinBitWidth = 1 - MaxBitWidth = 64 - // UnspecifiedBitWidth is the unspecified with if you want to calculate bit width dynamically. - UnspecifiedBitWidth = -1 -) - -// ParseBit parses bit string. -// The string format can be b'val', B'val' or 0bval, val must be 0 or 1. -// Width is the display width for bit representation. -1 means calculating -// width dynamically, using following algorithm: (len("011101") + 7) & ^7, -// e.g, if bit string is 0b01, the above will return 8 for its bit width. -func ParseBit(s string, width int) (Bit, error) { - if len(s) == 0 { - return Bit{}, errors.Errorf("invalid empty string for parsing bit type") - } - - if s[0] == 'b' || s[0] == 'B' { - // format is b'val' or B'val' - s = strings.Trim(s[1:], "'") - } else if strings.HasPrefix(s, "0b") { - s = s[2:] - } else { - // here means format is not b'val', B'val' or 0bval. - return Bit{}, errors.Errorf("invalid bit type format %s", s) - } - - if width == UnspecifiedBitWidth { - width = (len(s) + 7) & ^7 - } - - if width == 0 { - width = MinBitWidth - } - - if width < MinBitWidth || width > MaxBitWidth { - return Bit{}, errors.Errorf("invalid display width for bit type, must in [1, 64], but %d", width) - } - - n, err := strconv.ParseUint(s, 2, 64) - if err != nil { - return Bit{}, errors.Trace(err) - } - - if n > (uint64(1)< 0 { - // It is scientific notation, like 3.14e10 - expInt, err := strconv.Atoi(value[n+1:]) - if err != nil { - return Decimal{}, fmt.Errorf("can't convert %s to decimal, incorrect exponent", value) - } - value = value[0:n] - exp = int32(expInt) - } - - parts := strings.Split(value, ".") - if len(parts) == 1 { - // There is no decimal point, we can just parse the original string as - // an int. - intString = value - } else if len(parts) == 2 { - intString = parts[0] + parts[1] - expInt := -len(parts[1]) - exp += int32(expInt) - } else { - return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) - } - - dValue := new(big.Int) - _, ok := dValue.SetString(intString, 10) - if !ok { - return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) - } - - val := Decimal{ - value: dValue, - exp: exp, - fracDigits: fracDigitsDefault(exp), - } - if exp < -MaxFractionDigits { - val = val.rescale(-MaxFractionDigits) - } - return val, nil -} - -// NewDecimalFromFloat converts a float64 to Decimal. -// -// Example: -// -// NewDecimalFromFloat(123.45678901234567).String() // output: "123.4567890123456" -// NewDecimalFromFloat(.00000000000000001).String() // output: "0.00000000000000001" -// -// NOTE: this will panic on NaN, +/-inf. -func NewDecimalFromFloat(value float64) Decimal { - floor := math.Floor(value) - - // fast path, where float is an int. - if floor == value && !math.IsInf(value, 0) { - return NewDecimalFromInt(int64(value), 0) - } - - str := strconv.FormatFloat(value, 'f', -1, 64) - dec, err := ParseDecimal(str) - if err != nil { - panic(err) - } - return dec -} - -// NewDecimalFromFloatWithExponent converts a float64 to Decimal, with an arbitrary -// number of fractional digits. -// -// Example: -// -// NewDecimalFromFloatWithExponent(123.456, -2).String() // output: "123.46" -// -func NewDecimalFromFloatWithExponent(value float64, exp int32) Decimal { - mul := math.Pow(10, -float64(exp)) - floatValue := value * mul - if math.IsNaN(floatValue) || math.IsInf(floatValue, 0) { - panic(fmt.Sprintf("Cannot create a Decimal from %v", floatValue)) - } - dValue := big.NewInt(round(floatValue)) - - return Decimal{ - value: dValue, - exp: exp, - fracDigits: fracDigitsDefault(exp), - } -} - -// rescale returns a rescaled version of the decimal. Returned -// decimal may be less precise if the given exponent is bigger -// than the initial exponent of the Decimal. -// NOTE: this will truncate, NOT round -// -// Example: -// -// d := New(12345, -4) -// d2 := d.rescale(-1) -// d3 := d2.rescale(-4) -// println(d1) -// println(d2) -// println(d3) -// -// Output: -// -// 1.2345 -// 1.2 -// 1.2000 -// -func (d Decimal) rescale(exp int32) Decimal { - d.ensureInitialized() - if exp < -MaxFractionDigits-1 { - // Limit the number of digits but we can not call Round here because it is called by Round. - // Limit it to MaxFractionDigits + 1 to make sure the final result is correct. - exp = -MaxFractionDigits - 1 - } - // Must convert exps to float64 before - to prevent overflow. - diff := math.Abs(float64(exp) - float64(d.exp)) - value := new(big.Int).Set(d.value) - - expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) - if exp > d.exp { - value = value.Quo(value, expScale) - } else if exp < d.exp { - value = value.Mul(value, expScale) - } - return Decimal{ - value: value, - exp: exp, - fracDigits: d.fracDigits, - } -} - -// Abs returns the absolute value of the decimal. -func (d Decimal) Abs() Decimal { - d.ensureInitialized() - d2Value := new(big.Int).Abs(d.value) - return Decimal{ - value: d2Value, - exp: d.exp, - fracDigits: d.fracDigits, - } -} - -// Add returns d + d2. -func (d Decimal) Add(d2 Decimal) Decimal { - baseExp := min(d.exp, d2.exp) - rd := d.rescale(baseExp) - rd2 := d2.rescale(baseExp) - - d3Value := new(big.Int).Add(rd.value, rd2.value) - return Decimal{ - value: d3Value, - exp: baseExp, - fracDigits: fracDigitsPlus(d.fracDigits, d2.fracDigits), - } -} - -// Sub returns d - d2. -func (d Decimal) Sub(d2 Decimal) Decimal { - baseExp := min(d.exp, d2.exp) - rd := d.rescale(baseExp) - rd2 := d2.rescale(baseExp) - - d3Value := new(big.Int).Sub(rd.value, rd2.value) - return Decimal{ - value: d3Value, - exp: baseExp, - fracDigits: fracDigitsPlus(d.fracDigits, d2.fracDigits), - } -} - -// Mul returns d * d2. -func (d Decimal) Mul(d2 Decimal) Decimal { - d.ensureInitialized() - d2.ensureInitialized() - - expInt64 := int64(d.exp) + int64(d2.exp) - if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { - // It is better to panic than to give incorrect results, as - // decimals are usually used for money. - panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) - } - - d3Value := new(big.Int).Mul(d.value, d2.value) - val := Decimal{ - value: d3Value, - exp: int32(expInt64), - fracDigits: fracDigitsMul(d.fracDigits, d2.fracDigits), - } - if val.exp < -(MaxFractionDigits) { - val = val.Round(MaxFractionDigits) - } - return val -} - -// Div returns d / d2. If it doesn't divide exactly, the result will have -// DivisionPrecision digits after the decimal point. -func (d Decimal) Div(d2 Decimal) Decimal { - // Division is hard, use Rat to do it. - ratNum := d.Rat() - ratDenom := d2.Rat() - - quoRat := big.NewRat(0, 1).Quo(ratNum, ratDenom) - - // Converting from Rat to Decimal inefficiently for now. - ret, err := ParseDecimal(quoRat.FloatString(MaxFractionDigits + 1)) - if err != nil { - panic(err) // This should never happen. - } - // To pass test "2 / 3 * 3 < 2" -> "1". - ret = ret.Truncate(MaxFractionDigits) - ret.fracDigits = fracDigitsDiv(d.fracDigits) - return ret -} - -// Cmp compares the numbers represented by d and d2, and returns: -// -// -1 if d < d2 -// 0 if d == d2 -// +1 if d > d2 -// -func (d Decimal) Cmp(d2 Decimal) int { - baseExp := min(d.exp, d2.exp) - rd := d.rescale(baseExp) - rd2 := d2.rescale(baseExp) - - return rd.value.Cmp(rd2.value) -} - -// Equals returns whether the numbers represented by d and d2 are equal. -func (d Decimal) Equals(d2 Decimal) bool { - return d.Cmp(d2) == 0 -} - -// Exponent returns the exponent, or scale component of the decimal. -func (d Decimal) Exponent() int32 { - return d.exp -} - -// FracDigits returns the number of fractional digits of the decimal. -func (d Decimal) FracDigits() int32 { - return d.fracDigits -} - -// IntPart returns the integer component of the decimal. -func (d Decimal) IntPart() int64 { - scaledD := d.rescale(0) - return scaledD.value.Int64() -} - -// Rat returns a rational number representation of the decimal. -func (d Decimal) Rat() *big.Rat { - d.ensureInitialized() - if d.exp <= 0 { - // It must negate after casting to prevent int32 overflow. - denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) - return new(big.Rat).SetFrac(d.value, denom) - } - - mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) - num := new(big.Int).Mul(d.value, mul) - return new(big.Rat).SetFrac(num, oneInt) -} - -// Float64 returns the nearest float64 value for d and a bool indicating -// whether f represents d exactly. -// For more details, see the documentation for big.Rat.Float64. -func (d Decimal) Float64() (f float64, exact bool) { - return d.Rat().Float64() -} - -// String returns the string representation of the decimal -// with the fixed point. -// -// Example: -// -// d := New(-12345, -3) -// println(d.String()) -// -// Output: -// -// -12.345 -// -func (d Decimal) String() string { - return d.StringFixed(d.fracDigits) -} - -// StringFixed returns a rounded fixed-point string with places digits after -// the decimal point. -// -// Example: -// -// NewFromFloat(0).StringFixed(2) // output: "0.00" -// NewFromFloat(0).StringFixed(0) // output: "0" -// NewFromFloat(5.45).StringFixed(0) // output: "5" -// NewFromFloat(5.45).StringFixed(1) // output: "5.5" -// NewFromFloat(5.45).StringFixed(2) // output: "5.45" -// NewFromFloat(5.45).StringFixed(3) // output: "5.450" -// NewFromFloat(545).StringFixed(-1) // output: "550" -// -func (d Decimal) StringFixed(places int32) string { - rounded := d.Round(places) - return rounded.string(false) -} - -// Round rounds the decimal to places decimal places. -// If places < 0, it will round the integer part to the nearest 10^(-places). -// -// Example: -// -// NewFromFloat(5.45).Round(1).String() // output: "5.5" -// NewFromFloat(545).Round(-1).String() // output: "550" -// -func (d Decimal) Round(places int32) Decimal { - // Truncate to places + 1. - ret := d.rescale(-places - 1) - - // Add sign(d) * 0.5. - if ret.value.Sign() < 0 { - ret.value.Sub(ret.value, fiveInt) - } else { - ret.value.Add(ret.value, fiveInt) - } - - // Floor for positive numbers, Ceil for negative numbers. - _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) - ret.exp++ - if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { - ret.value.Add(ret.value, oneInt) - } - ret.fracDigits = places - return ret -} - -// Floor returns the nearest integer value less than or equal to d. -func (d Decimal) Floor() Decimal { - d.ensureInitialized() - - exp := big.NewInt(10) - - // It must negate after casting to prevent int32 overflow. - exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) - - z := new(big.Int).Div(d.value, exp) - return Decimal{value: z, exp: 0} -} - -// Ceil returns the nearest integer value greater than or equal to d. -func (d Decimal) Ceil() Decimal { - d.ensureInitialized() - - exp := big.NewInt(10) - - // It must negate after casting to prevent int32 overflow. - exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) - - z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) - if m.Cmp(zeroInt) != 0 { - z.Add(z, oneInt) - } - return Decimal{value: z, exp: 0} -} - -// Truncate truncates off digits from the number, without rounding. -// -// NOTE: precision is the last digit that will not be truncated (must be >= 0). -// -// Example: -// -// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" -// -func (d Decimal) Truncate(precision int32) Decimal { - d.ensureInitialized() - if precision >= 0 && -precision > d.exp { - d = d.rescale(-precision) - } - d.fracDigits = precision - return d -} - -// UnmarshalJSON implements the json.Unmarshaler interface. -func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { - str, err := unquoteIfQuoted(decimalBytes) - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) - } - - decimal, err := ParseDecimal(str) - *d = decimal - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", str, err) - } - return nil -} - -// MarshalJSON implements the json.Marshaler interface. -func (d Decimal) MarshalJSON() ([]byte, error) { - str := "\"" + d.String() + "\"" - return []byte(str), nil -} - -// Scan implements the sql.Scanner interface for database deserialization. -func (d *Decimal) Scan(value interface{}) error { - str, err := unquoteIfQuoted(value) - if err != nil { - return err - } - *d, err = ParseDecimal(str) - - return err -} - -// Value implements the driver.Valuer interface for database serialization. -func (d Decimal) Value() (driver.Value, error) { - return d.String(), nil -} - -// BigIntValue returns the *bit.Int value member of decimal. -func (d Decimal) BigIntValue() *big.Int { - return d.value -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface for XML -// deserialization. -func (d *Decimal) UnmarshalText(text []byte) error { - str := string(text) - - dec, err := ParseDecimal(str) - *d = dec - if err != nil { - return fmt.Errorf("Error decoding string '%s': %s", str, err) - } - - return nil -} - -// MarshalText implements the encoding.TextMarshaler interface for XML -// serialization. -func (d Decimal) MarshalText() (text []byte, err error) { - return []byte(d.String()), nil -} - -// StringScaled first scales the decimal then calls .String() on it. -// NOTE: buggy, unintuitive, and DEPRECATED! Use StringFixed instead. -func (d Decimal) StringScaled(exp int32) string { - return d.rescale(exp).String() -} - -func (d Decimal) string(trimTrailingZeros bool) string { - if d.exp >= 0 { - return d.rescale(0).value.String() - } - - abs := new(big.Int).Abs(d.value) - str := abs.String() - - var intPart, fractionalPart string - - // this cast to int will cause bugs if d.exp == INT_MIN - // and you are on a 32-bit machine. Won't fix this super-edge case. - dExpInt := int(d.exp) - if len(str) > -dExpInt { - intPart = str[:len(str)+dExpInt] - fractionalPart = str[len(str)+dExpInt:] - } else { - intPart = "0" - - num0s := -dExpInt - len(str) - fractionalPart = strings.Repeat("0", num0s) + str - } - - if trimTrailingZeros { - i := len(fractionalPart) - 1 - for ; i >= 0; i-- { - if fractionalPart[i] != '0' { - break - } - } - fractionalPart = fractionalPart[:i+1] - } - - number := intPart - if len(fractionalPart) > 0 { - number += "." + fractionalPart - } - - if d.value.Sign() < 0 { - return "-" + number - } - - return number -} - -func (d *Decimal) ensureInitialized() { - if d.value == nil { - d.value = new(big.Int) - } -} - -func min(x, y int32) int32 { - if x >= y { - return y - } - return x -} - -func max(x, y int32) int32 { - if x >= y { - return x - } - return y -} - -func round(n float64) int64 { - if n < 0 { - return int64(n - 0.5) - } - return int64(n + 0.5) -} - -func unquoteIfQuoted(value interface{}) (string, error) { - bytes, ok := value.([]byte) - if !ok { - return "", fmt.Errorf("Could not convert value '%+v' to byte array", - value) - } - - // If the amount is quoted, strip the quotes. - if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { - bytes = bytes[1 : len(bytes)-1] - } - return string(bytes), nil -} - -func fracDigitsDefault(exp int32) int32 { - if exp < 0 { - return min(MaxFractionDigits, -exp) - } - - return 0 -} - -func fracDigitsPlus(x, y int32) int32 { - return max(x, y) -} - -func fracDigitsDiv(x int32) int32 { - return min(x+DivIncreasePrecision, MaxFractionDigits) -} - -func fracDigitsMul(a, b int32) int32 { - return min(MaxFractionDigits, a+b) -} diff --git a/vendor/github.com/pingcap/tidb/mysql/enum.go b/vendor/github.com/pingcap/tidb/mysql/enum.go deleted file mode 100644 index 425a3e1b5209..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/enum.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "strconv" - "strings" - - "github.com/juju/errors" -) - -// Enum is for MySQL enum type. -type Enum struct { - Name string - Value uint64 -} - -// String implements fmt.Stringer interface. -func (e Enum) String() string { - return e.Name -} - -// ToNumber changes enum index to float64 for numeric operation. -func (e Enum) ToNumber() float64 { - return float64(e.Value) -} - -// ParseEnumName creates a Enum with item name. -func ParseEnumName(elems []string, name string) (Enum, error) { - for i, n := range elems { - if strings.EqualFold(n, name) { - return Enum{Name: n, Value: uint64(i) + 1}, nil - } - } - - // name doesn't exist, maybe an integer? - if num, err := strconv.ParseUint(name, 0, 64); err == nil { - return ParseEnumValue(elems, num) - } - - return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) -} - -// ParseEnumValue creates a Enum with special number. -func ParseEnumValue(elems []string, number uint64) (Enum, error) { - if number == 0 || number > uint64(len(elems)) { - return Enum{}, errors.Errorf("number %d overflow enum boundary [1, %d]", number, len(elems)) - } - - return Enum{Name: elems[number-1], Value: number}, nil -} diff --git a/vendor/github.com/pingcap/tidb/mysql/errcode.go b/vendor/github.com/pingcap/tidb/mysql/errcode.go deleted file mode 100644 index 8de53d7e7133..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/errcode.go +++ /dev/null @@ -1,885 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -// MySQL error code. -// This value is numeric. It is not portable to other database systems. -const ( - ErrErrorFirst uint16 = 1000 - ErrHashchk = 1000 - ErrNisamchk = 1001 - ErrNo = 1002 - ErrYes = 1003 - ErrCantCreateFile = 1004 - ErrCantCreateTable = 1005 - ErrCantCreateDb = 1006 - ErrDbCreateExists = 1007 - ErrDbDropExists = 1008 - ErrDbDropDelete = 1009 - ErrDbDropRmdir = 1010 - ErrCantDeleteFile = 1011 - ErrCantFindSystemRec = 1012 - ErrCantGetStat = 1013 - ErrCantGetWd = 1014 - ErrCantLock = 1015 - ErrCantOpenFile = 1016 - ErrFileNotFound = 1017 - ErrCantReadDir = 1018 - ErrCantSetWd = 1019 - ErrCheckread = 1020 - ErrDiskFull = 1021 - ErrDupKey = 1022 - ErrErrorOnClose = 1023 - ErrErrorOnRead = 1024 - ErrErrorOnRename = 1025 - ErrErrorOnWrite = 1026 - ErrFileUsed = 1027 - ErrFilsortAbort = 1028 - ErrFormNotFound = 1029 - ErrGetErrno = 1030 - ErrIllegalHa = 1031 - ErrKeyNotFound = 1032 - ErrNotFormFile = 1033 - ErrNotKeyfile = 1034 - ErrOldKeyfile = 1035 - ErrOpenAsReadonly = 1036 - ErrOutofmemory = 1037 - ErrOutOfSortmemory = 1038 - ErrUnexpectedEOF = 1039 - ErrConCount = 1040 - ErrOutOfResources = 1041 - ErrBadHost = 1042 - ErrHandshake = 1043 - ErrDbaccessDenied = 1044 - ErrAccessDenied = 1045 - ErrNoDb = 1046 - ErrUnknownCom = 1047 - ErrBadNull = 1048 - ErrBadDb = 1049 - ErrTableExists = 1050 - ErrBadTable = 1051 - ErrNonUniq = 1052 - ErrServerShutdown = 1053 - ErrBadField = 1054 - ErrWrongFieldWithGroup = 1055 - ErrWrongGroupField = 1056 - ErrWrongSumSelect = 1057 - ErrWrongValueCount = 1058 - ErrTooLongIdent = 1059 - ErrDupFieldname = 1060 - ErrDupKeyname = 1061 - ErrDupEntry = 1062 - ErrWrongFieldSpec = 1063 - ErrParse = 1064 - ErrEmptyQuery = 1065 - ErrNonuniqTable = 1066 - ErrInvalidDefault = 1067 - ErrMultiplePriKey = 1068 - ErrTooManyKeys = 1069 - ErrTooManyKeyParts = 1070 - ErrTooLongKey = 1071 - ErrKeyColumnDoesNotExits = 1072 - ErrBlobUsedAsKey = 1073 - ErrTooBigFieldlength = 1074 - ErrWrongAutoKey = 1075 - ErrReady = 1076 - ErrNormalShutdown = 1077 - ErrGotSignal = 1078 - ErrShutdownComplete = 1079 - ErrForcingClose = 1080 - ErrIpsock = 1081 - ErrNoSuchIndex = 1082 - ErrWrongFieldTerminators = 1083 - ErrBlobsAndNoTerminated = 1084 - ErrTextfileNotReadable = 1085 - ErrFileExists = 1086 - ErrLoadInfo = 1087 - ErrAlterInfo = 1088 - ErrWrongSubKey = 1089 - ErrCantRemoveAllFields = 1090 - ErrCantDropFieldOrKey = 1091 - ErrInsertInfo = 1092 - ErrUpdateTableUsed = 1093 - ErrNoSuchThread = 1094 - ErrKillDenied = 1095 - ErrNoTablesUsed = 1096 - ErrTooBigSet = 1097 - ErrNoUniqueLogfile = 1098 - ErrTableNotLockedForWrite = 1099 - ErrTableNotLocked = 1100 - ErrBlobCantHaveDefault = 1101 - ErrWrongDbName = 1102 - ErrWrongTableName = 1103 - ErrTooBigSelect = 1104 - ErrUnknown = 1105 - ErrUnknownProcedure = 1106 - ErrWrongParamcountToProcedure = 1107 - ErrWrongParametersToProcedure = 1108 - ErrUnknownTable = 1109 - ErrFieldSpecifiedTwice = 1110 - ErrInvalidGroupFuncUse = 1111 - ErrUnsupportedExtension = 1112 - ErrTableMustHaveColumns = 1113 - ErrRecordFileFull = 1114 - ErrUnknownCharacterSet = 1115 - ErrTooManyTables = 1116 - ErrTooManyFields = 1117 - ErrTooBigRowsize = 1118 - ErrStackOverrun = 1119 - ErrWrongOuterJoin = 1120 - ErrNullColumnInIndex = 1121 - ErrCantFindUdf = 1122 - ErrCantInitializeUdf = 1123 - ErrUdfNoPaths = 1124 - ErrUdfExists = 1125 - ErrCantOpenLibrary = 1126 - ErrCantFindDlEntry = 1127 - ErrFunctionNotDefined = 1128 - ErrHostIsBlocked = 1129 - ErrHostNotPrivileged = 1130 - ErrPasswordAnonymousUser = 1131 - ErrPasswordNotAllowed = 1132 - ErrPasswordNoMatch = 1133 - ErrUpdateInfo = 1134 - ErrCantCreateThread = 1135 - ErrWrongValueCountOnRow = 1136 - ErrCantReopenTable = 1137 - ErrInvalidUseOfNull = 1138 - ErrRegexp = 1139 - ErrMixOfGroupFuncAndFields = 1140 - ErrNonexistingGrant = 1141 - ErrTableaccessDenied = 1142 - ErrColumnaccessDenied = 1143 - ErrIllegalGrantForTable = 1144 - ErrGrantWrongHostOrUser = 1145 - ErrNoSuchTable = 1146 - ErrNonexistingTableGrant = 1147 - ErrNotAllowedCommand = 1148 - ErrSyntax = 1149 - ErrDelayedCantChangeLock = 1150 - ErrTooManyDelayedThreads = 1151 - ErrAbortingConnection = 1152 - ErrNetPacketTooLarge = 1153 - ErrNetReadErrorFromPipe = 1154 - ErrNetFcntl = 1155 - ErrNetPacketsOutOfOrder = 1156 - ErrNetUncompress = 1157 - ErrNetRead = 1158 - ErrNetReadInterrupted = 1159 - ErrNetErrorOnWrite = 1160 - ErrNetWriteInterrupted = 1161 - ErrTooLongString = 1162 - ErrTableCantHandleBlob = 1163 - ErrTableCantHandleAutoIncrement = 1164 - ErrDelayedInsertTableLocked = 1165 - ErrWrongColumnName = 1166 - ErrWrongKeyColumn = 1167 - ErrWrongMrgTable = 1168 - ErrDupUnique = 1169 - ErrBlobKeyWithoutLength = 1170 - ErrPrimaryCantHaveNull = 1171 - ErrTooManyRows = 1172 - ErrRequiresPrimaryKey = 1173 - ErrNoRaidCompiled = 1174 - ErrUpdateWithoutKeyInSafeMode = 1175 - ErrKeyDoesNotExits = 1176 - ErrCheckNoSuchTable = 1177 - ErrCheckNotImplemented = 1178 - ErrCantDoThisDuringAnTransaction = 1179 - ErrErrorDuringCommit = 1180 - ErrErrorDuringRollback = 1181 - ErrErrorDuringFlushLogs = 1182 - ErrErrorDuringCheckpoint = 1183 - ErrNewAbortingConnection = 1184 - ErrDumpNotImplemented = 1185 - ErrFlushMasterBinlogClosed = 1186 - ErrIndexRebuild = 1187 - ErrMaster = 1188 - ErrMasterNetRead = 1189 - ErrMasterNetWrite = 1190 - ErrFtMatchingKeyNotFound = 1191 - ErrLockOrActiveTransaction = 1192 - ErrUnknownSystemVariable = 1193 - ErrCrashedOnUsage = 1194 - ErrCrashedOnRepair = 1195 - ErrWarningNotCompleteRollback = 1196 - ErrTransCacheFull = 1197 - ErrSlaveMustStop = 1198 - ErrSlaveNotRunning = 1199 - ErrBadSlave = 1200 - ErrMasterInfo = 1201 - ErrSlaveThread = 1202 - ErrTooManyUserConnections = 1203 - ErrSetConstantsOnly = 1204 - ErrLockWaitTimeout = 1205 - ErrLockTableFull = 1206 - ErrReadOnlyTransaction = 1207 - ErrDropDbWithReadLock = 1208 - ErrCreateDbWithReadLock = 1209 - ErrWrongArguments = 1210 - ErrNoPermissionToCreateUser = 1211 - ErrUnionTablesInDifferentDir = 1212 - ErrLockDeadlock = 1213 - ErrTableCantHandleFt = 1214 - ErrCannotAddForeign = 1215 - ErrNoReferencedRow = 1216 - ErrRowIsReferenced = 1217 - ErrConnectToMaster = 1218 - ErrQueryOnMaster = 1219 - ErrErrorWhenExecutingCommand = 1220 - ErrWrongUsage = 1221 - ErrWrongNumberOfColumnsInSelect = 1222 - ErrCantUpdateWithReadlock = 1223 - ErrMixingNotAllowed = 1224 - ErrDupArgument = 1225 - ErrUserLimitReached = 1226 - ErrSpecificAccessDenied = 1227 - ErrLocalVariable = 1228 - ErrGlobalVariable = 1229 - ErrNoDefault = 1230 - ErrWrongValueForVar = 1231 - ErrWrongTypeForVar = 1232 - ErrVarCantBeRead = 1233 - ErrCantUseOptionHere = 1234 - ErrNotSupportedYet = 1235 - ErrMasterFatalErrorReadingBinlog = 1236 - ErrSlaveIgnoredTable = 1237 - ErrIncorrectGlobalLocalVar = 1238 - ErrWrongFkDef = 1239 - ErrKeyRefDoNotMatchTableRef = 1240 - ErrOperandColumns = 1241 - ErrSubqueryNo1Row = 1242 - ErrUnknownStmtHandler = 1243 - ErrCorruptHelpDb = 1244 - ErrCyclicReference = 1245 - ErrAutoConvert = 1246 - ErrIllegalReference = 1247 - ErrDerivedMustHaveAlias = 1248 - ErrSelectReduced = 1249 - ErrTablenameNotAllowedHere = 1250 - ErrNotSupportedAuthMode = 1251 - ErrSpatialCantHaveNull = 1252 - ErrCollationCharsetMismatch = 1253 - ErrSlaveWasRunning = 1254 - ErrSlaveWasNotRunning = 1255 - ErrTooBigForUncompress = 1256 - ErrZlibZMem = 1257 - ErrZlibZBuf = 1258 - ErrZlibZData = 1259 - ErrCutValueGroupConcat = 1260 - ErrWarnTooFewRecords = 1261 - ErrWarnTooManyRecords = 1262 - ErrWarnNullToNotnull = 1263 - ErrWarnDataOutOfRange = 1264 - WarnDataTruncated = 1265 - ErrWarnUsingOtherHandler = 1266 - ErrCantAggregate2collations = 1267 - ErrDropUser = 1268 - ErrRevokeGrants = 1269 - ErrCantAggregate3collations = 1270 - ErrCantAggregateNcollations = 1271 - ErrVariableIsNotStruct = 1272 - ErrUnknownCollation = 1273 - ErrSlaveIgnoredSslParams = 1274 - ErrServerIsInSecureAuthMode = 1275 - ErrWarnFieldResolved = 1276 - ErrBadSlaveUntilCond = 1277 - ErrMissingSkipSlave = 1278 - ErrUntilCondIgnored = 1279 - ErrWrongNameForIndex = 1280 - ErrWrongNameForCatalog = 1281 - ErrWarnQcResize = 1282 - ErrBadFtColumn = 1283 - ErrUnknownKeyCache = 1284 - ErrWarnHostnameWontWork = 1285 - ErrUnknownStorageEngine = 1286 - ErrWarnDeprecatedSyntax = 1287 - ErrNonUpdatableTable = 1288 - ErrFeatureDisabled = 1289 - ErrOptionPreventsStatement = 1290 - ErrDuplicatedValueInType = 1291 - ErrTruncatedWrongValue = 1292 - ErrTooMuchAutoTimestampCols = 1293 - ErrInvalidOnUpdate = 1294 - ErrUnsupportedPs = 1295 - ErrGetErrmsg = 1296 - ErrGetTemporaryErrmsg = 1297 - ErrUnknownTimeZone = 1298 - ErrWarnInvalidTimestamp = 1299 - ErrInvalidCharacterString = 1300 - ErrWarnAllowedPacketOverflowed = 1301 - ErrConflictingDeclarations = 1302 - ErrSpNoRecursiveCreate = 1303 - ErrSpAlreadyExists = 1304 - ErrSpDoesNotExist = 1305 - ErrSpDropFailed = 1306 - ErrSpStoreFailed = 1307 - ErrSpLilabelMismatch = 1308 - ErrSpLabelRedefine = 1309 - ErrSpLabelMismatch = 1310 - ErrSpUninitVar = 1311 - ErrSpBadselect = 1312 - ErrSpBadreturn = 1313 - ErrSpBadstatement = 1314 - ErrUpdateLogDeprecatedIgnored = 1315 - ErrUpdateLogDeprecatedTranslated = 1316 - ErrQueryInterrupted = 1317 - ErrSpWrongNoOfArgs = 1318 - ErrSpCondMismatch = 1319 - ErrSpNoreturn = 1320 - ErrSpNoreturnend = 1321 - ErrSpBadCursorQuery = 1322 - ErrSpBadCursorSelect = 1323 - ErrSpCursorMismatch = 1324 - ErrSpCursorAlreadyOpen = 1325 - ErrSpCursorNotOpen = 1326 - ErrSpUndeclaredVar = 1327 - ErrSpWrongNoOfFetchArgs = 1328 - ErrSpFetchNoData = 1329 - ErrSpDupParam = 1330 - ErrSpDupVar = 1331 - ErrSpDupCond = 1332 - ErrSpDupCurs = 1333 - ErrSpCantAlter = 1334 - ErrSpSubselectNyi = 1335 - ErrStmtNotAllowedInSfOrTrg = 1336 - ErrSpVarcondAfterCurshndlr = 1337 - ErrSpCursorAfterHandler = 1338 - ErrSpCaseNotFound = 1339 - ErrFparserTooBigFile = 1340 - ErrFparserBadHeader = 1341 - ErrFparserEOFInComment = 1342 - ErrFparserErrorInParameter = 1343 - ErrFparserEOFInUnknownParameter = 1344 - ErrViewNoExplain = 1345 - ErrFrmUnknownType = 1346 - ErrWrongObject = 1347 - ErrNonupdateableColumn = 1348 - ErrViewSelectDerived = 1349 - ErrViewSelectClause = 1350 - ErrViewSelectVariable = 1351 - ErrViewSelectTmptable = 1352 - ErrViewWrongList = 1353 - ErrWarnViewMerge = 1354 - ErrWarnViewWithoutKey = 1355 - ErrViewInvalid = 1356 - ErrSpNoDropSp = 1357 - ErrSpGotoInHndlr = 1358 - ErrTrgAlreadyExists = 1359 - ErrTrgDoesNotExist = 1360 - ErrTrgOnViewOrTempTable = 1361 - ErrTrgCantChangeRow = 1362 - ErrTrgNoSuchRowInTrg = 1363 - ErrNoDefaultForField = 1364 - ErrDivisionByZero = 1365 - ErrTruncatedWrongValueForField = 1366 - ErrIllegalValueForType = 1367 - ErrViewNonupdCheck = 1368 - ErrViewCheckFailed = 1369 - ErrProcaccessDenied = 1370 - ErrRelayLogFail = 1371 - ErrPasswdLength = 1372 - ErrUnknownTargetBinlog = 1373 - ErrIoErrLogIndexRead = 1374 - ErrBinlogPurgeProhibited = 1375 - ErrFseekFail = 1376 - ErrBinlogPurgeFatalErr = 1377 - ErrLogInUse = 1378 - ErrLogPurgeUnknownErr = 1379 - ErrRelayLogInit = 1380 - ErrNoBinaryLogging = 1381 - ErrReservedSyntax = 1382 - ErrWsasFailed = 1383 - ErrDiffGroupsProc = 1384 - ErrNoGroupForProc = 1385 - ErrOrderWithProc = 1386 - ErrLoggingProhibitChangingOf = 1387 - ErrNoFileMapping = 1388 - ErrWrongMagic = 1389 - ErrPsManyParam = 1390 - ErrKeyPart0 = 1391 - ErrViewChecksum = 1392 - ErrViewMultiupdate = 1393 - ErrViewNoInsertFieldList = 1394 - ErrViewDeleteMergeView = 1395 - ErrCannotUser = 1396 - ErrXaerNota = 1397 - ErrXaerInval = 1398 - ErrXaerRmfail = 1399 - ErrXaerOutside = 1400 - ErrXaerRmerr = 1401 - ErrXaRbrollback = 1402 - ErrNonexistingProcGrant = 1403 - ErrProcAutoGrantFail = 1404 - ErrProcAutoRevokeFail = 1405 - ErrDataTooLong = 1406 - ErrSpBadSQLstate = 1407 - ErrStartup = 1408 - ErrLoadFromFixedSizeRowsToVar = 1409 - ErrCantCreateUserWithGrant = 1410 - ErrWrongValueForType = 1411 - ErrTableDefChanged = 1412 - ErrSpDupHandler = 1413 - ErrSpNotVarArg = 1414 - ErrSpNoRetset = 1415 - ErrCantCreateGeometryObject = 1416 - ErrFailedRoutineBreakBinlog = 1417 - ErrBinlogUnsafeRoutine = 1418 - ErrBinlogCreateRoutineNeedSuper = 1419 - ErrExecStmtWithOpenCursor = 1420 - ErrStmtHasNoOpenCursor = 1421 - ErrCommitNotAllowedInSfOrTrg = 1422 - ErrNoDefaultForViewField = 1423 - ErrSpNoRecursion = 1424 - ErrTooBigScale = 1425 - ErrTooBigPrecision = 1426 - ErrMBiggerThanD = 1427 - ErrWrongLockOfSystemTable = 1428 - ErrConnectToForeignDataSource = 1429 - ErrQueryOnForeignDataSource = 1430 - ErrForeignDataSourceDoesntExist = 1431 - ErrForeignDataStringInvalidCantCreate = 1432 - ErrForeignDataStringInvalid = 1433 - ErrCantCreateFederatedTable = 1434 - ErrTrgInWrongSchema = 1435 - ErrStackOverrunNeedMore = 1436 - ErrTooLongBody = 1437 - ErrWarnCantDropDefaultKeycache = 1438 - ErrTooBigDisplaywidth = 1439 - ErrXaerDupid = 1440 - ErrDatetimeFunctionOverflow = 1441 - ErrCantUpdateUsedTableInSfOrTrg = 1442 - ErrViewPreventUpdate = 1443 - ErrPsNoRecursion = 1444 - ErrSpCantSetAutocommit = 1445 - ErrMalformedDefiner = 1446 - ErrViewFrmNoUser = 1447 - ErrViewOtherUser = 1448 - ErrNoSuchUser = 1449 - ErrForbidSchemaChange = 1450 - ErrRowIsReferenced2 = 1451 - ErrNoReferencedRow2 = 1452 - ErrSpBadVarShadow = 1453 - ErrTrgNoDefiner = 1454 - ErrOldFileFormat = 1455 - ErrSpRecursionLimit = 1456 - ErrSpProcTableCorrupt = 1457 - ErrSpWrongName = 1458 - ErrTableNeedsUpgrade = 1459 - ErrSpNoAggregate = 1460 - ErrMaxPreparedStmtCountReached = 1461 - ErrViewRecursive = 1462 - ErrNonGroupingFieldUsed = 1463 - ErrTableCantHandleSpkeys = 1464 - ErrNoTriggersOnSystemSchema = 1465 - ErrRemovedSpaces = 1466 - ErrAutoincReadFailed = 1467 - ErrUsername = 1468 - ErrHostname = 1469 - ErrWrongStringLength = 1470 - ErrNonInsertableTable = 1471 - ErrAdminWrongMrgTable = 1472 - ErrTooHighLevelOfNestingForSelect = 1473 - ErrNameBecomesEmpty = 1474 - ErrAmbiguousFieldTerm = 1475 - ErrForeignServerExists = 1476 - ErrForeignServerDoesntExist = 1477 - ErrIllegalHaCreateOption = 1478 - ErrPartitionRequiresValues = 1479 - ErrPartitionWrongValues = 1480 - ErrPartitionMaxvalue = 1481 - ErrPartitionSubpartition = 1482 - ErrPartitionSubpartMix = 1483 - ErrPartitionWrongNoPart = 1484 - ErrPartitionWrongNoSubpart = 1485 - ErrWrongExprInPartitionFunc = 1486 - ErrNoConstExprInRangeOrList = 1487 - ErrFieldNotFoundPart = 1488 - ErrListOfFieldsOnlyInHash = 1489 - ErrInconsistentPartitionInfo = 1490 - ErrPartitionFuncNotAllowed = 1491 - ErrPartitionsMustBeDefined = 1492 - ErrRangeNotIncreasing = 1493 - ErrInconsistentTypeOfFunctions = 1494 - ErrMultipleDefConstInListPart = 1495 - ErrPartitionEntry = 1496 - ErrMixHandler = 1497 - ErrPartitionNotDefined = 1498 - ErrTooManyPartitions = 1499 - ErrSubpartition = 1500 - ErrCantCreateHandlerFile = 1501 - ErrBlobFieldInPartFunc = 1502 - ErrUniqueKeyNeedAllFieldsInPf = 1503 - ErrNoParts = 1504 - ErrPartitionMgmtOnNonpartitioned = 1505 - ErrForeignKeyOnPartitioned = 1506 - ErrDropPartitionNonExistent = 1507 - ErrDropLastPartition = 1508 - ErrCoalesceOnlyOnHashPartition = 1509 - ErrReorgHashOnlyOnSameNo = 1510 - ErrReorgNoParam = 1511 - ErrOnlyOnRangeListPartition = 1512 - ErrAddPartitionSubpart = 1513 - ErrAddPartitionNoNewPartition = 1514 - ErrCoalescePartitionNoPartition = 1515 - ErrReorgPartitionNotExist = 1516 - ErrSameNamePartition = 1517 - ErrNoBinlog = 1518 - ErrConsecutiveReorgPartitions = 1519 - ErrReorgOutsideRange = 1520 - ErrPartitionFunctionFailure = 1521 - ErrPartState = 1522 - ErrLimitedPartRange = 1523 - ErrPluginIsNotLoaded = 1524 - ErrWrongValue = 1525 - ErrNoPartitionForGivenValue = 1526 - ErrFilegroupOptionOnlyOnce = 1527 - ErrCreateFilegroupFailed = 1528 - ErrDropFilegroupFailed = 1529 - ErrTablespaceAutoExtend = 1530 - ErrWrongSizeNumber = 1531 - ErrSizeOverflow = 1532 - ErrAlterFilegroupFailed = 1533 - ErrBinlogRowLoggingFailed = 1534 - ErrBinlogRowWrongTableDef = 1535 - ErrBinlogRowRbrToSbr = 1536 - ErrEventAlreadyExists = 1537 - ErrEventStoreFailed = 1538 - ErrEventDoesNotExist = 1539 - ErrEventCantAlter = 1540 - ErrEventDropFailed = 1541 - ErrEventIntervalNotPositiveOrTooBig = 1542 - ErrEventEndsBeforeStarts = 1543 - ErrEventExecTimeInThePast = 1544 - ErrEventOpenTableFailed = 1545 - ErrEventNeitherMExprNorMAt = 1546 - ErrObsoleteColCountDoesntMatchCorrupted = 1547 - ErrObsoleteCannotLoadFromTable = 1548 - ErrEventCannotDelete = 1549 - ErrEventCompile = 1550 - ErrEventSameName = 1551 - ErrEventDataTooLong = 1552 - ErrDropIndexFk = 1553 - ErrWarnDeprecatedSyntaxWithVer = 1554 - ErrCantWriteLockLogTable = 1555 - ErrCantLockLogTable = 1556 - ErrForeignDuplicateKeyOldUnused = 1557 - ErrColCountDoesntMatchPleaseUpdate = 1558 - ErrTempTablePreventsSwitchOutOfRbr = 1559 - ErrStoredFunctionPreventsSwitchBinlogFormat = 1560 - ErrNdbCantSwitchBinlogFormat = 1561 - ErrPartitionNoTemporary = 1562 - ErrPartitionConstDomain = 1563 - ErrPartitionFunctionIsNotAllowed = 1564 - ErrDdlLog = 1565 - ErrNullInValuesLessThan = 1566 - ErrWrongPartitionName = 1567 - ErrCantChangeTxCharacteristics = 1568 - ErrDupEntryAutoincrementCase = 1569 - ErrEventModifyQueue = 1570 - ErrEventSetVar = 1571 - ErrPartitionMerge = 1572 - ErrCantActivateLog = 1573 - ErrRbrNotAvailable = 1574 - ErrBase64Decode = 1575 - ErrEventRecursionForbidden = 1576 - ErrEventsDb = 1577 - ErrOnlyIntegersAllowed = 1578 - ErrUnsuportedLogEngine = 1579 - ErrBadLogStatement = 1580 - ErrCantRenameLogTable = 1581 - ErrWrongParamcountToNativeFct = 1582 - ErrWrongParametersToNativeFct = 1583 - ErrWrongParametersToStoredFct = 1584 - ErrNativeFctNameCollision = 1585 - ErrDupEntryWithKeyName = 1586 - ErrBinlogPurgeEmfile = 1587 - ErrEventCannotCreateInThePast = 1588 - ErrEventCannotAlterInThePast = 1589 - ErrSlaveIncident = 1590 - ErrNoPartitionForGivenValueSilent = 1591 - ErrBinlogUnsafeStatement = 1592 - ErrSlaveFatal = 1593 - ErrSlaveRelayLogReadFailure = 1594 - ErrSlaveRelayLogWriteFailure = 1595 - ErrSlaveCreateEventFailure = 1596 - ErrSlaveMasterComFailure = 1597 - ErrBinlogLoggingImpossible = 1598 - ErrViewNoCreationCtx = 1599 - ErrViewInvalidCreationCtx = 1600 - ErrSrInvalidCreationCtx = 1601 - ErrTrgCorruptedFile = 1602 - ErrTrgNoCreationCtx = 1603 - ErrTrgInvalidCreationCtx = 1604 - ErrEventInvalidCreationCtx = 1605 - ErrTrgCantOpenTable = 1606 - ErrCantCreateSroutine = 1607 - ErrNeverUsed = 1608 - ErrNoFormatDescriptionEventBeforeBinlogStatement = 1609 - ErrSlaveCorruptEvent = 1610 - ErrLoadDataInvalidColumn = 1611 - ErrLogPurgeNoFile = 1612 - ErrXaRbtimeout = 1613 - ErrXaRbdeadlock = 1614 - ErrNeedReprepare = 1615 - ErrDelayedNotSupported = 1616 - WarnNoMasterInfo = 1617 - WarnOptionIgnored = 1618 - WarnPluginDeleteBuiltin = 1619 - WarnPluginBusy = 1620 - ErrVariableIsReadonly = 1621 - ErrWarnEngineTransactionRollback = 1622 - ErrSlaveHeartbeatFailure = 1623 - ErrSlaveHeartbeatValueOutOfRange = 1624 - ErrNdbReplicationSchema = 1625 - ErrConflictFnParse = 1626 - ErrExceptionsWrite = 1627 - ErrTooLongTableComment = 1628 - ErrTooLongFieldComment = 1629 - ErrFuncInexistentNameCollision = 1630 - ErrDatabaseName = 1631 - ErrTableName = 1632 - ErrPartitionName = 1633 - ErrSubpartitionName = 1634 - ErrTemporaryName = 1635 - ErrRenamedName = 1636 - ErrTooManyConcurrentTrxs = 1637 - WarnNonASCIISeparatorNotImplemented = 1638 - ErrDebugSyncTimeout = 1639 - ErrDebugSyncHitLimit = 1640 - ErrDupSignalSet = 1641 - ErrSignalWarn = 1642 - ErrSignalNotFound = 1643 - ErrSignalException = 1644 - ErrResignalWithoutActiveHandler = 1645 - ErrSignalBadConditionType = 1646 - WarnCondItemTruncated = 1647 - ErrCondItemTooLong = 1648 - ErrUnknownLocale = 1649 - ErrSlaveIgnoreServerIds = 1650 - ErrQueryCacheDisabled = 1651 - ErrSameNamePartitionField = 1652 - ErrPartitionColumnList = 1653 - ErrWrongTypeColumnValue = 1654 - ErrTooManyPartitionFuncFields = 1655 - ErrMaxvalueInValuesIn = 1656 - ErrTooManyValues = 1657 - ErrRowSinglePartitionField = 1658 - ErrFieldTypeNotAllowedAsPartitionField = 1659 - ErrPartitionFieldsTooLong = 1660 - ErrBinlogRowEngineAndStmtEngine = 1661 - ErrBinlogRowModeAndStmtEngine = 1662 - ErrBinlogUnsafeAndStmtEngine = 1663 - ErrBinlogRowInjectionAndStmtEngine = 1664 - ErrBinlogStmtModeAndRowEngine = 1665 - ErrBinlogRowInjectionAndStmtMode = 1666 - ErrBinlogMultipleEnginesAndSelfLoggingEngine = 1667 - ErrBinlogUnsafeLimit = 1668 - ErrBinlogUnsafeInsertDelayed = 1669 - ErrBinlogUnsafeSystemTable = 1670 - ErrBinlogUnsafeAutoincColumns = 1671 - ErrBinlogUnsafeUdf = 1672 - ErrBinlogUnsafeSystemVariable = 1673 - ErrBinlogUnsafeSystemFunction = 1674 - ErrBinlogUnsafeNontransAfterTrans = 1675 - ErrMessageAndStatement = 1676 - ErrSlaveConversionFailed = 1677 - ErrSlaveCantCreateConversion = 1678 - ErrInsideTransactionPreventsSwitchBinlogFormat = 1679 - ErrPathLength = 1680 - ErrWarnDeprecatedSyntaxNoReplacement = 1681 - ErrWrongNativeTableStructure = 1682 - ErrWrongPerfschemaUsage = 1683 - ErrWarnISSkippedTable = 1684 - ErrInsideTransactionPreventsSwitchBinlogDirect = 1685 - ErrStoredFunctionPreventsSwitchBinlogDirect = 1686 - ErrSpatialMustHaveGeomCol = 1687 - ErrTooLongIndexComment = 1688 - ErrLockAborted = 1689 - ErrDataOutOfRange = 1690 - ErrWrongSpvarTypeInLimit = 1691 - ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine = 1692 - ErrBinlogUnsafeMixedStatement = 1693 - ErrInsideTransactionPreventsSwitchSQLLogBin = 1694 - ErrStoredFunctionPreventsSwitchSQLLogBin = 1695 - ErrFailedReadFromParFile = 1696 - ErrValuesIsNotIntType = 1697 - ErrAccessDeniedNoPassword = 1698 - ErrSetPasswordAuthPlugin = 1699 - ErrGrantPluginUserExists = 1700 - ErrTruncateIllegalFk = 1701 - ErrPluginIsPermanent = 1702 - ErrSlaveHeartbeatValueOutOfRangeMin = 1703 - ErrSlaveHeartbeatValueOutOfRangeMax = 1704 - ErrStmtCacheFull = 1705 - ErrMultiUpdateKeyConflict = 1706 - ErrTableNeedsRebuild = 1707 - WarnOptionBelowLimit = 1708 - ErrIndexColumnTooLong = 1709 - ErrErrorInTriggerBody = 1710 - ErrErrorInUnknownTriggerBody = 1711 - ErrIndexCorrupt = 1712 - ErrUndoRecordTooBig = 1713 - ErrBinlogUnsafeInsertIgnoreSelect = 1714 - ErrBinlogUnsafeInsertSelectUpdate = 1715 - ErrBinlogUnsafeReplaceSelect = 1716 - ErrBinlogUnsafeCreateIgnoreSelect = 1717 - ErrBinlogUnsafeCreateReplaceSelect = 1718 - ErrBinlogUnsafeUpdateIgnore = 1719 - ErrPluginNoUninstall = 1720 - ErrPluginNoInstall = 1721 - ErrBinlogUnsafeWriteAutoincSelect = 1722 - ErrBinlogUnsafeCreateSelectAutoinc = 1723 - ErrBinlogUnsafeInsertTwoKeys = 1724 - ErrTableInFkCheck = 1725 - ErrUnsupportedEngine = 1726 - ErrBinlogUnsafeAutoincNotFirst = 1727 - ErrCannotLoadFromTableV2 = 1728 - ErrMasterDelayValueOutOfRange = 1729 - ErrOnlyFdAndRbrEventsAllowedInBinlogStatement = 1730 - ErrPartitionExchangeDifferentOption = 1731 - ErrPartitionExchangePartTable = 1732 - ErrPartitionExchangeTempTable = 1733 - ErrPartitionInsteadOfSubpartition = 1734 - ErrUnknownPartition = 1735 - ErrTablesDifferentMetadata = 1736 - ErrRowDoesNotMatchPartition = 1737 - ErrBinlogCacheSizeGreaterThanMax = 1738 - ErrWarnIndexNotApplicable = 1739 - ErrPartitionExchangeForeignKey = 1740 - ErrNoSuchKeyValue = 1741 - ErrRplInfoDataTooLong = 1742 - ErrNetworkReadEventChecksumFailure = 1743 - ErrBinlogReadEventChecksumFailure = 1744 - ErrBinlogStmtCacheSizeGreaterThanMax = 1745 - ErrCantUpdateTableInCreateTableSelect = 1746 - ErrPartitionClauseOnNonpartitioned = 1747 - ErrRowDoesNotMatchGivenPartitionSet = 1748 - ErrNoSuchPartitionunused = 1749 - ErrChangeRplInfoRepositoryFailure = 1750 - ErrWarningNotCompleteRollbackWithCreatedTempTable = 1751 - ErrWarningNotCompleteRollbackWithDroppedTempTable = 1752 - ErrMtsFeatureIsNotSupported = 1753 - ErrMtsUpdatedDbsGreaterMax = 1754 - ErrMtsCantParallel = 1755 - ErrMtsInconsistentData = 1756 - ErrFulltextNotSupportedWithPartitioning = 1757 - ErrDaInvalidConditionNumber = 1758 - ErrInsecurePlainText = 1759 - ErrInsecureChangeMaster = 1760 - ErrForeignDuplicateKeyWithChildInfo = 1761 - ErrForeignDuplicateKeyWithoutChildInfo = 1762 - ErrSQLthreadWithSecureSlave = 1763 - ErrTableHasNoFt = 1764 - ErrVariableNotSettableInSfOrTrigger = 1765 - ErrVariableNotSettableInTransaction = 1766 - ErrGtidNextIsNotInGtidNextList = 1767 - ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull = 1768 - ErrSetStatementCannotInvokeFunction = 1769 - ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull = 1770 - ErrSkippingLoggedTransaction = 1771 - ErrMalformedGtidSetSpecification = 1772 - ErrMalformedGtidSetEncoding = 1773 - ErrMalformedGtidSpecification = 1774 - ErrGnoExhausted = 1775 - ErrBadSlaveAutoPosition = 1776 - ErrAutoPositionRequiresGtidModeOn = 1777 - ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet = 1778 - ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn = 1779 - ErrGtidModeRequiresBinlog = 1780 - ErrCantSetGtidNextToGtidWhenGtidModeIsOff = 1781 - ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn = 1782 - ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff = 1783 - ErrFoundGtidEventWhenGtidModeIsOff = 1784 - ErrGtidUnsafeNonTransactionalTable = 1785 - ErrGtidUnsafeCreateSelect = 1786 - ErrGtidUnsafeCreateDropTemporaryTableInTransaction = 1787 - ErrGtidModeCanOnlyChangeOneStepAtATime = 1788 - ErrMasterHasPurgedRequiredGtids = 1789 - ErrCantSetGtidNextWhenOwningGtid = 1790 - ErrUnknownExplainFormat = 1791 - ErrCantExecuteInReadOnlyTransaction = 1792 - ErrTooLongTablePartitionComment = 1793 - ErrSlaveConfiguration = 1794 - ErrInnodbFtLimit = 1795 - ErrInnodbNoFtTempTable = 1796 - ErrInnodbFtWrongDocidColumn = 1797 - ErrInnodbFtWrongDocidIndex = 1798 - ErrInnodbOnlineLogTooBig = 1799 - ErrUnknownAlterAlgorithm = 1800 - ErrUnknownAlterLock = 1801 - ErrMtsChangeMasterCantRunWithGaps = 1802 - ErrMtsRecoveryFailure = 1803 - ErrMtsResetWorkers = 1804 - ErrColCountDoesntMatchCorruptedV2 = 1805 - ErrSlaveSilentRetryTransaction = 1806 - ErrDiscardFkChecksRunning = 1807 - ErrTableSchemaMismatch = 1808 - ErrTableInSystemTablespace = 1809 - ErrIoRead = 1810 - ErrIoWrite = 1811 - ErrTablespaceMissing = 1812 - ErrTablespaceExists = 1813 - ErrTablespaceDiscarded = 1814 - ErrInternal = 1815 - ErrInnodbImport = 1816 - ErrInnodbIndexCorrupt = 1817 - ErrInvalidYearColumnLength = 1818 - ErrNotValidPassword = 1819 - ErrMustChangePassword = 1820 - ErrFkNoIndexChild = 1821 - ErrFkNoIndexParent = 1822 - ErrFkFailAddSystem = 1823 - ErrFkCannotOpenParent = 1824 - ErrFkIncorrectOption = 1825 - ErrFkDupName = 1826 - ErrPasswordFormat = 1827 - ErrFkColumnCannotDrop = 1828 - ErrFkColumnCannotDropChild = 1829 - ErrFkColumnNotNull = 1830 - ErrDupIndex = 1831 - ErrFkColumnCannotChange = 1832 - ErrFkColumnCannotChangeChild = 1833 - ErrFkCannotDeleteParent = 1834 - ErrMalformedPacket = 1835 - ErrReadOnlyMode = 1836 - ErrGtidNextTypeUndefinedGroup = 1837 - ErrVariableNotSettableInSp = 1838 - ErrCantSetGtidPurgedWhenGtidModeIsOff = 1839 - ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty = 1840 - ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty = 1841 - ErrGtidPurgedWasChanged = 1842 - ErrGtidExecutedWasChanged = 1843 - ErrBinlogStmtModeAndNoReplTables = 1844 - ErrAlterOperationNotSupported = 1845 - ErrAlterOperationNotSupportedReason = 1846 - ErrAlterOperationNotSupportedReasonCopy = 1847 - ErrAlterOperationNotSupportedReasonPartition = 1848 - ErrAlterOperationNotSupportedReasonFkRename = 1849 - ErrAlterOperationNotSupportedReasonColumnType = 1850 - ErrAlterOperationNotSupportedReasonFkCheck = 1851 - ErrAlterOperationNotSupportedReasonIgnore = 1852 - ErrAlterOperationNotSupportedReasonNopk = 1853 - ErrAlterOperationNotSupportedReasonAutoinc = 1854 - ErrAlterOperationNotSupportedReasonHiddenFts = 1855 - ErrAlterOperationNotSupportedReasonChangeFts = 1856 - ErrAlterOperationNotSupportedReasonFts = 1857 - ErrSQLSlaveSkipCounterNotSettableInGtidMode = 1858 - ErrDupUnknownInIndex = 1859 - ErrIdentCausesTooLongPath = 1860 - ErrAlterOperationNotSupportedReasonNotNull = 1861 - ErrMustChangePasswordLogin = 1862 - ErrRowInWrongPartition = 1863 - ErrErrorLast = 1863 -) diff --git a/vendor/github.com/pingcap/tidb/mysql/errname.go b/vendor/github.com/pingcap/tidb/mysql/errname.go deleted file mode 100644 index ad11ec746ebd..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/errname.go +++ /dev/null @@ -1,882 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -// MySQLErrName maps error code to MySQL error messages. -var MySQLErrName = map[uint16]string{ - ErrHashchk: "hashchk", - ErrNisamchk: "isamchk", - ErrNo: "NO", - ErrYes: "YES", - ErrCantCreateFile: "Can't create file '%-.200s' (errno: %d - %s)", - ErrCantCreateTable: "Can't create table '%-.200s' (errno: %d)", - ErrCantCreateDb: "Can't create database '%-.192s' (errno: %d)", - ErrDbCreateExists: "Can't create database '%-.192s'; database exists", - ErrDbDropExists: "Can't drop database '%-.192s'; database doesn't exist", - ErrDbDropDelete: "Error dropping database (can't delete '%-.192s', errno: %d)", - ErrDbDropRmdir: "Error dropping database (can't rmdir '%-.192s', errno: %d)", - ErrCantDeleteFile: "Error on delete of '%-.192s' (errno: %d - %s)", - ErrCantFindSystemRec: "Can't read record in system table", - ErrCantGetStat: "Can't get status of '%-.200s' (errno: %d - %s)", - ErrCantGetWd: "Can't get working directory (errno: %d - %s)", - ErrCantLock: "Can't lock file (errno: %d - %s)", - ErrCantOpenFile: "Can't open file: '%-.200s' (errno: %d - %s)", - ErrFileNotFound: "Can't find file: '%-.200s' (errno: %d - %s)", - ErrCantReadDir: "Can't read dir of '%-.192s' (errno: %d - %s)", - ErrCantSetWd: "Can't change dir to '%-.192s' (errno: %d - %s)", - ErrCheckread: "Record has changed since last read in table '%-.192s'", - ErrDiskFull: "Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", - ErrDupKey: "Can't write; duplicate key in table '%-.192s'", - ErrErrorOnClose: "Error on close of '%-.192s' (errno: %d - %s)", - ErrErrorOnRead: "Error reading file '%-.200s' (errno: %d - %s)", - ErrErrorOnRename: "Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", - ErrErrorOnWrite: "Error writing file '%-.200s' (errno: %d - %s)", - ErrFileUsed: "'%-.192s' is locked against change", - ErrFilsortAbort: "Sort aborted", - ErrFormNotFound: "View '%-.192s' doesn't exist for '%-.192s'", - ErrGetErrno: "Got error %d from storage engine", - ErrIllegalHa: "Table storage engine for '%-.192s' doesn't have this option", - ErrKeyNotFound: "Can't find record in '%-.192s'", - ErrNotFormFile: "Incorrect information in file: '%-.200s'", - ErrNotKeyfile: "Incorrect key file for table '%-.200s'; try to repair it", - ErrOldKeyfile: "Old key file for table '%-.192s'; repair it!", - ErrOpenAsReadonly: "Table '%-.192s' is read only", - ErrOutofmemory: "Out of memory; restart server and try again (needed %d bytes)", - ErrOutOfSortmemory: "Out of sort memory, consider increasing server sort buffer size", - ErrUnexpectedEOF: "Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", - ErrConCount: "Too many connections", - ErrOutOfResources: "Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", - ErrBadHost: "Can't get hostname for your address", - ErrHandshake: "Bad handshake", - ErrDbaccessDenied: "Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", - ErrAccessDenied: "Access denied for user '%-.48s'@'%-.64s' (using password: %s)", - ErrNoDb: "No database selected", - ErrUnknownCom: "Unknown command", - ErrBadNull: "Column '%-.192s' cannot be null", - ErrBadDb: "Unknown database '%-.192s'", - ErrTableExists: "Table '%-.192s' already exists", - ErrBadTable: "Unknown table '%-.100s'", - ErrNonUniq: "Column '%-.192s' in %-.192s is ambiguous", - ErrServerShutdown: "Server shutdown in progress", - ErrBadField: "Unknown column '%-.192s' in '%-.192s'", - ErrWrongFieldWithGroup: "'%-.192s' isn't in GROUP BY", - ErrWrongGroupField: "Can't group on '%-.192s'", - ErrWrongSumSelect: "Statement has sum functions and columns in same statement", - ErrWrongValueCount: "Column count doesn't match value count", - ErrTooLongIdent: "Identifier name '%-.100s' is too long", - ErrDupFieldname: "Duplicate column name '%-.192s'", - ErrDupKeyname: "Duplicate key name '%-.192s'", - ErrDupEntry: "Duplicate entry '%-.192s' for key %d", - ErrWrongFieldSpec: "Incorrect column specifier for column '%-.192s'", - ErrParse: "%s near '%-.80s' at line %d", - ErrEmptyQuery: "Query was empty", - ErrNonuniqTable: "Not unique table/alias: '%-.192s'", - ErrInvalidDefault: "Invalid default value for '%-.192s'", - ErrMultiplePriKey: "Multiple primary key defined", - ErrTooManyKeys: "Too many keys specified; max %d keys allowed", - ErrTooManyKeyParts: "Too many key parts specified; max %d parts allowed", - ErrTooLongKey: "Specified key was too long; max key length is %d bytes", - ErrKeyColumnDoesNotExits: "Key column '%-.192s' doesn't exist in table", - ErrBlobUsedAsKey: "BLOB column '%-.192s' can't be used in key specification with the used table type", - ErrTooBigFieldlength: "Column length too big for column '%-.192s' (max = %lu); use BLOB or TEXT instead", - ErrWrongAutoKey: "Incorrect table definition; there can be only one auto column and it must be defined as a key", - ErrReady: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", - ErrNormalShutdown: "%s: Normal shutdown\n", - ErrGotSignal: "%s: Got signal %d. Aborting!\n", - ErrShutdownComplete: "%s: Shutdown complete\n", - ErrForcingClose: "%s: Forcing close of thread %ld user: '%-.48s'\n", - ErrIpsock: "Can't create IP socket", - ErrNoSuchIndex: "Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", - ErrWrongFieldTerminators: "Field separator argument is not what is expected; check the manual", - ErrBlobsAndNoTerminated: "You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", - ErrTextfileNotReadable: "The file '%-.128s' must be in the database directory or be readable by all", - ErrFileExists: "File '%-.200s' already exists", - ErrLoadInfo: "Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld", - ErrAlterInfo: "Records: %ld Duplicates: %ld", - ErrWrongSubKey: "Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", - ErrCantRemoveAllFields: "You can't delete all columns with ALTER TABLE; use DROP TABLE instead", - ErrCantDropFieldOrKey: "Can't DROP '%-.192s'; check that column/key exists", - ErrInsertInfo: "Records: %ld Duplicates: %ld Warnings: %ld", - ErrUpdateTableUsed: "You can't specify target table '%-.192s' for update in FROM clause", - ErrNoSuchThread: "Unknown thread id: %lu", - ErrKillDenied: "You are not owner of thread %lu", - ErrNoTablesUsed: "No tables used", - ErrTooBigSet: "Too many strings for column %-.192s and SET", - ErrNoUniqueLogfile: "Can't generate a unique log-filename %-.200s.(1-999)\n", - ErrTableNotLockedForWrite: "Table '%-.192s' was locked with a READ lock and can't be updated", - ErrTableNotLocked: "Table '%-.192s' was not locked with LOCK TABLES", - ErrBlobCantHaveDefault: "BLOB/TEXT column '%-.192s' can't have a default value", - ErrWrongDbName: "Incorrect database name '%-.100s'", - ErrWrongTableName: "Incorrect table name '%-.100s'", - ErrTooBigSelect: "The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", - ErrUnknown: "Unknown error", - ErrUnknownProcedure: "Unknown procedure '%-.192s'", - ErrWrongParamcountToProcedure: "Incorrect parameter count to procedure '%-.192s'", - ErrWrongParametersToProcedure: "Incorrect parameters to procedure '%-.192s'", - ErrUnknownTable: "Unknown table '%-.192s' in %-.32s", - ErrFieldSpecifiedTwice: "Column '%-.192s' specified twice", - ErrInvalidGroupFuncUse: "Invalid use of group function", - ErrUnsupportedExtension: "Table '%-.192s' uses an extension that doesn't exist in this MySQL version", - ErrTableMustHaveColumns: "A table must have at least 1 column", - ErrRecordFileFull: "The table '%-.192s' is full", - ErrUnknownCharacterSet: "Unknown character set: '%-.64s'", - ErrTooManyTables: "Too many tables; MySQL can only use %d tables in a join", - ErrTooManyFields: "Too many columns", - ErrTooBigRowsize: "Row size too large. The maximum row size for the used table type, not counting BLOBs, is %ld. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", - ErrStackOverrun: "Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", - ErrWrongOuterJoin: "Cross dependency found in OUTER JOIN; examine your ON conditions", - ErrNullColumnInIndex: "Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", - ErrCantFindUdf: "Can't load function '%-.192s'", - ErrCantInitializeUdf: "Can't initialize function '%-.192s'; %-.80s", - ErrUdfNoPaths: "No paths allowed for shared library", - ErrUdfExists: "Function '%-.192s' already exists", - ErrCantOpenLibrary: "Can't open shared library '%-.192s' (errno: %d %-.128s)", - ErrCantFindDlEntry: "Can't find symbol '%-.128s' in library", - ErrFunctionNotDefined: "Function '%-.192s' is not defined", - ErrHostIsBlocked: "Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", - ErrHostNotPrivileged: "Host '%-.64s' is not allowed to connect to this MySQL server", - ErrPasswordAnonymousUser: "You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", - ErrPasswordNotAllowed: "You must have privileges to update tables in the mysql database to be able to change passwords for others", - ErrPasswordNoMatch: "Can't find any matching row in the user table", - ErrUpdateInfo: "Rows matched: %ld Changed: %ld Warnings: %ld", - ErrCantCreateThread: "Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", - ErrWrongValueCountOnRow: "Column count doesn't match value count at row %ld", - ErrCantReopenTable: "Can't reopen table: '%-.192s'", - ErrInvalidUseOfNull: "Invalid use of NULL value", - ErrRegexp: "Got error '%-.64s' from regexp", - ErrMixOfGroupFuncAndFields: "Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", - ErrNonexistingGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s'", - ErrTableaccessDenied: "%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", - ErrColumnaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", - ErrIllegalGrantForTable: "Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", - ErrGrantWrongHostOrUser: "The host or user argument to GRANT is too long", - ErrNoSuchTable: "Table '%-.192s.%-.192s' doesn't exist", - ErrNonexistingTableGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", - ErrNotAllowedCommand: "The used command is not allowed with this MySQL version", - ErrSyntax: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", - ErrDelayedCantChangeLock: "Delayed insert thread couldn't get requested lock for table %-.192s", - ErrTooManyDelayedThreads: "Too many delayed threads in use", - ErrAbortingConnection: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' (%-.64s)", - ErrNetPacketTooLarge: "Got a packet bigger than 'maxAllowedPacket' bytes", - ErrNetReadErrorFromPipe: "Got a read error from the connection pipe", - ErrNetFcntl: "Got an error from fcntl()", - ErrNetPacketsOutOfOrder: "Got packets out of order", - ErrNetUncompress: "Couldn't uncompress communication packet", - ErrNetRead: "Got an error reading communication packets", - ErrNetReadInterrupted: "Got timeout reading communication packets", - ErrNetErrorOnWrite: "Got an error writing communication packets", - ErrNetWriteInterrupted: "Got timeout writing communication packets", - ErrTooLongString: "Result string is longer than 'maxAllowedPacket' bytes", - ErrTableCantHandleBlob: "The used table type doesn't support BLOB/TEXT columns", - ErrTableCantHandleAutoIncrement: "The used table type doesn't support AUTOINCREMENT columns", - ErrDelayedInsertTableLocked: "INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", - ErrWrongColumnName: "Incorrect column name '%-.100s'", - ErrWrongKeyColumn: "The used storage engine can't index column '%-.192s'", - ErrWrongMrgTable: "Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", - ErrDupUnique: "Can't write, because of unique constraint, to table '%-.192s'", - ErrBlobKeyWithoutLength: "BLOB/TEXT column '%-.192s' used in key specification without a key length", - ErrPrimaryCantHaveNull: "All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", - ErrTooManyRows: "Result consisted of more than one row", - ErrRequiresPrimaryKey: "This table type requires a primary key", - ErrNoRaidCompiled: "This version of MySQL is not compiled with RAID support", - ErrUpdateWithoutKeyInSafeMode: "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", - ErrKeyDoesNotExits: "Key '%-.192s' doesn't exist in table '%-.192s'", - ErrCheckNoSuchTable: "Can't open table", - ErrCheckNotImplemented: "The storage engine for the table doesn't support %s", - ErrCantDoThisDuringAnTransaction: "You are not allowed to execute this command in a transaction", - ErrErrorDuringCommit: "Got error %d during COMMIT", - ErrErrorDuringRollback: "Got error %d during ROLLBACK", - ErrErrorDuringFlushLogs: "Got error %d during FLUSHLOGS", - ErrErrorDuringCheckpoint: "Got error %d during CHECKPOINT", - ErrNewAbortingConnection: "Aborted connection %ld to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", - ErrDumpNotImplemented: "The storage engine for the table does not support binary table dump", - ErrFlushMasterBinlogClosed: "Binlog closed, cannot RESET MASTER", - ErrIndexRebuild: "Failed rebuilding the index of dumped table '%-.192s'", - ErrMaster: "Error from master: '%-.64s'", - ErrMasterNetRead: "Net error reading from master", - ErrMasterNetWrite: "Net error writing to master", - ErrFtMatchingKeyNotFound: "Can't find FULLTEXT index matching the column list", - ErrLockOrActiveTransaction: "Can't execute the given command because you have active locked tables or an active transaction", - ErrUnknownSystemVariable: "Unknown system variable '%-.64s'", - ErrCrashedOnUsage: "Table '%-.192s' is marked as crashed and should be repaired", - ErrCrashedOnRepair: "Table '%-.192s' is marked as crashed and last (automatic?) repair failed", - ErrWarningNotCompleteRollback: "Some non-transactional changed tables couldn't be rolled back", - ErrTransCacheFull: "Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", - ErrSlaveMustStop: "This operation cannot be performed with a running slave; run STOP SLAVE first", - ErrSlaveNotRunning: "This operation requires a running slave; configure slave and do START SLAVE", - ErrBadSlave: "The server is not configured as slave; fix in config file or with CHANGE MASTER TO", - ErrMasterInfo: "Could not initialize master info structure; more error messages can be found in the MySQL error log", - ErrSlaveThread: "Could not create slave thread; check system resources", - ErrTooManyUserConnections: "User %-.64s already has more than 'maxUserConnections' active connections", - ErrSetConstantsOnly: "You may only use constant expressions with SET", - ErrLockWaitTimeout: "Lock wait timeout exceeded; try restarting transaction", - ErrLockTableFull: "The total number of locks exceeds the lock table size", - ErrReadOnlyTransaction: "Update locks cannot be acquired during a READ UNCOMMITTED transaction", - ErrDropDbWithReadLock: "DROP DATABASE not allowed while thread is holding global read lock", - ErrCreateDbWithReadLock: "CREATE DATABASE not allowed while thread is holding global read lock", - ErrWrongArguments: "Incorrect arguments to %s", - ErrNoPermissionToCreateUser: "'%-.48s'@'%-.64s' is not allowed to create new users", - ErrUnionTablesInDifferentDir: "Incorrect table definition; all MERGE tables must be in the same database", - ErrLockDeadlock: "Deadlock found when trying to get lock; try restarting transaction", - ErrTableCantHandleFt: "The used table type doesn't support FULLTEXT indexes", - ErrCannotAddForeign: "Cannot add foreign key constraint", - ErrNoReferencedRow: "Cannot add or update a child row: a foreign key constraint fails", - ErrRowIsReferenced: "Cannot delete or update a parent row: a foreign key constraint fails", - ErrConnectToMaster: "Error connecting to master: %-.128s", - ErrQueryOnMaster: "Error running query on master: %-.128s", - ErrErrorWhenExecutingCommand: "Error when executing command %s: %-.128s", - ErrWrongUsage: "Incorrect usage of %s and %s", - ErrWrongNumberOfColumnsInSelect: "The used SELECT statements have a different number of columns", - ErrCantUpdateWithReadlock: "Can't execute the query because you have a conflicting read lock", - ErrMixingNotAllowed: "Mixing of transactional and non-transactional tables is disabled", - ErrDupArgument: "Option '%s' used twice in statement", - ErrUserLimitReached: "User '%-.64s' has exceeded the '%s' resource (current value: %ld)", - ErrSpecificAccessDenied: "Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", - ErrLocalVariable: "Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", - ErrGlobalVariable: "Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", - ErrNoDefault: "Variable '%-.64s' doesn't have a default value", - ErrWrongValueForVar: "Variable '%-.64s' can't be set to the value of '%-.200s'", - ErrWrongTypeForVar: "Incorrect argument type to variable '%-.64s'", - ErrVarCantBeRead: "Variable '%-.64s' can only be set, not read", - ErrCantUseOptionHere: "Incorrect usage/placement of '%s'", - ErrNotSupportedYet: "This version of MySQL doesn't yet support '%s'", - ErrMasterFatalErrorReadingBinlog: "Got fatal error %d from master when reading data from binary log: '%-.320s'", - ErrSlaveIgnoredTable: "Slave SQL thread ignored the query because of replicate-*-table rules", - ErrIncorrectGlobalLocalVar: "Variable '%-.192s' is a %s variable", - ErrWrongFkDef: "Incorrect foreign key definition for '%-.192s': %s", - ErrKeyRefDoNotMatchTableRef: "Key reference and table reference don't match", - ErrOperandColumns: "Operand should contain %d column(s)", - ErrSubqueryNo1Row: "Subquery returns more than 1 row", - ErrUnknownStmtHandler: "Unknown prepared statement handler (%.*s) given to %s", - ErrCorruptHelpDb: "Help database is corrupt or does not exist", - ErrCyclicReference: "Cyclic reference on subqueries", - ErrAutoConvert: "Converting column '%s' from %s to %s", - ErrIllegalReference: "Reference '%-.64s' not supported (%s)", - ErrDerivedMustHaveAlias: "Every derived table must have its own alias", - ErrSelectReduced: "Select %u was reduced during optimization", - ErrTablenameNotAllowedHere: "Table '%-.192s' from one of the SELECTs cannot be used in %-.32s", - ErrNotSupportedAuthMode: "Client does not support authentication protocol requested by server; consider upgrading MySQL client", - ErrSpatialCantHaveNull: "All parts of a SPATIAL index must be NOT NULL", - ErrCollationCharsetMismatch: "COLLATION '%s' is not valid for CHARACTER SET '%s'", - ErrSlaveWasRunning: "Slave is already running", - ErrSlaveWasNotRunning: "Slave already has been stopped", - ErrTooBigForUncompress: "Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", - ErrZlibZMem: "ZLIB: Not enough memory", - ErrZlibZBuf: "ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", - ErrZlibZData: "ZLIB: Input data corrupted", - ErrCutValueGroupConcat: "Row %u was cut by GROUPCONCAT()", - ErrWarnTooFewRecords: "Row %ld doesn't contain data for all columns", - ErrWarnTooManyRecords: "Row %ld was truncated; it contained more data than there were input columns", - ErrWarnNullToNotnull: "Column set to default value; NULL supplied to NOT NULL column '%s' at row %ld", - ErrWarnDataOutOfRange: "Out of range value for column '%s' at row %ld", - WarnDataTruncated: "Data truncated for column '%s' at row %ld", - ErrWarnUsingOtherHandler: "Using storage engine %s for table '%s'", - ErrCantAggregate2collations: "Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", - ErrDropUser: "Cannot drop one or more of the requested users", - ErrRevokeGrants: "Can't revoke all privileges for one or more of the requested users", - ErrCantAggregate3collations: "Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", - ErrCantAggregateNcollations: "Illegal mix of collations for operation '%s'", - ErrVariableIsNotStruct: "Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", - ErrUnknownCollation: "Unknown collation: '%-.64s'", - ErrSlaveIgnoredSslParams: "SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started", - ErrServerIsInSecureAuthMode: "Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", - ErrWarnFieldResolved: "Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", - ErrBadSlaveUntilCond: "Incorrect parameter or combination of parameters for START SLAVE UNTIL", - ErrMissingSkipSlave: "It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart", - ErrUntilCondIgnored: "SQL thread is not to be started so UNTIL options are ignored", - ErrWrongNameForIndex: "Incorrect index name '%-.100s'", - ErrWrongNameForCatalog: "Incorrect catalog name '%-.100s'", - ErrWarnQcResize: "Query cache failed to set size %lu; new query cache size is %lu", - ErrBadFtColumn: "Column '%-.192s' cannot be part of FULLTEXT index", - ErrUnknownKeyCache: "Unknown key cache '%-.100s'", - ErrWarnHostnameWontWork: "MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", - ErrUnknownStorageEngine: "Unknown storage engine '%s'", - ErrWarnDeprecatedSyntax: "'%s' is deprecated and will be removed in a future release. Please use %s instead", - ErrNonUpdatableTable: "The target table %-.100s of the %s is not updatable", - ErrFeatureDisabled: "The '%s' feature is disabled; you need MySQL built with '%s' to have it working", - ErrOptionPreventsStatement: "The MySQL server is running with the %s option so it cannot execute this statement", - ErrDuplicatedValueInType: "Column '%-.100s' has duplicated value '%-.64s' in %s", - ErrTruncatedWrongValue: "Truncated incorrect %-.32s value: '%-.128s'", - ErrTooMuchAutoTimestampCols: "Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", - ErrInvalidOnUpdate: "Invalid ON UPDATE clause for '%-.192s' column", - ErrUnsupportedPs: "This command is not supported in the prepared statement protocol yet", - ErrGetErrmsg: "Got error %d '%-.100s' from %s", - ErrGetTemporaryErrmsg: "Got temporary error %d '%-.100s' from %s", - ErrUnknownTimeZone: "Unknown or incorrect time zone: '%-.64s'", - ErrWarnInvalidTimestamp: "Invalid TIMESTAMP value in column '%s' at row %ld", - ErrInvalidCharacterString: "Invalid %s character string: '%.64s'", - ErrWarnAllowedPacketOverflowed: "Result of %s() was larger than maxAllowedPacket (%ld) - truncated", - ErrConflictingDeclarations: "Conflicting declarations: '%s%s' and '%s%s'", - ErrSpNoRecursiveCreate: "Can't create a %s from within another stored routine", - ErrSpAlreadyExists: "%s %s already exists", - ErrSpDoesNotExist: "%s %s does not exist", - ErrSpDropFailed: "Failed to DROP %s %s", - ErrSpStoreFailed: "Failed to CREATE %s %s", - ErrSpLilabelMismatch: "%s with no matching label: %s", - ErrSpLabelRedefine: "Redefining label %s", - ErrSpLabelMismatch: "End-label %s without match", - ErrSpUninitVar: "Referring to uninitialized variable %s", - ErrSpBadselect: "PROCEDURE %s can't return a result set in the given context", - ErrSpBadreturn: "RETURN is only allowed in a FUNCTION", - ErrSpBadstatement: "%s is not allowed in stored procedures", - ErrUpdateLogDeprecatedIgnored: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", - ErrUpdateLogDeprecatedTranslated: "The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", - ErrQueryInterrupted: "Query execution was interrupted", - ErrSpWrongNoOfArgs: "Incorrect number of arguments for %s %s; expected %u, got %u", - ErrSpCondMismatch: "Undefined CONDITION: %s", - ErrSpNoreturn: "No RETURN found in FUNCTION %s", - ErrSpNoreturnend: "FUNCTION %s ended without RETURN", - ErrSpBadCursorQuery: "Cursor statement must be a SELECT", - ErrSpBadCursorSelect: "Cursor SELECT must not have INTO", - ErrSpCursorMismatch: "Undefined CURSOR: %s", - ErrSpCursorAlreadyOpen: "Cursor is already open", - ErrSpCursorNotOpen: "Cursor is not open", - ErrSpUndeclaredVar: "Undeclared variable: %s", - ErrSpWrongNoOfFetchArgs: "Incorrect number of FETCH variables", - ErrSpFetchNoData: "No data - zero rows fetched, selected, or processed", - ErrSpDupParam: "Duplicate parameter: %s", - ErrSpDupVar: "Duplicate variable: %s", - ErrSpDupCond: "Duplicate condition: %s", - ErrSpDupCurs: "Duplicate cursor: %s", - ErrSpCantAlter: "Failed to ALTER %s %s", - ErrSpSubselectNyi: "Subquery value not supported", - ErrStmtNotAllowedInSfOrTrg: "%s is not allowed in stored function or trigger", - ErrSpVarcondAfterCurshndlr: "Variable or condition declaration after cursor or handler declaration", - ErrSpCursorAfterHandler: "Cursor declaration after handler declaration", - ErrSpCaseNotFound: "Case not found for CASE statement", - ErrFparserTooBigFile: "Configuration file '%-.192s' is too big", - ErrFparserBadHeader: "Malformed file type header in file '%-.192s'", - ErrFparserEOFInComment: "Unexpected end of file while parsing comment '%-.200s'", - ErrFparserErrorInParameter: "Error while parsing parameter '%-.192s' (line: '%-.192s')", - ErrFparserEOFInUnknownParameter: "Unexpected end of file while skipping unknown parameter '%-.192s'", - ErrViewNoExplain: "EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", - ErrFrmUnknownType: "File '%-.192s' has unknown type '%-.64s' in its header", - ErrWrongObject: "'%-.192s.%-.192s' is not %s", - ErrNonupdateableColumn: "Column '%-.192s' is not updatable", - ErrViewSelectDerived: "View's SELECT contains a subquery in the FROM clause", - ErrViewSelectClause: "View's SELECT contains a '%s' clause", - ErrViewSelectVariable: "View's SELECT contains a variable or parameter", - ErrViewSelectTmptable: "View's SELECT refers to a temporary table '%-.192s'", - ErrViewWrongList: "View's SELECT and view's field list have different column counts", - ErrWarnViewMerge: "View merge algorithm can't be used here for now (assumed undefined algorithm)", - ErrWarnViewWithoutKey: "View being updated does not have complete key of underlying table in it", - ErrViewInvalid: "View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", - ErrSpNoDropSp: "Can't drop or alter a %s from within another stored routine", - ErrSpGotoInHndlr: "GOTO is not allowed in a stored procedure handler", - ErrTrgAlreadyExists: "Trigger already exists", - ErrTrgDoesNotExist: "Trigger does not exist", - ErrTrgOnViewOrTempTable: "Trigger's '%-.192s' is view or temporary table", - ErrTrgCantChangeRow: "Updating of %s row is not allowed in %strigger", - ErrTrgNoSuchRowInTrg: "There is no %s row in %s trigger", - ErrNoDefaultForField: "Field '%-.192s' doesn't have a default value", - ErrDivisionByZero: "Division by 0", - ErrTruncatedWrongValueForField: "Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %ld", - ErrIllegalValueForType: "Illegal %s '%-.192s' value found during parsing", - ErrViewNonupdCheck: "CHECK OPTION on non-updatable view '%-.192s.%-.192s'", - ErrViewCheckFailed: "CHECK OPTION failed '%-.192s.%-.192s'", - ErrProcaccessDenied: "%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", - ErrRelayLogFail: "Failed purging old relay logs: %s", - ErrPasswdLength: "Password hash should be a %d-digit hexadecimal number", - ErrUnknownTargetBinlog: "Target log not found in binlog index", - ErrIoErrLogIndexRead: "I/O error reading log index file", - ErrBinlogPurgeProhibited: "Server configuration does not permit binlog purge", - ErrFseekFail: "Failed on fseek()", - ErrBinlogPurgeFatalErr: "Fatal error during log purge", - ErrLogInUse: "A purgeable log is in use, will not purge", - ErrLogPurgeUnknownErr: "Unknown error during log purge", - ErrRelayLogInit: "Failed initializing relay log position: %s", - ErrNoBinaryLogging: "You are not using binary logging", - ErrReservedSyntax: "The '%-.64s' syntax is reserved for purposes internal to the MySQL server", - ErrWsasFailed: "WSAStartup Failed", - ErrDiffGroupsProc: "Can't handle procedures with different groups yet", - ErrNoGroupForProc: "Select must have a group with this procedure", - ErrOrderWithProc: "Can't use ORDER clause with this procedure", - ErrLoggingProhibitChangingOf: "Binary logging and replication forbid changing the global server %s", - ErrNoFileMapping: "Can't map file: %-.200s, errno: %d", - ErrWrongMagic: "Wrong magic in %-.64s", - ErrPsManyParam: "Prepared statement contains too many placeholders", - ErrKeyPart0: "Key part '%-.192s' length cannot be 0", - ErrViewChecksum: "View text checksum failed", - ErrViewMultiupdate: "Can not modify more than one base table through a join view '%-.192s.%-.192s'", - ErrViewNoInsertFieldList: "Can not insert into join view '%-.192s.%-.192s' without fields list", - ErrViewDeleteMergeView: "Can not delete from join view '%-.192s.%-.192s'", - ErrCannotUser: "Operation %s failed for %.256s", - ErrXaerNota: "XAERNOTA: Unknown XID", - ErrXaerInval: "XAERINVAL: Invalid arguments (or unsupported command)", - ErrXaerRmfail: "XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", - ErrXaerOutside: "XAEROUTSIDE: Some work is done outside global transaction", - ErrXaerRmerr: "XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", - ErrXaRbrollback: "XARBROLLBACK: Transaction branch was rolled back", - ErrNonexistingProcGrant: "There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", - ErrProcAutoGrantFail: "Failed to grant EXECUTE and ALTER ROUTINE privileges", - ErrProcAutoRevokeFail: "Failed to revoke all privileges to dropped routine", - ErrDataTooLong: "Data too long for column '%s' at row %ld", - ErrSpBadSQLstate: "Bad SQLSTATE: '%s'", - ErrStartup: "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", - ErrLoadFromFixedSizeRowsToVar: "Can't load value from file with fixed size rows to variable", - ErrCantCreateUserWithGrant: "You are not allowed to create a user with GRANT", - ErrWrongValueForType: "Incorrect %-.32s value: '%-.128s' for function %-.32s", - ErrTableDefChanged: "Table definition has changed, please retry transaction", - ErrSpDupHandler: "Duplicate handler declared in the same block", - ErrSpNotVarArg: "OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", - ErrSpNoRetset: "Not allowed to return a result set from a %s", - ErrCantCreateGeometryObject: "Cannot get geometry object from data you send to the GEOMETRY field", - ErrFailedRoutineBreakBinlog: "A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", - ErrBinlogUnsafeRoutine: "This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", - ErrBinlogCreateRoutineNeedSuper: "You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", - ErrExecStmtWithOpenCursor: "You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", - ErrStmtHasNoOpenCursor: "The statement (%lu) has no open cursor.", - ErrCommitNotAllowedInSfOrTrg: "Explicit or implicit commit is not allowed in stored function or trigger.", - ErrNoDefaultForViewField: "Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", - ErrSpNoRecursion: "Recursive stored functions and triggers are not allowed.", - ErrTooBigScale: "Too big scale %d specified for column '%-.192s'. Maximum is %lu.", - ErrTooBigPrecision: "Too big precision %d specified for column '%-.192s'. Maximum is %lu.", - ErrMBiggerThanD: "For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", - ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", - ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", - ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", - ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", - ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", - ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", - ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", - ErrTrgInWrongSchema: "Trigger in wrong schema", - ErrStackOverrunNeedMore: "Thread stack overrun: %ld bytes used of a %ld byte stack, and %ld bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", - ErrTooLongBody: "Routine body for '%-.100s' is too long", - ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", - ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %lu)", - ErrXaerDupid: "XAERDUPID: The XID already exists", - ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", - ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", - ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", - ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", - ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", - ErrMalformedDefiner: "Definer is not fully qualified", - ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", - ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", - ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", - ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", - ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", - ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", - ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", - ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", - ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", - ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", - ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", - ErrSpWrongName: "Incorrect routine name '%-.192s'", - ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", - ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", - ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %lu)", - ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", - ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", - ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", - ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", - ErrRemovedSpaces: "Leading spaces are removed from name '%s'", - ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", - ErrUsername: "user name", - ErrHostname: "host name", - ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", - ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", - ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", - ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", - ErrNameBecomesEmpty: "Name '%-.64s' has become ''", - ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", - ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", - ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", - ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", - ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", - ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", - ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", - ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", - ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", - ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", - ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", - ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", - ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", - ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", - ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", - ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", - ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", - ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", - ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", - ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", - ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", - ErrPartitionEntry: "Partitioning can not be used stand-alone in query", - ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", - ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", - ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", - ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", - ErrCantCreateHandlerFile: "Failed to create specific handler file", - ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", - ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", - ErrNoParts: "Number of %-.64s = 0 is not an allowed value", - ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", - ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", - ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", - ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", - ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", - ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", - ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", - ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", - ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", - ErrAddPartitionNoNewPartition: "At least one partition must be added", - ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", - ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", - ErrSameNamePartition: "Duplicate partition name %-.192s", - ErrNoBinlog: "It is not allowed to shut off binlog on this command", - ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", - ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", - ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", - ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", - ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", - ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", - ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", - ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", - ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", - ErrCreateFilegroupFailed: "Failed to create %s", - ErrDropFilegroupFailed: "Failed to drop %s", - ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", - ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", - ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", - ErrAlterFilegroupFailed: "Failed to alter: %s", - ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", - ErrBinlogRowWrongTableDef: "Table definition on master and slave does not match: %s", - ErrBinlogRowRbrToSbr: "Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events", - ErrEventAlreadyExists: "Event '%-.192s' already exists", - ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", - ErrEventDoesNotExist: "Unknown event '%-.192s'", - ErrEventCantAlter: "Failed to alter event '%-.192s'", - ErrEventDropFailed: "Failed to drop %s", - ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", - ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", - ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", - ErrEventOpenTableFailed: "Failed to open mysql.event", - ErrEventNeitherMExprNorMAt: "No datetime expression provided", - ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", - ErrEventCannotDelete: "Failed to delete the event from mysql.event", - ErrEventCompile: "Error during compilation of event's body", - ErrEventSameName: "Same old and new event name", - ErrEventDataTooLong: "Data for column '%s' too long", - ErrDropIndexFk: "Cannot drop index '%-.192s': needed in a foreign key constraint", - ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", - ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", - ErrCantLockLogTable: "You can't use locks with log tables.", - ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", - ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", - ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", - ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", - ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", - ErrPartitionNoTemporary: "Cannot create temporary table with partitions", - ErrPartitionConstDomain: "Partition constant is out of partition function domain", - ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", - ErrDdlLog: "Error in DDL log", - ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", - ErrWrongPartitionName: "Incorrect partition name", - ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", - ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", - ErrEventModifyQueue: "Internal scheduler error %d", - ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %u", - ErrPartitionMerge: "Engine cannot be used in partitioned tables", - ErrCantActivateLog: "Cannot activate '%-.64s' log", - ErrRbrNotAvailable: "The server was not built with row-based replication", - ErrBase64Decode: "Decoding of base64 string failed", - ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", - ErrEventsDb: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", - ErrOnlyIntegersAllowed: "Only integers allowed as number here", - ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", - ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", - ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", - ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", - ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", - ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", - ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", - ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", - ErrBinlogPurgeEmfile: "Too many files opened, please execute the command again", - ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", - ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", - ErrSlaveIncident: "The incident %s occured on the master. Message: %-.64s", - ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", - ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", - ErrSlaveFatal: "Fatal : %s", - ErrSlaveRelayLogReadFailure: "Relay log read failure: %s", - ErrSlaveRelayLogWriteFailure: "Relay log write failure: %s", - ErrSlaveCreateEventFailure: "Failed to create %s", - ErrSlaveMasterComFailure: "Master command %s failed: %s", - ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", - ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", - ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", - ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", - ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", - ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", - ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", - ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", - ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", - ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", - ErrNeverUsed: "Ambiguous slave modes combination. %s", - ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", - ErrSlaveCorruptEvent: "Corrupted replication event was detected", - ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", - ErrLogPurgeNoFile: "Being purged log %s was not found", - ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", - ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", - ErrNeedReprepare: "Prepared statement needs to be re-prepared", - ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", - WarnNoMasterInfo: "The master info structure does not exist", - WarnOptionIgnored: "<%-.64s> option ignored", - WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", - WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", - ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", - ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", - ErrSlaveHeartbeatFailure: "Unexpected master's heartbeat data: %s", - ErrSlaveHeartbeatValueOutOfRange: "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%s seconds).", - ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", - ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", - ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", - ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %lu)", - ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %lu)", - ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", - ErrDatabaseName: "Database", - ErrTableName: "Table", - ErrPartitionName: "Partition", - ErrSubpartitionName: "Subpartition", - ErrTemporaryName: "Temporary", - ErrRenamedName: "Renamed", - ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", - WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", - ErrDebugSyncTimeout: "debug sync point wait timed out", - ErrDebugSyncHitLimit: "debug sync point hit limit reached", - ErrDupSignalSet: "Duplicate condition information item '%s'", - ErrSignalWarn: "Unhandled user-defined warning condition", - ErrSignalNotFound: "Unhandled user-defined not found condition", - ErrSignalException: "Unhandled user-defined exception condition", - ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", - ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", - WarnCondItemTruncated: "Data truncated for condition item '%s'", - ErrCondItemTooLong: "Data too long for condition item '%s'", - ErrUnknownLocale: "Unknown locale: '%-.64s'", - ErrSlaveIgnoreServerIds: "The requested server id %d clashes with the slave startup option --replicate-same-server-id", - ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", - ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", - ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", - ErrWrongTypeColumnValue: "Partition column values of incorrect type", - ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", - ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", - ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", - ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", - ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", - ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", - ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", - ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", - ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", - ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", - ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", - ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", - ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", - ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", - ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", - ErrBinlogUnsafeSystemTable: "The statement is unsafe because it uses the general log, slow query log, or performanceSchema table(s). This is unsafe because system tables may differ on slaves.", - ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", - ErrBinlogUnsafeUdf: "Statement is unsafe because it uses a UDF which may not return the same value on the slave.", - ErrBinlogUnsafeSystemVariable: "Statement is unsafe because it uses a system variable that may have a different value on the slave.", - ErrBinlogUnsafeSystemFunction: "Statement is unsafe because it uses a system function that may return a different value on the slave.", - ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", - ErrMessageAndStatement: "%s Statement: %s", - ErrSlaveConversionFailed: "Column %d of table '%-.192s.%-.192s' cannot be converted from type '%-.32s' to type '%-.32s'", - ErrSlaveCantCreateConversion: "Can't create conversion table for table '%-.192s.%-.192s'", - ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", - ErrPathLength: "The path specified for %.64s is too long.", - ErrWarnDeprecatedSyntaxNoReplacement: "'%s' is deprecated and will be removed in a future release.", - ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", - ErrWrongPerfschemaUsage: "Invalid performanceSchema usage.", - ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", - ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", - ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", - ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", - ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %lu)", - ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", - ErrDataOutOfRange: "%s value is out of range in '%s'", - ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", - ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", - ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", - ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", - ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", - ErrFailedReadFromParFile: "Failed to read from the .par file", - ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", - ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", - ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for users authenticating via plugins", - ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", - ErrTruncateIllegalFk: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", - ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", - ErrSlaveHeartbeatValueOutOfRangeMin: "The requested value for the heartbeat period is less than 1 millisecond. The value is reset to 0, meaning that heartbeating will effectively be disabled.", - ErrSlaveHeartbeatValueOutOfRangeMax: "The requested value for the heartbeat period exceeds the value of `slaveNetTimeout' seconds. A sensible value for the period should be less than the timeout.", - ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", - ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", - ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", - WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", - ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %lu bytes.", - ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", - ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", - ErrIndexCorrupt: "Index %s is corrupted", - ErrUndoRecordTooBig: "Undo log record is too big.", - ErrBinlogUnsafeInsertIgnoreSelect: "INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeInsertSelectUpdate: "INSERT... SELECT... ON DUPLICATE KEY UPDATE is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are updated. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeReplaceSelect: "REPLACE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeCreateIgnoreSelect: "CREATE... IGNORE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeCreateReplaceSelect: "CREATE... REPLACE SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are replaced. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeUpdateIgnore: "UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.", - ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", - ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", - ErrBinlogUnsafeWriteAutoincSelect: "Statements writing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any) rows will be written. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeCreateSelectAutoinc: "CREATE TABLE... SELECT... on a table with an auto-increment column is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are inserted. This order cannot be predicted and may differ on master and the slave.", - ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", - ErrTableInFkCheck: "Table is being used in foreign key check.", - ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", - ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", - ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", - ErrMasterDelayValueOutOfRange: "The requested value %u for the master delay exceeds the maximum %u", - ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", - ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", - ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", - ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", - ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", - ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", - ErrTablesDifferentMetadata: "Tables have different definitions", - ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", - ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%lu) is greater than maxBinlogCacheSize (%lu); setting binlogCacheSize equal to maxBinlogCacheSize.", - ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", - ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", - ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", - ErrRplInfoDataTooLong: "Data for column '%s' too long", - ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", - ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", - ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%lu) is greater than maxBinlogStmtCacheSize (%lu); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", - ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", - ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", - ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", - ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", - ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", - ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", - ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", - ErrMtsFeatureIsNotSupported: "%s is not supported in multi-threaded slave mode. %s", - ErrMtsUpdatedDbsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", - ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", - ErrMtsInconsistentData: "%s", - ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", - ErrDaInvalidConditionNumber: "Invalid condition number", - ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", - ErrInsecureChangeMaster: "Storing MySQL user name or password information in the master.info repository is not secure and is therefore not recommended. Please see the MySQL Manual for more about this issue and possible alternatives.", - ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", - ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", - ErrSQLthreadWithSecureSlave: "Setting authentication options is not possible when only the Slave SQL Thread is being started.", - ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", - ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", - ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", - ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", - ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", - ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", - ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", - ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", - ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", - ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", - ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", - ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", - ErrBadSlaveAutoPosition: "Parameters MASTERLOGFILE, MASTERLOGPOS, RELAYLOGFILE and RELAYLOGPOS cannot be set when MASTERAUTOPOSITION is active.", - ErrAutoPositionRequiresGtidModeOn: "CHANGE MASTER TO MASTERAUTOPOSITION = 1 can only be executed when @@GLOBAL.GTIDMODE = ON.", - ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", - ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", - ErrGtidModeRequiresBinlog: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP1 or UPGRADESTEP2 requires --log-bin and --log-slave-updates.", - ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", - ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", - ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", - ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", - ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", - ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", - ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", - ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", - ErrMasterHasPurgedRequiredGtids: "The slave is connecting using CHANGE MASTER TO MASTERAUTOPOSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.", - ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", - ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", - ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", - ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %lu)", - ErrSlaveConfiguration: "Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.", - ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", - ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", - ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", - ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", - ErrUnknownAlterLock: "Unknown LOCK type '%s'", - ErrMtsChangeMasterCantRunWithGaps: "CHANGE MASTER cannot be executed when the slave was stopped with an error or killed in MTS mode. Consider using RESET SLAVE or START SLAVE UNTIL.", - ErrMtsRecoveryFailure: "Cannot recover after SLAVE errored out in parallel execution mode. Additional error messages can be found in the MySQL error log.", - ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", - ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ErrSlaveSilentRetryTransaction: "Slave must silently retry current transaction", - ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", - ErrTableSchemaMismatch: "Schema mismatch (%s)", - ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", - ErrIoRead: "IO Read : (%lu, %s) %s", - ErrIoWrite: "IO Write : (%lu, %s) %s", - ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", - ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", - ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", - ErrInternal: "Internal : %s", - ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %lu : '%s'", - ErrInnodbIndexCorrupt: "Index corrupt: %s", - ErrInvalidYearColumnLength: "YEAR(%lu) column type is deprecated. Creating YEAR(4) column instead.", - ErrNotValidPassword: "Your password does not satisfy the current policy requirements", - ErrMustChangePassword: "You must SET PASSWORD before executing this statement", - ErrFkNoIndexChild: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", - ErrFkNoIndexParent: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", - ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", - ErrFkCannotOpenParent: "Failed to open the referenced table '%s'", - ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", - ErrFkDupName: "Duplicate foreign key constraint name '%s'", - ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", - ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", - ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrFkColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", - ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", - ErrFkColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", - ErrFkColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrMalformedPacket: "Malformed communication packet.", - ErrReadOnlyMode: "Running in read-only mode", - ErrGtidNextTypeUndefinedGroup: "When @@SESSION.GTIDNEXT is set to a GTID, you must explicitly set it again after a COMMIT or ROLLBACK. If you see this error message in the slave SQL thread, it means that a table in the current transaction is transactional on the master and non-transactional on the slave. In a client connection, it means that you executed SET @@SESSION.GTIDNEXT before a transaction and forgot to set @@SESSION.GTIDNEXT to a different identifier or to 'AUTOMATIC' after COMMIT or ROLLBACK. Current @@SESSION.GTIDNEXT is '%s'.", - ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", - ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", - ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", - ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", - ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", - ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", - ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", - ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", - ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", - ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", - ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", - ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", - ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", - ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", - ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", - ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", - ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", - ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", - ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", - ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", - ErrSQLSlaveSkipCounterNotSettableInGtidMode: "sqlSlaveSkipCounter can not be set when the server is running with @@GLOBAL.GTIDMODE = ON. Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction", - ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", - ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", - ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", - ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", - ErrRowInWrongPartition: "Found a row in wrong partition %s", -} diff --git a/vendor/github.com/pingcap/tidb/mysql/error.go b/vendor/github.com/pingcap/tidb/mysql/error.go deleted file mode 100644 index 43246a4a2ad6..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/error.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "errors" - "fmt" -) - -// Portable analogs of some common call errors. -var ( - ErrBadConn = errors.New("connection was bad") - ErrMalformPacket = errors.New("Malform packet error") -) - -// SQLError records an error information, from executing SQL. -type SQLError struct { - Code uint16 - Message string - State string -} - -// Error prints errors, with a formatted string. -func (e *SQLError) Error() string { - return fmt.Sprintf("ERROR %d (%s): %s", e.Code, e.State, e.Message) -} - -// NewErr generates a SQL error, with an error code and default format specifier defined in MySQLErrName. -func NewErr(errCode uint16, args ...interface{}) *SQLError { - e := &SQLError{Code: errCode} - - if s, ok := MySQLState[errCode]; ok { - e.State = s - } else { - e.State = DefaultMySQLState - } - - if format, ok := MySQLErrName[errCode]; ok { - e.Message = fmt.Sprintf(format, args...) - } else { - e.Message = fmt.Sprint(args...) - } - - return e -} - -// NewErrf creates a SQL error, with an error code and a format specifier -func NewErrf(errCode uint16, format string, args ...interface{}) *SQLError { - e := &SQLError{Code: errCode} - - if s, ok := MySQLState[errCode]; ok { - e.State = s - } else { - e.State = DefaultMySQLState - } - - e.Message = fmt.Sprintf(format, args...) - - return e -} diff --git a/vendor/github.com/pingcap/tidb/mysql/fsp.go b/vendor/github.com/pingcap/tidb/mysql/fsp.go deleted file mode 100644 index 820fabb3d1b5..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/fsp.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "math" - "strconv" - "strings" - - "github.com/juju/errors" -) - -const ( - // UnspecifiedFsp is the unspecified fractional seconds part. - UnspecifiedFsp int = -1 - // MaxFsp is the maximum digit of fractional seconds part. - MaxFsp int = 6 - // MinFsp is the minimum digit of fractional seconds part. - MinFsp int = 0 - // DefaultFsp is the default digit of fractional seconds part. - // MySQL use 0 as the default Fsp. - DefaultFsp int = 0 -) - -func checkFsp(fsp int) (int, error) { - if fsp == UnspecifiedFsp { - return DefaultFsp, nil - } - if fsp < MinFsp || fsp > MaxFsp { - return DefaultFsp, errors.Errorf("Invalid fsp %d", fsp) - } - return fsp, nil -} - -func parseFrac(s string, fsp int) (int, error) { - if len(s) == 0 { - return 0, nil - } - - var err error - fsp, err = checkFsp(fsp) - if err != nil { - return 0, errors.Trace(err) - } - - // Use float to calculate frac, e.g, "123" -> "0.123" - if !strings.HasPrefix(s, ".") && !strings.HasPrefix(s, "0.") { - s = "0." + s - } - - frac, err := strconv.ParseFloat(s, 64) - if err != nil { - return 0, errors.Trace(err) - } - - // round frac to the nearest value with FSP - var round float64 - pow := math.Pow(10, float64(fsp)) - digit := pow * frac - _, div := math.Modf(digit) - if div >= 0.5 { - round = math.Ceil(digit) - } else { - round = math.Floor(digit) - } - - // Get the final frac, with 6 digit number - // 0.1236 round 3 -> 124 -> 123000 - // 0.0312 round 2 -> 3 -> 30000 - return int(round * math.Pow10(MaxFsp-fsp)), nil -} - -// alignFrac is used to generate alignment frac, like `100` -> `100000` -func alignFrac(s string, fsp int) string { - sl := len(s) - if sl < fsp { - return s + strings.Repeat("0", fsp-sl) - } - - return s -} diff --git a/vendor/github.com/pingcap/tidb/mysql/hex.go b/vendor/github.com/pingcap/tidb/mysql/hex.go deleted file mode 100644 index 5858b5d969b1..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/hex.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "encoding/hex" - "fmt" - "strconv" - "strings" - - "github.com/juju/errors" -) - -// Hex is for mysql hexadecimal literal type. -type Hex struct { - // Value holds numeric value for hexadecimal literal. - Value int64 -} - -// String implements fmt.Stringer interface. -func (h Hex) String() string { - s := fmt.Sprintf("%X", h.Value) - if len(s)%2 != 0 { - return "0x0" + s - } - - return "0x" + s -} - -// ToNumber changes hexadecimal type to float64 for numeric operation. -// MySQL treats hexadecimal literal as double type. -func (h Hex) ToNumber() float64 { - return float64(h.Value) -} - -// ToString returns the string representation for hexadecimal literal. -func (h Hex) ToString() string { - s := fmt.Sprintf("%x", h.Value) - if len(s)%2 != 0 { - s = "0" + s - } - - // should never error. - b, _ := hex.DecodeString(s) - return string(b) -} - -// ParseHex parses hexadecimal literal string. -// The string format can be X'val', x'val' or 0xval. -// val must in (0...9, a...z, A...Z). -func ParseHex(s string) (Hex, error) { - if len(s) == 0 { - return Hex{}, errors.Errorf("invalid empty string for parsing hexadecimal literal") - } - - if s[0] == 'x' || s[0] == 'X' { - // format is x'val' or X'val' - s = strings.Trim(s[1:], "'") - if len(s)%2 != 0 { - return Hex{}, errors.Errorf("invalid hexadecimal format, must even numbers, but %d", len(s)) - } - s = "0x" + s - } else if !strings.HasPrefix(s, "0x") { - // here means format is not x'val', X'val' or 0xval. - return Hex{}, errors.Errorf("invalid hexadecimal format %s", s) - } - - n, err := strconv.ParseInt(s, 0, 64) - if err != nil { - return Hex{}, errors.Trace(err) - } - - return Hex{Value: n}, nil -} diff --git a/vendor/github.com/pingcap/tidb/mysql/set.go b/vendor/github.com/pingcap/tidb/mysql/set.go deleted file mode 100644 index 8c0788a614d8..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/set.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "strconv" - "strings" - - "github.com/juju/errors" -) - -var zeroSet = Set{Name: "", Value: 0} - -// Set is for MySQL Set type. -type Set struct { - Name string - Value uint64 -} - -// String implements fmt.Stringer interface. -func (e Set) String() string { - return e.Name -} - -// ToNumber changes Set to float64 for numeric operation. -func (e Set) ToNumber() float64 { - return float64(e.Value) -} - -// ParseSetName creates a Set with name. -func ParseSetName(elems []string, name string) (Set, error) { - if len(name) == 0 { - return zeroSet, nil - } - - seps := strings.Split(name, ",") - marked := make(map[string]struct{}, len(seps)) - for _, s := range seps { - marked[strings.ToLower(s)] = struct{}{} - } - items := make([]string, 0, len(seps)) - - value := uint64(0) - for i, n := range elems { - key := strings.ToLower(n) - if _, ok := marked[key]; ok { - value |= (1 << uint64(i)) - delete(marked, key) - items = append(items, key) - } - } - - if len(marked) == 0 { - return Set{Name: strings.Join(items, ","), Value: value}, nil - } - - // name doesn't exist, maybe an integer? - if num, err := strconv.ParseUint(name, 0, 64); err == nil { - return ParseSetValue(elems, num) - } - - return Set{}, errors.Errorf("item %s is not in Set %v", name, elems) -} - -var ( - setIndexValue []uint64 - setIndexInvertValue []uint64 -) - -func init() { - setIndexValue = make([]uint64, 64) - setIndexInvertValue = make([]uint64, 64) - - for i := 0; i < 64; i++ { - setIndexValue[i] = 1 << uint64(i) - setIndexInvertValue[i] = ^setIndexValue[i] - } -} - -// ParseSetValue creates a Set with special number. -func ParseSetValue(elems []string, number uint64) (Set, error) { - if number == 0 { - return zeroSet, nil - } - - value := number - var items []string - for i := 0; i < len(elems); i++ { - if number&setIndexValue[i] > 0 { - items = append(items, elems[i]) - number &= setIndexInvertValue[i] - } - } - - if number != 0 { - return Set{}, errors.Errorf("invalid number %d for Set %v", number, elems) - } - - return Set{Name: strings.Join(items, ","), Value: value}, nil -} diff --git a/vendor/github.com/pingcap/tidb/mysql/state.go b/vendor/github.com/pingcap/tidb/mysql/state.go deleted file mode 100644 index 67fcd0e5af72..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/state.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -const ( - // DefaultMySQLState is default state of the mySQL - DefaultMySQLState = "HY000" -) - -// MySQLState maps error code to MySQL SQLSTATE value. -// The values are taken from ANSI SQL and ODBC and are more standardized. -var MySQLState = map[uint16]string{ - ErrDupKey: "23000", - ErrOutofmemory: "HY001", - ErrOutOfSortmemory: "HY001", - ErrConCount: "08004", - ErrBadHost: "08S01", - ErrHandshake: "08S01", - ErrDbaccessDenied: "42000", - ErrAccessDenied: "28000", - ErrNoDb: "3D000", - ErrUnknownCom: "08S01", - ErrBadNull: "23000", - ErrBadDb: "42000", - ErrTableExists: "42S01", - ErrBadTable: "42S02", - ErrNonUniq: "23000", - ErrServerShutdown: "08S01", - ErrBadField: "42S22", - ErrWrongFieldWithGroup: "42000", - ErrWrongSumSelect: "42000", - ErrWrongGroupField: "42000", - ErrWrongValueCount: "21S01", - ErrTooLongIdent: "42000", - ErrDupFieldname: "42S21", - ErrDupKeyname: "42000", - ErrDupEntry: "23000", - ErrWrongFieldSpec: "42000", - ErrParse: "42000", - ErrEmptyQuery: "42000", - ErrNonuniqTable: "42000", - ErrInvalidDefault: "42000", - ErrMultiplePriKey: "42000", - ErrTooManyKeys: "42000", - ErrTooManyKeyParts: "42000", - ErrTooLongKey: "42000", - ErrKeyColumnDoesNotExits: "42000", - ErrBlobUsedAsKey: "42000", - ErrTooBigFieldlength: "42000", - ErrWrongAutoKey: "42000", - ErrForcingClose: "08S01", - ErrIpsock: "08S01", - ErrNoSuchIndex: "42S12", - ErrWrongFieldTerminators: "42000", - ErrBlobsAndNoTerminated: "42000", - ErrCantRemoveAllFields: "42000", - ErrCantDropFieldOrKey: "42000", - ErrBlobCantHaveDefault: "42000", - ErrWrongDbName: "42000", - ErrWrongTableName: "42000", - ErrTooBigSelect: "42000", - ErrUnknownProcedure: "42000", - ErrWrongParamcountToProcedure: "42000", - ErrUnknownTable: "42S02", - ErrFieldSpecifiedTwice: "42000", - ErrUnsupportedExtension: "42000", - ErrTableMustHaveColumns: "42000", - ErrUnknownCharacterSet: "42000", - ErrTooBigRowsize: "42000", - ErrWrongOuterJoin: "42000", - ErrNullColumnInIndex: "42000", - ErrPasswordAnonymousUser: "42000", - ErrPasswordNotAllowed: "42000", - ErrPasswordNoMatch: "42000", - ErrWrongValueCountOnRow: "21S01", - ErrInvalidUseOfNull: "22004", - ErrRegexp: "42000", - ErrMixOfGroupFuncAndFields: "42000", - ErrNonexistingGrant: "42000", - ErrTableaccessDenied: "42000", - ErrColumnaccessDenied: "42000", - ErrIllegalGrantForTable: "42000", - ErrGrantWrongHostOrUser: "42000", - ErrNoSuchTable: "42S02", - ErrNonexistingTableGrant: "42000", - ErrNotAllowedCommand: "42000", - ErrSyntax: "42000", - ErrAbortingConnection: "08S01", - ErrNetPacketTooLarge: "08S01", - ErrNetReadErrorFromPipe: "08S01", - ErrNetFcntl: "08S01", - ErrNetPacketsOutOfOrder: "08S01", - ErrNetUncompress: "08S01", - ErrNetRead: "08S01", - ErrNetReadInterrupted: "08S01", - ErrNetErrorOnWrite: "08S01", - ErrNetWriteInterrupted: "08S01", - ErrTooLongString: "42000", - ErrTableCantHandleBlob: "42000", - ErrTableCantHandleAutoIncrement: "42000", - ErrWrongColumnName: "42000", - ErrWrongKeyColumn: "42000", - ErrDupUnique: "23000", - ErrBlobKeyWithoutLength: "42000", - ErrPrimaryCantHaveNull: "42000", - ErrTooManyRows: "42000", - ErrRequiresPrimaryKey: "42000", - ErrKeyDoesNotExits: "42000", - ErrCheckNoSuchTable: "42000", - ErrCheckNotImplemented: "42000", - ErrCantDoThisDuringAnTransaction: "25000", - ErrNewAbortingConnection: "08S01", - ErrMasterNetRead: "08S01", - ErrMasterNetWrite: "08S01", - ErrTooManyUserConnections: "42000", - ErrReadOnlyTransaction: "25000", - ErrNoPermissionToCreateUser: "42000", - ErrLockDeadlock: "40001", - ErrNoReferencedRow: "23000", - ErrRowIsReferenced: "23000", - ErrConnectToMaster: "08S01", - ErrWrongNumberOfColumnsInSelect: "21000", - ErrUserLimitReached: "42000", - ErrSpecificAccessDenied: "42000", - ErrNoDefault: "42000", - ErrWrongValueForVar: "42000", - ErrWrongTypeForVar: "42000", - ErrCantUseOptionHere: "42000", - ErrNotSupportedYet: "42000", - ErrWrongFkDef: "42000", - ErrOperandColumns: "21000", - ErrSubqueryNo1Row: "21000", - ErrIllegalReference: "42S22", - ErrDerivedMustHaveAlias: "42000", - ErrSelectReduced: "01000", - ErrTablenameNotAllowedHere: "42000", - ErrNotSupportedAuthMode: "08004", - ErrSpatialCantHaveNull: "42000", - ErrCollationCharsetMismatch: "42000", - ErrWarnTooFewRecords: "01000", - ErrWarnTooManyRecords: "01000", - ErrWarnNullToNotnull: "22004", - ErrWarnDataOutOfRange: "22003", - WarnDataTruncated: "01000", - ErrWrongNameForIndex: "42000", - ErrWrongNameForCatalog: "42000", - ErrUnknownStorageEngine: "42000", - ErrTruncatedWrongValue: "22007", - ErrSpNoRecursiveCreate: "2F003", - ErrSpAlreadyExists: "42000", - ErrSpDoesNotExist: "42000", - ErrSpLilabelMismatch: "42000", - ErrSpLabelRedefine: "42000", - ErrSpLabelMismatch: "42000", - ErrSpUninitVar: "01000", - ErrSpBadselect: "0A000", - ErrSpBadreturn: "42000", - ErrSpBadstatement: "0A000", - ErrUpdateLogDeprecatedIgnored: "42000", - ErrUpdateLogDeprecatedTranslated: "42000", - ErrQueryInterrupted: "70100", - ErrSpWrongNoOfArgs: "42000", - ErrSpCondMismatch: "42000", - ErrSpNoreturn: "42000", - ErrSpNoreturnend: "2F005", - ErrSpBadCursorQuery: "42000", - ErrSpBadCursorSelect: "42000", - ErrSpCursorMismatch: "42000", - ErrSpCursorAlreadyOpen: "24000", - ErrSpCursorNotOpen: "24000", - ErrSpUndeclaredVar: "42000", - ErrSpFetchNoData: "02000", - ErrSpDupParam: "42000", - ErrSpDupVar: "42000", - ErrSpDupCond: "42000", - ErrSpDupCurs: "42000", - ErrSpSubselectNyi: "0A000", - ErrStmtNotAllowedInSfOrTrg: "0A000", - ErrSpVarcondAfterCurshndlr: "42000", - ErrSpCursorAfterHandler: "42000", - ErrSpCaseNotFound: "20000", - ErrDivisionByZero: "22012", - ErrIllegalValueForType: "22007", - ErrProcaccessDenied: "42000", - ErrXaerNota: "XAE04", - ErrXaerInval: "XAE05", - ErrXaerRmfail: "XAE07", - ErrXaerOutside: "XAE09", - ErrXaerRmerr: "XAE03", - ErrXaRbrollback: "XA100", - ErrNonexistingProcGrant: "42000", - ErrDataTooLong: "22001", - ErrSpBadSQLstate: "42000", - ErrCantCreateUserWithGrant: "42000", - ErrSpDupHandler: "42000", - ErrSpNotVarArg: "42000", - ErrSpNoRetset: "0A000", - ErrCantCreateGeometryObject: "22003", - ErrTooBigScale: "42000", - ErrTooBigPrecision: "42000", - ErrMBiggerThanD: "42000", - ErrTooLongBody: "42000", - ErrTooBigDisplaywidth: "42000", - ErrXaerDupid: "XAE08", - ErrDatetimeFunctionOverflow: "22008", - ErrRowIsReferenced2: "23000", - ErrNoReferencedRow2: "23000", - ErrSpBadVarShadow: "42000", - ErrSpWrongName: "42000", - ErrSpNoAggregate: "42000", - ErrMaxPreparedStmtCountReached: "42000", - ErrNonGroupingFieldUsed: "42000", - ErrForeignDuplicateKeyOldUnused: "23000", - ErrCantChangeTxCharacteristics: "25001", - ErrWrongParamcountToNativeFct: "42000", - ErrWrongParametersToNativeFct: "42000", - ErrWrongParametersToStoredFct: "42000", - ErrDupEntryWithKeyName: "23000", - ErrXaRbtimeout: "XA106", - ErrXaRbdeadlock: "XA102", - ErrFuncInexistentNameCollision: "42000", - ErrDupSignalSet: "42000", - ErrSignalWarn: "01000", - ErrSignalNotFound: "02000", - ErrSignalException: "HY000", - ErrResignalWithoutActiveHandler: "0K000", - ErrSpatialMustHaveGeomCol: "42000", - ErrDataOutOfRange: "22003", - ErrAccessDeniedNoPassword: "28000", - ErrTruncateIllegalFk: "42000", - ErrDaInvalidConditionNumber: "35000", - ErrForeignDuplicateKeyWithChildInfo: "23000", - ErrForeignDuplicateKeyWithoutChildInfo: "23000", - ErrCantExecuteInReadOnlyTransaction: "25006", - ErrAlterOperationNotSupported: "0A000", - ErrAlterOperationNotSupportedReason: "0A000", - ErrDupUnknownInIndex: "23000", -} diff --git a/vendor/github.com/pingcap/tidb/mysql/time.go b/vendor/github.com/pingcap/tidb/mysql/time.go deleted file mode 100644 index 7f9819941572..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/time.go +++ /dev/null @@ -1,1422 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -import ( - "bytes" - "fmt" - "math" - "strconv" - "strings" - "time" - "unicode" - - "github.com/juju/errors" -) - -// Portable analogs of some common call errors. -var ( - ErrInvalidTimeFormat = errors.New("invalid time format") - ErrInvalidYearFormat = errors.New("invalid year format") - ErrInvalidYear = errors.New("invalid year") -) - -// Time format without fractional seconds precision. -const ( - DateFormat = "2006-01-02" - TimeFormat = "2006-01-02 15:04:05" - // TimeFSPFormat is time format with fractional seconds precision. - TimeFSPFormat = "2006-01-02 15:04:05.000000" -) - -const ( - // MinYear is the minimum for mysql year type. - MinYear int16 = 1901 - // MaxYear is the maximum for mysql year type. - MaxYear int16 = 2155 - - // MinTime is the minimum for mysql time type. - MinTime = -time.Duration(838*3600+59*60+59) * time.Second - // MaxTime is the maximum for mysql time type. - MaxTime = time.Duration(838*3600+59*60+59) * time.Second - - zeroDatetimeStr = "0000-00-00 00:00:00" - zeroDateStr = "0000-00-00" -) - -// Zero values for different types. -var ( - // ZeroDuration is the zero value for Duration type. - ZeroDuration = Duration{Duration: time.Duration(0), Fsp: DefaultFsp} - - // ZeroTime is the zero value for time.Time type. - ZeroTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC) - - // ZeroDatetime is the zero value for datetime Time. - ZeroDatetime = Time{ - Time: ZeroTime, - Type: TypeDatetime, - Fsp: DefaultFsp, - } - - // ZeroTimestamp is the zero value for timestamp Time. - ZeroTimestamp = Time{ - Time: ZeroTime, - Type: TypeTimestamp, - Fsp: DefaultFsp, - } - - // ZeroDate is the zero value for date Time. - ZeroDate = Time{ - Time: ZeroTime, - Type: TypeDate, - Fsp: DefaultFsp, - } -) - -var ( - // MinDatetime is the minimum for mysql datetime type. - MinDatetime = time.Date(1000, 1, 1, 0, 0, 0, 0, time.Local) - // MaxDatetime is the maximum for mysql datetime type. - MaxDatetime = time.Date(9999, 12, 31, 23, 59, 59, 999999, time.Local) - - // MinTimestamp is the minimum for mysql timestamp type. - MinTimestamp = time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC) - // MaxTimestamp is the maximum for mysql timestamp type. - MaxTimestamp = time.Date(2038, 1, 19, 3, 14, 7, 999999, time.UTC) - - // WeekdayNames lists names of weekdays, which are used in builtin time function `dayname`. - WeekdayNames = []string{ - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday", - } -) - -// Time is the struct for handling datetime, timestamp and date. -// TODO: check if need a NewTime function to set Fsp default value? -type Time struct { - time.Time - Type uint8 - // Fsp is short for Fractional Seconds Precision. - // See http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html - Fsp int -} - -// CurrentTime returns current time with type tp. -func CurrentTime(tp uint8) Time { - return Time{Time: time.Now(), Type: tp, Fsp: 0} -} - -func (t Time) String() string { - if t.IsZero() { - if t.Type == TypeDate { - return zeroDateStr - } - - return zeroDatetimeStr - } - - if t.Type == TypeDate { - return t.Time.Format(DateFormat) - } - - tfStr := TimeFormat - if t.Fsp > 0 { - tfStr = fmt.Sprintf("%s.%s", tfStr, strings.Repeat("0", t.Fsp)) - } - - return t.Time.Format(tfStr) -} - -// IsZero returns a boolean indicating whether the time is equal to ZeroTime. -func (t Time) IsZero() bool { - return t.Time.Equal(ZeroTime) -} - -// Marshal returns the binary encoding of time. -func (t Time) Marshal() ([]byte, error) { - var ( - b []byte - err error - ) - - switch t.Type { - case TypeDatetime, TypeDate: - // We must use t's Zone not current Now Zone, - // For EDT/EST, even we create the time with time.Local location, - // we may still have a different zone with current Now time. - _, offset := t.Zone() - // For datetime and date type, we have a trick to marshal. - // e.g, if local time is 2010-10-10T10:10:10 UTC+8 - // we will change this to 2010-10-10T10:10:10 UTC and then marshal. - b, err = t.Time.Add(time.Duration(offset) * time.Second).UTC().MarshalBinary() - case TypeTimestamp: - b, err = t.Time.UTC().MarshalBinary() - default: - err = errors.Errorf("invalid time type %d", t.Type) - } - - if err != nil { - return nil, errors.Trace(err) - } - - return b, nil -} - -// Unmarshal decodes the binary data into Time with current local time. -func (t *Time) Unmarshal(b []byte) error { - return t.UnmarshalInLocation(b, time.Local) -} - -// UnmarshalInLocation decodes the binary data -// into Time with a specific time Location. -func (t *Time) UnmarshalInLocation(b []byte, loc *time.Location) error { - if err := t.Time.UnmarshalBinary(b); err != nil { - return errors.Trace(err) - } - - if t.IsZero() { - return nil - } - - if t.Type == TypeDatetime || t.Type == TypeDate { - // e.g, for 2010-10-10T10:10:10 UTC, we will unmarshal to 2010-10-10T10:10:10 location - _, offset := t.Time.In(loc).Zone() - - t.Time = t.Time.Add(-time.Duration(offset) * time.Second).In(loc) - if t.Type == TypeDate { - // for date type ,we will only use year, month and day. - year, month, day := t.Time.Date() - t.Time = time.Date(year, month, day, 0, 0, 0, 0, loc) - } - } else if t.Type == TypeTimestamp { - t.Time = t.Time.In(loc) - } else { - return errors.Errorf("invalid time type %d", t.Type) - } - - return nil -} - -const numberFormat = "20060102150405" - -// ToNumber returns a formatted number. -// e.g, -// 2012-12-12T10:10:10 -> 20121212101010 -// 2012-12-12T10:10:10.123456 -> 20121212101010.123456 -func (t Time) ToNumber() Decimal { - if t.IsZero() { - return ZeroDecimal - } - - tfStr := numberFormat - if t.Fsp > 0 { - tfStr = fmt.Sprintf("%s.%s", tfStr, strings.Repeat("0", t.Fsp)) - } - - s := t.Time.Format(tfStr) - // We skip checking error here because time formatted string can be parsed certainly. - d, _ := ParseDecimal(s) - return d -} - -// Convert converts t with type tp. -func (t Time) Convert(tp uint8) (Time, error) { - if t.Type == tp || t.IsZero() { - return Time{Time: t.Time, Type: tp, Fsp: t.Fsp}, nil - } - - switch tp { - case TypeDatetime: - return Time{Time: t.Time, Type: TypeDatetime, Fsp: t.Fsp}, nil - case TypeTimestamp: - nt := Time{Time: t.Time, Type: TypeTimestamp, Fsp: t.Fsp} - if !checkTimestamp(nt) { - return ZeroTimestamp, errors.Trace(ErrInvalidTimeFormat) - } - return nt, nil - case TypeDate: - year, month, day := t.Time.Date() - return Time{Time: time.Date(year, month, day, 0, 0, 0, 0, time.Local), - Type: TypeDate, Fsp: 0}, nil - default: - return Time{Time: ZeroTime, Type: tp}, errors.Errorf("invalid time type %d", tp) - } -} - -// ConvertToDuration converts mysql datetime, timestamp and date to mysql time type. -// e.g, -// 2012-12-12T10:10:10 -> 10:10:10 -// 2012-12-12 -> 0 -func (t Time) ConvertToDuration() (Duration, error) { - if t.IsZero() { - return ZeroDuration, nil - } - - hour, minute, second := t.Clock() - frac := t.Nanosecond() - - d := time.Duration(hour*3600+minute*60+second)*time.Second + time.Duration(frac) - - // TODO: check convert validation - return Duration{Duration: time.Duration(d), Fsp: t.Fsp}, nil -} - -// Compare returns an integer comparing the time instant t to o. -// If t is after o, return 1, equal o, return 0, before o, return -1. -func (t Time) Compare(o Time) int { - if t.Time.After(o.Time) { - return 1 - } else if t.Time.Equal(o.Time) { - return 0 - } else { - return -1 - } -} - -// CompareString is like Compare, -// but parses string to Time then compares. -func (t Time) CompareString(str string) (int, error) { - // use MaxFsp to parse the string - o, err := ParseTime(str, t.Type, MaxFsp) - if err != nil { - return 0, errors.Trace(err) - } - - return t.Compare(o), nil -} - -// RoundFrac rounds fractional seconds precision with new fsp and returns a new one. -// We will use the “round half up” rule, e.g, >= 0.5 -> 1, < 0.5 -> 0, -// so 2011:11:11 10:10:10.888888 round 0 -> 2011:11:11 10:10:11 -// and 2011:11:11 10:10:10.111111 round 0 -> 2011:11:11 10:10:10 -func (t Time) RoundFrac(fsp int) (Time, error) { - if t.Type == TypeDate { - // date type has no fsp - return t, nil - } - - fsp, err := checkFsp(fsp) - if err != nil { - return t, errors.Trace(err) - } - - if fsp == t.Fsp { - // have same fsp - return t, nil - } - - nt := t.Time.Round(time.Duration(math.Pow10(9-fsp)) * time.Nanosecond) - return Time{Time: nt, Type: t.Type, Fsp: fsp}, nil -} - -func parseDateFormat(format string) []string { - format = strings.TrimSpace(format) - - start := 0 - seps := []string{} - for i := 0; i < len(format); i++ { - // Date fromat must start and end with number. - if i == 0 || i == len(format)-1 { - if !unicode.IsNumber(rune(format[i])) { - return nil - } - - continue - } - - // Seperator is a single none-number char. - if !unicode.IsNumber(rune(format[i])) { - if !unicode.IsNumber(rune(format[i-1])) { - return nil - } - - seps = append(seps, format[start:i]) - start = i + 1 - } - - } - - seps = append(seps, format[start:]) - return seps -} - -func parseDatetime(str string, fsp int) (Time, error) { - // Try to split str with delimiter. - // TODO: only punctuation can be the delimiter for date parts or time parts. - // But only space and T can be the delimiter between the date and time part. - var ( - year int - month int - day int - hour int - minute int - second int - frac int - fracStr string - - err error - ) - - seps := parseDateFormat(str) - - switch len(seps) { - case 1: - // No delimiter. - if len(str) == 14 { - // YYYYMMDDHHMMSS - _, err = fmt.Sscanf(str, "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &minute, &second) - } else if len(str) == 12 { - // YYMMDDHHMMSS - _, err = fmt.Sscanf(str, "%2d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &minute, &second) - year = adjustYear(year) - } else if len(str) == 8 { - // YYYYMMDD - _, err = fmt.Sscanf(str, "%4d%2d%2d", &year, &month, &day) - } else if len(str) == 6 { - // YYMMDD - _, err = fmt.Sscanf(str, "%2d%2d%2d", &year, &month, &day) - year = adjustYear(year) - } else { - return ZeroDatetime, errors.Trace(ErrInvalidTimeFormat) - } - case 2: - s := seps[0] - fracStr = seps[1] - - if len(s) == 14 { - // YYYYMMDDHHMMSS.fraction - _, err = fmt.Sscanf(s, "%4d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &minute, &second) - } else if len(s) == 12 { - // YYMMDDHHMMSS.fraction - _, err = fmt.Sscanf(s, "%2d%2d%2d%2d%2d%2d", &year, &month, &day, &hour, &minute, &second) - year = adjustYear(year) - } else { - return ZeroDatetime, errors.Trace(ErrInvalidTimeFormat) - } - case 3: - // YYYY-MM-DD - err = scanTimeArgs(seps, &year, &month, &day) - case 6: - // We don't have fractional seconds part. - // YYYY-MM-DD HH-MM-SS - err = scanTimeArgs(seps, &year, &month, &day, &hour, &minute, &second) - case 7: - // We have fractional seconds part. - // YYY-MM-DD HH-MM-SS.fraction - err = scanTimeArgs(seps[0:len(seps)-1], &year, &month, &day, &hour, &minute, &second) - fracStr = seps[len(seps)-1] - default: - return ZeroDatetime, errors.Trace(ErrInvalidTimeFormat) - } - - if err != nil { - return ZeroDatetime, errors.Trace(err) - } - - // If str is sepereated by delimiters, the first one is year, and if the year is 2 digit, - // we should adjust it. - // TODO: ajust year is very complex, now we only consider the simplest way. - if len(seps[0]) == 2 { - year = adjustYear(year) - } - - frac, err = parseFrac(fracStr, fsp) - if err != nil { - return ZeroDatetime, errors.Trace(err) - } - - t, err := newTime(year, month, day, hour, minute, second, frac) - if err != nil { - return ZeroDatetime, errors.Trace(err) - } - - nt := Time{ - Time: t, - Type: TypeDatetime, - Fsp: fsp} - - return nt, nil -} - -func scanTimeArgs(seps []string, args ...*int) error { - if len(seps) != len(args) { - return errors.Trace(ErrInvalidTimeFormat) - } - - var err error - for i, s := range seps { - *args[i], err = strconv.Atoi(s) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -// ParseYear parses a formatted string and returns a year number. -func ParseYear(str string) (int16, error) { - v, err := strconv.ParseInt(str, 10, 16) - if err != nil { - return 0, errors.Trace(err) - } - y := int16(v) - - if len(str) == 4 { - // Nothing to do. - } else if len(str) == 2 || len(str) == 1 { - y = int16(adjustYear(int(y))) - } else { - return 0, errors.Trace(ErrInvalidYearFormat) - } - - if y < MinYear || y > MaxYear { - return 0, errors.Trace(ErrInvalidYearFormat) - } - - return y, nil -} - -func newTime(year int, month int, day int, hour int, minute int, second int, frac int) (time.Time, error) { - if year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0 { - // Should we check fractional fractional here? - // But go time.Time can not support zero time 0000-00-00 00:00:00. - return ZeroTime, nil - } - - if err := checkTime(year, month, day, hour, minute, second, frac); err != nil { - return ZeroTime, errors.Trace(err) - } - - return time.Date(year, time.Month(month), day, hour, minute, second, frac*1000, time.Local), nil -} - -// See https://dev.mysql.com/doc/refman/5.7/en/two-digit-years.html -func adjustYear(y int) int { - if y >= 0 && y <= 69 { - y = 2000 + y - } else if y >= 70 && y <= 99 { - y = 1900 + y - } - return y -} - -// AdjustYear is used for adjusting year and checking its validation. -func AdjustYear(y int64) (int64, error) { - y = int64(adjustYear(int(y))) - if y < int64(MinYear) || y > int64(MaxYear) { - return 0, errors.Trace(ErrInvalidYear) - } - - return y, nil -} - -// Duration is the type for MySQL time type. -type Duration struct { - time.Duration - // Fsp is short for Fractional Seconds Precision. - // See http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html - Fsp int -} - -// String returns the time formatted using default TimeFormat and fsp. -func (d Duration) String() string { - var buf bytes.Buffer - - sign, hours, minutes, seconds, fraction := splitDuration(d.Duration) - if sign < 0 { - buf.WriteByte('-') - } - - fmt.Fprintf(&buf, "%02d:%02d:%02d", hours, minutes, seconds) - if d.Fsp > 0 { - buf.WriteString(".") - buf.WriteString(d.formatFrac(fraction)) - } - - p := buf.String() - - return p -} - -func (d Duration) formatFrac(frac int) string { - format := fmt.Sprintf("%%0%dd", d.Fsp) - s := fmt.Sprintf(format, frac) - return s[0:d.Fsp] -} - -// ToNumber changes duration to number format. -// e.g, -// 10:10:10 -> 101010 -func (d Duration) ToNumber() Decimal { - sign, hours, minutes, seconds, fraction := splitDuration(time.Duration(d.Duration)) - var ( - s string - signStr string - ) - - if sign < 0 { - signStr = "-" - } - - if d.Fsp == 0 { - s = fmt.Sprintf("%s%02d%02d%02d", signStr, hours, minutes, seconds) - } else { - s = fmt.Sprintf("%s%02d%02d%02d.%s", signStr, hours, minutes, seconds, d.formatFrac(fraction)) - } - - // We skip checking error here because time formatted string can be parsed certainly. - v, _ := ParseDecimal(s) - return v -} - -// ConvertToTime converts duration to Time. -// Tp is TypeDatetime, TypeTimestamp and TypeDate. -func (d Duration) ConvertToTime(tp uint8) (Time, error) { - year, month, day := time.Now().Date() - // just use current year, month and day. - n := time.Date(year, month, day, 0, 0, 0, 0, time.Local) - n = n.Add(d.Duration) - - t := Time{ - Time: n, - Type: TypeDatetime, - Fsp: d.Fsp, - } - - return t.Convert(tp) -} - -// RoundFrac rounds fractional seconds precision with new fsp and returns a new one. -// We will use the “round half up” rule, e.g, >= 0.5 -> 1, < 0.5 -> 0, -// so 10:10:10.999999 round 0 -> 10:10:11 -// and 10:10:10.000000 round 0 -> 10:10:10 -func (d Duration) RoundFrac(fsp int) (Duration, error) { - fsp, err := checkFsp(fsp) - if err != nil { - return d, errors.Trace(err) - } - - if fsp == d.Fsp { - return d, nil - } - - n := ZeroTime - nd := n.Add(d.Duration).Round(time.Duration(math.Pow10(9-fsp)) * time.Nanosecond).Sub(n) - return Duration{Duration: nd, Fsp: fsp}, nil -} - -// Compare returns an integer comparing the Duration instant t to o. -// If d is after o, return 1, equal o, return 0, before o, return -1. -func (d Duration) Compare(o Duration) int { - if d.Duration > o.Duration { - return 1 - } else if d.Duration == o.Duration { - return 0 - } else { - return -1 - } -} - -// CompareString is like Compare, -// but parses str to Duration then compares. -func (d Duration) CompareString(str string) (int, error) { - // use MaxFsp to parse the string - o, err := ParseDuration(str, MaxFsp) - if err != nil { - return 0, err - } - - return d.Compare(o), nil -} - -// Hour returns current hour. -// e.g, hour("11:11:11") -> 11 -func (d Duration) Hour() int { - _, hour, _, _, _ := splitDuration(d.Duration) - return hour -} - -// Minute returns current minute. -// e.g, hour("11:11:11") -> 11 -func (d Duration) Minute() int { - _, _, minute, _, _ := splitDuration(d.Duration) - return minute -} - -// Second returns current second. -// e.g, hour("11:11:11") -> 11 -func (d Duration) Second() int { - _, _, _, second, _ := splitDuration(d.Duration) - return second -} - -// MicroSecond returns current microsecond. -// e.g, hour("11:11:11.11") -> 110000 -func (d Duration) MicroSecond() int { - _, _, _, _, frac := splitDuration(d.Duration) - return frac -} - -// ParseDuration parses the time form a formatted string with a fractional seconds part, -// returns the duration type Time value. -// See: http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html -func ParseDuration(str string, fsp int) (Duration, error) { - var ( - day int - hour int - minute int - second int - frac int - - err error - sign = 0 - dayExists = false - ) - - fsp, err = checkFsp(fsp) - if err != nil { - return ZeroDuration, errors.Trace(err) - } - - if len(str) == 0 { - return ZeroDuration, nil - } else if str[0] == '-' { - str = str[1:] - sign = -1 - } - - // Time format may has day. - if n := strings.IndexByte(str, ' '); n >= 0 { - if day, err = strconv.Atoi(str[:n]); err == nil { - dayExists = true - } - str = str[n+1:] - } - - if n := strings.IndexByte(str, '.'); n >= 0 { - // It has fractional precesion parts. - fracStr := str[n+1:] - frac, err = parseFrac(fracStr, fsp) - if err != nil { - return ZeroDuration, errors.Trace(err) - } - str = str[0:n] - } - - // It tries to split str with delimiter, time delimiter must be : - seps := strings.Split(str, ":") - - switch len(seps) { - case 1: - if dayExists { - hour, err = strconv.Atoi(seps[0]) - } else { - // No delimiter. - if len(str) == 6 { - // HHMMSS - _, err = fmt.Sscanf(str, "%2d%2d%2d", &hour, &minute, &second) - } else if len(str) == 4 { - // MMSS - _, err = fmt.Sscanf(str, "%2d%2d", &minute, &second) - } else if len(str) == 2 { - // SS - _, err = fmt.Sscanf(str, "%2d", &second) - } else { - // Maybe only contains date. - _, err = ParseDate(str) - if err == nil { - return ZeroDuration, nil - } - return ZeroDuration, errors.Trace(ErrInvalidTimeFormat) - } - } - case 2: - // HH:MM - _, err = fmt.Sscanf(str, "%2d:%2d", &hour, &minute) - case 3: - // Time format maybe HH:MM:SS or HHH:MM:SS. - // See: https://dev.mysql.com/doc/refman/5.7/en/time.html - if !dayExists && len(seps[0]) == 3 { - _, err = fmt.Sscanf(str, "%3d:%2d:%2d", &hour, &minute, &second) - } else { - _, err = fmt.Sscanf(str, "%2d:%2d:%2d", &hour, &minute, &second) - } - default: - return ZeroDuration, errors.Trace(ErrInvalidTimeFormat) - } - - if err != nil { - return ZeroDuration, errors.Trace(err) - } - - d := time.Duration(day*24*3600+hour*3600+minute*60+second)*time.Second + time.Duration(frac)*time.Microsecond - if sign == -1 { - d = -d - } - - if d > MaxTime { - d = MaxTime - err = ErrInvalidTimeFormat - } else if d < MinTime { - d = MinTime - err = ErrInvalidTimeFormat - } - return Duration{Duration: d, Fsp: fsp}, errors.Trace(err) -} - -func splitDuration(t time.Duration) (int, int, int, int, int) { - sign := 1 - if t < 0 { - t = -t - sign = -1 - } - - hours := t / time.Hour - t -= hours * time.Hour - minutes := t / time.Minute - t -= minutes * time.Minute - seconds := t / time.Second - t -= seconds * time.Second - fraction := t / time.Microsecond - - return sign, int(hours), int(minutes), int(seconds), int(fraction) -} - -func checkTime(year int, month int, day int, hour int, minute int, second int, frac int) error { - // Notes: for datetime type, `insert t values("0001-01-01 00:00:00");` is valid - // so here only check year from 0~9999. - if (year < 0 || year > 9999) || - (month <= 0 || month > 12) || - (day <= 0 || day > 31) || - (hour < 0 || hour >= 24) || - (minute < 0 || minute >= 60) || - (second < 0 || second >= 60) || - (frac < 0) { - return errors.Trace(ErrInvalidTimeFormat) - } - - return nil -} - -func getTime(num int64, tp byte) (Time, error) { - s1 := num / 1000000 - s2 := num - s1*1000000 - - year := int(s1 / 10000) - s1 %= 10000 - month := int(s1 / 100) - day := int(s1 % 100) - - hour := int(s2 / 10000) - s2 %= 10000 - minute := int(s2 / 100) - second := int(s2 % 100) - - if err := checkTime(year, month, day, hour, minute, second, 0); err != nil { - return Time{ - Time: ZeroTime, - Type: tp, - Fsp: DefaultFsp, - }, err - } - - t, err := newTime(year, month, day, hour, minute, second, 0) - return Time{ - Time: t, - Type: tp, - Fsp: DefaultFsp, - }, errors.Trace(err) -} - -// See number_to_datetime function. -// https://github.com/mysql/mysql-server/blob/5.7/sql-common/my_time.c -func parseDateTimeFromNum(num int64) (Time, error) { - t := ZeroDate - // Check zero. - if num == 0 { - return t, nil - } - - // Check datetime type. - if num >= 10000101000000 { - return getTime(num, t.Type) - } - - // Check MMDD. - if num < 101 { - return t, errors.Trace(ErrInvalidTimeFormat) - } - - // Adjust year - // YYMMDD, year: 2000-2069 - if num <= (70-1)*10000+1231 { - num = (num + 20000000) * 1000000 - return getTime(num, t.Type) - } - - // Check YYMMDD. - if num < 70*10000+101 { - return t, errors.Trace(ErrInvalidTimeFormat) - } - - // Adjust year - // YYMMDD, year: 1970-1999 - if num < 991231 { - num = (num + 19000000) * 1000000 - return getTime(num, t.Type) - } - - // Check YYYYMMDD. - if num < 10000101 { - return t, errors.Trace(ErrInvalidTimeFormat) - } - - // Adjust hour/min/second. - if num < 99991231 { - num = num * 1000000 - return getTime(num, t.Type) - } - - // Check MMDDHHMMSS. - if num < 101000000 { - return t, errors.Trace(ErrInvalidTimeFormat) - } - - // Set TypeDatetime type. - t.Type = TypeDatetime - - // Adjust year - // YYMMDDHHMMSS, 2000-2069 - if num <= 69*10000000000+1231235959 { - num = num + 20000000000000 - return getTime(num, t.Type) - } - - // Check YYYYMMDDHHMMSS. - if num < 70*10000000000+101000000 { - return t, errors.Trace(ErrInvalidTimeFormat) - } - - // Adjust year - // YYMMDDHHMMSS, 1970-1999 - if num <= 991231235959 { - num = num + 19000000000000 - return getTime(num, t.Type) - } - - return getTime(num, t.Type) -} - -// ParseTime parses a formatted string with type tp and specific fsp. -// Type is TypeDatetime, TypeTimestamp and TypeDate. -// Fsp is in range [0, 6]. -// MySQL supports many valid datatime format, but still has some limitation. -// If delimiter exists, the date part and time part is seperated by a space or T, -// other punctuation character can be used as the delimiter between date parts or time parts. -// If no delimiter, the format must be YYYYMMDDHHMMSS or YYMMDDHHMMSS -// If we have fractional seconds part, we must use decimal points as the delimiter. -// The valid datetime range is from '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'. -// The valid timestamp range is from '1970-01-01 00:00:01.000000' to '2038-01-19 03:14:07.999999'. -// The valid date range is from '1000-01-01' to '9999-12-31' -func ParseTime(str string, tp byte, fsp int) (Time, error) { - fsp, err := checkFsp(fsp) - if err != nil { - return Time{Time: ZeroTime, Type: tp}, errors.Trace(err) - } - - t, err := parseDatetime(str, fsp) - if err != nil { - return Time{Time: ZeroTime, Type: tp}, errors.Trace(err) - } - - return t.Convert(tp) -} - -// ParseDatetime is a helper function wrapping ParseTime with datetime type and default fsp. -func ParseDatetime(str string) (Time, error) { - return ParseTime(str, TypeDatetime, DefaultFsp) -} - -// ParseTimestamp is a helper function wrapping ParseTime with timestamp type and default fsp. -func ParseTimestamp(str string) (Time, error) { - return ParseTime(str, TypeTimestamp, DefaultFsp) -} - -// ParseDate is a helper function wrapping ParseTime with date type. -func ParseDate(str string) (Time, error) { - // date has no fractional seconds precision - return ParseTime(str, TypeDate, MinFsp) -} - -// ParseTimeFromNum parses a formatted int64, -// returns the value which type is tp. -func ParseTimeFromNum(num int64, tp byte, fsp int) (Time, error) { - fsp, err := checkFsp(fsp) - if err != nil { - return Time{Time: ZeroTime, Type: tp}, errors.Trace(err) - } - - t, err := parseDateTimeFromNum(num) - if err != nil { - return Time{Time: ZeroTime, Type: tp}, errors.Trace(err) - } - - if !checkDatetime(t) { - return Time{Time: ZeroTime, Type: tp}, ErrInvalidTimeFormat - } - - t.Fsp = fsp - return t.Convert(tp) -} - -// ParseDatetimeFromNum is a helper function wrapping ParseTimeFromNum with datetime type and default fsp. -func ParseDatetimeFromNum(num int64) (Time, error) { - return ParseTimeFromNum(num, TypeDatetime, DefaultFsp) -} - -// ParseTimestampFromNum is a helper function wrapping ParseTimeFromNum with timestamp type and default fsp. -func ParseTimestampFromNum(num int64) (Time, error) { - return ParseTimeFromNum(num, TypeTimestamp, DefaultFsp) -} - -// ParseDateFromNum is a helper function wrapping ParseTimeFromNum with date type. -func ParseDateFromNum(num int64) (Time, error) { - // date has no fractional seconds precision - return ParseTimeFromNum(num, TypeDate, MinFsp) -} - -func checkDatetime(t Time) bool { - if t.IsZero() { - return true - } - - if t.Time.After(MaxDatetime) || t.Time.Before(MinDatetime) { - return false - } - - return true -} - -func checkTimestamp(t Time) bool { - if t.IsZero() { - return true - } - - if t.Time.After(MaxTimestamp) || t.Time.Before(MinTimestamp) { - return false - } - - return true -} - -// ExtractTimeNum extracts time value number from time unit and format. -func ExtractTimeNum(unit string, t Time) (int64, error) { - switch strings.ToUpper(unit) { - case "MICROSECOND": - return int64(t.Nanosecond() / 1000), nil - case "SECOND": - return int64(t.Second()), nil - case "MINUTE": - return int64(t.Minute()), nil - case "HOUR": - return int64(t.Hour()), nil - case "DAY": - return int64(t.Day()), nil - case "WEEK": - _, week := t.ISOWeek() - return int64(week), nil - case "MONTH": - return int64(t.Month()), nil - case "QUARTER": - m := int64(t.Month()) - // 1 - 3 -> 1 - // 4 - 6 -> 2 - // 7 - 9 -> 3 - // 10 - 12 -> 4 - return (m + 2) / 3, nil - case "YEAR": - return int64(t.Year()), nil - case "SECOND_MICROSECOND": - return int64(t.Second())*1000000 + int64(t.Nanosecond())/1000, nil - case "MINUTE_MICROSECOND": - _, m, s := t.Clock() - return int64(m)*100000000 + int64(s)*1000000 + int64(t.Nanosecond())/1000, nil - case "MINUTE_SECOND": - _, m, s := t.Clock() - return int64(m*100 + s), nil - case "HOUR_MICROSECOND": - h, m, s := t.Clock() - return int64(h)*10000000000 + int64(m)*100000000 + int64(s)*1000000 + int64(t.Nanosecond())/1000, nil - case "HOUR_SECOND": - h, m, s := t.Clock() - return int64(h)*10000 + int64(m)*100 + int64(s), nil - case "HOUR_MINUTE": - h, m, _ := t.Clock() - return int64(h)*100 + int64(m), nil - case "DAY_MICROSECOND": - h, m, s := t.Clock() - d := t.Day() - return int64(d*1000000+h*10000+m*100+s)*1000000 + int64(t.Nanosecond())/1000, nil - case "DAY_SECOND": - h, m, s := t.Clock() - d := t.Day() - return int64(d)*1000000 + int64(h)*10000 + int64(m)*100 + int64(s), nil - case "DAY_MINUTE": - h, m, _ := t.Clock() - d := t.Day() - return int64(d)*10000 + int64(h)*100 + int64(m), nil - case "DAY_HOUR": - h, _, _ := t.Clock() - d := t.Day() - return int64(d)*100 + int64(h), nil - case "YEAR_MONTH": - y, m, _ := t.Date() - return int64(y)*100 + int64(m), nil - default: - return 0, errors.Errorf("invalid unit %s", unit) - } -} - -func extractSingleTimeValue(unit string, format string) (int64, int64, int64, time.Duration, error) { - iv, err := strconv.ParseInt(format, 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - v := time.Duration(iv) - switch strings.ToUpper(unit) { - case "MICROSECOND": - return 0, 0, 0, v * time.Microsecond, nil - case "SECOND": - return 0, 0, 0, v * time.Second, nil - case "MINUTE": - return 0, 0, 0, v * time.Minute, nil - case "HOUR": - return 0, 0, 0, v * time.Hour, nil - case "DAY": - return 0, 0, iv, 0, nil - case "WEEK": - return 0, 0, 7 * iv, 0, nil - case "MONTH": - return 0, iv, 0, 0, nil - case "QUARTER": - return 0, 3 * iv, 0, 0, nil - case "YEAR": - return iv, 0, 0, 0, nil - } - - return 0, 0, 0, 0, errors.Errorf("invalid singel timeunit - %s", unit) -} - -// Format is `SS.FFFFFF`. -func extractSecondMicrosecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ".") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - seconds, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - microseconds, err := strconv.ParseInt(alignFrac(fields[1], MaxFsp), 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, 0, time.Duration(seconds)*time.Second + time.Duration(microseconds)*time.Microsecond, nil -} - -// Format is `MM:SS.FFFFFF`. -func extractMinuteMicrosecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ":") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - minutes, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - _, _, _, value, err := extractSecondMicrosecond(fields[1]) - if err != nil { - return 0, 0, 0, 0, errors.Trace(err) - } - - return 0, 0, 0, time.Duration(minutes)*time.Minute + value, nil -} - -// Format is `MM:SS`. -func extractMinuteSecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ":") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - minutes, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - seconds, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, 0, time.Duration(minutes)*time.Minute + time.Duration(seconds)*time.Second, nil -} - -// Format is `HH:MM:SS.FFFFFF`. -func extractHourMicrosecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ":") - if len(fields) != 3 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - hours, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - minutes, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - _, _, _, value, err := extractSecondMicrosecond(fields[2]) - if err != nil { - return 0, 0, 0, 0, errors.Trace(err) - } - - return 0, 0, 0, time.Duration(hours)*time.Hour + time.Duration(minutes)*time.Minute + value, nil -} - -// Format is `HH:MM:SS`. -func extractHourSecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ":") - if len(fields) != 3 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - hours, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - minutes, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - seconds, err := strconv.ParseInt(fields[2], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, 0, time.Duration(hours)*time.Hour + time.Duration(minutes)*time.Minute + time.Duration(seconds)*time.Second, nil -} - -// Format is `HH:MM`. -func extractHourMinute(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, ":") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - hours, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - minutes, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, 0, time.Duration(hours)*time.Hour + time.Duration(minutes)*time.Minute, nil -} - -// Format is `DD HH:MM:SS.FFFFFF`. -func extractDayMicrosecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, " ") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - days, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - _, _, _, value, err := extractHourMicrosecond(fields[1]) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, days, value, nil -} - -// Format is `DD HH:MM:SS`. -func extractDaySecond(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, " ") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - days, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - _, _, _, value, err := extractHourSecond(fields[1]) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, days, value, nil -} - -// Format is `DD HH:MM`. -func extractDayMinute(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, " ") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - days, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - _, _, _, value, err := extractHourMinute(fields[1]) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, days, value, nil -} - -// Format is `DD HH`. -func extractDayHour(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, " ") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - days, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - hours, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return 0, 0, days, time.Duration(hours) * time.Hour, nil -} - -// Format is `YYYY-MM`. -func extractYearMonth(format string) (int64, int64, int64, time.Duration, error) { - fields := strings.Split(format, "-") - if len(fields) != 2 { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - years, err := strconv.ParseInt(fields[0], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - months, err := strconv.ParseInt(fields[1], 10, 64) - if err != nil { - return 0, 0, 0, 0, errors.Errorf("invalid time format - %s", format) - } - - return years, months, 0, 0, nil -} - -// ExtractTimeValue extracts time value from time unit and format. -func ExtractTimeValue(unit string, format string) (int64, int64, int64, time.Duration, error) { - switch strings.ToUpper(unit) { - case "MICROSECOND", "SECOND", "MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "QUARTER", "YEAR": - return extractSingleTimeValue(unit, format) - case "SECOND_MICROSECOND": - return extractSecondMicrosecond(format) - case "MINUTE_MICROSECOND": - return extractMinuteMicrosecond(format) - case "MINUTE_SECOND": - return extractMinuteSecond(format) - case "HOUR_MICROSECOND": - return extractHourMicrosecond(format) - case "HOUR_SECOND": - return extractHourSecond(format) - case "HOUR_MINUTE": - return extractHourMinute(format) - case "DAY_MICROSECOND": - return extractDayMicrosecond(format) - case "DAY_SECOND": - return extractDaySecond(format) - case "DAY_MINUTE": - return extractDayMinute(format) - case "DAY_HOUR": - return extractDayHour(format) - case "YEAR_MONTH": - return extractYearMonth(format) - default: - return 0, 0, 0, 0, errors.Errorf("invalid singel timeunit - %s", unit) - } -} - -// IsClockUnit returns true when unit is interval unit with hour, minute or second. -func IsClockUnit(unit string) bool { - switch strings.ToUpper(unit) { - case "MICROSECOND", "SECOND", "MINUTE", "HOUR", - "SECOND_MICROSECOND", "MINUTE_MICROSECOND", "MINUTE_SECOND", - "HOUR_MICROSECOND", "HOUR_SECOND", "HOUR_MINUTE", - "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR": - return true - default: - return false - } -} - -// IsDateFormat returns true when the specified time format could contain only date. -func IsDateFormat(format string) bool { - format = strings.TrimSpace(format) - seps := parseDateFormat(format) - length := len(format) - switch len(seps) { - case 1: - if (length == 8) || (length == 6) { - return true - } - case 3: - return true - } - return false -} - -// ParseTimeFromInt64 parses mysql time value from int64. -func ParseTimeFromInt64(num int64) (Time, error) { - return parseDateTimeFromNum(num) -} diff --git a/vendor/github.com/pingcap/tidb/mysql/type.go b/vendor/github.com/pingcap/tidb/mysql/type.go deleted file mode 100644 index c80b0c5e5022..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/type.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -// MySQL type informations. -const ( - TypeDecimal byte = iota - TypeTiny - TypeShort - TypeLong - TypeFloat - TypeDouble - TypeNull - TypeTimestamp - TypeLonglong - TypeInt24 - TypeDate - TypeDuration /* Original name was TypeTime, renamed to Duration to resolve the conflict with Go type Time.*/ - TypeDatetime - TypeYear - TypeNewDate - TypeVarchar - TypeBit -) - -// TypeUnspecified is an uninitialized type. TypeDecimal is not used in MySQL. -var TypeUnspecified = TypeDecimal - -// MySQL type informations. -const ( - TypeNewDecimal byte = iota + 0xf6 - TypeEnum - TypeSet - TypeTinyBlob - TypeMediumBlob - TypeLongBlob - TypeBlob - TypeVarString - TypeString - TypeGeometry -) - -// IsUninitializedType check if a type code is uninitialized. -// TypeDecimal is the old type code for decimal and not be used in the new mysql version. -func IsUninitializedType(tp byte) bool { - return tp == TypeDecimal -} - -// Flag informations. -const ( - NotNullFlag = 1 /* Field can't be NULL */ - PriKeyFlag = 2 /* Field is part of a primary key */ - UniqueKeyFlag = 4 /* Field is part of a unique key */ - MultipleKeyFlag = 8 /* Field is part of a key */ - BlobFlag = 16 /* Field is a blob */ - UnsignedFlag = 32 /* Field is unsigned */ - ZerofillFlag = 64 /* Field is zerofill */ - BinaryFlag = 128 /* Field is binary */ - - EnumFlag = 256 /* Field is an enum */ - AutoIncrementFlag = 512 /* Field is an auto increment field */ - TimestampFlag = 1024 /* Field is a timestamp */ - SetFlag = 2048 /* Field is a set */ - NoDefaultValueFlag = 4096 /* Field doesn't have a default value */ - OnUpdateNowFlag = 8192 /* Field is set to NOW on UPDATE */ - NumFlag = 32768 /* Field is a num (for clients) */ - PartKeyFlag = 16384 /* Intern: Part of some keys */ - GroupFlag = 32768 /* Intern: Group field */ - UniqueFlag = 65536 /* Intern: Used by sql_yacc */ - BinCmpFlag = 131072 /* Intern: Used by sql_yacc */ -) - -// TypeInt24 bounds. -const ( - MaxUint24 = 1<<24 - 1 - MaxInt24 = 1<<23 - 1 - MinInt24 = -1 << 23 -) - -// HasNotNullFlag checks if NotNullFlag is set. -func HasNotNullFlag(flag uint) bool { - return (flag & NotNullFlag) > 0 -} - -// HasNoDefaultValueFlag checks if NoDefaultValueFlag is set. -func HasNoDefaultValueFlag(flag uint) bool { - return (flag & NoDefaultValueFlag) > 0 -} - -// HasAutoIncrementFlag checks if AutoIncrementFlag is set. -func HasAutoIncrementFlag(flag uint) bool { - return (flag & AutoIncrementFlag) > 0 -} - -// HasUnsignedFlag checks if UnsignedFlag is set. -func HasUnsignedFlag(flag uint) bool { - return (flag & UnsignedFlag) > 0 -} - -// HasZerofillFlag checks if ZerofillFlag is set. -func HasZerofillFlag(flag uint) bool { - return (flag & ZerofillFlag) > 0 -} - -// HasBinaryFlag checks if BinaryFlag is set. -func HasBinaryFlag(flag uint) bool { - return (flag & BinaryFlag) > 0 -} - -// HasPriKeyFlag checks if PriKeyFlag is set. -func HasPriKeyFlag(flag uint) bool { - return (flag & PriKeyFlag) > 0 -} - -// HasUniKeyFlag checks if UniqueKeyFlag is set. -func HasUniKeyFlag(flag uint) bool { - return (flag & UniqueKeyFlag) > 0 -} - -// HasMultipleKeyFlag checks if MultipleKeyFlag is set. -func HasMultipleKeyFlag(flag uint) bool { - return (flag & MultipleKeyFlag) > 0 -} - -// HasTimestampFlag checks if HasTimestampFlag is set. -func HasTimestampFlag(flag uint) bool { - return (flag & TimestampFlag) > 0 -} - -// HasOnUpdateNowFlag checks if OnUpdateNowFlag is set. -func HasOnUpdateNowFlag(flag uint) bool { - return (flag & OnUpdateNowFlag) > 0 -} diff --git a/vendor/github.com/pingcap/tidb/mysql/util.go b/vendor/github.com/pingcap/tidb/mysql/util.go deleted file mode 100644 index 7a5cf72e1f57..000000000000 --- a/vendor/github.com/pingcap/tidb/mysql/util.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package mysql - -// GetDefaultFieldLength is used for Interger Types, Flen is the display length. -// Call this when no Flen assigned in ddl. -// or column value is calculated from an expression. -// For example: "select count(*) from t;", the column type is int64 and Flen in ResultField will be 21. -// See: https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html -func GetDefaultFieldLength(tp byte) int { - switch tp { - case TypeTiny: - return 4 - case TypeShort: - return 6 - case TypeInt24: - return 9 - case TypeLong: - return 11 - case TypeLonglong: - return 21 - case TypeDecimal: - // See: https://dev.mysql.com/doc/refman/5.7/en/fixed-point-types.html - return 10 - case TypeBit, TypeBlob: - return -1 - default: - //TODO: add more types - return -1 - } -} - -// GetDefaultDecimal returns the default decimal length for column. -func GetDefaultDecimal(tp byte) int { - switch tp { - case TypeDecimal: - // See: https://dev.mysql.com/doc/refman/5.7/en/fixed-point-types.html - return 0 - default: - //TODO: add more types - return -1 - } -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/logic.go b/vendor/github.com/pingcap/tidb/optimizer/logic.go deleted file mode 100644 index 36070dbf7c48..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/logic.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" -) - -// logicOptimize does logic optimization works on AST. -func logicOptimize(ctx context.Context, node ast.Node) error { - return preEvaluate(ctx, node) -} - -// preEvaluate evaluates preEvaluable expression and rewrites constant expression to value expression. -func preEvaluate(ctx context.Context, node ast.Node) error { - pe := preEvaluator{ctx: ctx} - node.Accept(&pe) - return pe.err -} - -type preEvaluator struct { - ctx context.Context - err error -} - -func (r *preEvaluator) Enter(in ast.Node) (ast.Node, bool) { - return in, false -} - -func (r *preEvaluator) Leave(in ast.Node) (ast.Node, bool) { - if expr, ok := in.(ast.ExprNode); ok { - if _, ok = expr.(*ast.ValueExpr); ok { - return in, true - } else if ast.IsPreEvaluable(expr) { - val, err := evaluator.Eval(r.ctx, expr) - if err != nil { - r.err = err - return in, false - } - if ast.IsConstant(expr) { - // The expression is constant, rewrite the expression to value expression. - valExpr := &ast.ValueExpr{} - valExpr.SetText(expr.Text()) - valExpr.SetType(expr.GetType()) - valExpr.SetValue(val) - return valExpr, true - } - expr.SetValue(val) - } - } - return in, true -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/optimizer.go b/vendor/github.com/pingcap/tidb/optimizer/optimizer.go deleted file mode 100644 index 04bf748689a8..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/optimizer.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/optimizer/plan" - "github.com/pingcap/tidb/terror" -) - -// Optimize does optimization and creates a Plan. -// The node must be prepared first. -func Optimize(ctx context.Context, node ast.Node, sb plan.SubQueryBuilder) (plan.Plan, error) { - // We have to infer type again because after parameter is set, the expression type may change. - if err := InferType(node); err != nil { - return nil, errors.Trace(err) - } - if err := logicOptimize(ctx, node); err != nil { - return nil, errors.Trace(err) - } - p, err := plan.BuildPlan(node, sb) - if err != nil { - return nil, errors.Trace(err) - } - err = plan.Refine(p) - if err != nil { - return nil, errors.Trace(err) - } - return p, nil -} - -// Prepare prepares a raw statement parsed from parser. -// The statement must be prepared before it can be passed to optimize function. -// We pass InfoSchema instead of getting from Context in case it is changed after resolving name. -func Prepare(is infoschema.InfoSchema, ctx context.Context, node ast.Node) error { - ast.SetFlag(node) - if err := Preprocess(node, is, ctx); err != nil { - return errors.Trace(err) - } - if err := Validate(node, true); err != nil { - return errors.Trace(err) - } - return nil -} - -// Optimizer error codes. -const ( - CodeOneColumn terror.ErrCode = 1 - CodeSameColumns terror.ErrCode = 2 - CodeMultiWildCard terror.ErrCode = 3 - CodeUnsupported terror.ErrCode = 4 - CodeInvalidGroupFuncUse terror.ErrCode = 5 - CodeIllegalReference terror.ErrCode = 6 -) - -// Optimizer base errors. -var ( - ErrOneColumn = terror.ClassOptimizer.New(CodeOneColumn, "Operand should contain 1 column(s)") - ErrSameColumns = terror.ClassOptimizer.New(CodeSameColumns, "Operands should contain same columns") - ErrMultiWildCard = terror.ClassOptimizer.New(CodeMultiWildCard, "wildcard field exist more than once") - ErrUnSupported = terror.ClassOptimizer.New(CodeUnsupported, "unsupported") - ErrInvalidGroupFuncUse = terror.ClassOptimizer.New(CodeInvalidGroupFuncUse, "Invalid use of group function") - ErrIllegalReference = terror.ClassOptimizer.New(CodeIllegalReference, "Illegal reference") -) - -func init() { - mySQLErrCodes := map[terror.ErrCode]uint16{ - CodeOneColumn: mysql.ErrOperandColumns, - CodeSameColumns: mysql.ErrOperandColumns, - CodeMultiWildCard: mysql.ErrParse, - CodeInvalidGroupFuncUse: mysql.ErrInvalidGroupFuncUse, - CodeIllegalReference: mysql.ErrIllegalReference, - } - terror.ErrClassToMySQLCodes[terror.ClassOptimizer] = mySQLErrCodes -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/cost.go b/vendor/github.com/pingcap/tidb/optimizer/plan/cost.go deleted file mode 100644 index 88f80ce04f89..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/cost.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "math" -) - -// Pre-defined cost factors. -const ( - FullRangeCount = 10000 - HalfRangeCount = 4000 - MiddleRangeCount = 100 - RowCost = 1.0 - IndexCost = 2.0 - SortCost = 2.0 - FilterRate = 0.5 -) - -// CostEstimator estimates the cost of a plan. -type costEstimator struct { -} - -// Enter implements Visitor Enter interface. -func (c *costEstimator) Enter(p Plan) (Plan, bool) { - return p, false -} - -// Leave implements Visitor Leave interface. -func (c *costEstimator) Leave(p Plan) (Plan, bool) { - switch v := p.(type) { - case *IndexScan: - c.indexScan(v) - case *Limit: - v.rowCount = v.Src().RowCount() - v.startupCost = v.Src().StartupCost() - v.totalCost = v.Src().TotalCost() - case *SelectFields: - if v.Src() != nil { - v.startupCost = v.Src().StartupCost() - v.rowCount = v.Src().RowCount() - v.totalCost = v.Src().TotalCost() - } - case *SelectLock: - v.startupCost = v.Src().StartupCost() - v.rowCount = v.Src().RowCount() - v.totalCost = v.Src().TotalCost() - case *Sort: - // Sort plan must retrieve all the rows before returns the first row. - v.startupCost = v.Src().TotalCost() + v.Src().RowCount()*SortCost - if v.limit == 0 { - v.rowCount = v.Src().RowCount() - } else { - v.rowCount = math.Min(v.Src().RowCount(), v.limit) - } - v.totalCost = v.startupCost + v.rowCount*RowCost - case *TableScan: - c.tableScan(v) - } - return p, true -} - -func (c *costEstimator) tableScan(v *TableScan) { - var rowCount float64 = FullRangeCount - for _, con := range v.AccessConditions { - rowCount *= guesstimateFilterRate(con) - } - v.startupCost = 0 - if v.limit == 0 { - // limit is zero means no limit. - v.rowCount = rowCount - } else { - v.rowCount = math.Min(rowCount, v.limit) - } - v.totalCost = v.rowCount * RowCost -} - -func (c *costEstimator) indexScan(v *IndexScan) { - var rowCount float64 = FullRangeCount - for _, con := range v.AccessConditions { - rowCount *= guesstimateFilterRate(con) - } - v.startupCost = 0 - if v.limit == 0 { - // limit is zero means no limit. - v.rowCount = rowCount - } else { - v.rowCount = math.Min(rowCount, v.limit) - } - v.totalCost = v.rowCount * RowCost -} - -// EstimateCost estimates the cost of the plan. -func EstimateCost(p Plan) float64 { - var estimator costEstimator - p.Accept(&estimator) - return p.TotalCost() -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/filterrate.go b/vendor/github.com/pingcap/tidb/optimizer/plan/filterrate.go deleted file mode 100644 index 244309a46ef6..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/filterrate.go +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/parser/opcode" -) - -const ( - rateFull float64 = 1 - rateEqual float64 = 0.01 - rateNotEqual float64 = 0.99 - rateBetween float64 = 0.1 - rateGreaterOrLess float64 = 0.33 - rateIsFalse float64 = 0.1 - rateIsNull float64 = 0.1 - rateLike float64 = 0.1 -) - -// guesstimateFilterRate guesstimates the filter rate for an expression. -// For example: a table has 100 rows, after filter expression 'a between 0 and 9', -// 10 rows returned, then the filter rate is '0.1'. -// It only depends on the expression type, not the expression value. -// The expr parameter should contain only one column name. -func guesstimateFilterRate(expr ast.ExprNode) float64 { - switch x := expr.(type) { - case *ast.BetweenExpr: - return rateBetween - case *ast.BinaryOperationExpr: - return guesstimateBinop(x) - case *ast.ColumnNameExpr: - return rateFull - case *ast.IsNullExpr: - return guesstimateIsNull(x) - case *ast.IsTruthExpr: - return guesstimateIsTrue(x) - case *ast.ParenthesesExpr: - return guesstimateFilterRate(x.Expr) - case *ast.PatternInExpr: - return guesstimatePatternIn(x) - case *ast.PatternLikeExpr: - return guesstimatePatternLike(x) - } - return rateFull -} - -func guesstimateBinop(expr *ast.BinaryOperationExpr) float64 { - switch expr.Op { - case opcode.AndAnd: - // P(A and B) = P(A) * P(B) - return guesstimateFilterRate(expr.L) * guesstimateFilterRate(expr.R) - case opcode.OrOr: - // P(A or B) = P(A) + P(B) – P(A and B) - rateL := guesstimateFilterRate(expr.L) - rateR := guesstimateFilterRate(expr.R) - return rateL + rateR - rateL*rateR - case opcode.EQ: - return rateEqual - case opcode.GT, opcode.GE, opcode.LT, opcode.LE: - return rateGreaterOrLess - case opcode.NE: - return rateNotEqual - } - return rateFull -} - -func guesstimateIsNull(expr *ast.IsNullExpr) float64 { - if expr.Not { - return rateFull - rateIsNull - } - return rateIsNull -} - -func guesstimateIsTrue(expr *ast.IsTruthExpr) float64 { - if expr.True == 0 { - if expr.Not { - return rateFull - rateIsFalse - } - return rateIsFalse - } - if expr.Not { - return rateIsFalse + rateIsNull - } - return rateFull - rateIsFalse - rateIsNull -} - -func guesstimatePatternIn(expr *ast.PatternInExpr) float64 { - if len(expr.List) > 0 { - rate := rateEqual * float64(len(expr.List)) - if expr.Not { - return rateFull - rate - } - return rate - } - return rateFull -} - -func guesstimatePatternLike(expr *ast.PatternLikeExpr) float64 { - if expr.Not { - return rateFull - rateLike - } - return rateLike -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/plan.go b/vendor/github.com/pingcap/tidb/optimizer/plan/plan.go deleted file mode 100644 index 02ac6369ab6f..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/plan.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "math" - - "github.com/pingcap/tidb/ast" -) - -// Plan is a description of an execution flow. -// It is created from ast.Node first, then optimized by optimizer, -// then used by executor to create a Cursor which executes the statement. -type Plan interface { - // Accept a visitor, implementation should call Visitor.Enter first, - // then call children Accept methods, finally call Visitor.Leave. - Accept(v Visitor) (out Plan, ok bool) - // Fields returns the result fields of the plan. - Fields() []*ast.ResultField - // SetFields sets the results fields of the plan. - SetFields(fields []*ast.ResultField) - // The cost before returning fhe first row. - StartupCost() float64 - // The cost after returning all the rows. - TotalCost() float64 - // The expected row count. - RowCount() float64 - // SetLimit is used to push limit to upstream to estimate the cost. - SetLimit(limit float64) -} - -// WithSrcPlan is a Plan has a source Plan. -type WithSrcPlan interface { - Plan - Src() Plan - SetSrc(src Plan) -} - -// Visitor visits a Plan. -type Visitor interface { - // Enter is called before visit children. - // The out plan should be of exactly the same type as the in plan. - // if skipChildren is true, the children should not be visited. - Enter(in Plan) (out Plan, skipChildren bool) - - // Leave is called after children has been visited, the out Plan can - // be another type, this is different than ast.Visitor Leave, because - // Plans only contain children plans as Plan interface type, so it is safe - // to return a different type of plan. - Leave(in Plan) (out Plan, ok bool) -} - -// basePlan implements base Plan interface. -// Should be used as embedded struct in Plan implementations. -type basePlan struct { - fields []*ast.ResultField - startupCost float64 - totalCost float64 - rowCount float64 - limit float64 -} - -// StartupCost implements Plan StartupCost interface. -func (p *basePlan) StartupCost() float64 { - return p.startupCost -} - -// TotalCost implements Plan TotalCost interface. -func (p *basePlan) TotalCost() float64 { - return p.totalCost -} - -// RowCount implements Plan RowCount interface. -func (p *basePlan) RowCount() float64 { - if p.limit == 0 { - return p.rowCount - } - return math.Min(p.rowCount, p.limit) -} - -// SetLimit implements Plan SetLimit interface. -func (p *basePlan) SetLimit(limit float64) { - p.limit = limit -} - -// Fields implements Plan Fields interface. -func (p *basePlan) Fields() []*ast.ResultField { - return p.fields -} - -// SetFields implements Plan SetFields interface. -func (p *basePlan) SetFields(fields []*ast.ResultField) { - p.fields = fields -} - -// srcPlan implements base PlanWithSrc interface. -type planWithSrc struct { - basePlan - src Plan -} - -// Src implements PlanWithSrc interface. -func (p *planWithSrc) Src() Plan { - return p.src -} - -// SetSrc implements PlanWithSrc interface. -func (p *planWithSrc) SetSrc(src Plan) { - p.src = src -} - -// SetLimit implements Plan interface. -func (p *planWithSrc) SetLimit(limit float64) { - p.limit = limit - p.src.SetLimit(limit) -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder.go b/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder.go deleted file mode 100644 index 74f4da7b6f56..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder.go +++ /dev/null @@ -1,926 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -// Error instances. -var ( - ErrUnsupportedType = terror.ClassOptimizerPlan.New(CodeUnsupportedType, "Unsupported type") -) - -// Error codes. -const ( - CodeUnsupportedType terror.ErrCode = 1 -) - -// BuildPlan builds a plan from a node. -// It returns ErrUnsupportedType if ast.Node type is not supported yet. -func BuildPlan(node ast.Node, sb SubQueryBuilder) (Plan, error) { - builder := planBuilder{sb: sb} - p := builder.build(node) - return p, builder.err -} - -// planBuilder builds Plan from an ast.Node. -// It just builds the ast node straightforwardly. -type planBuilder struct { - err error - hasAgg bool - sb SubQueryBuilder - obj interface{} -} - -func (b *planBuilder) build(node ast.Node) Plan { - switch x := node.(type) { - case *ast.AdminStmt: - return b.buildAdmin(x) - case *ast.AlterTableStmt: - return b.buildDDL(x) - case *ast.CreateDatabaseStmt: - return b.buildDDL(x) - case *ast.CreateIndexStmt: - return b.buildDDL(x) - case *ast.CreateTableStmt: - return b.buildDDL(x) - case *ast.DeallocateStmt: - return &Deallocate{Name: x.Name} - case *ast.DeleteStmt: - return b.buildDelete(x) - case *ast.DropDatabaseStmt: - return b.buildDDL(x) - case *ast.DropIndexStmt: - return b.buildDDL(x) - case *ast.DropTableStmt: - return b.buildDDL(x) - case *ast.ExecuteStmt: - return &Execute{Name: x.Name, UsingVars: x.UsingVars} - case *ast.ExplainStmt: - return b.buildExplain(x) - case *ast.InsertStmt: - return b.buildInsert(x) - case *ast.PrepareStmt: - return b.buildPrepare(x) - case *ast.SelectStmt: - return b.buildSelect(x) - case *ast.UnionStmt: - return b.buildUnion(x) - case *ast.UpdateStmt: - return b.buildUpdate(x) - case *ast.UseStmt: - return b.buildSimple(x) - case *ast.SetCharsetStmt: - return b.buildSimple(x) - case *ast.SetStmt: - return b.buildSimple(x) - case *ast.ShowStmt: - return b.buildShow(x) - case *ast.DoStmt: - return b.buildSimple(x) - case *ast.BeginStmt: - return b.buildSimple(x) - case *ast.CommitStmt: - return b.buildSimple(x) - case *ast.RollbackStmt: - return b.buildSimple(x) - case *ast.CreateUserStmt: - return b.buildSimple(x) - case *ast.SetPwdStmt: - return b.buildSimple(x) - case *ast.GrantStmt: - return b.buildSimple(x) - case *ast.TruncateTableStmt: - return b.buildDDL(x) - } - b.err = ErrUnsupportedType.Gen("Unsupported type %T", node) - return nil -} - -// Detect aggregate function or groupby clause. -func (b *planBuilder) detectSelectAgg(sel *ast.SelectStmt) bool { - if sel.GroupBy != nil { - return true - } - for _, f := range sel.GetResultFields() { - if ast.HasAggFlag(f.Expr) { - return true - } - } - if sel.Having != nil { - if ast.HasAggFlag(sel.Having.Expr) { - return true - } - } - if sel.OrderBy != nil { - for _, item := range sel.OrderBy.Items { - if ast.HasAggFlag(item.Expr) { - return true - } - } - } - return false -} - -// extractSelectAgg extracts aggregate functions and converts ColumnNameExpr to aggregate function. -func (b *planBuilder) extractSelectAgg(sel *ast.SelectStmt) []*ast.AggregateFuncExpr { - extractor := &ast.AggregateFuncExtractor{AggFuncs: make([]*ast.AggregateFuncExpr, 0)} - for _, f := range sel.GetResultFields() { - n, ok := f.Expr.Accept(extractor) - if !ok { - b.err = errors.New("Failed to extract agg expr!") - return nil - } - ve, ok := f.Expr.(*ast.ValueExpr) - if ok && len(f.Column.Name.O) > 0 { - agg := &ast.AggregateFuncExpr{ - F: ast.AggFuncFirstRow, - Args: []ast.ExprNode{ve}, - } - extractor.AggFuncs = append(extractor.AggFuncs, agg) - n = agg - } - f.Expr = n.(ast.ExprNode) - } - // Extract agg funcs from having clause. - if sel.Having != nil { - n, ok := sel.Having.Expr.Accept(extractor) - if !ok { - b.err = errors.New("Failed to extract agg expr from having clause") - return nil - } - sel.Having.Expr = n.(ast.ExprNode) - } - // Extract agg funcs from orderby clause. - if sel.OrderBy != nil { - for _, item := range sel.OrderBy.Items { - n, ok := item.Expr.Accept(extractor) - if !ok { - b.err = errors.New("Failed to extract agg expr from orderby clause") - return nil - } - item.Expr = n.(ast.ExprNode) - // If item is PositionExpr, we need to rebind it. - // For PositionExpr will refer to a ResultField in fieldlist. - // After extract AggExpr from fieldlist, it may be changed (See the code above). - if pe, ok := item.Expr.(*ast.PositionExpr); ok { - pe.Refer = sel.GetResultFields()[pe.N-1] - } - } - } - return extractor.AggFuncs -} - -func (b *planBuilder) buildSubquery(n ast.Node) { - sv := &subqueryVisitor{ - builder: b, - } - _, ok := n.Accept(sv) - if !ok { - log.Errorf("Extract subquery error") - } -} - -func (b *planBuilder) buildSelect(sel *ast.SelectStmt) Plan { - var aggFuncs []*ast.AggregateFuncExpr - hasAgg := b.detectSelectAgg(sel) - if hasAgg { - aggFuncs = b.extractSelectAgg(sel) - } - // Build subquery - // Convert subquery to expr with plan - b.buildSubquery(sel) - var p Plan - if sel.From != nil { - p = b.buildFrom(sel) - if b.err != nil { - return nil - } - if sel.LockTp != ast.SelectLockNone { - p = b.buildSelectLock(p, sel.LockTp) - if b.err != nil { - return nil - } - } - if hasAgg { - p = b.buildAggregate(p, aggFuncs, sel.GroupBy) - } - p = b.buildSelectFields(p, sel.GetResultFields()) - if b.err != nil { - return nil - } - } else { - if hasAgg { - p = b.buildAggregate(p, aggFuncs, nil) - } - p = b.buildSelectFields(p, sel.GetResultFields()) - if b.err != nil { - return nil - } - } - if sel.Having != nil { - p = b.buildHaving(p, sel.Having) - if b.err != nil { - return nil - } - } - if sel.Distinct { - p = b.buildDistinct(p) - if b.err != nil { - return nil - } - } - if sel.OrderBy != nil && !matchOrder(p, sel.OrderBy.Items) { - p = b.buildSort(p, sel.OrderBy.Items) - if b.err != nil { - return nil - } - } - if sel.Limit != nil { - p = b.buildLimit(p, sel.Limit) - if b.err != nil { - return nil - } - } - return p -} - -func (b *planBuilder) buildFrom(sel *ast.SelectStmt) Plan { - from := sel.From.TableRefs - if from.Right == nil { - return b.buildSingleTable(sel) - } - return b.buildJoin(sel) -} - -func (b *planBuilder) buildSingleTable(sel *ast.SelectStmt) Plan { - from := sel.From.TableRefs - ts, ok := from.Left.(*ast.TableSource) - if !ok { - b.err = ErrUnsupportedType.Gen("Unsupported type %T", from.Left) - return nil - } - var bestPlan Plan - switch v := ts.Source.(type) { - case *ast.TableName: - case *ast.SelectStmt: - bestPlan = b.buildSelect(v) - } - if bestPlan != nil { - return bestPlan - } - tn, ok := ts.Source.(*ast.TableName) - if !ok { - b.err = ErrUnsupportedType.Gen("Unsupported type %T", ts.Source) - return nil - } - conditions := splitWhere(sel.Where) - path := &joinPath{table: tn, conditions: conditions} - candidates := b.buildAllAccessMethodsPlan(path) - var lowestCost float64 - for _, v := range candidates { - cost := EstimateCost(b.buildPseudoSelectPlan(v, sel)) - if bestPlan == nil { - bestPlan = v - lowestCost = cost - } - if cost < lowestCost { - bestPlan = v - lowestCost = cost - } - } - return bestPlan -} - -func (b *planBuilder) buildAllAccessMethodsPlan(path *joinPath) []Plan { - var candidates []Plan - p := b.buildTableScanPlan(path) - candidates = append(candidates, p) - for _, index := range path.table.TableInfo.Indices { - ip := b.buildIndexScanPlan(index, path) - candidates = append(candidates, ip) - } - return candidates -} - -func (b *planBuilder) buildTableScanPlan(path *joinPath) Plan { - tn := path.table - p := &TableScan{ - Table: tn.TableInfo, - } - // Equal condition contains a column from previous joined table. - p.RefAccess = len(path.eqConds) > 0 - p.SetFields(tn.GetResultFields()) - var pkName model.CIStr - if p.Table.PKIsHandle { - for _, colInfo := range p.Table.Columns { - if mysql.HasPriKeyFlag(colInfo.Flag) { - pkName = colInfo.Name - } - } - } - for _, con := range path.conditions { - if pkName.L != "" { - checker := conditionChecker{tableName: tn.TableInfo.Name, pkName: pkName} - if checker.check(con) { - p.AccessConditions = append(p.AccessConditions, con) - } else { - p.FilterConditions = append(p.FilterConditions, con) - } - } else { - p.FilterConditions = append(p.FilterConditions, con) - } - } - return p -} - -func (b *planBuilder) buildIndexScanPlan(index *model.IndexInfo, path *joinPath) Plan { - tn := path.table - ip := &IndexScan{Table: tn.TableInfo, Index: index} - ip.RefAccess = len(path.eqConds) > 0 - ip.SetFields(tn.GetResultFields()) - - condMap := map[ast.ExprNode]bool{} - for _, con := range path.conditions { - condMap[con] = true - } -out: - // Build equal access conditions first. - // Starts from the first index column, if equal condition is found, add it to access conditions, - // proceed to the next index column. until we can't find any equal condition for the column. - for ip.AccessEqualCount < len(index.Columns) { - for con := range condMap { - binop, ok := con.(*ast.BinaryOperationExpr) - if !ok || binop.Op != opcode.EQ { - continue - } - if ast.IsPreEvaluable(binop.L) { - binop.L, binop.R = binop.R, binop.L - } - if !ast.IsPreEvaluable(binop.R) { - continue - } - cn, ok2 := binop.L.(*ast.ColumnNameExpr) - if !ok2 || cn.Refer.Column.Name.L != index.Columns[ip.AccessEqualCount].Name.L { - continue - } - ip.AccessConditions = append(ip.AccessConditions, con) - delete(condMap, con) - ip.AccessEqualCount++ - continue out - } - break - } - - for con := range condMap { - if ip.AccessEqualCount < len(ip.Index.Columns) { - // Try to add non-equal access condition for index column at AccessEqualCount. - checker := conditionChecker{tableName: tn.TableInfo.Name, idx: index, columnOffset: ip.AccessEqualCount} - if checker.check(con) { - ip.AccessConditions = append(ip.AccessConditions, con) - } else { - ip.FilterConditions = append(ip.FilterConditions, con) - } - } else { - ip.FilterConditions = append(ip.FilterConditions, con) - } - } - return ip -} - -// buildPseudoSelectPlan pre-builds more complete plans that may affect total cost. -func (b *planBuilder) buildPseudoSelectPlan(p Plan, sel *ast.SelectStmt) Plan { - if sel.OrderBy == nil { - return p - } - if sel.GroupBy != nil { - return p - } - if !matchOrder(p, sel.OrderBy.Items) { - np := &Sort{ByItems: sel.OrderBy.Items} - np.SetSrc(p) - p = np - } - if sel.Limit != nil { - np := &Limit{Offset: sel.Limit.Offset, Count: sel.Limit.Count} - np.SetSrc(p) - np.SetLimit(0) - p = np - } - return p -} - -func (b *planBuilder) buildSelectLock(src Plan, lock ast.SelectLockType) *SelectLock { - selectLock := &SelectLock{ - Lock: lock, - } - selectLock.SetSrc(src) - selectLock.SetFields(src.Fields()) - return selectLock -} - -func (b *planBuilder) buildSelectFields(src Plan, fields []*ast.ResultField) Plan { - selectFields := &SelectFields{} - selectFields.SetSrc(src) - selectFields.SetFields(fields) - return selectFields -} - -func (b *planBuilder) buildAggregate(src Plan, aggFuncs []*ast.AggregateFuncExpr, groupby *ast.GroupByClause) Plan { - // Add aggregate plan. - aggPlan := &Aggregate{ - AggFuncs: aggFuncs, - } - aggPlan.SetSrc(src) - if src != nil { - aggPlan.SetFields(src.Fields()) - } - if groupby != nil { - aggPlan.GroupByItems = groupby.Items - } - return aggPlan -} - -func (b *planBuilder) buildHaving(src Plan, having *ast.HavingClause) Plan { - p := &Having{ - Conditions: splitWhere(having.Expr), - } - p.SetSrc(src) - p.SetFields(src.Fields()) - return p -} - -func (b *planBuilder) buildSort(src Plan, byItems []*ast.ByItem) Plan { - sort := &Sort{ - ByItems: byItems, - } - sort.SetSrc(src) - sort.SetFields(src.Fields()) - return sort -} - -func (b *planBuilder) buildLimit(src Plan, limit *ast.Limit) Plan { - li := &Limit{ - Offset: limit.Offset, - Count: limit.Count, - } - li.SetSrc(src) - li.SetFields(src.Fields()) - return li -} - -func (b *planBuilder) buildPrepare(x *ast.PrepareStmt) Plan { - p := &Prepare{ - Name: x.Name, - } - if x.SQLVar != nil { - p.SQLText, _ = x.SQLVar.GetValue().(string) - } else { - p.SQLText = x.SQLText - } - return p -} - -func (b *planBuilder) buildAdmin(as *ast.AdminStmt) Plan { - var p Plan - - switch as.Tp { - case ast.AdminCheckTable: - p = &CheckTable{Tables: as.Tables} - case ast.AdminShowDDL: - p = &ShowDDL{} - p.SetFields(buildShowDDLFields()) - default: - b.err = ErrUnsupportedType.Gen("Unsupported type %T", as) - } - - return p -} - -func buildShowDDLFields() []*ast.ResultField { - rfs := make([]*ast.ResultField, 0, 6) - rfs = append(rfs, buildResultField("", "SCHEMA_VER", mysql.TypeLonglong, 4)) - rfs = append(rfs, buildResultField("", "OWNER", mysql.TypeVarchar, 64)) - rfs = append(rfs, buildResultField("", "JOB", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "BG_SCHEMA_VER", mysql.TypeLonglong, 4)) - rfs = append(rfs, buildResultField("", "BG_OWNER", mysql.TypeVarchar, 64)) - rfs = append(rfs, buildResultField("", "BG_JOB", mysql.TypeVarchar, 128)) - - return rfs -} - -func buildResultField(tableName, name string, tp byte, size int) *ast.ResultField { - cs := charset.CharsetBin - cl := charset.CharsetBin - flag := mysql.UnsignedFlag - if tp == mysql.TypeVarchar || tp == mysql.TypeBlob { - cs = mysql.DefaultCharset - cl = mysql.DefaultCollationName - flag = 0 - } - - fieldType := types.FieldType{ - Charset: cs, - Collate: cl, - Tp: tp, - Flen: size, - Flag: uint(flag), - } - colInfo := &model.ColumnInfo{ - Name: model.NewCIStr(name), - FieldType: fieldType, - } - expr := &ast.ValueExpr{} - expr.SetType(&fieldType) - - return &ast.ResultField{ - Column: colInfo, - ColumnAsName: colInfo.Name, - TableAsName: model.NewCIStr(tableName), - DBName: model.NewCIStr(infoschema.Name), - Expr: expr, - } -} - -// matchOrder checks if the plan has the same ordering as items. -func matchOrder(p Plan, items []*ast.ByItem) bool { - switch x := p.(type) { - case *Aggregate: - return false - case *IndexScan: - if len(items) > len(x.Index.Columns) { - return false - } - for i, item := range items { - if item.Desc { - return false - } - var rf *ast.ResultField - switch y := item.Expr.(type) { - case *ast.ColumnNameExpr: - rf = y.Refer - case *ast.PositionExpr: - rf = y.Refer - default: - return false - } - if rf.Table.Name.L != x.Table.Name.L || rf.Column.Name.L != x.Index.Columns[i].Name.L { - return false - } - } - return true - case *TableScan: - if len(items) != 1 || !x.Table.PKIsHandle { - return false - } - if items[0].Desc { - return false - } - var refer *ast.ResultField - switch x := items[0].Expr.(type) { - case *ast.ColumnNameExpr: - refer = x.Refer - case *ast.PositionExpr: - refer = x.Refer - default: - return false - } - if mysql.HasPriKeyFlag(refer.Column.Flag) { - return true - } - return false - case *JoinOuter: - return false - case *JoinInner: - return false - case *Sort: - // Sort plan should not be checked here as there should only be one sort plan in a plan tree. - return false - case WithSrcPlan: - return matchOrder(x.Src(), items) - } - return true -} - -// splitWhere split a where expression to a list of AND conditions. -func splitWhere(where ast.ExprNode) []ast.ExprNode { - var conditions []ast.ExprNode - switch x := where.(type) { - case nil: - case *ast.BinaryOperationExpr: - if x.Op == opcode.AndAnd { - conditions = append(conditions, splitWhere(x.L)...) - conditions = append(conditions, splitWhere(x.R)...) - } else { - conditions = append(conditions, x) - } - case *ast.ParenthesesExpr: - conditions = append(conditions, splitWhere(x.Expr)...) - default: - conditions = append(conditions, where) - } - return conditions -} - -// SubQueryBuilder is the interface for building SubQuery executor. -type SubQueryBuilder interface { - Build(p Plan) ast.SubqueryExec -} - -// subqueryVisitor visits AST and handles SubqueryExpr. -type subqueryVisitor struct { - builder *planBuilder -} - -func (se *subqueryVisitor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { - switch x := in.(type) { - case *ast.SubqueryExpr: - p := se.builder.build(x.Query) - // The expr pointor is copyed into ResultField when running name resolver. - // So we can not just replace the expr node in AST. We need to put SubQuery into the expr. - // See: optimizer.nameResolver.createResultFields() - x.SubqueryExec = se.builder.sb.Build(p) - return in, true - case *ast.Join: - // SubSelect in from clause will be handled in buildJoin(). - return in, true - } - return in, false -} - -func (se *subqueryVisitor) Leave(in ast.Node) (out ast.Node, ok bool) { - return in, true -} - -func (b *planBuilder) buildUnion(union *ast.UnionStmt) Plan { - sels := make([]Plan, len(union.SelectList.Selects)) - for i, sel := range union.SelectList.Selects { - sels[i] = b.buildSelect(sel) - } - var p Plan - p = &Union{ - Selects: sels, - } - unionFields := union.GetResultFields() - for _, sel := range sels { - for i, f := range sel.Fields() { - if i == len(unionFields) { - b.err = errors.New("The used SELECT statements have a different number of columns") - return nil - } - uField := unionFields[i] - /* - * The lengths of the columns in the UNION result take into account the values retrieved by all of the SELECT statements - * SELECT REPEAT('a',1) UNION SELECT REPEAT('b',10); - * +---------------+ - * | REPEAT('a',1) | - * +---------------+ - * | a | - * | bbbbbbbbbb | - * +---------------+ - */ - if f.Column.Flen > uField.Column.Flen { - uField.Column.Flen = f.Column.Flen - } - // For select nul union select "abc", we should not convert "abc" to nil. - // And the result field type should be VARCHAR. - if uField.Column.Tp == 0 || uField.Column.Tp == mysql.TypeNull { - uField.Column.Tp = f.Column.Tp - } - } - } - for _, v := range unionFields { - v.Expr.SetType(&v.Column.FieldType) - } - - p.SetFields(unionFields) - if union.Distinct { - p = b.buildDistinct(p) - } - if union.OrderBy != nil { - p = b.buildSort(p, union.OrderBy.Items) - } - if union.Limit != nil { - p = b.buildLimit(p, union.Limit) - } - return p -} - -func (b *planBuilder) buildDistinct(src Plan) Plan { - d := &Distinct{} - d.src = src - d.SetFields(src.Fields()) - return d -} - -func (b *planBuilder) buildUpdate(update *ast.UpdateStmt) Plan { - sel := &ast.SelectStmt{From: update.TableRefs, Where: update.Where, OrderBy: update.Order, Limit: update.Limit} - p := b.buildFrom(sel) - if sel.OrderBy != nil && !matchOrder(p, sel.OrderBy.Items) { - p = b.buildSort(p, sel.OrderBy.Items) - if b.err != nil { - return nil - } - } - if sel.Limit != nil { - p = b.buildLimit(p, sel.Limit) - if b.err != nil { - return nil - } - } - orderedList := b.buildUpdateLists(update.List, p.Fields()) - if b.err != nil { - return nil - } - return &Update{OrderedList: orderedList, SelectPlan: p} -} - -func (b *planBuilder) buildUpdateLists(list []*ast.Assignment, fields []*ast.ResultField) []*ast.Assignment { - newList := make([]*ast.Assignment, len(fields)) - for _, assign := range list { - offset, err := columnOffsetInFields(assign.Column, fields) - if err != nil { - b.err = errors.Trace(err) - return nil - } - newList[offset] = assign - } - return newList -} - -func (b *planBuilder) buildDelete(del *ast.DeleteStmt) Plan { - sel := &ast.SelectStmt{From: del.TableRefs, Where: del.Where, OrderBy: del.Order, Limit: del.Limit} - p := b.buildFrom(sel) - if sel.OrderBy != nil && !matchOrder(p, sel.OrderBy.Items) { - p = b.buildSort(p, sel.OrderBy.Items) - if b.err != nil { - return nil - } - } - if sel.Limit != nil { - p = b.buildLimit(p, sel.Limit) - if b.err != nil { - return nil - } - } - var tables []*ast.TableName - if del.Tables != nil { - tables = del.Tables.Tables - } - return &Delete{ - Tables: tables, - IsMultiTable: del.IsMultiTable, - SelectPlan: p, - } -} - -func columnOffsetInFields(cn *ast.ColumnName, fields []*ast.ResultField) (int, error) { - offset := -1 - tableNameL := cn.Table.L - columnNameL := cn.Name.L - if tableNameL != "" { - for i, f := range fields { - // Check table name. - if f.TableAsName.L != "" { - if tableNameL != f.TableAsName.L { - continue - } - } else { - if tableNameL != f.Table.Name.L { - continue - } - } - // Check column name. - if f.ColumnAsName.L != "" { - if columnNameL != f.ColumnAsName.L { - continue - } - } else { - if columnNameL != f.Column.Name.L { - continue - } - } - - offset = i - } - } else { - for i, f := range fields { - matchAsName := f.ColumnAsName.L != "" && f.ColumnAsName.L == columnNameL - matchColumnName := f.ColumnAsName.L == "" && f.Column.Name.L == columnNameL - if matchAsName || matchColumnName { - if offset != -1 { - return -1, errors.Errorf("column %s is ambiguous.", cn.Name.O) - } - offset = i - } - } - } - if offset == -1 { - return -1, errors.Errorf("column %s not found", cn.Name.O) - } - return offset, nil -} - -func (b *planBuilder) buildShow(show *ast.ShowStmt) Plan { - var p Plan - p = &Show{ - Tp: show.Tp, - DBName: show.DBName, - Table: show.Table, - Column: show.Column, - Flag: show.Flag, - Full: show.Full, - User: show.User, - } - p.SetFields(show.GetResultFields()) - var conditions []ast.ExprNode - if show.Pattern != nil { - conditions = append(conditions, show.Pattern) - } - if show.Where != nil { - conditions = append(conditions, show.Where) - } - if len(conditions) != 0 { - filter := &Filter{Conditions: conditions} - filter.SetSrc(p) - p = filter - } - return p -} - -func (b *planBuilder) buildSimple(node ast.StmtNode) Plan { - return &Simple{Statement: node} -} - -func (b *planBuilder) buildInsert(insert *ast.InsertStmt) Plan { - insertPlan := &Insert{ - Table: insert.Table, - Columns: insert.Columns, - Lists: insert.Lists, - Setlist: insert.Setlist, - OnDuplicate: insert.OnDuplicate, - IsReplace: insert.IsReplace, - Priority: insert.Priority, - } - if insert.Select != nil { - insertPlan.SelectPlan = b.build(insert.Select) - if b.err != nil { - return nil - } - } - return insertPlan -} - -func (b *planBuilder) buildDDL(node ast.DDLNode) Plan { - return &DDL{Statement: node} -} - -func (b *planBuilder) buildExplain(explain *ast.ExplainStmt) Plan { - if show, ok := explain.Stmt.(*ast.ShowStmt); ok { - return b.buildShow(show) - } - targetPlan := b.build(explain.Stmt) - if b.err != nil { - return nil - } - p := &Explain{StmtPlan: targetPlan} - p.SetFields(buildExplainFields()) - return p -} - -// See: https://dev.mysql.com/doc/refman/5.7/en/explain-output.html -func buildExplainFields() []*ast.ResultField { - rfs := make([]*ast.ResultField, 0, 10) - rfs = append(rfs, buildResultField("", "id", mysql.TypeLonglong, 4)) - rfs = append(rfs, buildResultField("", "select_type", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "table", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "type", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "possible_keys", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "key", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "key_len", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "ref", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "rows", mysql.TypeVarchar, 128)) - rfs = append(rfs, buildResultField("", "Extra", mysql.TypeVarchar, 128)) - return rfs -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder_join.go b/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder_join.go deleted file mode 100644 index 964cb850dd9f..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/planbuilder_join.go +++ /dev/null @@ -1,795 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "strings" - - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" -) - -// equalCond represents an equivalent join condition, like "t1.c1 = t2.c1". -type equalCond struct { - left *ast.ResultField - leftIdx bool - right *ast.ResultField - rightIdx bool -} - -func newEqualCond(left, right *ast.ResultField) *equalCond { - eq := &equalCond{left: left, right: right} - eq.leftIdx = equivHasIndex(eq.left) - eq.rightIdx = equivHasIndex(eq.right) - return eq -} - -func equivHasIndex(rf *ast.ResultField) bool { - if rf.Table.PKIsHandle && mysql.HasPriKeyFlag(rf.Column.Flag) { - return true - } - for _, idx := range rf.Table.Indices { - if len(idx.Columns) == 1 && idx.Columns[0].Name.L == rf.Column.Name.L { - return true - } - } - return false -} - -// joinPath can be a single table path, inner join or outer join. -type joinPath struct { - // for table path - table *ast.TableName - totalFilterRate float64 - - // for subquery - subquery ast.Node - asName model.CIStr - - neighborCount int // number of neighbor table. - idxDepCount int // number of paths this table depends on. - ordering *ast.ResultField - orderingDesc bool - - // for outer join path - outer *joinPath - inner *joinPath - rightJoin bool - - // for inner join path - inners []*joinPath - - // common - parent *joinPath - filterRate float64 - conditions []ast.ExprNode - eqConds []*equalCond - // The joinPaths that this path's index depends on. - idxDeps map[*joinPath]bool - neighbors map[*joinPath]bool -} - -// newTablePath creates a new table join path. -func newTablePath(table *ast.TableName) *joinPath { - return &joinPath{ - table: table, - filterRate: rateFull, - } -} - -// newSubqueryPath creates a new subquery join path. -func newSubqueryPath(node ast.Node, asName model.CIStr) *joinPath { - return &joinPath{ - subquery: node, - asName: asName, - filterRate: rateFull, - } -} - -// newOuterJoinPath creates a new outer join path and pushes on condition to children paths. -// The returned joinPath slice has one element. -func newOuterJoinPath(isRightJoin bool, leftPath, rightPath *joinPath, on *ast.OnCondition) *joinPath { - outerJoin := &joinPath{rightJoin: isRightJoin, outer: leftPath, inner: rightPath, filterRate: 1} - leftPath.parent = outerJoin - rightPath.parent = outerJoin - if isRightJoin { - outerJoin.outer, outerJoin.inner = outerJoin.inner, outerJoin.outer - } - if on != nil { - conditions := splitWhere(on.Expr) - availablePaths := []*joinPath{outerJoin.outer} - for _, con := range conditions { - if !outerJoin.inner.attachCondition(con, availablePaths) { - log.Errorf("Inner failed to attach ON condition") - } - } - } - return outerJoin -} - -// newInnerJoinPath creates inner join path and pushes on condition to children paths. -// If left path or right path is also inner join, it will be merged. -func newInnerJoinPath(leftPath, rightPath *joinPath, on *ast.OnCondition) *joinPath { - var innerJoin *joinPath - if len(leftPath.inners) != 0 { - innerJoin = leftPath - } else { - innerJoin = &joinPath{filterRate: leftPath.filterRate} - innerJoin.inners = append(innerJoin.inners, leftPath) - } - if len(rightPath.inners) != 0 { - innerJoin.inners = append(innerJoin.inners, rightPath.inners...) - innerJoin.conditions = append(innerJoin.conditions, rightPath.conditions...) - } else { - innerJoin.inners = append(innerJoin.inners, rightPath) - } - innerJoin.filterRate *= rightPath.filterRate - - for _, in := range innerJoin.inners { - in.parent = innerJoin - } - - if on != nil { - conditions := splitWhere(on.Expr) - for _, con := range conditions { - if !innerJoin.attachCondition(con, nil) { - innerJoin.conditions = append(innerJoin.conditions, con) - } - } - } - return innerJoin -} - -func (p *joinPath) resultFields() []*ast.ResultField { - if p.table != nil { - return p.table.GetResultFields() - } - if p.outer != nil { - if p.rightJoin { - return append(p.inner.resultFields(), p.outer.resultFields()...) - } - return append(p.outer.resultFields(), p.inner.resultFields()...) - } - var rfs []*ast.ResultField - for _, in := range p.inners { - rfs = append(rfs, in.resultFields()...) - } - return rfs -} - -// attachCondition tries to attach a condition as deep as possible. -// availablePaths are paths join before this path. -func (p *joinPath) attachCondition(condition ast.ExprNode, availablePaths []*joinPath) (attached bool) { - filterRate := guesstimateFilterRate(condition) - // table - if p.table != nil || p.subquery != nil { - attacher := conditionAttachChecker{targetPath: p, availablePaths: availablePaths} - condition.Accept(&attacher) - if attacher.invalid { - return false - } - p.conditions = append(p.conditions, condition) - p.filterRate *= filterRate - return true - } - // inner join - if len(p.inners) > 0 { - for _, in := range p.inners { - if in.attachCondition(condition, availablePaths) { - p.filterRate *= filterRate - return true - } - } - attacher := &conditionAttachChecker{targetPath: p, availablePaths: availablePaths} - condition.Accept(attacher) - if attacher.invalid { - return false - } - p.conditions = append(p.conditions, condition) - p.filterRate *= filterRate - return true - } - - // outer join - if p.outer.attachCondition(condition, availablePaths) { - p.filterRate *= filterRate - return true - } - if p.inner.attachCondition(condition, append(availablePaths, p.outer)) { - p.filterRate *= filterRate - return true - } - return false -} - -func (p *joinPath) containsTable(table *ast.TableName) bool { - if p.table != nil { - return p.table == table - } - if p.subquery != nil { - return p.asName.L == table.Name.L - } - if len(p.inners) != 0 { - for _, in := range p.inners { - if in.containsTable(table) { - return true - } - } - return false - } - - return p.outer.containsTable(table) || p.inner.containsTable(table) -} - -// attachEqualCond tries to attach an equalCond deep into a table path if applicable. -func (p *joinPath) attachEqualCond(eqCon *equalCond, availablePaths []*joinPath) (attached bool) { - // table - if p.table != nil { - var prevTable *ast.TableName - var needSwap bool - if eqCon.left.TableName == p.table { - prevTable = eqCon.right.TableName - } else if eqCon.right.TableName == p.table { - prevTable = eqCon.left.TableName - needSwap = true - } - if prevTable != nil { - for _, prev := range availablePaths { - if prev.containsTable(prevTable) { - if needSwap { - eqCon.left, eqCon.right = eqCon.right, eqCon.left - eqCon.leftIdx, eqCon.rightIdx = eqCon.rightIdx, eqCon.leftIdx - } - p.eqConds = append(p.eqConds, eqCon) - return true - } - } - } - return false - } - - // inner join - if len(p.inners) > 0 { - for _, in := range p.inners { - if in.attachEqualCond(eqCon, availablePaths) { - p.filterRate *= rateEqual - return true - } - } - return false - } - // outer join - if p.outer.attachEqualCond(eqCon, availablePaths) { - p.filterRate *= rateEqual - return true - } - if p.inner.attachEqualCond(eqCon, append(availablePaths, p.outer)) { - p.filterRate *= rateEqual - return true - } - return false -} - -func (p *joinPath) extractEqualConditon() { - var equivs []*equalCond - var cons []ast.ExprNode - for _, con := range p.conditions { - eq := equivFromExpr(con) - if eq != nil { - equivs = append(equivs, eq) - if p.table != nil { - if eq.right.TableName == p.table { - eq.left, eq.right = eq.right, eq.left - eq.leftIdx, eq.rightIdx = eq.rightIdx, eq.leftIdx - } - } - } else { - cons = append(cons, con) - } - } - p.eqConds = equivs - p.conditions = cons - for _, in := range p.inners { - in.extractEqualConditon() - } - if p.outer != nil { - p.outer.extractEqualConditon() - p.inner.extractEqualConditon() - } -} - -func (p *joinPath) addIndexDependency() { - if p.outer != nil { - p.outer.addIndexDependency() - p.inner.addIndexDependency() - return - } - if p.table != nil { - return - } - for _, eq := range p.eqConds { - if !eq.leftIdx && !eq.rightIdx { - continue - } - pathLeft := p.findInnerContains(eq.left.TableName) - if pathLeft == nil { - continue - } - pathRight := p.findInnerContains(eq.right.TableName) - if pathRight == nil { - continue - } - if eq.leftIdx && eq.rightIdx { - pathLeft.addNeighbor(pathRight) - pathRight.addNeighbor(pathLeft) - } else if eq.leftIdx { - if !pathLeft.hasOuterIdxEqualCond() { - pathLeft.addIndexDep(pathRight) - } - } else if eq.rightIdx { - if !pathRight.hasOuterIdxEqualCond() { - pathRight.addIndexDep(pathLeft) - } - } - } - for _, in := range p.inners { - in.removeIndexDepCycle(in) - in.addIndexDependency() - } -} - -func (p *joinPath) hasOuterIdxEqualCond() bool { - if p.table != nil { - for _, eq := range p.eqConds { - if eq.leftIdx { - return true - } - } - return false - } - if p.outer != nil { - return p.outer.hasOuterIdxEqualCond() - } - for _, in := range p.inners { - if in.hasOuterIdxEqualCond() { - return true - } - } - return false -} - -func (p *joinPath) findInnerContains(table *ast.TableName) *joinPath { - for _, in := range p.inners { - if in.containsTable(table) { - return in - } - } - return nil -} - -func (p *joinPath) addNeighbor(neighbor *joinPath) { - if p.neighbors == nil { - p.neighbors = map[*joinPath]bool{} - } - p.neighbors[neighbor] = true - p.neighborCount++ -} - -func (p *joinPath) addIndexDep(dep *joinPath) { - if p.idxDeps == nil { - p.idxDeps = map[*joinPath]bool{} - } - p.idxDeps[dep] = true - p.idxDepCount++ -} - -func (p *joinPath) removeIndexDepCycle(origin *joinPath) { - if p.idxDeps == nil { - return - } - for dep := range p.idxDeps { - if dep == origin { - delete(p.idxDeps, origin) - continue - } - dep.removeIndexDepCycle(origin) - } -} - -func (p *joinPath) score() float64 { - return 1 / p.filterRate -} - -func (p *joinPath) String() string { - if p.table != nil { - return p.table.TableInfo.Name.L - } - if p.outer != nil { - return "outer{" + p.outer.String() + "," + p.inner.String() + "}" - } - var innerStrs []string - for _, in := range p.inners { - innerStrs = append(innerStrs, in.String()) - } - return "inner{" + strings.Join(innerStrs, ",") + "}" -} - -func (p *joinPath) optimizeJoinOrder(availablePaths []*joinPath) { - if p.table != nil { - return - } - if p.outer != nil { - p.outer.optimizeJoinOrder(availablePaths) - p.inner.optimizeJoinOrder(append(availablePaths, p.outer)) - return - } - var ordered []*joinPath - pathMap := map[*joinPath]bool{} - for _, in := range p.inners { - pathMap[in] = true - } - for len(pathMap) > 0 { - next := p.nextPath(pathMap, availablePaths) - next.optimizeJoinOrder(availablePaths) - ordered = append(ordered, next) - delete(pathMap, next) - availablePaths = append(availablePaths, next) - for path := range pathMap { - if path.idxDeps != nil { - delete(path.idxDeps, next) - } - if path.neighbors != nil { - delete(path.neighbors, next) - } - } - p.reattach(pathMap, availablePaths) - } - p.inners = ordered -} - -// reattach is called by inner joinPath to retry attach conditions to inner paths -// after an inner path has been added to available paths. -func (p *joinPath) reattach(pathMap map[*joinPath]bool, availablePaths []*joinPath) { - if len(p.conditions) != 0 { - remainedConds := make([]ast.ExprNode, 0, len(p.conditions)) - for _, con := range p.conditions { - var attached bool - for path := range pathMap { - if path.attachCondition(con, availablePaths) { - attached = true - break - } - } - if !attached { - remainedConds = append(remainedConds, con) - } - } - p.conditions = remainedConds - } - if len(p.eqConds) != 0 { - remainedEqConds := make([]*equalCond, 0, len(p.eqConds)) - for _, eq := range p.eqConds { - var attached bool - for path := range pathMap { - if path.attachEqualCond(eq, availablePaths) { - attached = true - break - } - } - if !attached { - remainedEqConds = append(remainedEqConds, eq) - } - } - p.eqConds = remainedEqConds - } -} - -func (p *joinPath) nextPath(pathMap map[*joinPath]bool, availablePaths []*joinPath) *joinPath { - cans := p.candidates(pathMap) - if len(cans) == 0 { - var v *joinPath - for v = range pathMap { - log.Errorf("index dep %v, prevs %v\n", v.idxDeps, len(availablePaths)) - } - return v - } - indexPath := p.nextIndexPath(cans) - if indexPath != nil { - return indexPath - } - return p.pickPath(cans) -} - -func (p *joinPath) candidates(pathMap map[*joinPath]bool) []*joinPath { - var cans []*joinPath - for t := range pathMap { - if len(t.idxDeps) > 0 { - continue - } - cans = append(cans, t) - } - return cans -} - -func (p *joinPath) nextIndexPath(candidates []*joinPath) *joinPath { - var best *joinPath - for _, can := range candidates { - // Since we may not have equal conditions attached on the path, we - // need to check neighborCount and idxDepCount to see if this path - // can be joined with index. - neighborIsAvailable := len(can.neighbors) < can.neighborCount - idxDepIsAvailable := can.idxDepCount > 0 - if can.hasOuterIdxEqualCond() || neighborIsAvailable || idxDepIsAvailable { - if best == nil { - best = can - } - if can.score() > best.score() { - best = can - } - } - } - return best -} - -func (p *joinPath) pickPath(candidates []*joinPath) *joinPath { - var best *joinPath - for _, path := range candidates { - if best == nil { - best = path - } - if path.score() > best.score() { - best = path - } - } - return best -} - -// conditionAttachChecker checks if an expression is valid to -// attach to a path. attach is valid only if all the referenced tables in the -// expression are available. -type conditionAttachChecker struct { - targetPath *joinPath - availablePaths []*joinPath - invalid bool -} - -func (c *conditionAttachChecker) Enter(in ast.Node) (ast.Node, bool) { - switch x := in.(type) { - case *ast.ColumnNameExpr: - table := x.Refer.TableName - if c.targetPath.containsTable(table) { - return in, false - } - c.invalid = true - for _, path := range c.availablePaths { - if path.containsTable(table) { - c.invalid = false - return in, false - } - } - } - return in, false -} - -func (c *conditionAttachChecker) Leave(in ast.Node) (ast.Node, bool) { - return in, !c.invalid -} - -func (b *planBuilder) buildJoin(sel *ast.SelectStmt) Plan { - nrfinder := &nullRejectFinder{nullRejectTables: map[*ast.TableName]bool{}} - if sel.Where != nil { - sel.Where.Accept(nrfinder) - } - path := b.buildBasicJoinPath(sel.From.TableRefs, nrfinder.nullRejectTables) - rfs := path.resultFields() - - whereConditions := splitWhere(sel.Where) - for _, whereCond := range whereConditions { - if !path.attachCondition(whereCond, nil) { - // TODO: Find a better way to handle this condition. - path.conditions = append(path.conditions, whereCond) - log.Errorf("Failed to attach where condtion.") - } - } - path.extractEqualConditon() - path.addIndexDependency() - path.optimizeJoinOrder(nil) - p := b.buildPlanFromJoinPath(path) - p.SetFields(rfs) - return p -} - -type nullRejectFinder struct { - nullRejectTables map[*ast.TableName]bool -} - -func (n *nullRejectFinder) Enter(in ast.Node) (ast.Node, bool) { - switch x := in.(type) { - case *ast.BinaryOperationExpr: - if x.Op == opcode.NullEQ || x.Op == opcode.OrOr { - return in, true - } - case *ast.IsNullExpr: - if !x.Not { - return in, true - } - case *ast.IsTruthExpr: - if x.Not { - return in, true - } - } - return in, false -} - -func (n *nullRejectFinder) Leave(in ast.Node) (ast.Node, bool) { - switch x := in.(type) { - case *ast.ColumnNameExpr: - n.nullRejectTables[x.Refer.TableName] = true - } - return in, true -} - -func (b *planBuilder) buildBasicJoinPath(node ast.ResultSetNode, nullRejectTables map[*ast.TableName]bool) *joinPath { - switch x := node.(type) { - case nil: - return nil - case *ast.Join: - leftPath := b.buildBasicJoinPath(x.Left, nullRejectTables) - if x.Right == nil { - return leftPath - } - righPath := b.buildBasicJoinPath(x.Right, nullRejectTables) - isOuter := b.isOuterJoin(x.Tp, leftPath, righPath, nullRejectTables) - if isOuter { - return newOuterJoinPath(x.Tp == ast.RightJoin, leftPath, righPath, x.On) - } - return newInnerJoinPath(leftPath, righPath, x.On) - case *ast.TableSource: - switch v := x.Source.(type) { - case *ast.TableName: - return newTablePath(v) - case *ast.SelectStmt, *ast.UnionStmt: - return newSubqueryPath(v, x.AsName) - default: - b.err = ErrUnsupportedType.Gen("unsupported table source type %T", x) - return nil - } - default: - b.err = ErrUnsupportedType.Gen("unsupported table source type %T", x) - return nil - } -} - -func (b *planBuilder) isOuterJoin(tp ast.JoinType, leftPaths, rightPaths *joinPath, - nullRejectTables map[*ast.TableName]bool) bool { - var innerPath *joinPath - switch tp { - case ast.LeftJoin: - innerPath = rightPaths - case ast.RightJoin: - innerPath = leftPaths - default: - return false - } - for table := range nullRejectTables { - if innerPath.containsTable(table) { - return false - } - } - return true -} - -func equivFromExpr(expr ast.ExprNode) *equalCond { - binop, ok := expr.(*ast.BinaryOperationExpr) - if !ok || binop.Op != opcode.EQ { - return nil - } - ln, lOK := binop.L.(*ast.ColumnNameExpr) - rn, rOK := binop.R.(*ast.ColumnNameExpr) - if !lOK || !rOK { - return nil - } - if ln.Name.Table.L == "" || rn.Name.Table.L == "" { - return nil - } - if ln.Name.Schema.L == rn.Name.Schema.L && ln.Name.Table.L == rn.Name.Table.L { - return nil - } - return newEqualCond(ln.Refer, rn.Refer) -} - -func (b *planBuilder) buildPlanFromJoinPath(path *joinPath) Plan { - if path.table != nil { - return b.buildTablePlanFromJoinPath(path) - } - if path.subquery != nil { - return b.buildSubqueryJoinPath(path) - } - if path.outer != nil { - join := &JoinOuter{ - Outer: b.buildPlanFromJoinPath(path.outer), - Inner: b.buildPlanFromJoinPath(path.inner), - } - if path.rightJoin { - join.SetFields(append(join.Inner.Fields(), join.Outer.Fields()...)) - } else { - join.SetFields(append(join.Outer.Fields(), join.Inner.Fields()...)) - } - return join - } - join := &JoinInner{} - for _, in := range path.inners { - join.Inners = append(join.Inners, b.buildPlanFromJoinPath(in)) - join.fields = append(join.fields, in.resultFields()...) - } - join.Conditions = path.conditions - for _, equiv := range path.eqConds { - cond := &ast.BinaryOperationExpr{L: equiv.left.Expr, R: equiv.right.Expr, Op: opcode.EQ} - join.Conditions = append(join.Conditions, cond) - } - return join -} - -func (b *planBuilder) buildTablePlanFromJoinPath(path *joinPath) Plan { - for _, equiv := range path.eqConds { - columnNameExpr := &ast.ColumnNameExpr{} - columnNameExpr.Name = &ast.ColumnName{} - columnNameExpr.Name.Name = equiv.left.Column.Name - columnNameExpr.Name.Table = equiv.left.Table.Name - columnNameExpr.Refer = equiv.left - condition := &ast.BinaryOperationExpr{L: columnNameExpr, R: equiv.right.Expr, Op: opcode.EQ} - ast.SetFlag(condition) - path.conditions = append(path.conditions, condition) - } - candidates := b.buildAllAccessMethodsPlan(path) - var p Plan - var lowestCost float64 - for _, can := range candidates { - cost := EstimateCost(can) - if p == nil { - p = can - lowestCost = cost - } - if cost < lowestCost { - p = can - lowestCost = cost - } - } - return p -} - -// Build subquery join path plan -func (b *planBuilder) buildSubqueryJoinPath(path *joinPath) Plan { - for _, equiv := range path.eqConds { - columnNameExpr := &ast.ColumnNameExpr{} - columnNameExpr.Name = &ast.ColumnName{} - columnNameExpr.Name.Name = equiv.left.Column.Name - columnNameExpr.Name.Table = equiv.left.Table.Name - columnNameExpr.Refer = equiv.left - condition := &ast.BinaryOperationExpr{L: columnNameExpr, R: equiv.right.Expr, Op: opcode.EQ} - ast.SetFlag(condition) - path.conditions = append(path.conditions, condition) - } - p := b.build(path.subquery) - if len(path.conditions) == 0 { - return p - } - filterPlan := &Filter{Conditions: path.conditions} - filterPlan.SetSrc(p) - filterPlan.SetFields(p.Fields()) - return filterPlan -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/plans.go b/vendor/github.com/pingcap/tidb/optimizer/plan/plans.go deleted file mode 100644 index 7a1a7e5d4619..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/plans.go +++ /dev/null @@ -1,677 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "fmt" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/util/types" -) - -// TableRange represents a range of row handle. -type TableRange struct { - LowVal int64 - HighVal int64 -} - -// TableScan represents a table scan plan. -type TableScan struct { - basePlan - - Table *model.TableInfo - Desc bool - Ranges []TableRange - - // RefAccess indicates it references a previous joined table, used in explain. - RefAccess bool - - // AccessConditions can be used to build index range. - AccessConditions []ast.ExprNode - - // FilterConditions can be used to filter result. - FilterConditions []ast.ExprNode -} - -// Accept implements Plan Accept interface. -func (p *TableScan) Accept(v Visitor) (Plan, bool) { - np, _ := v.Enter(p) - return v.Leave(np) -} - -// ShowDDL is for showing DDL information. -type ShowDDL struct { - basePlan -} - -// Accept implements Plan Accept interface. -func (p *ShowDDL) Accept(v Visitor) (Plan, bool) { - np, _ := v.Enter(p) - return v.Leave(np) -} - -// CheckTable is for checking table data. -type CheckTable struct { - basePlan - - Tables []*ast.TableName -} - -// Accept implements Plan Accept interface. -func (p *CheckTable) Accept(v Visitor) (Plan, bool) { - np, _ := v.Enter(p) - return v.Leave(np) - -} - -// IndexRange represents an index range to be scanned. -type IndexRange struct { - LowVal []types.Datum - LowExclude bool - HighVal []types.Datum - HighExclude bool -} - -// IsPoint returns if the index range is a point. -func (ir *IndexRange) IsPoint() bool { - if len(ir.LowVal) != len(ir.HighVal) { - return false - } - for i := range ir.LowVal { - a := ir.LowVal[i] - b := ir.HighVal[i] - if a.Kind() == types.KindMinNotNull || b.Kind() == types.KindMaxValue { - return false - } - cmp, err := a.CompareDatum(b) - if err != nil { - return false - } - if cmp != 0 { - return false - } - } - return !ir.LowExclude && !ir.HighExclude -} - -// IndexScan represents an index scan plan. -type IndexScan struct { - basePlan - - // The index used. - Index *model.IndexInfo - - // The table to lookup. - Table *model.TableInfo - - // Ordered and non-overlapping ranges to be scanned. - Ranges []*IndexRange - - // Desc indicates whether the index should be scanned in descending order. - Desc bool - - // RefAccess indicates it references a previous joined table, used in explain. - RefAccess bool - - // AccessConditions can be used to build index range. - AccessConditions []ast.ExprNode - - // Number of leading equal access condition. - // The offset of each equal condition correspond to the offset of index column. - // For example, an index has column (a, b, c), condition is 'a = 0 and b = 0 and c > 0' - // AccessEqualCount would be 2. - AccessEqualCount int - - // FilterConditions can be used to filter result. - FilterConditions []ast.ExprNode -} - -// Accept implements Plan Accept interface. -func (p *IndexScan) Accept(v Visitor) (Plan, bool) { - np, _ := v.Enter(p) - return v.Leave(np) -} - -// JoinOuter represents outer join plan. -type JoinOuter struct { - basePlan - - Outer Plan - Inner Plan -} - -// Accept implements Plan interface. -func (p *JoinOuter) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*JoinOuter) - var ok bool - p.Outer, ok = p.Outer.Accept(v) - if !ok { - return p, false - } - p.Inner, ok = p.Inner.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// JoinInner represents inner join plan. -type JoinInner struct { - basePlan - - Inners []Plan - Conditions []ast.ExprNode -} - -func (p *JoinInner) String() string { - return fmt.Sprintf("JoinInner()") -} - -// Accept implements Plan interface. -func (p *JoinInner) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*JoinInner) - for i, in := range p.Inners { - x, ok := in.Accept(v) - if !ok { - return p, false - } - p.Inners[i] = x - } - return v.Leave(p) -} - -// SelectLock represents a select lock plan. -type SelectLock struct { - planWithSrc - - Lock ast.SelectLockType -} - -// Accept implements Plan Accept interface. -func (p *SelectLock) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*SelectLock) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *SelectLock) SetLimit(limit float64) { - p.limit = limit - p.src.SetLimit(p.limit) -} - -// SelectFields represents a select fields plan. -type SelectFields struct { - planWithSrc -} - -// Accept implements Plan Accept interface. -func (p *SelectFields) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*SelectFields) - if p.src != nil { - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *SelectFields) SetLimit(limit float64) { - p.limit = limit - if p.src != nil { - p.src.SetLimit(limit) - } -} - -// Sort represents a sorting plan. -type Sort struct { - planWithSrc - - ByItems []*ast.ByItem -} - -// Accept implements Plan Accept interface. -func (p *Sort) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Sort) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -// It set the Src limit only if it is bypassed. -// Bypass has to be determined before this get called. -func (p *Sort) SetLimit(limit float64) { - p.limit = limit -} - -// Limit represents offset and limit plan. -type Limit struct { - planWithSrc - - Offset uint64 - Count uint64 -} - -// Accept implements Plan Accept interface. -func (p *Limit) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Limit) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -// As Limit itself determine the real limit, -// We just ignore the input, and set the real limit. -func (p *Limit) SetLimit(limit float64) { - p.limit = float64(p.Offset + p.Count) - p.src.SetLimit(p.limit) -} - -// Union represents Union plan. -type Union struct { - basePlan - - Selects []Plan -} - -// Accept implements Plan Accept interface. -func (p *Union) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(p) - } - p = np.(*Union) - for i, sel := range p.Selects { - var ok bool - p.Selects[i], ok = sel.Accept(v) - if !ok { - return p, false - } - } - return v.Leave(p) -} - -// Distinct represents Distinct plan. -type Distinct struct { - planWithSrc -} - -// Accept implements Plan Accept interface. -func (p *Distinct) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(p) - } - p = np.(*Distinct) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *Distinct) SetLimit(limit float64) { - p.limit = limit - if p.src != nil { - p.src.SetLimit(limit) - } -} - -// Prepare represents prepare plan. -type Prepare struct { - basePlan - - Name string - SQLText string -} - -// Accept implements Plan Accept interface. -func (p *Prepare) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Prepare) - return v.Leave(p) -} - -// Execute represents prepare plan. -type Execute struct { - basePlan - - Name string - UsingVars []ast.ExprNode - ID uint32 -} - -// Accept implements Plan Accept interface. -func (p *Execute) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Execute) - return v.Leave(p) -} - -// Deallocate represents deallocate plan. -type Deallocate struct { - basePlan - - Name string -} - -// Accept implements Plan Accept interface. -func (p *Deallocate) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Deallocate) - return v.Leave(p) -} - -// Aggregate represents a select fields plan. -type Aggregate struct { - planWithSrc - AggFuncs []*ast.AggregateFuncExpr - GroupByItems []*ast.ByItem -} - -// Accept implements Plan Accept interface. -func (p *Aggregate) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Aggregate) - if p.src != nil { - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *Aggregate) SetLimit(limit float64) { - p.limit = limit - if p.src != nil { - p.src.SetLimit(limit) - } -} - -// Having represents a having plan. -// The having plan should after aggregate plan. -type Having struct { - planWithSrc - - // Originally the WHERE or ON condition is parsed into a single expression, - // but after we converted to CNF(Conjunctive normal form), it can be - // split into a list of AND conditions. - Conditions []ast.ExprNode -} - -// Accept implements Plan Accept interface. -func (p *Having) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Having) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *Having) SetLimit(limit float64) { - p.limit = limit - // We assume 50% of the src row is filtered out. - p.src.SetLimit(limit * 2) -} - -// Update represents an update plan. -type Update struct { - basePlan - - OrderedList []*ast.Assignment // OrderedList has the same offset as TablePlan's result fields. - SelectPlan Plan -} - -// Accept implements Plan Accept interface. -func (p *Update) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Update) - var ok bool - p.SelectPlan, ok = p.SelectPlan.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// Delete represents a delete plan. -type Delete struct { - basePlan - - SelectPlan Plan - Tables []*ast.TableName - IsMultiTable bool -} - -// Accept implements Plan Accept interface. -func (p *Delete) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Delete) - var ok bool - p.SelectPlan, ok = p.SelectPlan.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// Filter represents a plan that filter srcplan result. -type Filter struct { - planWithSrc - - // Originally the WHERE or ON condition is parsed into a single expression, - // but after we converted to CNF(Conjunctive normal form), it can be - // split into a list of AND conditions. - Conditions []ast.ExprNode -} - -// Accept implements Plan Accept interface. -func (p *Filter) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Filter) - var ok bool - p.src, ok = p.src.Accept(v) - if !ok { - return p, false - } - return v.Leave(p) -} - -// SetLimit implements Plan SetLimit interface. -func (p *Filter) SetLimit(limit float64) { - p.limit = limit - // We assume 50% of the src row is filtered out. - p.src.SetLimit(limit * 2) -} - -// Show represents a show plan. -type Show struct { - basePlan - - Tp ast.ShowStmtType // Databases/Tables/Columns/.... - DBName string - Table *ast.TableName // Used for showing columns. - Column *ast.ColumnName // Used for `desc table column`. - Flag int // Some flag parsed from sql, such as FULL. - Full bool - User string // Used for show grants. - - // Used by show variables - GlobalScope bool -} - -// Accept implements Plan Accept interface. -func (p *Show) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Show) - return v.Leave(p) -} - -// Simple represents a simple statement plan which doesn't need any optimization. -type Simple struct { - basePlan - - Statement ast.StmtNode -} - -// Accept implements Plan Accept interface. -func (p *Simple) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Simple) - return v.Leave(p) -} - -// Insert represents an insert plan. -type Insert struct { - basePlan - - Table *ast.TableRefsClause - Columns []*ast.ColumnName - Lists [][]ast.ExprNode - Setlist []*ast.Assignment - OnDuplicate []*ast.Assignment - SelectPlan Plan - - IsReplace bool - Priority int -} - -// Accept implements Plan Accept interface. -func (p *Insert) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*Insert) - if p.SelectPlan != nil { - var ok bool - p.SelectPlan, ok = p.SelectPlan.Accept(v) - if !ok { - return p, false - } - } - return v.Leave(p) -} - -// DDL represents a DDL statement plan. -type DDL struct { - basePlan - - Statement ast.DDLNode -} - -// Accept implements Plan Accept interface. -func (p *DDL) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - return v.Leave(np) - } - p = np.(*DDL) - return v.Leave(p) -} - -// Explain represents a explain plan. -type Explain struct { - basePlan - - StmtPlan Plan -} - -// Accept implements Plan Accept interface. -func (p *Explain) Accept(v Visitor) (Plan, bool) { - np, skip := v.Enter(p) - if skip { - v.Leave(np) - } - p = np.(*Explain) - return v.Leave(p) -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/range.go b/vendor/github.com/pingcap/tidb/optimizer/plan/range.go deleted file mode 100644 index 5278b6566d98..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/range.go +++ /dev/null @@ -1,505 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "fmt" - "math" - "sort" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/types" -) - -type rangePoint struct { - value types.Datum - excl bool // exclude - start bool -} - -func (rp rangePoint) String() string { - val := rp.value.GetValue() - if rp.value.Kind() == types.KindMinNotNull { - val = "-inf" - } else if rp.value.Kind() == types.KindMaxValue { - val = "+inf" - } - if rp.start { - symbol := "[" - if rp.excl { - symbol = "(" - } - return fmt.Sprintf("%s%v", symbol, val) - } - symbol := "]" - if rp.excl { - symbol = ")" - } - return fmt.Sprintf("%v%s", val, symbol) -} - -type rangePointSorter struct { - points []rangePoint - err error -} - -func (r *rangePointSorter) Len() int { - return len(r.points) -} - -func (r *rangePointSorter) Less(i, j int) bool { - a := r.points[i] - b := r.points[j] - cmp, err := a.value.CompareDatum(b.value) - if err != nil { - r.err = err - return true - } - if cmp == 0 { - return r.equalValueLess(a, b) - } - return cmp < 0 -} - -func (r *rangePointSorter) equalValueLess(a, b rangePoint) bool { - if a.start && b.start { - return !a.excl && b.excl - } else if a.start { - return !b.excl - } else if b.start { - return a.excl || b.excl - } - return a.excl && !b.excl -} - -func (r *rangePointSorter) Swap(i, j int) { - r.points[i], r.points[j] = r.points[j], r.points[i] -} - -type rangeBuilder struct { - err error -} - -func (r *rangeBuilder) build(expr ast.ExprNode) []rangePoint { - switch x := expr.(type) { - case *ast.BinaryOperationExpr: - return r.buildFromBinop(x) - case *ast.PatternInExpr: - return r.buildFromIn(x) - case *ast.ParenthesesExpr: - return r.build(x.Expr) - case *ast.BetweenExpr: - return r.buildFromBetween(x) - case *ast.IsNullExpr: - return r.buildFromIsNull(x) - case *ast.IsTruthExpr: - return r.buildFromIsTruth(x) - case *ast.PatternLikeExpr: - rans := r.buildFromPatternLike(x) - return rans - case *ast.ColumnNameExpr: - return r.buildFromColumnName(x) - } - return fullRange -} - -func (r *rangeBuilder) buildFromBinop(x *ast.BinaryOperationExpr) []rangePoint { - if x.Op == opcode.OrOr { - return r.union(r.build(x.L), r.build(x.R)) - } else if x.Op == opcode.AndAnd { - return r.intersection(r.build(x.L), r.build(x.R)) - } - // This has been checked that the binary operation is comparison operation, and one of - // the operand is column name expression. - var value types.Datum - var op opcode.Op - if _, ok := x.L.(*ast.ValueExpr); ok { - value = types.NewDatum(x.L.GetValue()) - switch x.Op { - case opcode.GE: - op = opcode.LE - case opcode.GT: - op = opcode.LT - case opcode.LT: - op = opcode.GT - case opcode.LE: - op = opcode.GE - default: - op = x.Op - } - } else { - value = types.NewDatum(x.R.GetValue()) - op = x.Op - } - if value.Kind() == types.KindNull { - return nil - } - switch op { - case opcode.EQ: - startPoint := rangePoint{value: value, start: true} - endPoint := rangePoint{value: value} - return []rangePoint{startPoint, endPoint} - case opcode.NE: - startPoint1 := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint1 := rangePoint{value: value, excl: true} - startPoint2 := rangePoint{value: value, start: true, excl: true} - endPoint2 := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint1, endPoint1, startPoint2, endPoint2} - case opcode.LT: - startPoint := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint := rangePoint{value: value, excl: true} - return []rangePoint{startPoint, endPoint} - case opcode.LE: - startPoint := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint := rangePoint{value: value} - return []rangePoint{startPoint, endPoint} - case opcode.GT: - startPoint := rangePoint{value: value, start: true, excl: true} - endPoint := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint, endPoint} - case opcode.GE: - startPoint := rangePoint{value: value, start: true} - endPoint := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint, endPoint} - } - return nil -} - -func (r *rangeBuilder) buildFromIn(x *ast.PatternInExpr) []rangePoint { - if x.Not { - r.err = ErrUnsupportedType.Gen("NOT IN is not supported") - return fullRange - } - var rangePoints []rangePoint - for _, v := range x.List { - startPoint := rangePoint{value: types.NewDatum(v.GetValue()), start: true} - endPoint := rangePoint{value: types.NewDatum(v.GetValue())} - rangePoints = append(rangePoints, startPoint, endPoint) - } - sorter := rangePointSorter{points: rangePoints} - sort.Sort(&sorter) - if sorter.err != nil { - r.err = sorter.err - } - // check duplicates - hasDuplicate := false - isStart := false - for _, v := range rangePoints { - if isStart == v.start { - hasDuplicate = true - break - } - isStart = v.start - } - if !hasDuplicate { - return rangePoints - } - // remove duplicates - distinctRangePoints := make([]rangePoint, 0, len(rangePoints)) - isStart = false - for i := 0; i < len(rangePoints); i++ { - current := rangePoints[i] - if isStart == current.start { - continue - } - distinctRangePoints = append(distinctRangePoints, current) - isStart = current.start - } - return distinctRangePoints -} - -func (r *rangeBuilder) buildFromBetween(x *ast.BetweenExpr) []rangePoint { - if x.Not { - binop1 := &ast.BinaryOperationExpr{Op: opcode.LT, L: x.Expr, R: x.Left} - binop2 := &ast.BinaryOperationExpr{Op: opcode.GT, L: x.Expr, R: x.Right} - range1 := r.buildFromBinop(binop1) - range2 := r.buildFromBinop(binop2) - return r.union(range1, range2) - } - binop1 := &ast.BinaryOperationExpr{Op: opcode.GE, L: x.Expr, R: x.Left} - binop2 := &ast.BinaryOperationExpr{Op: opcode.LE, L: x.Expr, R: x.Right} - range1 := r.buildFromBinop(binop1) - range2 := r.buildFromBinop(binop2) - return r.intersection(range1, range2) -} - -func (r *rangeBuilder) buildFromIsNull(x *ast.IsNullExpr) []rangePoint { - if x.Not { - startPoint := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint, endPoint} - } - startPoint := rangePoint{start: true} - endPoint := rangePoint{} - return []rangePoint{startPoint, endPoint} -} - -func (r *rangeBuilder) buildFromIsTruth(x *ast.IsTruthExpr) []rangePoint { - if x.True != 0 { - if x.Not { - // NOT TRUE range is {[null null] [0, 0]} - startPoint1 := rangePoint{start: true} - endPoint1 := rangePoint{} - startPoint2 := rangePoint{start: true} - startPoint2.value.SetInt64(0) - endPoint2 := rangePoint{} - endPoint2.value.SetInt64(0) - return []rangePoint{startPoint1, endPoint1, startPoint2, endPoint2} - } - // TRUE range is {[-inf 0) (0 +inf]} - startPoint1 := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint1 := rangePoint{excl: true} - endPoint1.value.SetInt64(0) - startPoint2 := rangePoint{excl: true, start: true} - startPoint2.value.SetInt64(0) - endPoint2 := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint1, endPoint1, startPoint2, endPoint2} - } - if x.Not { - startPoint1 := rangePoint{start: true} - endPoint1 := rangePoint{excl: true} - endPoint1.value.SetInt64(0) - startPoint2 := rangePoint{start: true, excl: true} - startPoint2.value.SetInt64(0) - endPoint2 := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint1, endPoint1, startPoint2, endPoint2} - } - startPoint := rangePoint{start: true} - startPoint.value.SetInt64(0) - endPoint := rangePoint{} - endPoint.value.SetInt64(0) - return []rangePoint{startPoint, endPoint} -} - -func (r *rangeBuilder) buildFromPatternLike(x *ast.PatternLikeExpr) []rangePoint { - if x.Not { - // Pattern not like is not supported. - r.err = ErrUnsupportedType.Gen("NOT LIKE is not supported.") - return fullRange - } - pattern, err := types.ToString(x.Pattern.GetValue()) - if err != nil { - r.err = errors.Trace(err) - return fullRange - } - lowValue := make([]byte, 0, len(pattern)) - // unscape the pattern - var exclude bool - for i := 0; i < len(pattern); i++ { - if pattern[i] == x.Escape { - i++ - if i < len(pattern) { - lowValue = append(lowValue, pattern[i]) - } else { - lowValue = append(lowValue, x.Escape) - } - continue - } - if pattern[i] == '%' { - break - } else if pattern[i] == '_' { - exclude = true - break - } - lowValue = append(lowValue, pattern[i]) - } - if len(lowValue) == 0 { - return []rangePoint{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} - } - startPoint := rangePoint{start: true, excl: exclude} - startPoint.value.SetBytesAsString(lowValue) - highValue := make([]byte, len(lowValue)) - copy(highValue, lowValue) - endPoint := rangePoint{excl: true} - for i := len(highValue) - 1; i >= 0; i-- { - highValue[i]++ - if highValue[i] != 0 { - endPoint.value.SetBytesAsString(highValue) - break - } - if i == 0 { - endPoint.value = types.MaxValueDatum() - break - } - } - ranges := make([]rangePoint, 2) - ranges[0] = startPoint - ranges[1] = endPoint - return ranges -} - -func (r *rangeBuilder) buildFromColumnName(x *ast.ColumnNameExpr) []rangePoint { - // column name expression is equivalent to column name is true. - startPoint1 := rangePoint{value: types.MinNotNullDatum(), start: true} - endPoint1 := rangePoint{excl: true} - endPoint1.value.SetInt64(0) - startPoint2 := rangePoint{excl: true, start: true} - startPoint2.value.SetInt64(0) - endPoint2 := rangePoint{value: types.MaxValueDatum()} - return []rangePoint{startPoint1, endPoint1, startPoint2, endPoint2} -} - -func (r *rangeBuilder) intersection(a, b []rangePoint) []rangePoint { - return r.merge(a, b, false) -} - -func (r *rangeBuilder) union(a, b []rangePoint) []rangePoint { - return r.merge(a, b, true) -} - -func (r *rangeBuilder) merge(a, b []rangePoint, union bool) []rangePoint { - sorter := rangePointSorter{points: append(a, b...)} - sort.Sort(&sorter) - if sorter.err != nil { - r.err = sorter.err - return nil - } - var ( - merged []rangePoint - inRangeCount int - requiredInRangeCount int - ) - if union { - requiredInRangeCount = 1 - } else { - requiredInRangeCount = 2 - } - for _, val := range sorter.points { - if val.start { - inRangeCount++ - if inRangeCount == requiredInRangeCount { - // just reached the required in range count, a new range started. - merged = append(merged, val) - } - } else { - if inRangeCount == requiredInRangeCount { - // just about to leave the required in range count, the range is ended. - merged = append(merged, val) - } - inRangeCount-- - } - } - return merged -} - -// buildIndexRanges build index ranges from range points. -// Only the first column in the index is built, extra column ranges will be appended by -// appendIndexRanges. -func (r *rangeBuilder) buildIndexRanges(rangePoints []rangePoint) []*IndexRange { - indexRanges := make([]*IndexRange, 0, len(rangePoints)/2) - for i := 0; i < len(rangePoints); i += 2 { - startPoint := rangePoints[i] - endPoint := rangePoints[i+1] - ir := &IndexRange{ - LowVal: []types.Datum{startPoint.value}, - LowExclude: startPoint.excl, - HighVal: []types.Datum{endPoint.value}, - HighExclude: endPoint.excl, - } - indexRanges = append(indexRanges, ir) - } - return indexRanges -} - -// appendIndexRanges appends additional column ranges for multi-column index. -// The additional column ranges can only be appended to point ranges. -// for example we have an index (a, b), if the condition is (a > 1 and b = 2) -// then we can not build a conjunctive ranges for this index. -func (r *rangeBuilder) appendIndexRanges(origin []*IndexRange, rangePoints []rangePoint) []*IndexRange { - var newIndexRanges []*IndexRange - for i := 0; i < len(origin); i++ { - oRange := origin[i] - if !oRange.IsPoint() { - newIndexRanges = append(newIndexRanges, oRange) - } else { - newIndexRanges = append(newIndexRanges, r.appendIndexRange(oRange, rangePoints)...) - } - } - return newIndexRanges -} - -func (r *rangeBuilder) appendIndexRange(origin *IndexRange, rangePoints []rangePoint) []*IndexRange { - newRanges := make([]*IndexRange, 0, len(rangePoints)/2) - for i := 0; i < len(rangePoints); i += 2 { - startPoint := rangePoints[i] - lowVal := make([]types.Datum, len(origin.LowVal)+1) - copy(lowVal, origin.LowVal) - lowVal[len(origin.LowVal)] = startPoint.value - - endPoint := rangePoints[i+1] - highVal := make([]types.Datum, len(origin.HighVal)+1) - copy(highVal, origin.HighVal) - highVal[len(origin.HighVal)] = endPoint.value - - ir := &IndexRange{ - LowVal: lowVal, - LowExclude: startPoint.excl, - HighVal: highVal, - HighExclude: endPoint.excl, - } - newRanges = append(newRanges, ir) - } - return newRanges -} - -func (r *rangeBuilder) buildTableRanges(rangePoints []rangePoint) []TableRange { - tableRanges := make([]TableRange, 0, len(rangePoints)/2) - for i := 0; i < len(rangePoints); i += 2 { - startPoint := rangePoints[i] - if startPoint.value.Kind() == types.KindNull || startPoint.value.Kind() == types.KindMinNotNull { - startPoint.value.SetInt64(math.MinInt64) - } - startInt, err := types.ToInt64(startPoint.value.GetValue()) - if err != nil { - r.err = errors.Trace(err) - return tableRanges - } - startDatum := types.NewDatum(startInt) - cmp, err := startDatum.CompareDatum(startPoint.value) - if err != nil { - r.err = errors.Trace(err) - return tableRanges - } - if cmp < 0 || (cmp == 0 && startPoint.excl) { - startInt++ - } - endPoint := rangePoints[i+1] - if endPoint.value.Kind() == types.KindNull { - endPoint.value.SetInt64(math.MinInt64) - } else if endPoint.value.Kind() == types.KindMaxValue { - endPoint.value.SetInt64(math.MaxInt64) - } - endInt, err := types.ToInt64(endPoint.value.GetValue()) - if err != nil { - r.err = errors.Trace(err) - return tableRanges - } - endDatum := types.NewDatum(endInt) - cmp, err = endDatum.CompareDatum(endPoint.value) - if err != nil { - r.err = errors.Trace(err) - return tableRanges - } - if cmp > 0 || (cmp == 0 && endPoint.excl) { - endInt-- - } - if startInt > endInt { - continue - } - tableRanges = append(tableRanges, TableRange{LowVal: startInt, HighVal: endInt}) - } - return tableRanges -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/refiner.go b/vendor/github.com/pingcap/tidb/optimizer/plan/refiner.go deleted file mode 100644 index 7ca3f3bd816b..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/refiner.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "math" - - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/types" -) - -// Refine tries to build index or table range. -func Refine(p Plan) error { - r := refiner{} - p.Accept(&r) - return r.err -} - -type refiner struct { - err error -} - -func (r *refiner) Enter(in Plan) (Plan, bool) { - return in, false -} - -func (r *refiner) Leave(in Plan) (Plan, bool) { - switch x := in.(type) { - case *IndexScan: - r.buildIndexRange(x) - case *Limit: - x.SetLimit(0) - case *TableScan: - r.buildTableRange(x) - } - return in, r.err == nil -} - -var fullRange = []rangePoint{ - {start: true}, - {value: types.MaxValueDatum()}, -} - -func (r *refiner) buildIndexRange(p *IndexScan) { - rb := rangeBuilder{} - if p.AccessEqualCount > 0 { - // Build ranges for equal access conditions. - point := rb.build(p.AccessConditions[0]) - p.Ranges = rb.buildIndexRanges(point) - for i := 1; i < p.AccessEqualCount; i++ { - point = rb.build(p.AccessConditions[i]) - p.Ranges = rb.appendIndexRanges(p.Ranges, point) - } - } - rangePoints := fullRange - // Build rangePoints for non-equal access condtions. - for i := p.AccessEqualCount; i < len(p.AccessConditions); i++ { - rangePoints = rb.intersection(rangePoints, rb.build(p.AccessConditions[i])) - } - if p.AccessEqualCount == 0 { - p.Ranges = rb.buildIndexRanges(rangePoints) - } else if p.AccessEqualCount < len(p.AccessConditions) { - p.Ranges = rb.appendIndexRanges(p.Ranges, rangePoints) - } - r.err = rb.err - return -} - -func (r *refiner) buildTableRange(p *TableScan) { - if len(p.AccessConditions) == 0 { - p.Ranges = []TableRange{{math.MinInt64, math.MaxInt64}} - return - } - rb := rangeBuilder{} - rangePoints := fullRange - for _, cond := range p.AccessConditions { - rangePoints = rb.intersection(rangePoints, rb.build(cond)) - } - p.Ranges = rb.buildTableRanges(rangePoints) - r.err = rb.err -} - -// conditionChecker checks if this condition can be pushed to index plan. -type conditionChecker struct { - tableName model.CIStr - idx *model.IndexInfo - // the offset of the indexed column to be checked. - columnOffset int - pkName model.CIStr -} - -func (c *conditionChecker) check(condition ast.ExprNode) bool { - switch x := condition.(type) { - case *ast.BinaryOperationExpr: - return c.checkBinaryOperation(x) - case *ast.BetweenExpr: - if ast.IsPreEvaluable(x.Left) && ast.IsPreEvaluable(x.Right) && c.checkColumnExpr(x.Expr) { - return true - } - case *ast.ColumnNameExpr: - return c.checkColumnExpr(x) - case *ast.IsNullExpr: - if c.checkColumnExpr(x.Expr) { - return true - } - case *ast.IsTruthExpr: - if c.checkColumnExpr(x.Expr) { - return true - } - case *ast.ParenthesesExpr: - return c.check(x.Expr) - case *ast.PatternInExpr: - if x.Sel != nil || x.Not { - return false - } - if !c.checkColumnExpr(x.Expr) { - return false - } - for _, val := range x.List { - if !ast.IsPreEvaluable(val) { - return false - } - } - return true - case *ast.PatternLikeExpr: - if x.Not { - return false - } - if !c.checkColumnExpr(x.Expr) { - return false - } - if !ast.IsPreEvaluable(x.Pattern) { - return false - } - patternVal := x.Pattern.GetValue() - if patternVal == nil { - return false - } - patternStr, err := types.ToString(patternVal) - if err != nil { - return false - } - firstChar := patternStr[0] - return firstChar != '%' && firstChar != '.' - } - return false -} - -func (c *conditionChecker) checkBinaryOperation(b *ast.BinaryOperationExpr) bool { - switch b.Op { - case opcode.OrOr: - return c.check(b.L) && c.check(b.R) - case opcode.AndAnd: - return c.check(b.L) && c.check(b.R) - case opcode.EQ, opcode.NE, opcode.GE, opcode.GT, opcode.LE, opcode.LT: - if ast.IsPreEvaluable(b.L) { - return c.checkColumnExpr(b.R) - } else if ast.IsPreEvaluable(b.R) { - return c.checkColumnExpr(b.L) - } - } - return false -} - -func (c *conditionChecker) checkColumnExpr(expr ast.ExprNode) bool { - cn, ok := expr.(*ast.ColumnNameExpr) - if !ok { - return false - } - if cn.Refer.Table.Name.L != c.tableName.L { - return false - } - if c.pkName.L != "" { - return c.pkName.L == cn.Refer.Column.Name.L - } - if c.idx != nil { - return cn.Refer.Column.Name.L == c.idx.Columns[c.columnOffset].Name.L - } - return true -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/plan/stringer.go b/vendor/github.com/pingcap/tidb/optimizer/plan/stringer.go deleted file mode 100644 index 9b2c8ed3c0c0..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/plan/stringer.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package plan - -import ( - "fmt" - "math" - "strings" -) - -// ToString explains a Plan, returns description string. -func ToString(p Plan) string { - var e stringer - p.Accept(&e) - return strings.Join(e.strs, "->") -} - -type stringer struct { - strs []string - idxs []int -} - -func (e *stringer) Enter(in Plan) (Plan, bool) { - switch in.(type) { - case *JoinOuter, *JoinInner: - e.idxs = append(e.idxs, len(e.strs)) - } - return in, false -} - -func (e *stringer) Leave(in Plan) (Plan, bool) { - var str string - switch x := in.(type) { - case *CheckTable: - str = "CheckTable" - case *IndexScan: - str = fmt.Sprintf("Index(%s.%s)", x.Table.Name.L, x.Index.Name.L) - case *Limit: - str = "Limit" - case *SelectFields: - str = "Fields" - case *SelectLock: - str = "Lock" - case *ShowDDL: - str = "ShowDDL" - case *Sort: - str = "Sort" - case *TableScan: - if len(x.Ranges) > 0 { - ran := x.Ranges[0] - if ran.LowVal != math.MinInt64 || ran.HighVal != math.MaxInt64 { - str = fmt.Sprintf("Range(%s)", x.Table.Name.L) - } else { - str = fmt.Sprintf("Table(%s)", x.Table.Name.L) - } - } else { - str = fmt.Sprintf("Table(%s)", x.Table.Name.L) - } - case *JoinOuter: - last := len(e.idxs) - 1 - idx := e.idxs[last] - chilrden := e.strs[idx:] - e.strs = e.strs[:idx] - str = "OuterJoin{" + strings.Join(chilrden, "->") + "}" - e.idxs = e.idxs[:last] - case *JoinInner: - last := len(e.idxs) - 1 - idx := e.idxs[last] - chilrden := e.strs[idx:] - e.strs = e.strs[:idx] - str = "InnerJoin{" + strings.Join(chilrden, "->") + "}" - e.idxs = e.idxs[:last] - default: - str = fmt.Sprintf("%T", in) - } - e.strs = append(e.strs, str) - return in, true -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/preprocess.go b/vendor/github.com/pingcap/tidb/optimizer/preprocess.go deleted file mode 100644 index d5b2337e4d3d..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/preprocess.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" -) - -// Preprocess does preprocess work for optimizer. -func Preprocess(node ast.Node, info infoschema.InfoSchema, ctx context.Context) error { - if err := ResolveName(node, info, ctx); err != nil { - return errors.Trace(err) - } - return nil -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/resolver.go b/vendor/github.com/pingcap/tidb/optimizer/resolver.go deleted file mode 100644 index bad755b26b54..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/resolver.go +++ /dev/null @@ -1,924 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "fmt" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/util/types" -) - -// ResolveName resolves table name and column name. -// It generates ResultFields for ResultSetNode and resolves ColumnNameExpr to a ResultField. -func ResolveName(node ast.Node, info infoschema.InfoSchema, ctx context.Context) error { - defaultSchema := db.GetCurrentSchema(ctx) - resolver := nameResolver{Info: info, Ctx: ctx, DefaultSchema: model.NewCIStr(defaultSchema)} - node.Accept(&resolver) - return errors.Trace(resolver.Err) -} - -// nameResolver is the visitor to resolve table name and column name. -// In general, a reference can only refer to information that are available for it. -// So children elements are visited in the order that previous elements make information -// available for following elements. -// -// During visiting, information are collected and stored in resolverContext. -// When we enter a subquery, a new resolverContext is pushed to the contextStack, so subquery -// information can overwrite outer query information. When we look up for a column reference, -// we look up from top to bottom in the contextStack. -type nameResolver struct { - Info infoschema.InfoSchema - Ctx context.Context - DefaultSchema model.CIStr - Err error - useOuterContext bool - - contextStack []*resolverContext -} - -// resolverContext stores information in a single level of select statement -// that table name and column name can be resolved. -type resolverContext struct { - /* For Select Statement. */ - // table map to lookup and check table name conflict. - tableMap map[string]int - // table map to lookup and check derived-table(subselect) name conflict. - derivedTableMap map[string]int - // tableSources collected in from clause. - tables []*ast.TableSource - // result fields collected in select field list. - fieldList []*ast.ResultField - // result fields collected in group by clause. - groupBy []*ast.ResultField - - // The join node stack is used by on condition to find out - // available tables to reference. On condition can only - // refer to tables involved in current join. - joinNodeStack []*ast.Join - - // When visiting TableRefs, tables in this context are not available - // because it is being collected. - inTableRefs bool - // When visiting on conditon only tables in current join node are available. - inOnCondition bool - // When visiting field list, fieldList in this context are not available. - inFieldList bool - // When visiting group by, groupBy fields are not available. - inGroupBy bool - // When visiting having, only fieldList and groupBy fields are available. - inHaving bool - // When visiting having, checks if the expr is an aggregate function expr. - inHavingAgg bool - // OrderBy clause has different resolving rule than group by. - inOrderBy bool - // When visiting column name in ByItem, we should know if the column name is in an expression. - inByItemExpression bool - // If subquery use outer context. - useOuterContext bool - // When visiting multi-table delete stmt table list. - inDeleteTableList bool - // When visiting create/drop table statement. - inCreateOrDropTable bool - // When visiting show statement. - inShow bool -} - -// currentContext gets the current resolverContext. -func (nr *nameResolver) currentContext() *resolverContext { - stackLen := len(nr.contextStack) - if stackLen == 0 { - return nil - } - return nr.contextStack[stackLen-1] -} - -// pushContext is called when we enter a statement. -func (nr *nameResolver) pushContext() { - nr.contextStack = append(nr.contextStack, &resolverContext{ - tableMap: map[string]int{}, - derivedTableMap: map[string]int{}, - }) -} - -// popContext is called when we leave a statement. -func (nr *nameResolver) popContext() { - nr.contextStack = nr.contextStack[:len(nr.contextStack)-1] -} - -// pushJoin is called when we enter a join node. -func (nr *nameResolver) pushJoin(j *ast.Join) { - ctx := nr.currentContext() - ctx.joinNodeStack = append(ctx.joinNodeStack, j) -} - -// popJoin is called when we leave a join node. -func (nr *nameResolver) popJoin() { - ctx := nr.currentContext() - ctx.joinNodeStack = ctx.joinNodeStack[:len(ctx.joinNodeStack)-1] -} - -// Enter implements ast.Visitor interface. -func (nr *nameResolver) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { - switch v := inNode.(type) { - case *ast.AdminStmt: - nr.pushContext() - case *ast.AggregateFuncExpr: - ctx := nr.currentContext() - if ctx.inHaving { - ctx.inHavingAgg = true - } - case *ast.AlterTableStmt: - nr.pushContext() - case *ast.ByItem: - if _, ok := v.Expr.(*ast.ColumnNameExpr); !ok { - // If ByItem is not a single column name expression, - // the resolving rule is different from order by clause. - nr.currentContext().inByItemExpression = true - } - if nr.currentContext().inGroupBy { - // make sure item is not aggregate function - if ast.HasAggFlag(v.Expr) { - nr.Err = ErrInvalidGroupFuncUse - return inNode, true - } - } - case *ast.CreateIndexStmt: - nr.pushContext() - case *ast.CreateTableStmt: - nr.pushContext() - nr.currentContext().inCreateOrDropTable = true - case *ast.DeleteStmt: - nr.pushContext() - case *ast.DeleteTableList: - nr.currentContext().inDeleteTableList = true - case *ast.DoStmt: - nr.pushContext() - case *ast.DropTableStmt: - nr.pushContext() - nr.currentContext().inCreateOrDropTable = true - case *ast.DropIndexStmt: - nr.pushContext() - case *ast.FieldList: - nr.currentContext().inFieldList = true - case *ast.GroupByClause: - nr.currentContext().inGroupBy = true - case *ast.HavingClause: - nr.currentContext().inHaving = true - case *ast.InsertStmt: - nr.pushContext() - case *ast.Join: - nr.pushJoin(v) - case *ast.OnCondition: - nr.currentContext().inOnCondition = true - case *ast.OrderByClause: - nr.currentContext().inOrderBy = true - case *ast.SelectStmt: - nr.pushContext() - case *ast.SetStmt: - for _, assign := range v.Variables { - if cn, ok := assign.Value.(*ast.ColumnNameExpr); ok && cn.Name.Table.L == "" { - // Convert column name expression to string value expression. - assign.Value = ast.NewValueExpr(cn.Name.Name.O) - } - } - nr.pushContext() - case *ast.ShowStmt: - nr.pushContext() - nr.currentContext().inShow = true - nr.fillShowFields(v) - case *ast.TableRefsClause: - nr.currentContext().inTableRefs = true - case *ast.TruncateTableStmt: - nr.pushContext() - case *ast.UnionStmt: - nr.pushContext() - case *ast.UpdateStmt: - nr.pushContext() - } - return inNode, false -} - -// Leave implements ast.Visitor interface. -func (nr *nameResolver) Leave(inNode ast.Node) (node ast.Node, ok bool) { - switch v := inNode.(type) { - case *ast.AdminStmt: - nr.popContext() - case *ast.AggregateFuncExpr: - ctx := nr.currentContext() - if ctx.inHaving { - ctx.inHavingAgg = false - } - case *ast.AlterTableStmt: - nr.popContext() - case *ast.TableName: - nr.handleTableName(v) - case *ast.ColumnNameExpr: - nr.handleColumnName(v) - case *ast.CreateIndexStmt: - nr.popContext() - case *ast.CreateTableStmt: - nr.popContext() - case *ast.DeleteTableList: - nr.currentContext().inDeleteTableList = false - case *ast.DoStmt: - nr.popContext() - case *ast.DropIndexStmt: - nr.popContext() - case *ast.DropTableStmt: - nr.popContext() - case *ast.TableSource: - nr.handleTableSource(v) - case *ast.OnCondition: - nr.currentContext().inOnCondition = false - case *ast.Join: - nr.handleJoin(v) - nr.popJoin() - case *ast.TableRefsClause: - nr.currentContext().inTableRefs = false - case *ast.FieldList: - nr.handleFieldList(v) - nr.currentContext().inFieldList = false - case *ast.GroupByClause: - ctx := nr.currentContext() - ctx.inGroupBy = false - for _, item := range v.Items { - switch x := item.Expr.(type) { - case *ast.ColumnNameExpr: - ctx.groupBy = append(ctx.groupBy, x.Refer) - } - } - case *ast.HavingClause: - nr.currentContext().inHaving = false - case *ast.OrderByClause: - nr.currentContext().inOrderBy = false - case *ast.ByItem: - nr.currentContext().inByItemExpression = false - case *ast.PositionExpr: - nr.handlePosition(v) - case *ast.SelectStmt: - ctx := nr.currentContext() - v.SetResultFields(ctx.fieldList) - if ctx.useOuterContext { - nr.useOuterContext = true - } - nr.popContext() - case *ast.SetStmt: - nr.popContext() - case *ast.ShowStmt: - nr.popContext() - case *ast.SubqueryExpr: - if nr.useOuterContext { - // TODO: check this - // If there is a deep nest of subquery, there may be something wrong. - v.UseOuterContext = true - nr.useOuterContext = false - } - case *ast.TruncateTableStmt: - nr.popContext() - case *ast.UnionStmt: - ctx := nr.currentContext() - v.SetResultFields(ctx.fieldList) - if ctx.useOuterContext { - nr.useOuterContext = true - } - nr.popContext() - case *ast.UnionSelectList: - nr.handleUnionSelectList(v) - case *ast.InsertStmt: - nr.popContext() - case *ast.DeleteStmt: - nr.popContext() - case *ast.UpdateStmt: - nr.popContext() - } - return inNode, nr.Err == nil -} - -// handleTableName looks up and sets the schema information and result fields for table name. -func (nr *nameResolver) handleTableName(tn *ast.TableName) { - if tn.Schema.L == "" { - tn.Schema = nr.DefaultSchema - } - ctx := nr.currentContext() - if ctx.inCreateOrDropTable { - // The table may not exist in create table or drop table statement. - // Skip resolving the table to avoid error. - return - } - if ctx.inDeleteTableList { - idx, ok := ctx.tableMap[nr.tableUniqueName(tn.Schema, tn.Name)] - if !ok { - nr.Err = errors.Errorf("Unknown table %s", tn.Name.O) - return - } - ts := ctx.tables[idx] - tableName := ts.Source.(*ast.TableName) - tn.DBInfo = tableName.DBInfo - tn.TableInfo = tableName.TableInfo - tn.SetResultFields(tableName.GetResultFields()) - return - } - table, err := nr.Info.TableByName(tn.Schema, tn.Name) - if err != nil { - nr.Err = errors.Trace(err) - return - } - tn.TableInfo = table.Meta() - dbInfo, _ := nr.Info.SchemaByName(tn.Schema) - tn.DBInfo = dbInfo - - rfs := make([]*ast.ResultField, 0, len(tn.TableInfo.Columns)) - for _, v := range tn.TableInfo.Columns { - if v.State != model.StatePublic { - continue - } - expr := &ast.ValueExpr{} - expr.SetType(&v.FieldType) - rf := &ast.ResultField{ - Column: v, - Table: tn.TableInfo, - DBName: tn.Schema, - Expr: expr, - TableName: tn, - } - rfs = append(rfs, rf) - } - tn.SetResultFields(rfs) - return -} - -// handleTableSources checks name duplication -// and puts the table source in current resolverContext. -// Note: -// "select * from t as a join (select 1) as a;" is not duplicate. -// "select * from t as a join t as a;" is duplicate. -// "select * from (select 1) as a join (select 1) as a;" is duplicate. -func (nr *nameResolver) handleTableSource(ts *ast.TableSource) { - for _, v := range ts.GetResultFields() { - v.TableAsName = ts.AsName - } - ctx := nr.currentContext() - switch ts.Source.(type) { - case *ast.TableName: - var name string - if ts.AsName.L != "" { - name = ts.AsName.L - } else { - tableName := ts.Source.(*ast.TableName) - name = nr.tableUniqueName(tableName.Schema, tableName.Name) - } - if _, ok := ctx.tableMap[name]; ok { - nr.Err = errors.Errorf("duplicated table/alias name %s", name) - return - } - ctx.tableMap[name] = len(ctx.tables) - case *ast.SelectStmt: - name := ts.AsName.L - if _, ok := ctx.derivedTableMap[name]; ok { - nr.Err = errors.Errorf("duplicated table/alias name %s", name) - return - } - ctx.derivedTableMap[name] = len(ctx.tables) - } - dupNames := make(map[string]struct{}, len(ts.GetResultFields())) - for _, f := range ts.GetResultFields() { - // duplicate column name in one table is not allowed. - // "select * from (select 1, 1) as a;" is duplicate. - name := f.ColumnAsName.L - if name == "" { - name = f.Column.Name.L - } - if _, ok := dupNames[name]; ok { - nr.Err = errors.Errorf("Duplicate column name '%s'", name) - return - } - dupNames[name] = struct{}{} - } - ctx.tables = append(ctx.tables, ts) - return -} - -// handleJoin sets result fields for join. -func (nr *nameResolver) handleJoin(j *ast.Join) { - if j.Right == nil { - j.SetResultFields(j.Left.GetResultFields()) - return - } - leftLen := len(j.Left.GetResultFields()) - rightLen := len(j.Right.GetResultFields()) - rfs := make([]*ast.ResultField, leftLen+rightLen) - copy(rfs, j.Left.GetResultFields()) - copy(rfs[leftLen:], j.Right.GetResultFields()) - j.SetResultFields(rfs) -} - -// handleColumnName looks up and sets ResultField for -// the column name. -func (nr *nameResolver) handleColumnName(cn *ast.ColumnNameExpr) { - ctx := nr.currentContext() - if ctx.inOnCondition { - // In on condition, only tables within current join is available. - nr.resolveColumnNameInOnCondition(cn) - return - } - - // Try to resolve the column name form top to bottom in the context stack. - for i := len(nr.contextStack) - 1; i >= 0; i-- { - if nr.resolveColumnNameInContext(nr.contextStack[i], cn) { - // Column is already resolved or encountered an error. - if i < len(nr.contextStack)-1 { - // If in subselect, the query use outer query. - nr.currentContext().useOuterContext = true - } - return - } - } - nr.Err = errors.Errorf("unknown column %s", cn.Name.Name.L) -} - -// resolveColumnNameInContext looks up and sets ResultField for a column with the ctx. -func (nr *nameResolver) resolveColumnNameInContext(ctx *resolverContext, cn *ast.ColumnNameExpr) bool { - if ctx.inTableRefs { - // In TableRefsClause, column reference only in join on condition which is handled before. - return false - } - if ctx.inFieldList { - // only resolve column using tables. - return nr.resolveColumnInTableSources(cn, ctx.tables) - } - if ctx.inGroupBy { - // From tables first, then field list. - // If ctx.InByItemExpression is true, the item is not an identifier. - // Otherwise it is an identifier. - if ctx.inByItemExpression { - // From table first, then field list. - if nr.resolveColumnInTableSources(cn, ctx.tables) { - return true - } - found := nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) - if nr.Err == nil && found { - // Check if resolved refer is an aggregate function expr. - if _, ok := cn.Refer.Expr.(*ast.AggregateFuncExpr); ok { - nr.Err = ErrIllegalReference.Gen("Reference '%s' not supported (reference to group function)", cn.Name.Name.O) - } - } - return found - } - // Resolve from table first, then from select list. - found := nr.resolveColumnInTableSources(cn, ctx.tables) - if nr.Err != nil { - return found - } - // We should copy the refer here. - // Because if the ByItem is an identifier, we should check if it - // is ambiguous even it is already resolved from table source. - // If the ByItem is not an identifier, we do not need the second check. - r := cn.Refer - if nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) { - if nr.Err != nil { - return true - } - if r != nil { - // It is not ambiguous and already resolved from table source. - // We should restore its Refer. - cn.Refer = r - } - if _, ok := cn.Refer.Expr.(*ast.AggregateFuncExpr); ok { - nr.Err = ErrIllegalReference.Gen("Reference '%s' not supported (reference to group function)", cn.Name.Name.O) - } - return true - } - return found - } - if ctx.inHaving { - // First group by, then field list. - if nr.resolveColumnInResultFields(ctx, cn, ctx.groupBy) { - return true - } - if ctx.inHavingAgg { - // If cn is in an aggregate function in having clause, check tablesource first. - if nr.resolveColumnInTableSources(cn, ctx.tables) { - return true - } - } - return nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) - } - if ctx.inOrderBy { - if nr.resolveColumnInResultFields(ctx, cn, ctx.groupBy) { - return true - } - if ctx.inByItemExpression { - // From table first, then field list. - if nr.resolveColumnInTableSources(cn, ctx.tables) { - return true - } - return nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) - } - // Field list first, then from table. - if nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) { - return true - } - return nr.resolveColumnInTableSources(cn, ctx.tables) - } - if ctx.inShow { - return nr.resolveColumnInResultFields(ctx, cn, ctx.fieldList) - } - // In where clause. - return nr.resolveColumnInTableSources(cn, ctx.tables) -} - -// resolveColumnNameInOnCondition resolves the column name in current join. -func (nr *nameResolver) resolveColumnNameInOnCondition(cn *ast.ColumnNameExpr) { - ctx := nr.currentContext() - join := ctx.joinNodeStack[len(ctx.joinNodeStack)-1] - tableSources := appendTableSources(nil, join) - if !nr.resolveColumnInTableSources(cn, tableSources) { - nr.Err = errors.Errorf("unkown column name %s", cn.Name.Name.O) - } -} - -func (nr *nameResolver) resolveColumnInTableSources(cn *ast.ColumnNameExpr, tableSources []*ast.TableSource) (done bool) { - var matchedResultField *ast.ResultField - tableNameL := cn.Name.Table.L - columnNameL := cn.Name.Name.L - if tableNameL != "" { - var matchedTable ast.ResultSetNode - for _, ts := range tableSources { - if tableNameL == ts.AsName.L { - // different table name. - matchedTable = ts - break - } else if ts.AsName.L != "" { - // Table as name shadows table real name. - continue - } - if tn, ok := ts.Source.(*ast.TableName); ok { - if cn.Name.Schema.L != "" && cn.Name.Schema.L != tn.Schema.L { - continue - } - if tableNameL == tn.Name.L { - matchedTable = ts - } - } - } - if matchedTable != nil { - resultFields := matchedTable.GetResultFields() - for _, rf := range resultFields { - if rf.ColumnAsName.L == columnNameL || rf.Column.Name.L == columnNameL { - // resolve column. - matchedResultField = rf - break - } - } - } - } else { - for _, ts := range tableSources { - rfs := ts.GetResultFields() - for _, rf := range rfs { - matchAsName := rf.ColumnAsName.L != "" && rf.ColumnAsName.L == columnNameL - matchColumnName := rf.ColumnAsName.L == "" && rf.Column.Name.L == columnNameL - if matchAsName || matchColumnName { - if matchedResultField != nil { - nr.Err = errors.Errorf("column %s is ambiguous.", cn.Name.Name.O) - return true - } - matchedResultField = rf - } - } - } - } - if matchedResultField != nil { - // Bind column. - cn.Refer = matchedResultField - return true - } - return false -} - -func (nr *nameResolver) resolveColumnInResultFields(ctx *resolverContext, cn *ast.ColumnNameExpr, rfs []*ast.ResultField) bool { - var matched *ast.ResultField - for _, rf := range rfs { - if cn.Name.Table.L != "" { - // Check table name - if rf.TableAsName.L != "" { - if cn.Name.Table.L != rf.TableAsName.L { - continue - } - } else if cn.Name.Table.L != rf.Table.Name.L { - continue - } - } - matchAsName := cn.Name.Name.L == rf.ColumnAsName.L - var matchColumnName bool - if ctx.inHaving { - matchColumnName = cn.Name.Name.L == rf.Column.Name.L - } else { - matchColumnName = rf.ColumnAsName.L == "" && cn.Name.Name.L == rf.Column.Name.L - } - if matchAsName || matchColumnName { - if rf.Column.Name.L == "" { - // This is not a real table column, resolve it directly. - cn.Refer = rf - return true - } - if matched == nil { - matched = rf - } else { - sameColumn := matched.TableName == rf.TableName && matched.Column.Name.L == rf.Column.Name.L - if !sameColumn { - nr.Err = errors.Errorf("column %s is ambiguous.", cn.Name.Name.O) - return true - } - } - } - } - if matched != nil { - // If in GroupBy, we clone the ResultField - if ctx.inGroupBy || ctx.inHaving || ctx.inOrderBy { - nf := *matched - expr := matched.Expr - if cexpr, ok := expr.(*ast.ColumnNameExpr); ok { - expr = cexpr.Refer.Expr - } - nf.Expr = expr - matched = &nf - } - // Bind column. - cn.Refer = matched - return true - } - return false -} - -// handleFieldList expands wild card field and sets fieldList in current context. -func (nr *nameResolver) handleFieldList(fieldList *ast.FieldList) { - var resultFields []*ast.ResultField - for _, v := range fieldList.Fields { - resultFields = append(resultFields, nr.createResultFields(v)...) - } - nr.currentContext().fieldList = resultFields -} - -func getInnerFromParentheses(expr ast.ExprNode) ast.ExprNode { - if pexpr, ok := expr.(*ast.ParenthesesExpr); ok { - return getInnerFromParentheses(pexpr.Expr) - } - return expr -} - -// createResultFields creates result field list for a single select field. -func (nr *nameResolver) createResultFields(field *ast.SelectField) (rfs []*ast.ResultField) { - ctx := nr.currentContext() - if field.WildCard != nil { - if len(ctx.tables) == 0 { - nr.Err = errors.New("No table used.") - return - } - tableRfs := []*ast.ResultField{} - if field.WildCard.Table.L == "" { - for _, v := range ctx.tables { - tableRfs = append(tableRfs, v.GetResultFields()...) - } - } else { - name := nr.tableUniqueName(field.WildCard.Schema, field.WildCard.Table) - tableIdx, ok1 := ctx.tableMap[name] - derivedTableIdx, ok2 := ctx.derivedTableMap[name] - if !ok1 && !ok2 { - nr.Err = errors.Errorf("unknown table %s.", field.WildCard.Table.O) - } - if ok1 { - tableRfs = ctx.tables[tableIdx].GetResultFields() - } - if ok2 { - tableRfs = append(tableRfs, ctx.tables[derivedTableIdx].GetResultFields()...) - } - - } - for _, trf := range tableRfs { - // Convert it to ColumnNameExpr - cn := &ast.ColumnName{ - Schema: trf.DBName, - Table: trf.Table.Name, - Name: trf.ColumnAsName, - } - cnExpr := &ast.ColumnNameExpr{ - Name: cn, - Refer: trf, - } - ast.SetFlag(cnExpr) - cnExpr.SetType(trf.Expr.GetType()) - rf := *trf - rf.Expr = cnExpr - rfs = append(rfs, &rf) - } - return - } - // The column is visited before so it must has been resolved already. - rf := &ast.ResultField{ColumnAsName: field.AsName} - innerExpr := getInnerFromParentheses(field.Expr) - switch v := innerExpr.(type) { - case *ast.ColumnNameExpr: - rf.Column = v.Refer.Column - rf.Table = v.Refer.Table - rf.DBName = v.Refer.DBName - rf.TableName = v.Refer.TableName - rf.Expr = v - default: - rf.Column = &model.ColumnInfo{} // Empty column info. - rf.Table = &model.TableInfo{} // Empty table info. - rf.Expr = v - } - if field.AsName.L == "" { - switch x := innerExpr.(type) { - case *ast.ColumnNameExpr: - rf.ColumnAsName = model.NewCIStr(x.Name.Name.O) - case *ast.ValueExpr: - if innerExpr.Text() != "" { - rf.ColumnAsName = model.NewCIStr(innerExpr.Text()) - } else { - rf.ColumnAsName = model.NewCIStr(field.Text()) - } - default: - rf.ColumnAsName = model.NewCIStr(field.Text()) - } - } - rfs = append(rfs, rf) - return -} - -func appendTableSources(in []*ast.TableSource, resultSetNode ast.ResultSetNode) (out []*ast.TableSource) { - switch v := resultSetNode.(type) { - case *ast.TableSource: - out = append(in, v) - case *ast.Join: - out = appendTableSources(in, v.Left) - if v.Right != nil { - out = appendTableSources(out, v.Right) - } - } - return -} - -func (nr *nameResolver) tableUniqueName(schema, table model.CIStr) string { - if schema.L != "" && schema.L != nr.DefaultSchema.L { - return schema.L + "." + table.L - } - return table.L -} - -func (nr *nameResolver) handlePosition(pos *ast.PositionExpr) { - ctx := nr.currentContext() - if pos.N < 1 || pos.N > len(ctx.fieldList) { - nr.Err = errors.Errorf("Unknown column '%d'", pos.N) - return - } - matched := ctx.fieldList[pos.N-1] - nf := *matched - expr := matched.Expr - if cexpr, ok := expr.(*ast.ColumnNameExpr); ok { - expr = cexpr.Refer.Expr - } - nf.Expr = expr - pos.Refer = &nf - if nr.currentContext().inGroupBy { - // make sure item is not aggregate function - if ast.HasAggFlag(pos.Refer.Expr) { - nr.Err = errors.New("group by cannot contain aggregate function") - } - } -} - -func (nr *nameResolver) handleUnionSelectList(u *ast.UnionSelectList) { - firstSelFields := u.Selects[0].GetResultFields() - unionFields := make([]*ast.ResultField, len(firstSelFields)) - // Copy first result fields, because we may change the result field type. - for i, v := range firstSelFields { - rf := *v - col := *v.Column - rf.Column = &col - if rf.Column.Flen == 0 { - rf.Column.Flen = types.UnspecifiedLength - } - rf.Expr = &ast.ValueExpr{} - unionFields[i] = &rf - } - nr.currentContext().fieldList = unionFields -} - -func (nr *nameResolver) fillShowFields(s *ast.ShowStmt) { - if s.DBName == "" { - if s.Table != nil && s.Table.Schema.L != "" { - s.DBName = s.Table.Schema.O - } else { - s.DBName = nr.DefaultSchema.O - } - } else if s.Table != nil && s.Table.Schema.L == "" { - s.Table.Schema = model.NewCIStr(s.DBName) - } - var fields []*ast.ResultField - var ( - names []string - ftypes []byte - ) - switch s.Tp { - case ast.ShowEngines: - names = []string{"Engine", "Support", "Comment", "Transactions", "XA", "Savepoints"} - case ast.ShowDatabases: - names = []string{"Database"} - case ast.ShowTables: - names = []string{fmt.Sprintf("Tables_in_%s", s.DBName)} - if s.Full { - names = append(names, "Table_type") - } - case ast.ShowTableStatus: - names = []string{"Name", "Engine", "Version", "Row_format", "Rows", "Avg_row_length", - "Data_length", "Max_data_length", "Index_length", "Data_free", "Auto_increment", - "Create_time", "Update_time", "Check_time", "Collation", "Checksum", - "Create_options", "Comment"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeLonglong, mysql.TypeLonglong, - mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeLonglong, - mysql.TypeDatetime, mysql.TypeDatetime, mysql.TypeDatetime, mysql.TypeVarchar, mysql.TypeVarchar, - mysql.TypeVarchar, mysql.TypeVarchar} - case ast.ShowColumns: - names = column.ColDescFieldNames(s.Full) - case ast.ShowWarnings: - names = []string{"Level", "Code", "Message"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeLong, mysql.TypeVarchar} - case ast.ShowCharset: - names = []string{"Charset", "Description", "Default collation", "Maxlen"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} - case ast.ShowVariables: - names = []string{"Variable_name", "Value"} - case ast.ShowStatus: - names = []string{"Variable_name", "Value"} - case ast.ShowCollation: - names = []string{"Collation", "Charset", "Id", "Default", "Compiled", "Sortlen"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong, - mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} - case ast.ShowCreateTable: - names = []string{"Table", "Create Table"} - case ast.ShowGrants: - names = []string{fmt.Sprintf("Grants for %s", s.User)} - case ast.ShowTriggers: - names = []string{"Trigger", "Event", "Table", "Statement", "Timing", "Created", - "sql_mode", "Definer", "character_set_client", "collation_connection", "Database Collation"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, - mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} - case ast.ShowProcedureStatus: - names = []string{} - ftypes = []byte{} - case ast.ShowIndex: - names = []string{"Table", "Non_unique", "Key_name", "Seq_in_index", - "Column_name", "Collation", "Cardinality", "Sub_part", "Packed", - "Null", "Index_type", "Comment", "Index_comment"} - ftypes = []byte{mysql.TypeVarchar, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeLonglong, - mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong, mysql.TypeLonglong, - mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar} - } - for i, name := range names { - f := &ast.ResultField{ - ColumnAsName: model.NewCIStr(name), - Column: &model.ColumnInfo{}, // Empty column info. - Table: &model.TableInfo{}, // Empty table info. - } - if ftypes == nil || ftypes[i] == 0 { - // use varchar as the default return column type - f.Column.Tp = mysql.TypeVarchar - } else { - f.Column.Tp = ftypes[i] - } - f.Column.Charset, f.Column.Collate = types.DefaultCharsetForType(f.Column.Tp) - f.Expr = &ast.ValueExpr{} - f.Expr.SetType(&f.Column.FieldType) - fields = append(fields, f) - } - - if s.Pattern != nil && s.Pattern.Expr == nil { - rf := fields[0] - s.Pattern.Expr = &ast.ColumnNameExpr{ - Name: &ast.ColumnName{Name: rf.ColumnAsName}, - } - ast.SetFlag(s.Pattern) - } - s.SetResultFields(fields) - nr.currentContext().fieldList = fields -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/typeinferer.go b/vendor/github.com/pingcap/tidb/optimizer/typeinferer.go deleted file mode 100644 index 837e7bb9a2e1..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/typeinferer.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "strings" - - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -// InferType infers result type for ast.ExprNode. -func InferType(node ast.Node) error { - var inferrer typeInferrer - // TODO: get the default charset from ctx - inferrer.defaultCharset = "utf8" - node.Accept(&inferrer) - return inferrer.err -} - -type typeInferrer struct { - err error - defaultCharset string -} - -func (v *typeInferrer) Enter(in ast.Node) (out ast.Node, skipChildren bool) { - return in, false -} - -func (v *typeInferrer) Leave(in ast.Node) (out ast.Node, ok bool) { - switch x := in.(type) { - case *ast.AggregateFuncExpr: - v.aggregateFunc(x) - case *ast.BetweenExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.BinaryOperationExpr: - v.binaryOperation(x) - case *ast.CaseExpr: - v.handleCaseExpr(x) - case *ast.ColumnNameExpr: - x.SetType(&x.Refer.Column.FieldType) - case *ast.CompareSubqueryExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.ExistsSubqueryExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.FuncCallExpr: - v.handleFuncCallExpr(x) - case *ast.FuncCastExpr: - x.SetType(x.Tp) - if len(x.Type.Charset) == 0 { - x.Type.Charset, x.Type.Collate = types.DefaultCharsetForType(x.Type.Tp) - } - case *ast.IsNullExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.IsTruthExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.ParamMarkerExpr: - x.SetType(types.DefaultTypeForValue(x.GetValue())) - case *ast.ParenthesesExpr: - x.SetType(x.Expr.GetType()) - case *ast.PatternInExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.PatternLikeExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.PatternRegexpExpr: - x.SetType(types.NewFieldType(mysql.TypeLonglong)) - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin - case *ast.SelectStmt: - v.selectStmt(x) - case *ast.UnaryOperationExpr: - v.unaryOperation(x) - case *ast.ValueExpr: - v.handleValueExpr(x) - case *ast.ValuesExpr: - v.handleValuesExpr(x) - case *ast.VariableExpr: - x.SetType(types.NewFieldType(mysql.TypeVarString)) - x.Type.Charset = v.defaultCharset - cln, err := charset.GetDefaultCollation(v.defaultCharset) - if err != nil { - v.err = err - } - x.Type.Collate = cln - // TODO: handle all expression types. - } - return in, true -} - -func (v *typeInferrer) selectStmt(x *ast.SelectStmt) { - rf := x.GetResultFields() - for _, val := range rf { - // column ID is 0 means it is not a real column from table, but a temporary column, - // so its type is not pre-defined, we need to set it. - if val.Column.ID == 0 && val.Expr.GetType() != nil { - val.Column.FieldType = *(val.Expr.GetType()) - } - } -} - -func (v *typeInferrer) aggregateFunc(x *ast.AggregateFuncExpr) { - name := strings.ToLower(x.F) - switch name { - case ast.AggFuncCount: - ft := types.NewFieldType(mysql.TypeLonglong) - ft.Flen = 21 - ft.Charset = charset.CharsetBin - ft.Collate = charset.CollationBin - x.SetType(ft) - case ast.AggFuncMax, ast.AggFuncMin: - x.SetType(x.Args[0].GetType()) - case ast.AggFuncSum, ast.AggFuncAvg: - ft := types.NewFieldType(mysql.TypeNewDecimal) - ft.Charset = charset.CharsetBin - ft.Collate = charset.CollationBin - x.SetType(ft) - case ast.AggFuncGroupConcat: - ft := types.NewFieldType(mysql.TypeVarString) - ft.Charset = v.defaultCharset - cln, err := charset.GetDefaultCollation(v.defaultCharset) - if err != nil { - v.err = err - } - ft.Collate = cln - x.SetType(ft) - } -} - -func (v *typeInferrer) binaryOperation(x *ast.BinaryOperationExpr) { - switch x.Op { - case opcode.AndAnd, opcode.OrOr, opcode.LogicXor: - x.Type = types.NewFieldType(mysql.TypeLonglong) - case opcode.LT, opcode.LE, opcode.GE, opcode.GT, opcode.EQ, opcode.NE, opcode.NullEQ: - x.Type = types.NewFieldType(mysql.TypeLonglong) - case opcode.RightShift, opcode.LeftShift, opcode.And, opcode.Or, opcode.Xor: - x.Type = types.NewFieldType(mysql.TypeLonglong) - x.Type.Flag |= mysql.UnsignedFlag - case opcode.IntDiv: - x.Type = types.NewFieldType(mysql.TypeLonglong) - case opcode.Plus, opcode.Minus, opcode.Mul, opcode.Mod: - if x.L.GetType() != nil && x.R.GetType() != nil { - xTp := mergeArithType(x.L.GetType().Tp, x.R.GetType().Tp) - x.Type = types.NewFieldType(xTp) - leftUnsigned := x.L.GetType().Flag & mysql.UnsignedFlag - rightUnsigned := x.R.GetType().Flag & mysql.UnsignedFlag - // If both operands are unsigned, result is unsigned. - x.Type.Flag |= (leftUnsigned & rightUnsigned) - } - case opcode.Div: - if x.L.GetType() != nil && x.R.GetType() != nil { - xTp := mergeArithType(x.L.GetType().Tp, x.R.GetType().Tp) - if xTp == mysql.TypeLonglong { - xTp = mysql.TypeDecimal - } - x.Type = types.NewFieldType(xTp) - } - } - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin -} - -func mergeArithType(a, b byte) byte { - switch a { - case mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeDouble, mysql.TypeFloat: - return mysql.TypeDouble - } - switch b { - case mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeDouble, mysql.TypeFloat: - return mysql.TypeDouble - } - if a == mysql.TypeNewDecimal || b == mysql.TypeNewDecimal { - return mysql.TypeNewDecimal - } - return mysql.TypeLonglong -} - -func (v *typeInferrer) unaryOperation(x *ast.UnaryOperationExpr) { - switch x.Op { - case opcode.Not: - x.Type = types.NewFieldType(mysql.TypeLonglong) - case opcode.BitNeg: - x.Type = types.NewFieldType(mysql.TypeLonglong) - x.Type.Flag |= mysql.UnsignedFlag - case opcode.Plus: - x.Type = x.V.GetType() - case opcode.Minus: - x.Type = types.NewFieldType(mysql.TypeLonglong) - if x.V.GetType() != nil { - switch x.V.GetType().Tp { - case mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeDouble, mysql.TypeFloat: - x.Type.Tp = mysql.TypeDouble - case mysql.TypeNewDecimal: - x.Type.Tp = mysql.TypeNewDecimal - } - } - } - x.Type.Charset = charset.CharsetBin - x.Type.Collate = charset.CollationBin -} - -func (v *typeInferrer) handleValueExpr(x *ast.ValueExpr) { - tp := types.DefaultTypeForValue(x.GetValue()) - // Set charset and collation - x.SetType(tp) -} - -func (v *typeInferrer) handleValuesExpr(x *ast.ValuesExpr) { - x.SetType(x.Column.GetType()) -} - -func (v *typeInferrer) getFsp(x *ast.FuncCallExpr) int { - if len(x.Args) == 1 { - a := x.Args[0].GetValue() - fsp, err := types.ToInt64(a) - if err != nil { - v.err = err - } - return int(fsp) - } - return 0 -} - -func (v *typeInferrer) handleFuncCallExpr(x *ast.FuncCallExpr) { - var ( - tp *types.FieldType - chs = charset.CharsetBin - ) - switch x.FnName.L { - case "abs", "ifnull", "nullif": - tp = x.Args[0].GetType() - case "pow", "power", "rand": - tp = types.NewFieldType(mysql.TypeDouble) - case "curdate", "current_date", "date": - tp = types.NewFieldType(mysql.TypeDate) - case "curtime", "current_time": - tp = types.NewFieldType(mysql.TypeDuration) - tp.Decimal = v.getFsp(x) - case "current_timestamp", "date_arith": - tp = types.NewFieldType(mysql.TypeDatetime) - case "microsecond", "second", "minute", "hour", "day", "week", "month", "year", - "dayofweek", "dayofmonth", "dayofyear", "weekday", "weekofyear", "yearweek", - "found_rows", "length", "extract", "locate": - tp = types.NewFieldType(mysql.TypeLonglong) - case "now", "sysdate": - tp = types.NewFieldType(mysql.TypeDatetime) - tp.Decimal = v.getFsp(x) - case "dayname", "version", "database", "user", "current_user", - "concat", "concat_ws", "left", "lower", "repeat", "replace", "upper", "convert", - "substring", "substring_index", "trim": - tp = types.NewFieldType(mysql.TypeVarString) - chs = v.defaultCharset - case "strcmp": - tp = types.NewFieldType(mysql.TypeLonglong) - case "connection_id": - tp = types.NewFieldType(mysql.TypeLonglong) - tp.Flag |= mysql.UnsignedFlag - case "if": - // TODO: fix this - // See: https://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html#function_if - // The default return type of IF() (which may matter when it is stored into a temporary table) is calculated as follows. - // Expression Return Value - // expr2 or expr3 returns a string string - // expr2 or expr3 returns a floating-point value floating-point - // expr2 or expr3 returns an integer integer - tp = x.Args[1].GetType() - default: - tp = types.NewFieldType(mysql.TypeUnspecified) - } - // If charset is unspecified. - if len(tp.Charset) == 0 { - tp.Charset = chs - cln := charset.CollationBin - if chs != charset.CharsetBin { - var err error - cln, err = charset.GetDefaultCollation(chs) - if err != nil { - v.err = err - } - } - tp.Collate = cln - } - x.SetType(tp) -} - -// The return type of a CASE expression is the compatible aggregated type of all return values, -// but also depends on the context in which it is used. -// If used in a string context, the result is returned as a string. -// If used in a numeric context, the result is returned as a decimal, real, or integer value. -func (v *typeInferrer) handleCaseExpr(x *ast.CaseExpr) { - var currType *types.FieldType - for _, w := range x.WhenClauses { - t := w.Result.GetType() - if currType == nil { - currType = t - continue - } - mtp := types.MergeFieldType(currType.Tp, t.Tp) - if mtp == t.Tp && mtp != currType.Tp { - currType.Charset = t.Charset - currType.Collate = t.Collate - } - currType.Tp = mtp - - } - if x.ElseClause != nil { - t := x.ElseClause.GetType() - if currType == nil { - currType = t - } else { - mtp := types.MergeFieldType(currType.Tp, t.Tp) - if mtp == t.Tp && mtp != currType.Tp { - currType.Charset = t.Charset - currType.Collate = t.Collate - } - currType.Tp = mtp - } - } - x.SetType(currType) - // TODO: We need a better way to set charset/collation - x.Type.Charset, x.Type.Collate = types.DefaultCharsetForType(x.Type.Tp) -} diff --git a/vendor/github.com/pingcap/tidb/optimizer/validator.go b/vendor/github.com/pingcap/tidb/optimizer/validator.go deleted file mode 100644 index 2064fb45f623..000000000000 --- a/vendor/github.com/pingcap/tidb/optimizer/validator.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package optimizer - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/parser/opcode" -) - -// Validate checkes whether the node is valid. -func Validate(node ast.Node, inPrepare bool) error { - v := validator{inPrepare: inPrepare} - node.Accept(&v) - return v.err -} - -// validator is an ast.Visitor that validates -// ast Nodes parsed from parser. -type validator struct { - err error - wildCardCount int - inPrepare bool - inAggregate bool -} - -func (v *validator) Enter(in ast.Node) (out ast.Node, skipChildren bool) { - switch in.(type) { - case *ast.AggregateFuncExpr: - if v.inAggregate { - // Aggregate function can not contain aggregate function. - v.err = ErrInvalidGroupFuncUse - return in, true - } - v.inAggregate = true - } - return in, false -} - -func (v *validator) Leave(in ast.Node) (out ast.Node, ok bool) { - switch x := in.(type) { - case *ast.AggregateFuncExpr: - v.inAggregate = false - case *ast.BetweenExpr: - v.checkAllOneColumn(x.Expr, x.Left, x.Right) - case *ast.BinaryOperationExpr: - v.checkBinaryOperation(x) - case *ast.ByItem: - v.checkAllOneColumn(x.Expr) - case *ast.CreateTableStmt: - v.checkAutoIncrement(x) - case *ast.CompareSubqueryExpr: - v.checkSameColumns(x.L, x.R) - case *ast.FieldList: - v.checkFieldList(x) - case *ast.HavingClause: - v.checkAllOneColumn(x.Expr) - case *ast.IsNullExpr: - v.checkAllOneColumn(x.Expr) - case *ast.IsTruthExpr: - v.checkAllOneColumn(x.Expr) - case *ast.ParamMarkerExpr: - if !v.inPrepare { - v.err = parser.ErrSyntax.Gen("syntax error, unexpected '?'") - } - case *ast.PatternInExpr: - v.checkSameColumns(append(x.List, x.Expr)...) - } - - return in, v.err == nil -} - -// checkAllOneColumn checks that all expressions have one column. -// Expression may have more than one column when it is a rowExpr or -// a Subquery with more than one result fields. -func (v *validator) checkAllOneColumn(exprs ...ast.ExprNode) { - for _, expr := range exprs { - switch x := expr.(type) { - case *ast.RowExpr: - v.err = ErrOneColumn - case *ast.SubqueryExpr: - if len(x.Query.GetResultFields()) != 1 { - v.err = ErrOneColumn - } - } - } - return -} - -func checkAutoIncrementOp(colDef *ast.ColumnDef, num int) (bool, error) { - var hasAutoIncrement bool - - if colDef.Options[num].Tp == ast.ColumnOptionAutoIncrement { - hasAutoIncrement = true - if len(colDef.Options) == num+1 { - return hasAutoIncrement, nil - } - for _, op := range colDef.Options[num+1:] { - if op.Tp == ast.ColumnOptionDefaultValue { - return hasAutoIncrement, errors.Errorf("Invalid default value for '%s'", colDef.Name.Name.O) - } - } - } - if colDef.Options[num].Tp == ast.ColumnOptionDefaultValue && len(colDef.Options) != num+1 { - for _, op := range colDef.Options[num+1:] { - if op.Tp == ast.ColumnOptionAutoIncrement { - return hasAutoIncrement, errors.Errorf("Invalid default value for '%s'", colDef.Name.Name.O) - } - } - } - - return hasAutoIncrement, nil -} - -func isConstraintKeyTp(constraints []*ast.Constraint, colDef *ast.ColumnDef) bool { - for _, c := range constraints { - if len(c.Keys) < 1 { - } - // If the constraint as follows: primary key(c1, c2) - // we only support c1 column can be auto_increment. - if colDef.Name.Name.L != c.Keys[0].Column.Name.L { - continue - } - switch c.Tp { - case ast.ConstraintPrimaryKey, ast.ConstraintKey, ast.ConstraintIndex, - ast.ConstraintUniq, ast.ConstraintUniqIndex, ast.ConstraintUniqKey: - return true - } - } - - return false -} - -func (v *validator) checkAutoIncrement(stmt *ast.CreateTableStmt) { - var ( - isKey bool - count int - autoIncrementCol *ast.ColumnDef - ) - - for _, colDef := range stmt.Cols { - var hasAutoIncrement bool - for i, op := range colDef.Options { - ok, err := checkAutoIncrementOp(colDef, i) - if err != nil { - v.err = err - return - } - if ok { - hasAutoIncrement = true - } - switch op.Tp { - case ast.ColumnOptionPrimaryKey, ast.ColumnOptionUniqKey, ast.ColumnOptionUniqIndex, - ast.ColumnOptionUniq, ast.ColumnOptionKey, ast.ColumnOptionIndex: - isKey = true - } - } - if hasAutoIncrement { - count++ - autoIncrementCol = colDef - } - } - - if count < 1 { - return - } - - if !isKey { - isKey = isConstraintKeyTp(stmt.Constraints, autoIncrementCol) - } - if !isKey || count > 1 { - v.err = errors.New("Incorrect table definition; there can be only one auto column and it must be defined as a key") - } - - switch autoIncrementCol.Tp.Tp { - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeLong, - mysql.TypeFloat, mysql.TypeDouble, mysql.TypeLonglong, mysql.TypeInt24: - default: - v.err = errors.Errorf("Incorrect column specifier for column '%s'", autoIncrementCol.Name.Name.O) - } -} - -func (v *validator) checkBinaryOperation(x *ast.BinaryOperationExpr) { - // row constructor only supports comparison operation. - switch x.Op { - case opcode.LT, opcode.LE, opcode.GE, opcode.GT, opcode.EQ, opcode.NE, opcode.NullEQ: - v.checkSameColumns(x.L, x.R) - default: - v.checkAllOneColumn(x.L, x.R) - } -} - -func columnCount(ex ast.ExprNode) int { - switch x := ex.(type) { - case *ast.RowExpr: - return len(x.Values) - case *ast.SubqueryExpr: - return len(x.Query.GetResultFields()) - default: - return 1 - } -} - -func (v *validator) checkSameColumns(exprs ...ast.ExprNode) { - if len(exprs) == 0 { - return - } - count := columnCount(exprs[0]) - for i := 1; i < len(exprs); i++ { - if columnCount(exprs[i]) != count { - v.err = ErrSameColumns - return - } - } -} - -// checkFieldList checks if there is only one '*' and each field has only one column. -func (v *validator) checkFieldList(x *ast.FieldList) { - var hasWildCard bool - for _, val := range x.Fields { - if val.WildCard != nil && val.WildCard.Table.L == "" { - if hasWildCard { - v.err = ErrMultiWildCard - return - } - hasWildCard = true - } - v.checkAllOneColumn(val.Expr) - if v.err != nil { - return - } - } -} diff --git a/vendor/github.com/pingcap/tidb/parser/opcode/opcode.go b/vendor/github.com/pingcap/tidb/parser/opcode/opcode.go deleted file mode 100644 index f112845c5593..000000000000 --- a/vendor/github.com/pingcap/tidb/parser/opcode/opcode.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package opcode - -import "fmt" - -// Op is opcode type. -type Op int - -// List operators. -const ( - AndAnd Op = iota + 1 - LeftShift - RightShift - OrOr - GE - LE - EQ - NE - LT - GT - Plus - Minus - And - Or - Mod - Xor - Div - Mul - Not - BitNeg - IntDiv - LogicXor - NullEQ -) - -var ops = map[Op]string{ - AndAnd: "&&", - LeftShift: "<<", - RightShift: ">>", - OrOr: "||", - GE: ">=", - LE: "<=", - EQ: "=", - NE: "!=", - LT: "<", - GT: ">", - Plus: "+", - Minus: "-", - And: "&", - Or: "|", - Mod: "%", - Xor: "^", - Div: "/", - Mul: "*", - Not: "!", - BitNeg: "~", - IntDiv: "DIV", - LogicXor: "XOR", - NullEQ: "<=>", -} - -// String implements Stringer interface. -func (o Op) String() string { - str, ok := ops[o] - if !ok { - panic(fmt.Sprintf("%d", o)) - } - - return str -} diff --git a/vendor/github.com/pingcap/tidb/parser/parser.go b/vendor/github.com/pingcap/tidb/parser/parser.go deleted file mode 100644 index e673a6abbe39..000000000000 --- a/vendor/github.com/pingcap/tidb/parser/parser.go +++ /dev/null @@ -1,9355 +0,0 @@ -// Code generated by goyacc -// CAUTION: Generated file - DO NOT EDIT. - -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -// Inital yacc source generated by ebnf2y[1] -// at 2013-10-04 23:10:47.861401015 +0200 CEST -// -// $ ebnf2y -o ql.y -oe ql.ebnf -start StatementList -pkg ql -p _ -// -// [1]: http://github.com/cznic/ebnf2y - -package parser - -import __yyfmt__ "fmt" - -import ( - "strings" - - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -type yySymType struct { - yys int - offset int // offset - line int - col int - item interface{} - list []interface{} -} - -type yyXError struct { - state, xsym int -} - -const ( - yyDefault = 57667 - yyEOFCode = 57344 - abs = 57352 - add = 57353 - addDate = 57354 - admin = 57355 - after = 57356 - all = 57357 - alter = 57358 - and = 57359 - andand = 57360 - andnot = 57361 - any = 57362 - as = 57363 - asc = 57364 - at = 57365 - autoIncrement = 57366 - avg = 57367 - avgRowLength = 57368 - begin = 57369 - between = 57370 - bigIntType = 57605 - binaryType = 57620 - bitLit = 57351 - bitType = 57606 - blobType = 57623 - boolType = 57642 - booleanType = 57643 - both = 57371 - btree = 57372 - by = 57373 - byteType = 57374 - calcFoundRows = 57595 - caseKwd = 57375 - cast = 57376 - charType = 57618 - character = 57377 - charsetKwd = 57378 - check = 57379 - checksum = 57380 - coalesce = 57381 - collate = 57382 - collation = 57383 - column = 57384 - columns = 57385 - comment = 57386 - commit = 57387 - committed = 57388 - compact = 57389 - compressed = 57390 - compression = 57391 - concat = 57392 - concatWs = 57393 - connection = 57394 - connectionID = 57395 - constraint = 57396 - convert = 57397 - count = 57398 - create = 57399 - cross = 57400 - curDate = 57401 - curTime = 57403 - currentDate = 57402 - currentTime = 57404 - currentTs = 57596 - currentUser = 57405 - database = 57406 - databases = 57407 - dateAdd = 57408 - dateSub = 57409 - dateType = 57613 - datetimeType = 57615 - day = 57410 - dayHour = 57654 - dayMicrosecond = 57651 - dayMinute = 57653 - daySecond = 57652 - dayname = 57411 - dayofmonth = 57412 - dayofweek = 57413 - dayofyear = 57414 - ddl = 57415 - deallocate = 57416 - decimalType = 57607 - defaultKwd = 57417 - delayKeyWrite = 57419 - delayed = 57418 - deleteKwd = 57420 - desc = 57421 - describe = 57422 - distinct = 57423 - div = 57424 - do = 57425 - doubleType = 57610 - drop = 57426 - dual = 57427 - duplicate = 57428 - dynamic = 57429 - elseKwd = 57430 - end = 57431 - engine = 57432 - engines = 57433 - enum = 57434 - eq = 57435 - yyErrCode = 57345 - escape = 57436 - execute = 57437 - exists = 57438 - explain = 57439 - extract = 57440 - falseKwd = 57441 - fields = 57442 - first = 57443 - fixed = 57444 - float32Type = 57640 - float64Type = 57641 - floatLit = 57346 - floatType = 57609 - forKwd = 57446 - foreign = 57445 - foundRows = 57447 - from = 57448 - full = 57449 - fulltext = 57450 - ge = 57451 - global = 57452 - grant = 57453 - grants = 57454 - group = 57455 - groupConcat = 57456 - hash = 57457 - having = 57458 - hexLit = 57350 - highPriority = 57459 - hour = 57460 - hourMicrosecond = 57648 - hourMinute = 57650 - hourSecond = 57649 - identified = 57461 - identifier = 57347 - ifKwd = 57463 - ifNull = 57464 - ignore = 57462 - in = 57465 - index = 57466 - inner = 57467 - insert = 57468 - insertValues = 57660 - int16Type = 57630 - int24Type = 57631 - int32Type = 57632 - int64Type = 57633 - int8Type = 57634 - intLit = 57348 - intType = 57603 - integerType = 57604 - interval = 57469 - into = 57470 - is = 57471 - isolation = 57472 - join = 57473 - key = 57474 - keyBlockSize = 57475 - le = 57476 - leading = 57477 - left = 57478 - length = 57479 - level = 57480 - like = 57481 - limit = 57482 - local = 57483 - localTime = 57597 - localTs = 57598 - locate = 57484 - lock = 57485 - longblobType = 57625 - longtextType = 57629 - lowPriority = 57487 - lower = 57486 - lowerThanCalcFoundRows = 57657 - lowerThanComma = 57666 - lowerThanEq = 57661 - lowerThanEscape = 57665 - lowerThanInsertValues = 57659 - lowerThanLeftParen = 57663 - lowerThanQuick = 57664 - lowerThanSetKeyword = 57658 - lsh = 57488 - max = 57489 - maxRows = 57490 - mediumIntType = 57602 - mediumblobType = 57624 - mediumtextType = 57628 - microsecond = 57491 - min = 57492 - minRows = 57494 - minute = 57493 - minuteMicrosecond = 57646 - minuteSecond = 57647 - mod = 57495 - mode = 57496 - month = 57497 - names = 57498 - national = 57499 - neg = 57662 - neq = 57500 - neqSynonym = 57501 - not = 57502 - now = 57599 - null = 57503 - nullIf = 57505 - nulleq = 57504 - numericType = 57608 - offset = 57506 - on = 57507 - only = 57508 - option = 57509 - or = 57510 - order = 57511 - oror = 57512 - outer = 57513 - parseExpression = 57644 - password = 57514 - placeholder = 57515 - pow = 57516 - power = 57517 - precisionType = 57611 - prepare = 57518 - primary = 57519 - procedure = 57520 - quarter = 57521 - quick = 57522 - rand = 57523 - read = 57524 - realType = 57612 - redundant = 57525 - references = 57526 - regexpKwd = 57527 - repeat = 57528 - repeatable = 57529 - replace = 57530 - right = 57531 - rlike = 57532 - rollback = 57533 - row = 57534 - rowFormat = 57535 - rsh = 57536 - schema = 57537 - schemas = 57538 - second = 57539 - secondMicrosecond = 57645 - selectKwd = 57540 - serializable = 57541 - session = 57542 - set = 57543 - share = 57544 - show = 57545 - signed = 57546 - smallIntType = 57601 - some = 57547 - start = 57548 - status = 57549 - strcmp = 57552 - stringLit = 57349 - stringType = 57550 - subDate = 57551 - substring = 57553 - substringIndex = 57554 - sum = 57555 - sysDate = 57557 - sysVar = 57556 - tableKwd = 57558 - tableRefPriority = 57656 - tables = 57559 - textType = 57627 - then = 57560 - timeType = 57614 - timestampType = 57616 - tinyIntType = 57600 - tinyblobType = 57622 - tinytextType = 57626 - to = 57561 - trailing = 57562 - transaction = 57563 - triggers = 57564 - trim = 57565 - trueKwd = 57566 - truncate = 57567 - uint16Type = 57636 - uint32Type = 57637 - uint64Type = 57638 - uint8Type = 57639 - uintType = 57635 - uncommitted = 57568 - underscoreCS = 57569 - union = 57571 - unique = 57572 - unknown = 57570 - unlock = 57573 - unsigned = 57574 - update = 57575 - upper = 57576 - use = 57577 - user = 57578 - userVar = 57580 - using = 57579 - value = 57581 - values = 57582 - varbinaryType = 57621 - varcharType = 57619 - variables = 57583 - version = 57584 - warnings = 57585 - week = 57586 - weekday = 57587 - weekofyear = 57588 - when = 57589 - where = 57590 - write = 57591 - xor = 57592 - yearMonth = 57655 - yearType = 57617 - yearweek = 57593 - zerofill = 57594 - - yyMaxDepth = 200 - yyTabOfs = -876 -) - -var ( - yyXLAT = map[int]int{ - 57386: 0, // comment (813x) - 57366: 1, // autoIncrement (806x) - 57344: 2, // $end (783x) - 59: 3, // ';' (781x) - 57356: 4, // after (776x) - 57443: 5, // first (776x) - 57378: 6, // charsetKwd (720x) - 41: 7, // ')' (718x) - 44: 8, // ',' (717x) - 57475: 9, // keyBlockSize (696x) - 57514: 10, // password (692x) - 57368: 11, // avgRowLength (689x) - 57380: 12, // checksum (689x) - 57391: 13, // compression (689x) - 57394: 14, // connection (689x) - 57419: 15, // delayKeyWrite (689x) - 57432: 16, // engine (689x) - 57490: 17, // maxRows (689x) - 57494: 18, // minRows (689x) - 57535: 19, // rowFormat (689x) - 57431: 20, // end (663x) - 57549: 21, // status (663x) - 57559: 22, // tables (663x) - 57518: 23, // prepare (662x) - 57437: 24, // execute (661x) - 57583: 25, // variables (661x) - 57617: 26, // yearType (661x) - 57385: 27, // columns (660x) - 57615: 28, // datetimeType (660x) - 57613: 29, // dateType (660x) - 57410: 30, // day (660x) - 57442: 31, // fields (660x) - 57460: 32, // hour (660x) - 57472: 33, // isolation (660x) - 57491: 34, // microsecond (660x) - 57493: 35, // minute (660x) - 57497: 36, // month (660x) - 57506: 37, // offset (660x) - 57521: 38, // quarter (660x) - 57539: 39, // second (660x) - 57614: 40, // timeType (660x) - 57570: 41, // unknown (660x) - 57581: 42, // value (660x) - 57586: 43, // week (660x) - 57355: 44, // admin (659x) - 57369: 45, // begin (659x) - 57387: 46, // commit (659x) - 57389: 47, // compact (659x) - 57390: 48, // compressed (659x) - 57416: 49, // deallocate (659x) - 57425: 50, // do (659x) - 57429: 51, // dynamic (659x) - 57444: 52, // fixed (659x) - 57461: 53, // identified (659x) - 57599: 54, // now (659x) - 57525: 55, // redundant (659x) - 57533: 56, // rollback (659x) - 57546: 57, // signed (659x) - 57548: 58, // start (659x) - 57567: 59, // truncate (659x) - 57578: 60, // user (659x) - 57606: 61, // bitType (658x) - 57643: 62, // booleanType (658x) - 57642: 63, // boolType (658x) - 57372: 64, // btree (658x) - 57383: 65, // collation (658x) - 57388: 66, // committed (658x) - 57433: 67, // engines (658x) - 57449: 68, // full (658x) - 57452: 69, // global (658x) - 57454: 70, // grants (658x) - 57457: 71, // hash (658x) - 57480: 72, // level (658x) - 57483: 73, // local (658x) - 57496: 74, // mode (658x) - 57499: 75, // national (658x) - 57508: 76, // only (658x) - 57529: 77, // repeatable (658x) - 57541: 78, // serializable (658x) - 57542: 79, // session (658x) - 57627: 80, // textType (658x) - 57616: 81, // timestampType (658x) - 57563: 82, // transaction (658x) - 57564: 83, // triggers (658x) - 57568: 84, // uncommitted (658x) - 57585: 85, // warnings (658x) - 57352: 86, // abs (657x) - 57354: 87, // addDate (657x) - 57362: 88, // any (657x) - 57367: 89, // avg (657x) - 57595: 90, // calcFoundRows (657x) - 57381: 91, // coalesce (657x) - 57392: 92, // concat (657x) - 57393: 93, // concatWs (657x) - 57395: 94, // connectionID (657x) - 57398: 95, // count (657x) - 57403: 96, // curTime (657x) - 57408: 97, // dateAdd (657x) - 57409: 98, // dateSub (657x) - 57411: 99, // dayname (657x) - 57412: 100, // dayofmonth (657x) - 57413: 101, // dayofweek (657x) - 57414: 102, // dayofyear (657x) - 57436: 103, // escape (657x) - 57447: 104, // foundRows (657x) - 57456: 105, // groupConcat (657x) - 57347: 106, // identifier (657x) - 57464: 107, // ifNull (657x) - 57479: 108, // length (657x) - 57484: 109, // locate (657x) - 57489: 110, // max (657x) - 57492: 111, // min (657x) - 57498: 112, // names (657x) - 57505: 113, // nullIf (657x) - 57516: 114, // pow (657x) - 57517: 115, // power (657x) - 57522: 116, // quick (657x) - 57523: 117, // rand (657x) - 57534: 118, // row (657x) - 57547: 119, // some (657x) - 57551: 120, // subDate (657x) - 57553: 121, // substring (657x) - 57554: 122, // substringIndex (657x) - 57555: 123, // sum (657x) - 57565: 124, // trim (657x) - 57584: 125, // version (657x) - 57587: 126, // weekday (657x) - 57588: 127, // weekofyear (657x) - 57593: 128, // yearweek (657x) - 57502: 129, // not (557x) - 57507: 130, // on (552x) - 57349: 131, // stringLit (538x) - 57478: 132, // left (506x) - 40: 133, // '(' (492x) - 43: 134, // '+' (473x) - 45: 135, // '-' (473x) - 57417: 136, // defaultKwd (462x) - 57503: 137, // null (423x) - 57359: 138, // and (409x) - 57571: 139, // union (409x) - 57360: 140, // andand (408x) - 57510: 141, // or (408x) - 57512: 142, // oror (408x) - 57592: 143, // xor (408x) - 57446: 144, // forKwd (392x) - 57482: 145, // limit (392x) - 57448: 146, // from (391x) - 57485: 147, // lock (391x) - 57590: 148, // where (380x) - 57382: 149, // collate (368x) - 57511: 150, // order (367x) - 57435: 151, // eq (360x) - 57458: 152, // having (357x) - 57543: 153, // set (352x) - 57473: 154, // join (350x) - 57579: 155, // using (350x) - 57455: 156, // group (348x) - 57400: 157, // cross (343x) - 57467: 158, // inner (343x) - 57531: 159, // right (343x) - 125: 160, // '}' (340x) - 57481: 161, // like (337x) - 57363: 162, // as (334x) - 57421: 163, // desc (331x) - 57589: 164, // when (331x) - 42: 165, // '*' (329x) - 57364: 166, // asc (329x) - 57430: 167, // elseKwd (328x) - 57654: 168, // dayHour (327x) - 57651: 169, // dayMicrosecond (327x) - 57653: 170, // dayMinute (327x) - 57652: 171, // daySecond (327x) - 57648: 172, // hourMicrosecond (327x) - 57650: 173, // hourMinute (327x) - 57649: 174, // hourSecond (327x) - 57646: 175, // minuteMicrosecond (327x) - 57647: 176, // minuteSecond (327x) - 57645: 177, // secondMicrosecond (327x) - 57655: 178, // yearMonth (327x) - 57560: 179, // then (325x) - 57465: 180, // in (322x) - 60: 181, // '<' (320x) - 62: 182, // '>' (320x) - 57451: 183, // ge (320x) - 57471: 184, // is (320x) - 57476: 185, // le (320x) - 57500: 186, // neq (320x) - 57501: 187, // neqSynonym (320x) - 57504: 188, // nulleq (320x) - 57370: 189, // between (310x) - 57527: 190, // regexpKwd (310x) - 57532: 191, // rlike (310x) - 37: 192, // '%' (309x) - 38: 193, // '&' (309x) - 47: 194, // '/' (309x) - 94: 195, // '^' (309x) - 124: 196, // '|' (309x) - 57620: 197, // binaryType (309x) - 57424: 198, // div (309x) - 57488: 199, // lsh (309x) - 57495: 200, // mod (309x) - 57536: 201, // rsh (309x) - 57582: 202, // values (295x) - 57519: 203, // primary (263x) - 57572: 204, // unique (263x) - 57379: 205, // check (258x) - 57766: 206, // Identifier (246x) - 57793: 207, // NotKeywordToken (246x) - 57877: 208, // UnReservedKeyword (246x) - 57377: 209, // character (196x) - 57348: 210, // intLit (189x) - 46: 211, // '.' (183x) - 57463: 212, // ifKwd (173x) - 57530: 213, // replace (169x) - 57580: 214, // userVar (168x) - 57441: 215, // falseKwd (167x) - 57566: 216, // trueKwd (167x) - 57438: 217, // exists (166x) - 57346: 218, // floatLit (166x) - 57596: 219, // currentTs (165x) - 57406: 220, // database (165x) - 57537: 221, // schema (165x) - 57556: 222, // sysVar (165x) - 57351: 223, // bitLit (164x) - 57350: 224, // hexLit (164x) - 57569: 225, // underscoreCS (164x) - 33: 226, // '!' (163x) - 126: 227, // '~' (163x) - 57375: 228, // caseKwd (163x) - 57376: 229, // cast (163x) - 57397: 230, // convert (163x) - 57401: 231, // curDate (163x) - 57402: 232, // currentDate (163x) - 57404: 233, // currentTime (163x) - 57405: 234, // currentUser (163x) - 57440: 235, // extract (163x) - 57486: 236, // lower (163x) - 57515: 237, // placeholder (163x) - 57528: 238, // repeat (163x) - 57552: 239, // strcmp (163x) - 57557: 240, // sysDate (163x) - 57576: 241, // upper (163x) - 57687: 242, // ColumnName (159x) - 57540: 243, // selectKwd (154x) - 57474: 244, // key (144x) - 57466: 245, // index (143x) - 57851: 246, // SubSelect (136x) - 57618: 247, // charType (135x) - 57426: 248, // drop (135x) - 57445: 249, // foreign (135x) - 57524: 250, // read (135x) - 57450: 251, // fulltext (134x) - 57887: 252, // UserVariable (134x) - 57607: 253, // decimalType (133x) - 57604: 254, // integerType (133x) - 57561: 255, // to (133x) - 57619: 256, // varcharType (133x) - 57787: 257, // Literal (132x) - 57353: 258, // add (131x) - 57605: 259, // bigIntType (131x) - 57623: 260, // blobType (131x) - 57715: 261, // DateArithMultiFormsOpt (131x) - 57716: 262, // DateArithOpt (131x) - 57610: 263, // doubleType (131x) - 57434: 264, // enum (131x) - 57640: 265, // float32Type (131x) - 57641: 266, // float64Type (131x) - 57609: 267, // floatType (131x) - 57755: 268, // Function (131x) - 57756: 269, // FunctionCallAgg (131x) - 57757: 270, // FunctionCallConflict (131x) - 57758: 271, // FunctionCallKeyword (131x) - 57759: 272, // FunctionCallNonKeyword (131x) - 57760: 273, // FunctionNameConflict (131x) - 57633: 274, // int64Type (131x) - 57603: 275, // intType (131x) - 57625: 276, // longblobType (131x) - 57629: 277, // longtextType (131x) - 57624: 278, // mediumblobType (131x) - 57602: 279, // mediumIntType (131x) - 57628: 280, // mediumtextType (131x) - 57608: 281, // numericType (131x) - 57800: 282, // Operand (131x) - 57816: 283, // PrimaryExpression (131x) - 57612: 284, // realType (131x) - 57601: 285, // smallIntType (131x) - 57550: 286, // stringType (131x) - 57853: 287, // SystemVariable (131x) - 57622: 288, // tinyblobType (131x) - 57600: 289, // tinyIntType (131x) - 57626: 290, // tinytextType (131x) - 57638: 291, // uint64Type (131x) - 57635: 292, // uintType (131x) - 57621: 293, // varbinaryType (131x) - 57891: 294, // Variable (131x) - 57591: 295, // write (131x) - 57817: 296, // PrimaryFactor (123x) - 57813: 297, // PredicateExpr (110x) - 57737: 298, // Expression (108x) - 57742: 299, // Factor (108x) - 57898: 300, // logAnd (85x) - 57899: 301, // logOr (85x) - 57574: 302, // unsigned (33x) - 57861: 303, // TableName (31x) - 57594: 304, // zerofill (31x) - 57357: 305, // all (20x) - 57746: 306, // FieldLen (20x) - 57831: 307, // SelectStmt (17x) - 57731: 308, // EqOpt (16x) - 57738: 309, // ExpressionList (16x) - 57784: 310, // LengthNum (15x) - 57791: 311, // NUM (15x) - 57804: 312, // OptFieldLen (14x) - 57462: 313, // ignore (13x) - 57774: 314, // IndexType (13x) - 57880: 315, // UnionSelect (13x) - 57878: 316, // UnionClauseList (12x) - 57881: 317, // UnionStmt (12x) - 123: 318, // '{' (11x) - 57770: 319, // IndexColName (11x) - 57470: 320, // into (11x) - 57849: 321, // StringName (11x) - 57575: 322, // update (11x) - 57684: 323, // CharsetKw (10x) - 57771: 324, // IndexColNameList (10x) - 57781: 325, // JoinTable (10x) - 57858: 326, // TableFactor (10x) - 57558: 327, // tableKwd (10x) - 57867: 328, // TableRef (10x) - 57420: 329, // deleteKwd (8x) - 57423: 330, // distinct (8x) - 57772: 331, // IndexName (8x) - 57468: 332, // insert (8x) - 57720: 333, // DefaultKwdOpt (7x) - 57732: 334, // EscapedTableRef (7x) - 57773: 335, // IndexOption (7x) - 57802: 336, // OptCharset (7x) - 57896: 337, // WhereClause (7x) - 57897: 338, // WhereClauseOptional (7x) - 57724: 339, // DistinctOpt (6x) - 57775: 340, // IndexTypeOpt (6x) - 57803: 341, // OptCollate (6x) - 57868: 342, // TableRefs (6x) - 57399: 343, // create (5x) - 57707: 344, // CrossOpt (5x) - 57708: 345, // DBName (5x) - 57741: 346, // ExpressionOpt (5x) - 57782: 347, // JoinType (5x) - 57801: 348, // OptBinary (5x) - 57829: 349, // RowFormat (5x) - 57545: 350, // show (5x) - 57839: 351, // ShowDatabaseNameOpt (5x) - 57862: 352, // TableNameList (5x) - 57863: 353, // TableOption (5x) - 57889: 354, // Username (5x) - 57358: 355, // alter (4x) - 57673: 356, // Assignment (4x) - 57739: 357, // ExpressionListList (4x) - 57453: 358, // grant (4x) - 57769: 359, // IgnoreOptional (4x) - 57487: 360, // lowPriority (4x) - 57808: 361, // OrderBy (4x) - 57809: 362, // OrderByOptional (4x) - 57836: 363, // SelectStmtLimit (4x) - 57854: 364, // TableAsName (4x) - 57674: 365, // AssignmentList (3x) - 57373: 366, // by (3x) - 57681: 367, // ByItem (3x) - 57685: 368, // ColumnDef (3x) - 57396: 369, // constraint (3x) - 57699: 370, // Constraint (3x) - 57701: 371, // ConstraintKeywordOpt (3x) - 57723: 372, // DeleteFromStmt (3x) - 57748: 373, // FieldOpt (3x) - 57749: 374, // FieldOpts (3x) - 57751: 375, // FloatOpt (3x) - 57768: 376, // IfNotExists (3x) - 57776: 377, // InsertIntoStmt (3x) - 57513: 378, // outer (3x) - 57812: 379, // Precision (3x) - 57826: 380, // ReplaceIntoStmt (3x) - 57830: 381, // SelectLockOpt (3x) - 57864: 382, // TableOptionList (3x) - 57865: 383, // TableOptionListOpt (3x) - 57871: 384, // TimeUnit (3x) - 57872: 385, // TransactionChar (3x) - 57883: 386, // UpdateStmt (3x) - 57885: 387, // UserSpec (3x) - 57890: 388, // ValueSym (3x) - 57668: 389, // AdminStmt (2x) - 57669: 390, // AlterTableSpec (2x) - 57671: 391, // AlterTableStmt (2x) - 57677: 392, // AuthString (2x) - 57678: 393, // BeginTransactionStmt (2x) - 57682: 394, // ByList (2x) - 57683: 395, // CastType (2x) - 57384: 396, // column (2x) - 57686: 397, // ColumnKeywordOpt (2x) - 57688: 398, // ColumnNameList (2x) - 57690: 399, // ColumnOption (2x) - 57694: 400, // ColumnSetValue (2x) - 57697: 401, // CommitStmt (2x) - 57702: 402, // CreateDatabaseStmt (2x) - 57703: 403, // CreateIndexStmt (2x) - 57705: 404, // CreateTableStmt (2x) - 57706: 405, // CreateUserStmt (2x) - 57709: 406, // DatabaseOption (2x) - 57407: 407, // databases (2x) - 57712: 408, // DatabaseSym (2x) - 57717: 409, // DeallocateStmt (2x) - 57718: 410, // DeallocateSym (2x) - 57418: 411, // delayed (2x) - 57422: 412, // describe (2x) - 57725: 413, // DoStmt (2x) - 57726: 414, // DropDatabaseStmt (2x) - 57727: 415, // DropIndexStmt (2x) - 57728: 416, // DropTableStmt (2x) - 57730: 417, // EmptyStmt (2x) - 57733: 418, // ExecuteStmt (2x) - 57439: 419, // explain (2x) - 57734: 420, // ExplainStmt (2x) - 57735: 421, // ExplainSym (2x) - 57743: 422, // Field (2x) - 57754: 423, // FuncDatetimePrec (2x) - 57762: 424, // GrantStmt (2x) - 57767: 425, // IfExists (2x) - 57777: 426, // InsertValues (2x) - 57469: 427, // interval (2x) - 57779: 428, // IntoOpt (2x) - 57786: 429, // LimitClause (2x) - 57597: 430, // localTime (2x) - 57598: 431, // localTs (2x) - 57788: 432, // LockTablesStmt (2x) - 57790: 433, // LowPriorityOptional (2x) - 57794: 434, // NotOpt (2x) - 57795: 435, // NowSym (2x) - 57796: 436, // NumLiteral (2x) - 57806: 437, // OptInteger (2x) - 57807: 438, // Order (2x) - 57811: 439, // PasswordOpt (2x) - 57815: 440, // PreparedStmt (2x) - 57819: 441, // PrivElem (2x) - 57822: 442, // PrivType (2x) - 57828: 443, // RollbackStmt (2x) - 57838: 444, // SetStmt (2x) - 57841: 445, // ShowStmt (2x) - 57842: 446, // ShowTableAliasOpt (2x) - 57846: 447, // Statement (2x) - 57848: 448, // StringList (2x) - 57852: 449, // Symbol (2x) - 57856: 450, // TableElement (2x) - 57859: 451, // TableLock (2x) - 57873: 452, // TransactionChars (2x) - 57875: 453, // TruncateTableStmt (2x) - 57573: 454, // unlock (2x) - 57882: 455, // UnlockTablesStmt (2x) - 57577: 456, // use (2x) - 57886: 457, // UserSpecList (2x) - 57884: 458, // UseStmt (2x) - 57892: 459, // VariableAssignment (2x) - 57894: 460, // WhenClause (2x) - 57670: 461, // AlterTableSpecList (1x) - 57672: 462, // AnyOrAll (1x) - 57365: 463, // at (1x) - 57676: 464, // AuthOption (1x) - 57679: 465, // BitValueType (1x) - 57680: 466, // BlobType (1x) - 57371: 467, // both (1x) - 57689: 468, // ColumnNameListOpt (1x) - 57691: 469, // ColumnOptionList (1x) - 57692: 470, // ColumnOptionListOpt (1x) - 57693: 471, // ColumnPosition (1x) - 57695: 472, // ColumnSetValueList (1x) - 57698: 473, // CompareOp (1x) - 57700: 474, // ConstraintElem (1x) - 57704: 475, // CreateIndexStmtUnique (1x) - 57710: 476, // DatabaseOptionList (1x) - 57711: 477, // DatabaseOptionListOpt (1x) - 57713: 478, // DateAndTimeType (1x) - 57714: 479, // DateArithInterval (1x) - 57415: 480, // ddl (1x) - 57722: 481, // DefaultValueExpr (1x) - 57427: 482, // dual (1x) - 57428: 483, // duplicate (1x) - 57729: 484, // ElseOpt (1x) - 57736: 485, // ExplainableStmt (1x) - 57740: 486, // ExpressionListOpt (1x) - 57744: 487, // FieldAsName (1x) - 57745: 488, // FieldAsNameOpt (1x) - 57747: 489, // FieldList (1x) - 57750: 490, // FixedPointType (1x) - 57752: 491, // FloatingPointType (1x) - 57753: 492, // FromDual (1x) - 57761: 493, // GlobalScope (1x) - 57763: 494, // GroupByClause (1x) - 57764: 495, // HashString (1x) - 57765: 496, // HavingClause (1x) - 57459: 497, // highPriority (1x) - 57778: 498, // IntegerType (1x) - 57780: 499, // IsolationLevel (1x) - 57783: 500, // KeyOrIndex (1x) - 57477: 501, // leading (1x) - 57785: 502, // LikeEscapeOpt (1x) - 57789: 503, // LockType (1x) - 57792: 504, // NationalOpt (1x) - 57797: 505, // NumericType (1x) - 57798: 506, // ObjectType (1x) - 57799: 507, // OnDuplicateKeyUpdate (1x) - 57805: 508, // OptFull (1x) - 57509: 509, // option (1x) - 57810: 510, // OuterOpt (1x) - 57644: 511, // parseExpression (1x) - 57611: 512, // precisionType (1x) - 57814: 513, // PrepareSQL (1x) - 57818: 514, // Priority (1x) - 57820: 515, // PrivElemList (1x) - 57821: 516, // PrivLevel (1x) - 57520: 517, // procedure (1x) - 57823: 518, // QuickOptional (1x) - 57824: 519, // ReferDef (1x) - 57526: 520, // references (1x) - 57825: 521, // RegexpSym (1x) - 57827: 522, // ReplacePriority (1x) - 57538: 523, // schemas (1x) - 57832: 524, // SelectStmtCalcFoundRows (1x) - 57833: 525, // SelectStmtDistinct (1x) - 57834: 526, // SelectStmtFieldList (1x) - 57835: 527, // SelectStmtGroup (1x) - 57837: 528, // SelectStmtOpts (1x) - 57544: 529, // share (1x) - 57840: 530, // ShowLikeOrWhereOpt (1x) - 57843: 531, // ShowTargetFilterable (1x) - 57844: 532, // SignedLiteral (1x) - 57845: 533, // Start (1x) - 57847: 534, // StatementList (1x) - 57850: 535, // StringType (1x) - 57855: 536, // TableAsNameOpt (1x) - 57857: 537, // TableElementList (1x) - 57860: 538, // TableLockList (1x) - 57866: 539, // TableOrTables (1x) - 57869: 540, // TableRefsClause (1x) - 57870: 541, // TextType (1x) - 57562: 542, // trailing (1x) - 57874: 543, // TrimDirection (1x) - 57876: 544, // Type (1x) - 57879: 545, // UnionOpt (1x) - 57888: 546, // UserVariableList (1x) - 57893: 547, // VariableAssignmentList (1x) - 57895: 548, // WhenClauseList (1x) - 57667: 549, // $default (0x) - 57361: 550, // andnot (0x) - 57675: 551, // AssignmentListOpt (0x) - 57374: 552, // byteType (0x) - 57696: 553, // CommaOpt (0x) - 57719: 554, // Default (0x) - 57721: 555, // DefaultOpt (0x) - 57345: 556, // error (0x) - 57660: 557, // insertValues (0x) - 57630: 558, // int16Type (0x) - 57631: 559, // int24Type (0x) - 57632: 560, // int32Type (0x) - 57634: 561, // int8Type (0x) - 57657: 562, // lowerThanCalcFoundRows (0x) - 57666: 563, // lowerThanComma (0x) - 57661: 564, // lowerThanEq (0x) - 57665: 565, // lowerThanEscape (0x) - 57659: 566, // lowerThanInsertValues (0x) - 57663: 567, // lowerThanLeftParen (0x) - 57664: 568, // lowerThanQuick (0x) - 57658: 569, // lowerThanSetKeyword (0x) - 57900: 570, // name (0x) - 57662: 571, // neg (0x) - 57656: 572, // tableRefPriority (0x) - 57636: 573, // uint16Type (0x) - 57637: 574, // uint32Type (0x) - 57639: 575, // uint8Type (0x) - } - - yySymNames = []string{ - "comment", - "autoIncrement", - "$end", - "';'", - "after", - "first", - "charsetKwd", - "')'", - "','", - "keyBlockSize", - "password", - "avgRowLength", - "checksum", - "compression", - "connection", - "delayKeyWrite", - "engine", - "maxRows", - "minRows", - "rowFormat", - "end", - "status", - "tables", - "prepare", - "execute", - "variables", - "yearType", - "columns", - "datetimeType", - "dateType", - "day", - "fields", - "hour", - "isolation", - "microsecond", - "minute", - "month", - "offset", - "quarter", - "second", - "timeType", - "unknown", - "value", - "week", - "admin", - "begin", - "commit", - "compact", - "compressed", - "deallocate", - "do", - "dynamic", - "fixed", - "identified", - "now", - "redundant", - "rollback", - "signed", - "start", - "truncate", - "user", - "bitType", - "booleanType", - "boolType", - "btree", - "collation", - "committed", - "engines", - "full", - "global", - "grants", - "hash", - "level", - "local", - "mode", - "national", - "only", - "repeatable", - "serializable", - "session", - "textType", - "timestampType", - "transaction", - "triggers", - "uncommitted", - "warnings", - "abs", - "addDate", - "any", - "avg", - "calcFoundRows", - "coalesce", - "concat", - "concatWs", - "connectionID", - "count", - "curTime", - "dateAdd", - "dateSub", - "dayname", - "dayofmonth", - "dayofweek", - "dayofyear", - "escape", - "foundRows", - "groupConcat", - "identifier", - "ifNull", - "length", - "locate", - "max", - "min", - "names", - "nullIf", - "pow", - "power", - "quick", - "rand", - "row", - "some", - "subDate", - "substring", - "substringIndex", - "sum", - "trim", - "version", - "weekday", - "weekofyear", - "yearweek", - "not", - "on", - "stringLit", - "left", - "'('", - "'+'", - "'-'", - "defaultKwd", - "null", - "and", - "union", - "andand", - "or", - "oror", - "xor", - "forKwd", - "limit", - "from", - "lock", - "where", - "collate", - "order", - "eq", - "having", - "set", - "join", - "using", - "group", - "cross", - "inner", - "right", - "'}'", - "like", - "as", - "desc", - "when", - "'*'", - "asc", - "elseKwd", - "dayHour", - "dayMicrosecond", - "dayMinute", - "daySecond", - "hourMicrosecond", - "hourMinute", - "hourSecond", - "minuteMicrosecond", - "minuteSecond", - "secondMicrosecond", - "yearMonth", - "then", - "in", - "'<'", - "'>'", - "ge", - "is", - "le", - "neq", - "neqSynonym", - "nulleq", - "between", - "regexpKwd", - "rlike", - "'%'", - "'&'", - "'/'", - "'^'", - "'|'", - "binaryType", - "div", - "lsh", - "mod", - "rsh", - "values", - "primary", - "unique", - "check", - "Identifier", - "NotKeywordToken", - "UnReservedKeyword", - "character", - "intLit", - "'.'", - "ifKwd", - "replace", - "userVar", - "falseKwd", - "trueKwd", - "exists", - "floatLit", - "currentTs", - "database", - "schema", - "sysVar", - "bitLit", - "hexLit", - "underscoreCS", - "'!'", - "'~'", - "caseKwd", - "cast", - "convert", - "curDate", - "currentDate", - "currentTime", - "currentUser", - "extract", - "lower", - "placeholder", - "repeat", - "strcmp", - "sysDate", - "upper", - "ColumnName", - "selectKwd", - "key", - "index", - "SubSelect", - "charType", - "drop", - "foreign", - "read", - "fulltext", - "UserVariable", - "decimalType", - "integerType", - "to", - "varcharType", - "Literal", - "add", - "bigIntType", - "blobType", - "DateArithMultiFormsOpt", - "DateArithOpt", - "doubleType", - "enum", - "float32Type", - "float64Type", - "floatType", - "Function", - "FunctionCallAgg", - "FunctionCallConflict", - "FunctionCallKeyword", - "FunctionCallNonKeyword", - "FunctionNameConflict", - "int64Type", - "intType", - "longblobType", - "longtextType", - "mediumblobType", - "mediumIntType", - "mediumtextType", - "numericType", - "Operand", - "PrimaryExpression", - "realType", - "smallIntType", - "stringType", - "SystemVariable", - "tinyblobType", - "tinyIntType", - "tinytextType", - "uint64Type", - "uintType", - "varbinaryType", - "Variable", - "write", - "PrimaryFactor", - "PredicateExpr", - "Expression", - "Factor", - "logAnd", - "logOr", - "unsigned", - "TableName", - "zerofill", - "all", - "FieldLen", - "SelectStmt", - "EqOpt", - "ExpressionList", - "LengthNum", - "NUM", - "OptFieldLen", - "ignore", - "IndexType", - "UnionSelect", - "UnionClauseList", - "UnionStmt", - "'{'", - "IndexColName", - "into", - "StringName", - "update", - "CharsetKw", - "IndexColNameList", - "JoinTable", - "TableFactor", - "tableKwd", - "TableRef", - "deleteKwd", - "distinct", - "IndexName", - "insert", - "DefaultKwdOpt", - "EscapedTableRef", - "IndexOption", - "OptCharset", - "WhereClause", - "WhereClauseOptional", - "DistinctOpt", - "IndexTypeOpt", - "OptCollate", - "TableRefs", - "create", - "CrossOpt", - "DBName", - "ExpressionOpt", - "JoinType", - "OptBinary", - "RowFormat", - "show", - "ShowDatabaseNameOpt", - "TableNameList", - "TableOption", - "Username", - "alter", - "Assignment", - "ExpressionListList", - "grant", - "IgnoreOptional", - "lowPriority", - "OrderBy", - "OrderByOptional", - "SelectStmtLimit", - "TableAsName", - "AssignmentList", - "by", - "ByItem", - "ColumnDef", - "constraint", - "Constraint", - "ConstraintKeywordOpt", - "DeleteFromStmt", - "FieldOpt", - "FieldOpts", - "FloatOpt", - "IfNotExists", - "InsertIntoStmt", - "outer", - "Precision", - "ReplaceIntoStmt", - "SelectLockOpt", - "TableOptionList", - "TableOptionListOpt", - "TimeUnit", - "TransactionChar", - "UpdateStmt", - "UserSpec", - "ValueSym", - "AdminStmt", - "AlterTableSpec", - "AlterTableStmt", - "AuthString", - "BeginTransactionStmt", - "ByList", - "CastType", - "column", - "ColumnKeywordOpt", - "ColumnNameList", - "ColumnOption", - "ColumnSetValue", - "CommitStmt", - "CreateDatabaseStmt", - "CreateIndexStmt", - "CreateTableStmt", - "CreateUserStmt", - "DatabaseOption", - "databases", - "DatabaseSym", - "DeallocateStmt", - "DeallocateSym", - "delayed", - "describe", - "DoStmt", - "DropDatabaseStmt", - "DropIndexStmt", - "DropTableStmt", - "EmptyStmt", - "ExecuteStmt", - "explain", - "ExplainStmt", - "ExplainSym", - "Field", - "FuncDatetimePrec", - "GrantStmt", - "IfExists", - "InsertValues", - "interval", - "IntoOpt", - "LimitClause", - "localTime", - "localTs", - "LockTablesStmt", - "LowPriorityOptional", - "NotOpt", - "NowSym", - "NumLiteral", - "OptInteger", - "Order", - "PasswordOpt", - "PreparedStmt", - "PrivElem", - "PrivType", - "RollbackStmt", - "SetStmt", - "ShowStmt", - "ShowTableAliasOpt", - "Statement", - "StringList", - "Symbol", - "TableElement", - "TableLock", - "TransactionChars", - "TruncateTableStmt", - "unlock", - "UnlockTablesStmt", - "use", - "UserSpecList", - "UseStmt", - "VariableAssignment", - "WhenClause", - "AlterTableSpecList", - "AnyOrAll", - "at", - "AuthOption", - "BitValueType", - "BlobType", - "both", - "ColumnNameListOpt", - "ColumnOptionList", - "ColumnOptionListOpt", - "ColumnPosition", - "ColumnSetValueList", - "CompareOp", - "ConstraintElem", - "CreateIndexStmtUnique", - "DatabaseOptionList", - "DatabaseOptionListOpt", - "DateAndTimeType", - "DateArithInterval", - "ddl", - "DefaultValueExpr", - "dual", - "duplicate", - "ElseOpt", - "ExplainableStmt", - "ExpressionListOpt", - "FieldAsName", - "FieldAsNameOpt", - "FieldList", - "FixedPointType", - "FloatingPointType", - "FromDual", - "GlobalScope", - "GroupByClause", - "HashString", - "HavingClause", - "highPriority", - "IntegerType", - "IsolationLevel", - "KeyOrIndex", - "leading", - "LikeEscapeOpt", - "LockType", - "NationalOpt", - "NumericType", - "ObjectType", - "OnDuplicateKeyUpdate", - "OptFull", - "option", - "OuterOpt", - "parseExpression", - "precisionType", - "PrepareSQL", - "Priority", - "PrivElemList", - "PrivLevel", - "procedure", - "QuickOptional", - "ReferDef", - "references", - "RegexpSym", - "ReplacePriority", - "schemas", - "SelectStmtCalcFoundRows", - "SelectStmtDistinct", - "SelectStmtFieldList", - "SelectStmtGroup", - "SelectStmtOpts", - "share", - "ShowLikeOrWhereOpt", - "ShowTargetFilterable", - "SignedLiteral", - "Start", - "StatementList", - "StringType", - "TableAsNameOpt", - "TableElementList", - "TableLockList", - "TableOrTables", - "TableRefsClause", - "TextType", - "trailing", - "TrimDirection", - "Type", - "UnionOpt", - "UserVariableList", - "VariableAssignmentList", - "WhenClauseList", - "$default", - "andnot", - "AssignmentListOpt", - "byteType", - "CommaOpt", - "Default", - "DefaultOpt", - "error", - "insertValues", - "int16Type", - "int24Type", - "int32Type", - "int8Type", - "lowerThanCalcFoundRows", - "lowerThanComma", - "lowerThanEq", - "lowerThanEscape", - "lowerThanInsertValues", - "lowerThanLeftParen", - "lowerThanQuick", - "lowerThanSetKeyword", - "name", - "neg", - "tableRefPriority", - "uint16Type", - "uint32Type", - "uint8Type", - } - - yyReductions = map[int]struct{ xsym, components int }{ - 0: {0, 1}, - 1: {533, 1}, - 2: {533, 2}, - 3: {391, 5}, - 4: {390, 1}, - 5: {390, 4}, - 6: {390, 2}, - 7: {390, 3}, - 8: {390, 3}, - 9: {390, 3}, - 10: {390, 4}, - 11: {500, 1}, - 12: {500, 1}, - 13: {397, 0}, - 14: {397, 1}, - 15: {471, 0}, - 16: {471, 1}, - 17: {471, 2}, - 18: {461, 1}, - 19: {461, 3}, - 20: {371, 0}, - 21: {371, 1}, - 22: {371, 2}, - 23: {449, 1}, - 24: {356, 3}, - 25: {365, 1}, - 26: {365, 3}, - 27: {551, 0}, - 28: {551, 1}, - 29: {393, 1}, - 30: {393, 2}, - 31: {368, 3}, - 32: {242, 1}, - 33: {242, 3}, - 34: {242, 5}, - 35: {398, 1}, - 36: {398, 3}, - 37: {468, 0}, - 38: {468, 1}, - 39: {401, 1}, - 40: {399, 2}, - 41: {399, 1}, - 42: {399, 1}, - 43: {399, 2}, - 44: {399, 1}, - 45: {399, 2}, - 46: {399, 2}, - 47: {399, 3}, - 48: {399, 2}, - 49: {399, 4}, - 50: {469, 1}, - 51: {469, 2}, - 52: {470, 0}, - 53: {470, 1}, - 54: {474, 7}, - 55: {474, 7}, - 56: {474, 7}, - 57: {474, 7}, - 58: {474, 7}, - 59: {474, 8}, - 60: {474, 8}, - 61: {474, 7}, - 62: {519, 5}, - 63: {481, 1}, - 64: {481, 3}, - 65: {481, 1}, - 66: {435, 1}, - 67: {435, 1}, - 68: {435, 1}, - 69: {435, 1}, - 70: {532, 1}, - 71: {532, 2}, - 72: {532, 2}, - 73: {436, 1}, - 74: {436, 1}, - 75: {403, 9}, - 76: {475, 0}, - 77: {475, 1}, - 78: {319, 3}, - 79: {324, 0}, - 80: {324, 1}, - 81: {324, 3}, - 82: {402, 5}, - 83: {345, 1}, - 84: {406, 4}, - 85: {406, 4}, - 86: {477, 0}, - 87: {477, 1}, - 88: {476, 1}, - 89: {476, 2}, - 90: {404, 8}, - 91: {554, 2}, - 92: {555, 0}, - 93: {555, 1}, - 94: {333, 0}, - 95: {333, 1}, - 96: {413, 2}, - 97: {372, 9}, - 98: {372, 8}, - 99: {372, 9}, - 100: {408, 1}, - 101: {408, 1}, - 102: {414, 4}, - 103: {415, 6}, - 104: {416, 3}, - 105: {416, 5}, - 106: {539, 1}, - 107: {539, 1}, - 108: {308, 0}, - 109: {308, 1}, - 110: {417, 0}, - 111: {421, 1}, - 112: {421, 1}, - 113: {421, 1}, - 114: {420, 2}, - 115: {420, 3}, - 116: {420, 2}, - 117: {310, 1}, - 118: {311, 1}, - 119: {298, 3}, - 120: {298, 3}, - 121: {298, 3}, - 122: {298, 2}, - 123: {298, 4}, - 124: {298, 4}, - 125: {298, 4}, - 126: {298, 1}, - 127: {301, 1}, - 128: {301, 1}, - 129: {300, 1}, - 130: {300, 1}, - 131: {570, 1}, - 132: {309, 1}, - 133: {309, 3}, - 134: {486, 0}, - 135: {486, 1}, - 136: {299, 4}, - 137: {299, 3}, - 138: {299, 4}, - 139: {299, 1}, - 140: {473, 1}, - 141: {473, 1}, - 142: {473, 1}, - 143: {473, 1}, - 144: {473, 1}, - 145: {473, 1}, - 146: {473, 1}, - 147: {473, 1}, - 148: {462, 1}, - 149: {462, 1}, - 150: {462, 1}, - 151: {297, 6}, - 152: {297, 4}, - 153: {297, 6}, - 154: {297, 5}, - 155: {297, 4}, - 156: {297, 1}, - 157: {521, 1}, - 158: {521, 1}, - 159: {502, 0}, - 160: {502, 2}, - 161: {434, 0}, - 162: {434, 1}, - 163: {422, 1}, - 164: {422, 3}, - 165: {422, 5}, - 166: {422, 2}, - 167: {488, 0}, - 168: {488, 1}, - 169: {487, 1}, - 170: {487, 2}, - 171: {487, 1}, - 172: {487, 2}, - 173: {489, 1}, - 174: {489, 3}, - 175: {494, 3}, - 176: {496, 0}, - 177: {496, 2}, - 178: {425, 0}, - 179: {425, 2}, - 180: {376, 0}, - 181: {376, 3}, - 182: {359, 0}, - 183: {359, 1}, - 184: {331, 0}, - 185: {331, 1}, - 186: {335, 0}, - 187: {335, 3}, - 188: {335, 1}, - 189: {335, 2}, - 190: {314, 2}, - 191: {314, 2}, - 192: {340, 0}, - 193: {340, 1}, - 194: {206, 1}, - 195: {206, 1}, - 196: {206, 1}, - 197: {208, 1}, - 198: {208, 1}, - 199: {208, 1}, - 200: {208, 1}, - 201: {208, 1}, - 202: {208, 1}, - 203: {208, 1}, - 204: {208, 1}, - 205: {208, 1}, - 206: {208, 1}, - 207: {208, 1}, - 208: {208, 1}, - 209: {208, 1}, - 210: {208, 1}, - 211: {208, 1}, - 212: {208, 1}, - 213: {208, 1}, - 214: {208, 1}, - 215: {208, 1}, - 216: {208, 1}, - 217: {208, 1}, - 218: {208, 1}, - 219: {208, 1}, - 220: {208, 1}, - 221: {208, 1}, - 222: {208, 1}, - 223: {208, 1}, - 224: {208, 1}, - 225: {208, 1}, - 226: {208, 1}, - 227: {208, 1}, - 228: {208, 1}, - 229: {208, 1}, - 230: {208, 1}, - 231: {208, 1}, - 232: {208, 1}, - 233: {208, 1}, - 234: {208, 1}, - 235: {208, 1}, - 236: {208, 1}, - 237: {208, 1}, - 238: {208, 1}, - 239: {208, 1}, - 240: {208, 1}, - 241: {208, 1}, - 242: {208, 1}, - 243: {208, 1}, - 244: {208, 1}, - 245: {208, 1}, - 246: {208, 1}, - 247: {208, 1}, - 248: {208, 1}, - 249: {208, 1}, - 250: {208, 1}, - 251: {208, 1}, - 252: {208, 1}, - 253: {208, 1}, - 254: {208, 1}, - 255: {208, 1}, - 256: {208, 1}, - 257: {208, 1}, - 258: {208, 1}, - 259: {208, 1}, - 260: {208, 1}, - 261: {208, 1}, - 262: {208, 1}, - 263: {208, 1}, - 264: {208, 1}, - 265: {208, 1}, - 266: {208, 1}, - 267: {208, 1}, - 268: {208, 1}, - 269: {208, 1}, - 270: {208, 1}, - 271: {208, 1}, - 272: {208, 1}, - 273: {208, 1}, - 274: {208, 1}, - 275: {208, 1}, - 276: {208, 1}, - 277: {208, 1}, - 278: {207, 1}, - 279: {207, 1}, - 280: {207, 1}, - 281: {207, 1}, - 282: {207, 1}, - 283: {207, 1}, - 284: {207, 1}, - 285: {207, 1}, - 286: {207, 1}, - 287: {207, 1}, - 288: {207, 1}, - 289: {207, 1}, - 290: {207, 1}, - 291: {207, 1}, - 292: {207, 1}, - 293: {207, 1}, - 294: {207, 1}, - 295: {207, 1}, - 296: {207, 1}, - 297: {207, 1}, - 298: {207, 1}, - 299: {207, 1}, - 300: {207, 1}, - 301: {207, 1}, - 302: {207, 1}, - 303: {207, 1}, - 304: {207, 1}, - 305: {207, 1}, - 306: {207, 1}, - 307: {207, 1}, - 308: {207, 1}, - 309: {207, 1}, - 310: {207, 1}, - 311: {207, 1}, - 312: {207, 1}, - 313: {207, 1}, - 314: {207, 1}, - 315: {207, 1}, - 316: {207, 1}, - 317: {207, 1}, - 318: {207, 1}, - 319: {207, 1}, - 320: {207, 1}, - 321: {377, 7}, - 322: {428, 0}, - 323: {428, 1}, - 324: {426, 5}, - 325: {426, 4}, - 326: {426, 4}, - 327: {426, 2}, - 328: {426, 1}, - 329: {426, 1}, - 330: {426, 2}, - 331: {388, 1}, - 332: {388, 1}, - 333: {357, 2}, - 334: {357, 4}, - 335: {357, 3}, - 336: {357, 5}, - 337: {400, 3}, - 338: {472, 0}, - 339: {472, 1}, - 340: {472, 3}, - 341: {507, 0}, - 342: {507, 5}, - 343: {380, 5}, - 344: {522, 0}, - 345: {522, 1}, - 346: {522, 1}, - 347: {257, 1}, - 348: {257, 1}, - 349: {257, 1}, - 350: {257, 1}, - 351: {257, 1}, - 352: {257, 1}, - 353: {257, 2}, - 354: {257, 1}, - 355: {257, 1}, - 356: {282, 1}, - 357: {282, 1}, - 358: {282, 3}, - 359: {282, 1}, - 360: {282, 4}, - 361: {282, 1}, - 362: {282, 1}, - 363: {282, 6}, - 364: {282, 5}, - 365: {282, 2}, - 366: {361, 3}, - 367: {394, 1}, - 368: {394, 3}, - 369: {367, 2}, - 370: {438, 0}, - 371: {438, 1}, - 372: {438, 1}, - 373: {362, 0}, - 374: {362, 1}, - 375: {283, 1}, - 376: {283, 1}, - 377: {283, 1}, - 378: {283, 2}, - 379: {283, 2}, - 380: {283, 2}, - 381: {283, 2}, - 382: {283, 2}, - 383: {283, 3}, - 384: {268, 1}, - 385: {268, 1}, - 386: {268, 1}, - 387: {268, 1}, - 388: {273, 1}, - 389: {273, 1}, - 390: {273, 1}, - 391: {273, 1}, - 392: {273, 1}, - 393: {273, 1}, - 394: {273, 1}, - 395: {273, 1}, - 396: {270, 4}, - 397: {270, 1}, - 398: {270, 1}, - 399: {339, 0}, - 400: {339, 1}, - 401: {339, 1}, - 402: {339, 2}, - 403: {271, 6}, - 404: {271, 5}, - 405: {271, 6}, - 406: {271, 6}, - 407: {271, 4}, - 408: {271, 3}, - 409: {271, 4}, - 410: {271, 4}, - 411: {271, 4}, - 412: {272, 4}, - 413: {272, 3}, - 414: {272, 4}, - 415: {272, 2}, - 416: {272, 2}, - 417: {272, 4}, - 418: {272, 4}, - 419: {272, 4}, - 420: {272, 4}, - 421: {272, 4}, - 422: {272, 4}, - 423: {272, 4}, - 424: {272, 4}, - 425: {272, 8}, - 426: {272, 6}, - 427: {272, 6}, - 428: {272, 3}, - 429: {272, 4}, - 430: {272, 4}, - 431: {272, 4}, - 432: {272, 6}, - 433: {272, 8}, - 434: {272, 4}, - 435: {272, 4}, - 436: {272, 4}, - 437: {272, 4}, - 438: {272, 4}, - 439: {272, 4}, - 440: {272, 6}, - 441: {272, 6}, - 442: {272, 4}, - 443: {272, 8}, - 444: {272, 4}, - 445: {272, 6}, - 446: {272, 6}, - 447: {272, 6}, - 448: {272, 8}, - 449: {272, 8}, - 450: {272, 8}, - 451: {272, 4}, - 452: {272, 4}, - 453: {272, 6}, - 454: {272, 6}, - 455: {272, 7}, - 456: {272, 4}, - 457: {272, 4}, - 458: {272, 4}, - 459: {272, 4}, - 460: {272, 3}, - 461: {262, 1}, - 462: {262, 1}, - 463: {261, 1}, - 464: {261, 1}, - 465: {479, 1}, - 466: {479, 3}, - 467: {543, 1}, - 468: {543, 1}, - 469: {543, 1}, - 470: {269, 5}, - 471: {269, 5}, - 472: {269, 5}, - 473: {269, 5}, - 474: {269, 5}, - 475: {269, 5}, - 476: {269, 5}, - 477: {423, 0}, - 478: {423, 2}, - 479: {423, 3}, - 480: {384, 1}, - 481: {384, 1}, - 482: {384, 1}, - 483: {384, 1}, - 484: {384, 1}, - 485: {384, 1}, - 486: {384, 1}, - 487: {384, 1}, - 488: {384, 1}, - 489: {384, 1}, - 490: {384, 1}, - 491: {384, 1}, - 492: {384, 1}, - 493: {384, 1}, - 494: {384, 1}, - 495: {384, 1}, - 496: {384, 1}, - 497: {384, 1}, - 498: {384, 1}, - 499: {384, 1}, - 500: {346, 0}, - 501: {346, 1}, - 502: {548, 1}, - 503: {548, 2}, - 504: {460, 4}, - 505: {484, 0}, - 506: {484, 2}, - 507: {395, 2}, - 508: {395, 4}, - 509: {395, 1}, - 510: {395, 2}, - 511: {395, 2}, - 512: {395, 2}, - 513: {395, 2}, - 514: {395, 2}, - 515: {296, 3}, - 516: {296, 3}, - 517: {296, 3}, - 518: {296, 3}, - 519: {296, 3}, - 520: {296, 3}, - 521: {296, 3}, - 522: {296, 3}, - 523: {296, 3}, - 524: {296, 3}, - 525: {296, 3}, - 526: {296, 3}, - 527: {296, 1}, - 528: {514, 0}, - 529: {514, 1}, - 530: {514, 1}, - 531: {514, 1}, - 532: {433, 0}, - 533: {433, 1}, - 534: {303, 1}, - 535: {303, 3}, - 536: {352, 1}, - 537: {352, 3}, - 538: {518, 0}, - 539: {518, 1}, - 540: {440, 4}, - 541: {513, 1}, - 542: {513, 1}, - 543: {418, 2}, - 544: {418, 4}, - 545: {546, 1}, - 546: {546, 3}, - 547: {409, 3}, - 548: {410, 1}, - 549: {410, 1}, - 550: {443, 1}, - 551: {307, 5}, - 552: {307, 7}, - 553: {307, 11}, - 554: {492, 2}, - 555: {540, 1}, - 556: {342, 1}, - 557: {342, 3}, - 558: {334, 1}, - 559: {334, 4}, - 560: {328, 1}, - 561: {328, 1}, - 562: {326, 2}, - 563: {326, 4}, - 564: {326, 4}, - 565: {326, 3}, - 566: {536, 0}, - 567: {536, 1}, - 568: {364, 1}, - 569: {364, 2}, - 570: {325, 3}, - 571: {325, 5}, - 572: {325, 7}, - 573: {347, 1}, - 574: {347, 1}, - 575: {510, 0}, - 576: {510, 1}, - 577: {344, 1}, - 578: {344, 2}, - 579: {344, 2}, - 580: {429, 0}, - 581: {429, 2}, - 582: {363, 0}, - 583: {363, 2}, - 584: {363, 4}, - 585: {363, 4}, - 586: {525, 0}, - 587: {525, 1}, - 588: {525, 1}, - 589: {528, 2}, - 590: {524, 0}, - 591: {524, 1}, - 592: {526, 1}, - 593: {527, 0}, - 594: {527, 1}, - 595: {246, 3}, - 596: {246, 3}, - 597: {381, 0}, - 598: {381, 2}, - 599: {381, 4}, - 600: {317, 4}, - 601: {317, 8}, - 602: {316, 1}, - 603: {316, 4}, - 604: {315, 1}, - 605: {315, 3}, - 606: {545, 0}, - 607: {545, 1}, - 608: {545, 1}, - 609: {444, 2}, - 610: {444, 3}, - 611: {444, 5}, - 612: {444, 3}, - 613: {444, 4}, - 614: {444, 6}, - 615: {444, 4}, - 616: {444, 4}, - 617: {452, 1}, - 618: {452, 3}, - 619: {385, 3}, - 620: {385, 2}, - 621: {385, 2}, - 622: {499, 2}, - 623: {499, 2}, - 624: {499, 2}, - 625: {499, 1}, - 626: {459, 3}, - 627: {459, 4}, - 628: {459, 4}, - 629: {459, 4}, - 630: {459, 3}, - 631: {459, 3}, - 632: {547, 0}, - 633: {547, 1}, - 634: {547, 3}, - 635: {294, 1}, - 636: {294, 1}, - 637: {287, 1}, - 638: {252, 1}, - 639: {354, 3}, - 640: {439, 1}, - 641: {439, 4}, - 642: {392, 1}, - 643: {389, 3}, - 644: {389, 4}, - 645: {445, 3}, - 646: {445, 4}, - 647: {445, 2}, - 648: {445, 4}, - 649: {445, 4}, - 650: {531, 1}, - 651: {531, 1}, - 652: {531, 1}, - 653: {531, 2}, - 654: {531, 3}, - 655: {531, 3}, - 656: {531, 4}, - 657: {531, 4}, - 658: {531, 1}, - 659: {531, 2}, - 660: {531, 2}, - 661: {531, 1}, - 662: {531, 2}, - 663: {531, 2}, - 664: {530, 0}, - 665: {530, 2}, - 666: {530, 2}, - 667: {493, 0}, - 668: {493, 1}, - 669: {493, 1}, - 670: {508, 0}, - 671: {508, 1}, - 672: {351, 0}, - 673: {351, 2}, - 674: {351, 2}, - 675: {446, 2}, - 676: {446, 2}, - 677: {447, 1}, - 678: {447, 1}, - 679: {447, 1}, - 680: {447, 1}, - 681: {447, 1}, - 682: {447, 1}, - 683: {447, 1}, - 684: {447, 1}, - 685: {447, 1}, - 686: {447, 1}, - 687: {447, 1}, - 688: {447, 1}, - 689: {447, 1}, - 690: {447, 1}, - 691: {447, 1}, - 692: {447, 1}, - 693: {447, 1}, - 694: {447, 1}, - 695: {447, 1}, - 696: {447, 1}, - 697: {447, 1}, - 698: {447, 1}, - 699: {447, 1}, - 700: {447, 1}, - 701: {447, 1}, - 702: {447, 1}, - 703: {447, 1}, - 704: {447, 1}, - 705: {447, 1}, - 706: {447, 1}, - 707: {447, 1}, - 708: {447, 1}, - 709: {485, 1}, - 710: {485, 1}, - 711: {485, 1}, - 712: {485, 1}, - 713: {485, 1}, - 714: {534, 1}, - 715: {534, 3}, - 716: {370, 2}, - 717: {450, 1}, - 718: {450, 1}, - 719: {450, 4}, - 720: {537, 1}, - 721: {537, 3}, - 722: {353, 2}, - 723: {353, 3}, - 724: {353, 4}, - 725: {353, 4}, - 726: {353, 3}, - 727: {353, 3}, - 728: {353, 3}, - 729: {353, 3}, - 730: {353, 3}, - 731: {353, 3}, - 732: {353, 3}, - 733: {353, 3}, - 734: {353, 3}, - 735: {353, 3}, - 736: {353, 3}, - 737: {353, 1}, - 738: {383, 0}, - 739: {383, 1}, - 740: {382, 1}, - 741: {382, 2}, - 742: {382, 3}, - 743: {453, 3}, - 744: {349, 3}, - 745: {349, 3}, - 746: {349, 3}, - 747: {349, 3}, - 748: {349, 3}, - 749: {349, 3}, - 750: {544, 1}, - 751: {544, 1}, - 752: {544, 1}, - 753: {544, 1}, - 754: {544, 1}, - 755: {544, 1}, - 756: {544, 1}, - 757: {544, 1}, - 758: {544, 1}, - 759: {505, 3}, - 760: {505, 3}, - 761: {505, 3}, - 762: {505, 2}, - 763: {498, 1}, - 764: {498, 1}, - 765: {498, 1}, - 766: {498, 1}, - 767: {498, 1}, - 768: {498, 1}, - 769: {498, 1}, - 770: {498, 1}, - 771: {437, 0}, - 772: {437, 1}, - 773: {490, 1}, - 774: {490, 1}, - 775: {491, 1}, - 776: {491, 1}, - 777: {491, 1}, - 778: {491, 2}, - 779: {465, 1}, - 780: {535, 6}, - 781: {535, 5}, - 782: {535, 6}, - 783: {535, 2}, - 784: {535, 2}, - 785: {535, 1}, - 786: {535, 4}, - 787: {535, 6}, - 788: {535, 6}, - 789: {504, 0}, - 790: {504, 1}, - 791: {466, 1}, - 792: {466, 2}, - 793: {466, 1}, - 794: {466, 1}, - 795: {541, 1}, - 796: {541, 2}, - 797: {541, 1}, - 798: {541, 1}, - 799: {478, 1}, - 800: {478, 2}, - 801: {478, 2}, - 802: {478, 2}, - 803: {478, 2}, - 804: {306, 3}, - 805: {312, 0}, - 806: {312, 1}, - 807: {373, 1}, - 808: {373, 1}, - 809: {374, 0}, - 810: {374, 2}, - 811: {375, 0}, - 812: {375, 1}, - 813: {375, 1}, - 814: {379, 5}, - 815: {348, 0}, - 816: {348, 1}, - 817: {336, 0}, - 818: {336, 2}, - 819: {323, 2}, - 820: {323, 1}, - 821: {341, 0}, - 822: {341, 2}, - 823: {448, 1}, - 824: {448, 3}, - 825: {321, 1}, - 826: {321, 1}, - 827: {386, 9}, - 828: {386, 7}, - 829: {458, 2}, - 830: {337, 2}, - 831: {338, 0}, - 832: {338, 1}, - 833: {553, 0}, - 834: {553, 1}, - 835: {405, 4}, - 836: {387, 2}, - 837: {457, 1}, - 838: {457, 3}, - 839: {464, 0}, - 840: {464, 3}, - 841: {464, 4}, - 842: {495, 1}, - 843: {424, 7}, - 844: {441, 1}, - 845: {441, 4}, - 846: {515, 1}, - 847: {515, 3}, - 848: {442, 1}, - 849: {442, 1}, - 850: {442, 1}, - 851: {442, 2}, - 852: {442, 1}, - 853: {442, 1}, - 854: {442, 1}, - 855: {442, 1}, - 856: {442, 1}, - 857: {442, 1}, - 858: {442, 2}, - 859: {442, 1}, - 860: {442, 2}, - 861: {506, 0}, - 862: {506, 1}, - 863: {516, 1}, - 864: {516, 3}, - 865: {516, 3}, - 866: {516, 3}, - 867: {516, 1}, - 868: {455, 2}, - 869: {432, 3}, - 870: {451, 2}, - 871: {503, 1}, - 872: {503, 2}, - 873: {503, 1}, - 874: {538, 1}, - 875: {538, 3}, - } - - yyXErrors = map[yyXError]string{ - yyXError{1, -1}: "expected $end", - yyXError{392, -1}: "expected '('", - yyXError{393, -1}: "expected '('", - yyXError{394, -1}: "expected '('", - yyXError{395, -1}: "expected '('", - yyXError{396, -1}: "expected '('", - yyXError{399, -1}: "expected '('", - yyXError{400, -1}: "expected '('", - yyXError{402, -1}: "expected '('", - yyXError{403, -1}: "expected '('", - yyXError{404, -1}: "expected '('", - yyXError{407, -1}: "expected '('", - yyXError{408, -1}: "expected '('", - yyXError{409, -1}: "expected '('", - yyXError{410, -1}: "expected '('", - yyXError{411, -1}: "expected '('", - yyXError{412, -1}: "expected '('", - yyXError{413, -1}: "expected '('", - yyXError{414, -1}: "expected '('", - yyXError{834, -1}: "expected '('", - yyXError{999, -1}: "expected '('", - yyXError{1105, -1}: "expected '('", - yyXError{1106, -1}: "expected '('", - yyXError{1201, -1}: "expected '('", - yyXError{1209, -1}: "expected '('", - yyXError{1222, -1}: "expected '('", - yyXError{1235, -1}: "expected '('", - yyXError{1243, -1}: "expected '('", - yyXError{1245, -1}: "expected '('", - yyXError{1260, -1}: "expected '('", - yyXError{1265, -1}: "expected '('", - yyXError{1271, -1}: "expected '('", - yyXError{1277, -1}: "expected '('", - yyXError{1283, -1}: "expected '('", - yyXError{1289, -1}: "expected '('", - yyXError{1390, -1}: "expected '('", - yyXError{1391, -1}: "expected '('", - yyXError{1465, -1}: "expected '('", - yyXError{1512, -1}: "expected '('", - yyXError{287, -1}: "expected ')'", - yyXError{434, -1}: "expected ')'", - yyXError{480, -1}: "expected ')'", - yyXError{483, -1}: "expected ')'", - yyXError{490, -1}: "expected ')'", - yyXError{498, -1}: "expected ')'", - yyXError{501, -1}: "expected ')'", - yyXError{507, -1}: "expected ')'", - yyXError{510, -1}: "expected ')'", - yyXError{516, -1}: "expected ')'", - yyXError{517, -1}: "expected ')'", - yyXError{518, -1}: "expected ')'", - yyXError{519, -1}: "expected ')'", - yyXError{524, -1}: "expected ')'", - yyXError{526, -1}: "expected ')'", - yyXError{532, -1}: "expected ')'", - yyXError{534, -1}: "expected ')'", - yyXError{538, -1}: "expected ')'", - yyXError{546, -1}: "expected ')'", - yyXError{548, -1}: "expected ')'", - yyXError{565, -1}: "expected ')'", - yyXError{570, -1}: "expected ')'", - yyXError{584, -1}: "expected ')'", - yyXError{586, -1}: "expected ')'", - yyXError{591, -1}: "expected ')'", - yyXError{660, -1}: "expected ')'", - yyXError{673, -1}: "expected ')'", - yyXError{716, -1}: "expected ')'", - yyXError{736, -1}: "expected ')'", - yyXError{740, -1}: "expected ')'", - yyXError{742, -1}: "expected ')'", - yyXError{761, -1}: "expected ')'", - yyXError{1001, -1}: "expected ')'", - yyXError{1017, -1}: "expected ')'", - yyXError{1125, -1}: "expected ')'", - yyXError{1489, -1}: "expected ')'", - yyXError{250, -1}: "expected '*'", - yyXError{854, -1}: "expected =", - yyXError{953, -1}: "expected =", - yyXError{954, -1}: "expected =", - yyXError{955, -1}: "expected =", - yyXError{968, -1}: "expected =", - yyXError{971, -1}: "expected =", - yyXError{995, -1}: "expected =", - yyXError{1007, -1}: "expected =", - yyXError{1109, -1}: "expected =", - yyXError{1301, -1}: "expected =", - yyXError{1252, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1303, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1305, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1308, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1309, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1310, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1311, -1}: "expected = or empty or Field length num(uint64) or one of [=, integer literal]", - yyXError{1307, -1}: "expected = or empty or identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1315, -1}: "expected = or empty or one of [=, COMPACT, COMPRESSED, DEFAULT, DYNAMIC, FIXED, REDUNDANT]", - yyXError{1302, -1}: "expected = or empty or one of [=, string literal]", - yyXError{1304, -1}: "expected = or empty or one of [=, string literal]", - yyXError{1306, -1}: "expected = or empty or one of [=, string literal]", - yyXError{1348, -1}: "expected = or empty or string literal or identifier or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1349, -1}: "expected = or empty or string literal or identifier or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1503, -1}: "expected = or empty or string literal or identifier or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1504, -1}: "expected = or empty or string literal or identifier or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{253, -1}: "expected AT", - yyXError{1519, -1}: "expected Alter table specification list or one of [$end, ',', ';', ADD, AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, DROP, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1544, -1}: "expected Alter table specification or one of [$end, ',', ';', ADD, AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, DROP, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{821, -1}: "expected Any or All for subquery or Predicate expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{260, -1}: "expected BY", - yyXError{862, -1}: "expected BY", - yyXError{1046, -1}: "expected BY", - yyXError{872, -1}: "expected BY item or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{868, -1}: "expected BY list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1061, -1}: "expected BY list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1497, -1}: "expected CREATE Database specification list opt or one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{1500, -1}: "expected CREATE Database specification or one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{8, -1}: "expected CREATE INDEX optional UNIQUE clause or DATABASE or SCHEMA or one of [DATABASE, INDEX, SCHEMA, TABLE, UNIQUE, USER]", - yyXError{1473, -1}: "expected CURRENT_TIMESTAMP/LOCALTIME/LOCALTIMESTAMP/NOW or one of [CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, NOW]", - yyXError{506, -1}: "expected Cast function target type or one of [BINARY, CHAR, DATE, DATETIME, DECIMAL, SIGNED, TIME, UNSIGNED]", - yyXError{564, -1}: "expected Cast function target type or one of [BINARY, CHAR, DATE, DATETIME, DECIMAL, SIGNED, TIME, UNSIGNED]", - yyXError{1523, -1}: "expected Column keyword or empty or column name or {KEY|INDEX} or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMN, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOREIGN, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1522, -1}: "expected Column keyword or empty or table column definition or table constraint or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMN, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONSTRAINT, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOREIGN, FOUND_ROWS, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNIQUE, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1539, -1}: "expected Column position [First|After ColumnName] or one of [$end, ',', ';', AFTER, FIRST]", - yyXError{313, -1}: "expected Compare opcode or one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{1203, -1}: "expected Constraint Symbol or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOREIGN, FOUND_ROWS, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNIQUE, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1532, -1}: "expected Constraint Symbol or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{842, -1}: "expected Cross join option or join type or one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{284, -1}: "expected Cross join option or join type or one of [$end, ')', ',', ';', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{277, -1}: "expected Cross join option or join type or one of [',', CROSS, INNER, JOIN, LEFT, RIGHT, SET]", - yyXError{851, -1}: "expected Cross join option or join type or one of ['}', CROSS, INNER, JOIN, LEFT, RIGHT]", - yyXError{309, -1}: "expected Cross join option or join type or one of [CROSS, INNER, JOIN, LEFT, ON, RIGHT]", - yyXError{11, -1}: "expected DATABASE or SCHEMA or TableOrTables or one of [DATABASE, INDEX, PREPARE, SCHEMA, TABLE, TABLES]", - yyXError{222, -1}: "expected DATABASES", - yyXError{937, -1}: "expected DDL", - yyXError{1140, -1}: "expected DUPLICATE", - yyXError{1155, -1}: "expected Database Name or If Exists or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1192, -1}: "expected Database Name or If Not Exists or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{65, -1}: "expected Database Name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{905, -1}: "expected Database Name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{906, -1}: "expected Database Name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1170, -1}: "expected Database Name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1496, -1}: "expected Database Name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{478, -1}: "expected Date arith interval part or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, INTERVAL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1462, -1}: "expected DefaultValueExpr(Now or Signed Literal) or one of ['+', '-', CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, NOW, NULL, UNDERSCORE_CHARSET, bit literal, false, floating-point literal, hexadecimal literal, integer literal, string literal, true]", - yyXError{733, -1}: "expected Distinct option or expression list or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{712, -1}: "expected Distinct option or expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{772, -1}: "expected Distinct option or expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{628, -1}: "expected Distinct option or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{684, -1}: "expected Distinct option or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{691, -1}: "expected Distinct option or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{557, -1}: "expected END", - yyXError{1161, -1}: "expected EXISTS", - yyXError{1165, -1}: "expected EXISTS", - yyXError{1198, -1}: "expected EXISTS", - yyXError{1038, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or FromDual or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1042, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or HAVING clause or Optinal WHERE clause or Optional ORDER BY clause optional or SELECT statement optional GROUP BY clause or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, UNION, WHERE]", - yyXError{1045, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or HAVING clause or Optional ORDER BY clause optional or SELECT statement optional GROUP BY clause or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1047, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or HAVING clause or Optional ORDER BY clause optional or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1040, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or Optinal WHERE clause or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, UNION, WHERE]", - yyXError{1050, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or Optional ORDER BY clause optional or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1051, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, UNION]", - yyXError{1063, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or SELECT statement optional LIMIT clause or one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, UNION]", - yyXError{1039, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or one of [$end, ')', ';', FOR, LOCK, ON, UNION]", - yyXError{1052, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or one of [$end, ')', ';', FOR, LOCK, ON, UNION]", - yyXError{1064, -1}: "expected FOR UPDATE or LOCK IN SHARE MODE, or one of [$end, ')', ';', FOR, LOCK, ON, UNION]", - yyXError{452, -1}: "expected FROM", - yyXError{888, -1}: "expected FROM", - yyXError{1089, -1}: "expected FROM", - yyXError{1034, -1}: "expected Field alias name opt or logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, XOR, YEAR, YEARWEEK, identifier, string literal, ||]", - yyXError{520, -1}: "expected Field length num(uint64) or integer literal", - yyXError{527, -1}: "expected Field length num(uint64) or integer literal", - yyXError{531, -1}: "expected Field length num(uint64) or integer literal", - yyXError{865, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1020, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1023, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1024, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1257, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1326, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1328, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1330, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1332, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1338, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1342, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1346, -1}: "expected Field length num(uint64) or integer literal", - yyXError{1387, -1}: "expected Field length or '('", - yyXError{1433, -1}: "expected Field length or '('", - yyXError{1432, -1}: "expected Field length or Optional BINARY or Optional Character setting or Optional Collate setting or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1367, -1}: "expected Field length or empty or Field type definition option list or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1226, -1}: "expected Field length or empty or ORDER BY clause optional collation specification or one of ['(', ')', ',', ASC, DESC]", - yyXError{509, -1}: "expected Field length or empty or Optional BINARY or Optional Character setting or one of ['(', ')', BINARY, CHARACTER, CHARSET]", - yyXError{1398, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1370, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1386, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1394, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1402, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1403, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1404, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1405, -1}: "expected Field length or empty or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{508, -1}: "expected Field length or empty or one of ['(', ')']", - yyXError{511, -1}: "expected Field length or empty or one of ['(', ')']", - yyXError{513, -1}: "expected Field length or empty or one of ['(', ')']", - yyXError{1368, -1}: "expected Field type definition option list or Floating-point type option or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1369, -1}: "expected Field type definition option list or Floating-point type option or one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1447, -1}: "expected Field type definition option list or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1452, -1}: "expected Field type definition option list or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1454, -1}: "expected Field type definition option list or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1448, -1}: "expected Field type definition option or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1453, -1}: "expected Field type definition option or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1455, -1}: "expected Field type definition option or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{512, -1}: "expected Floating-point type option or one of ['(', ')']", - yyXError{405, -1}: "expected Function datetime precision or one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{406, -1}: "expected Function datetime precision or one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{239, -1}: "expected Grant statement object type or Privilege scope or one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLE, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{264, -1}: "expected Hashed string or string literal", - yyXError{16, -1}: "expected IGNORE or empty or INTO or EmptyString or Table name or insert statement priority or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAYED, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HIGH_PRIORITY, HOUR, IDENTIFIED, IFNULL, IGNORE, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, LOW_PRIORITY, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1131, -1}: "expected IGNORE or empty or INTO or EmptyString or Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{10, -1}: "expected IGNORE or empty or LOW_PRIORITY or empty or QUICK or empty or Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, LOW_PRIORITY, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{64, -1}: "expected IGNORE or empty or LOW_PRIORITY or empty or table reference or table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, LOW_PRIORITY, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1172, -1}: "expected IGNORE or empty or QUICK or empty or Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1173, -1}: "expected IGNORE or empty or Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{4, -1}: "expected IGNORE or empty or one of [IGNORE, TABLE]", - yyXError{272, -1}: "expected IGNORE or empty or table reference or table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1055, -1}: "expected IN", - yyXError{1190, -1}: "expected INDEX", - yyXError{1191, -1}: "expected INDEX", - yyXError{487, -1}: "expected INTERVAL", - yyXError{1094, -1}: "expected INTO or EmptyString or Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1135, -1}: "expected INTO or EmptyString or Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{17, -1}: "expected INTO or EmptyString or Table name or replace statement priority or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAYED, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, LOW_PRIORITY, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1156, -1}: "expected If Exists or identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1193, -1}: "expected If Not Exists or Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1194, -1}: "expected If Not Exists or Username and auth option list or one of [IF, string literal]", - yyXError{1250, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1263, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1268, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1274, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1280, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1286, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1292, -1}: "expected Index Option or one of [$end, ')', ',', ';', COMMENT, KEY_BLOCK_SIZE, USING]", - yyXError{1231, -1}: "expected Index column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{981, -1}: "expected Isolation level or one of [READ, REPEATABLE, SERIALIZABLE]", - yyXError{302, -1}: "expected JOIN", - yyXError{303, -1}: "expected JOIN", - yyXError{306, -1}: "expected JOIN", - yyXError{307, -1}: "expected JOIN", - yyXError{1141, -1}: "expected KEY", - yyXError{1214, -1}: "expected KEY", - yyXError{1215, -1}: "expected KEY", - yyXError{1219, -1}: "expected KEY", - yyXError{1460, -1}: "expected KEY", - yyXError{1526, -1}: "expected KEY", - yyXError{1528, -1}: "expected KEY", - yyXError{977, -1}: "expected LEVEL", - yyXError{1181, -1}: "expected LIMIT clause or Optinal WHERE clause or Optional ORDER BY clause optional or one of [$end, ',', ';', LIMIT, ORDER, USING, WHERE]", - yyXError{856, -1}: "expected LIMIT clause or Optinal WHERE clause or Optional ORDER BY clause optional or one of [$end, ',', ';', LIMIT, ORDER, WHERE]", - yyXError{858, -1}: "expected LIMIT clause or Optional ORDER BY clause optional or one of [$end, ';', LIMIT, ORDER]", - yyXError{1186, -1}: "expected LIMIT clause or Optional ORDER BY clause optional or one of [$end, ';', LIMIT, ORDER]", - yyXError{864, -1}: "expected LIMIT clause or one of [$end, ';', LIMIT]", - yyXError{1187, -1}: "expected LIMIT clause or one of [$end, ';', LIMIT]", - yyXError{1224, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1236, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1248, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1261, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1266, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1272, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1278, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1284, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1290, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1513, -1}: "expected List of index column name or one of [')', ',', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1057, -1}: "expected MODE", - yyXError{1195, -1}: "expected NOT", - yyXError{1457, -1}: "expected NULL", - yyXError{1483, -1}: "expected Num/Int/Float/Decimal Literal or one of [floating-point literal, integer literal]", - yyXError{1484, -1}: "expected Num/Int/Float/Decimal Literal or one of [floating-point literal, integer literal]", - yyXError{1167, -1}: "expected ON", - yyXError{1510, -1}: "expected ON", - yyXError{1138, -1}: "expected ON DUPLICATE KEY UPDATE value list or one of [$end, ';', ON]", - yyXError{224, -1}: "expected OPTION", - yyXError{869, -1}: "expected ORDER BY clause optional collation specification or logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', AND, ASC, DESC, FOR, HAVING, LIMIT, LOCK, ON, OR, ORDER, UNION, XOR, ||]", - yyXError{1228, -1}: "expected ORDER BY clause optional collation specification or one of [')', ',', ASC, DESC]", - yyXError{881, -1}: "expected Optinal WHERE clause or one of [$end, ',', ';', WHERE]", - yyXError{1179, -1}: "expected Optinal WHERE clause or one of [$end, ',', ';', WHERE]", - yyXError{1184, -1}: "expected Optinal WHERE clause or one of [$end, ',', ';', WHERE]", - yyXError{1389, -1}: "expected Optional BINARY or Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1434, -1}: "expected Optional BINARY or Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1438, -1}: "expected Optional BINARY or Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{535, -1}: "expected Optional BINARY or Optional Character setting or one of [')', BINARY, CHARACTER, CHARSET]", - yyXError{1415, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1424, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1427, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1435, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1439, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1442, -1}: "expected Optional Character setting or Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{536, -1}: "expected Optional Character setting or one of [')', CHARACTER, CHARSET]", - yyXError{1418, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1425, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1428, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1436, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1440, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1443, -1}: "expected Optional Collate setting or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{514, -1}: "expected Optional Integer keyword or one of [')', INTEGER]", - yyXError{515, -1}: "expected Optional Integer keyword or one of [')', INTEGER]", - yyXError{1018, -1}: "expected Optional ORDER BY clause optional or SELECT statement optional LIMIT clause or one of [$end, ')', ';', LIMIT, ON, ORDER, UNION]", - yyXError{551, -1}: "expected Optional else clause or When clause or one of [ELSE, END, WHEN]", - yyXError{401, -1}: "expected Optional expression or When clause list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{432, -1}: "expected Optional expression or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{659, -1}: "expected Optional expression or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{672, -1}: "expected Optional expression or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{739, -1}: "expected Optional expression or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1218, -1}: "expected Optional index type or index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1216, -1}: "expected Optional index type or index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1217, -1}: "expected Optional index type or index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1240, -1}: "expected Optional index type or index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1241, -1}: "expected Optional index type or index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1239, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{1242, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{1259, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{1270, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{1276, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{1288, -1}: "expected Optional index type or one of ['(', USING]", - yyXError{20, -1}: "expected PREPARE", - yyXError{21, -1}: "expected PREPARE", - yyXError{993, -1}: "expected Password option or one of [PASSWORD, string literal]", - yyXError{996, -1}: "expected Password option or one of [PASSWORD, string literal]", - yyXError{261, -1}: "expected Password string value or one of [PASSWORD, string literal]", - yyXError{1000, -1}: "expected Password string value or string literal", - yyXError{814, -1}: "expected Predicate expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1090, -1}: "expected Prepare statement sql string or one of [USER_VAR, string literal]", - yyXError{66, -1}: "expected Privilege element list or one of [ALL, ALTER, CREATE, DELETE, DROP, EXECUTE, GRANT, INDEX, INSERT, SELECT, SHOW, UPDATE]", - yyXError{240, -1}: "expected Privilege element or one of [ALL, ALTER, CREATE, DELETE, DROP, EXECUTE, GRANT, INDEX, INSERT, SELECT, SHOW, UPDATE]", - yyXError{242, -1}: "expected Privilege scope or one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{983, -1}: "expected READ", - yyXError{776, -1}: "expected REGEXP or RLIKE or one of [BETWEEN, IN, LIKE, REGEXP, RLIKE]", - yyXError{315, -1}: "expected REGEXP or RLIKE or optional NOT or one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{1230, -1}: "expected Reference definition or REFERENCES", - yyXError{1099, -1}: "expected Rest part of INSERT/REPLACE INTO statement or one of ['(', SELECT, SET, VALUE, VALUES]", - yyXError{1137, -1}: "expected Rest part of INSERT/REPLACE INTO statement or one of ['(', SELECT, SET, VALUE, VALUES]", - yyXError{23, -1}: "expected SELECT statement field list or Select statement options or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DISTINCT, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1027, -1}: "expected SELECT statement field list or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1019, -1}: "expected SELECT statement optional LIMIT clause or one of [$end, ')', ';', LIMIT, ON]", - yyXError{1030, -1}: "expected SELECT statement optional SQL_CALC_FOUND_ROWS or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{585, -1}: "expected SELECT statement or SELECT", - yyXError{1015, -1}: "expected SELECT statement or SELECT", - yyXError{1010, -1}: "expected SELECT statement or Union (select) item or Union Option(empty/ALL/DISTINCT) or one of ['(', ALL, DISTINCT, SELECT]", - yyXError{1011, -1}: "expected SELECT statement or Union (select) item or one of ['(', SELECT]", - yyXError{1126, -1}: "expected SELECT statement or Union select state ment or Value or Values or one of ['(', SELECT, VALUE, VALUES]", - yyXError{816, -1}: "expected SELECT statement or Union select state ment or expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{374, -1}: "expected SELECT statement or Union select state ment or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{594, -1}: "expected SELECT statement or Union select state ment or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{24, -1}: "expected SELECT statement or Union select state ment or one of ['(', SELECT]", - yyXError{582, -1}: "expected SELECT statement or Union select state ment or one of ['(', SELECT]", - yyXError{282, -1}: "expected SELECT statement or Union select state ment or table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{285, -1}: "expected SELECT statement or Union select state ment or table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1100, -1}: "expected SELECT statement or column name list opt or one of [')', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{540, -1}: "expected SET", - yyXError{892, -1}: "expected SET", - yyXError{1056, -1}: "expected SHARE", - yyXError{894, -1}: "expected STATUS", - yyXError{899, -1}: "expected STATUS", - yyXError{885, -1}: "expected Show like or where clause option or one of [$end, ';', LIKE, WHERE]", - yyXError{914, -1}: "expected Show table alias option or one of [FROM, IN]", - yyXError{915, -1}: "expected Show table alias option or one of [FROM, IN]", - yyXError{898, -1}: "expected Show tables/columns statement database name option or one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{911, -1}: "expected Show tables/columns statement database name option or one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{913, -1}: "expected Show tables/columns statement database name option or one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{916, -1}: "expected Show tables/columns statement database name option or one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{922, -1}: "expected Show tables/columns statement database name option or one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{30, -1}: "expected Show target that can be filtered by WHERE or LIKE or one of [CHARACTER, COLLATION, COLUMNS, CREATE, DATABASES, ENGINES, FIELDS, FULL, GLOBAL, GRANTS, INDEX, PROCEDURE, SCHEMAS, SESSION, STATUS, TABLE, TABLES, TRIGGERS, VARIABLES, WARNINGS]", - yyXError{0, -1}: "expected Start or one of [$end, '(', ';', ADMIN, ALTER, BEGIN, COMMIT, CREATE, DEALLOCATE, DELETE, DESC, DESCRIBE, DO, DROP, EXECUTE, EXPLAIN, GRANT, INSERT, LOCK, PREPARE, REPLACE, ROLLBACK, SELECT, SET, SHOW, START, TRUNCATE, UNLOCK, UPDATE, USE, parse expression prefix]", - yyXError{378, -1}: "expected Sub Select or '('", - yyXError{802, -1}: "expected Sub Select or '('", - yyXError{831, -1}: "expected Sub Select or '('", - yyXError{63, -1}: "expected TABLE", - yyXError{886, -1}: "expected TABLE", - yyXError{938, -1}: "expected TABLE", - yyXError{1517, -1}: "expected TABLE", - yyXError{67, -1}: "expected TABLES", - yyXError{68, -1}: "expected TABLES", - yyXError{244, -1}: "expected TO", - yyXError{248, -1}: "expected TO", - yyXError{249, -1}: "expected TO", - yyXError{251, -1}: "expected TO", - yyXError{6, -1}: "expected TRANSACTION", - yyXError{69, -1}: "expected Table lock list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{199, -1}: "expected Table locks type or one of [READ, WRITE]", - yyXError{205, -1}: "expected Table name and lock type or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1175, -1}: "expected Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1157, -1}: "expected Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{939, -1}: "expected Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1162, -1}: "expected Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1176, -1}: "expected Table name or Table name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{15, -1}: "expected Table name or explainable statement or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DELETE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INSERT, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, UPDATE, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{883, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{917, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{918, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{926, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{930, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{942, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1098, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1136, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1168, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1200, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1234, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1511, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1518, -1}: "expected Table name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1041, -1}: "expected Table references clause or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DUAL, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{482, -1}: "expected Time unit or logical and operator or logical or operator or one of [&&, AND, DAY, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, MICROSECOND, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MONTH, OR, QUARTER, SECOND, SECOND_MICROSECOND, WEEK, XOR, YEAR, YEAR_MONTH, ||]", - yyXError{489, -1}: "expected Time unit or logical and operator or logical or operator or one of [&&, AND, DAY, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, MICROSECOND, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MONTH, OR, QUARTER, SECOND, SECOND_MICROSECOND, WEEK, XOR, YEAR, YEAR_MONTH, ||]", - yyXError{451, -1}: "expected Time unit or one of [DAY, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, MICROSECOND, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MONTH, QUARTER, SECOND, SECOND_MICROSECOND, WEEK, YEAR, YEAR_MONTH]", - yyXError{974, -1}: "expected Transaction characteristic list or one of [=, ISOLATION, READ]", - yyXError{991, -1}: "expected Transaction characteristic list or one of [=, ISOLATION, READ]", - yyXError{989, -1}: "expected Transaction characteristic or one of [ISOLATION, READ]", - yyXError{611, -1}: "expected Trim string direction or expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BOTH, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEADING, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRAILING, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1204, -1}: "expected Types or one of [BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, DOUBLE, ENUM, INT, INTEGER, LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NATIONAL, NUMERIC, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR, float, float32, float64, int64, string, uint, uint64]", - yyXError{25, -1}: "expected UNION", - yyXError{26, -1}: "expected UNION", - yyXError{587, -1}: "expected UNION", - yyXError{1016, -1}: "expected UNION", - yyXError{1054, -1}: "expected UPDATE", - yyXError{1142, -1}: "expected UPDATE", - yyXError{1463, -1}: "expected UPDATE", - yyXError{254, -1}: "expected User auth option or one of [$end, ',', ';', IDENTIFIED]", - yyXError{1084, -1}: "expected User defined variable name list or USER_VAR", - yyXError{1087, -1}: "expected User defined variable name or USER_VAR", - yyXError{252, -1}: "expected Username and auth option list or string literal", - yyXError{1196, -1}: "expected Username and auth option list or string literal", - yyXError{257, -1}: "expected Username and auth option or string literal", - yyXError{928, -1}: "expected Username or string literal", - yyXError{994, -1}: "expected Username or string literal", - yyXError{550, -1}: "expected When clause list or WHEN", - yyXError{853, -1}: "expected assignment list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{880, -1}: "expected assignment list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1143, -1}: "expected assignment list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{857, -1}: "expected assignment or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1300, -1}: "expected charset or charater set or one of [CHARACTER, CHARSET, COLLATE]", - yyXError{1499, -1}: "expected charset or charater set or one of [CHARACTER, CHARSET, COLLATE]", - yyXError{28, -1}: "expected charset or charater set or set variable value list or one of [$end, ',', ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARACTER, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USER_VAR, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1467, -1}: "expected column definition option or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{228, -1}: "expected column name list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1145, -1}: "expected column name or one of [$end, ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{232, -1}: "expected column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{500, -1}: "expected column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{590, -1}: "expected column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1525, -1}: "expected column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1542, -1}: "expected column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1294, -1}: "expected create table option list opt or one of [$end, ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1313, -1}: "expected create table option or one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1324, -1}: "expected create table option or one of [AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{845, -1}: "expected escaped table reference or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1101, -1}: "expected expression list list or '('", - yyXError{1119, -1}: "expected expression list list or '('", - yyXError{1122, -1}: "expected expression list list or '('", - yyXError{1127, -1}: "expected expression list list or '('", - yyXError{567, -1}: "expected expression list opt or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1116, -1}: "expected expression list or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{734, -1}: "expected expression list or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{9, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{598, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{602, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{678, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{706, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{713, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{744, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{747, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{750, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{758, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{763, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{773, -1}: "expected expression list or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{493, -1}: "expected expression or one of ['!', '(', ')', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{613, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{3, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{310, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{312, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{419, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{421, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{422, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{423, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{436, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{438, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{441, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{443, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{445, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{448, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{473, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{476, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{481, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{485, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{488, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{503, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{553, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{555, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{559, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{562, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{572, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{605, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{608, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{618, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{621, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{625, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{631, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{635, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{637, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{639, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{642, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{644, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{645, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{648, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{653, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{656, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{662, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{664, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{667, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{669, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{675, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{681, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{685, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{688, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{692, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{695, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{697, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{700, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{703, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{709, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{718, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{721, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{724, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{727, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{730, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{753, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{756, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{766, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{769, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{843, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{859, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{878, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{934, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{957, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{959, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{961, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{969, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{972, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1008, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1049, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1111, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1211, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1469, -1}: "expected expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1067, -1}: "expected field expression or one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{247, -1}: "expected identifier or unreserved keyword or one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1076, -1}: "expected identifier or unreserved keyword or one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1079, -1}: "expected identifier or unreserved keyword or one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{946, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{949, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{950, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{965, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{966, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1299, -1}: "expected identifier or unreserved keyword or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1072, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{18, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{19, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{207, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{235, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{237, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{278, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{291, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1081, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1164, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1334, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1355, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1509, -1}: "expected identifier or unreserved keyword or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1527, -1}: "expected index name or one of [$end, ',', ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1221, -1}: "expected index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1282, -1}: "expected index name or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1104, -1}: "expected insert statement set value by column name list or one of [$end, ',', ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1113, -1}: "expected insert statement set value by column name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{809, -1}: "expected like escape option or one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{429, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{430, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{431, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{841, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{311, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', AND, CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, OR, ORDER, RIGHT, SET, UNION, WHERE, XOR, ||]", - yyXError{844, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', '}', AND, CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, OR, ORDER, RIGHT, SET, UNION, WHERE, XOR, ||]", - yyXError{568, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', AND, OR, XOR, ||]", - yyXError{573, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ',', ';', AND, OR, XOR, ||]", - yyXError{861, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ';', AND, FOR, GROUP, HAVING, LIMIT, LOCK, ON, OR, ORDER, UNION, XOR, ||]", - yyXError{1060, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ')', ';', AND, FOR, LIMIT, LOCK, ON, OR, ORDER, UNION, XOR, ||]", - yyXError{879, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, LIMIT, OR, ORDER, WHERE, XOR, ||]", - yyXError{1112, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, ON, OR, XOR, ||]", - yyXError{958, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{960, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{962, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{970, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{973, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{1009, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ',', ';', AND, OR, XOR, ||]", - yyXError{935, -1}: "expected logical and operator or logical or operator or one of [$end, &&, ';', AND, OR, XOR, ||]", - yyXError{1546, -1}: "expected logical and operator or logical or operator or one of [$end, &&, AND, OR, XOR, ||]", - yyXError{593, -1}: "expected logical and operator or logical or operator or one of [&&, ')', ',', AND, OR, XOR, ||]", - yyXError{651, -1}: "expected logical and operator or logical or operator or one of [&&, ')', ',', AND, OR, XOR, ||]", - yyXError{698, -1}: "expected logical and operator or logical or operator or one of [&&, ')', ',', AND, OR, XOR, ||]", - yyXError{646, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, FOR, OR, XOR, ||]", - yyXError{612, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, FROM, OR, XOR, ||]", - yyXError{433, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, WHEN, XOR, ||]", - yyXError{420, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{439, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{446, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{449, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{474, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{479, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{494, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{606, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{609, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{619, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{622, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{626, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{632, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{640, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{649, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{654, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{657, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{665, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{670, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{676, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{682, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{686, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{689, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{693, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{701, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{704, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{710, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{719, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{722, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{725, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{728, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{731, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{754, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{767, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{770, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{1212, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{1470, -1}: "expected logical and operator or logical or operator or one of [&&, ')', AND, OR, XOR, ||]", - yyXError{643, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, FROM, OR, XOR, ||]", - yyXError{504, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, USING, XOR, ||]", - yyXError{437, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{442, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{444, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{477, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{486, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{636, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{638, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{663, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{668, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{696, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{757, -1}: "expected logical and operator or logical or operator or one of [&&, ',', AND, OR, XOR, ||]", - yyXError{563, -1}: "expected logical and operator or logical or operator or one of [&&, AND, AS, OR, XOR, ||]", - yyXError{556, -1}: "expected logical and operator or logical or operator or one of [&&, AND, ELSE, END, OR, WHEN, XOR, ||]", - yyXError{560, -1}: "expected logical and operator or logical or operator or one of [&&, AND, END, OR, XOR, ||]", - yyXError{617, -1}: "expected logical and operator or logical or operator or one of [&&, AND, FROM, OR, XOR, ||]", - yyXError{554, -1}: "expected logical and operator or logical or operator or one of [&&, AND, OR, THEN, XOR, ||]", - yyXError{70, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{71, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{72, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{73, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{74, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{75, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{76, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{77, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{78, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{79, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{80, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{81, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{82, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{83, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{84, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{85, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{86, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{87, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{88, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{89, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{90, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{91, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{92, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{93, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{94, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{95, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{96, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{97, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{98, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{99, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{100, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{101, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{102, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{103, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{104, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{105, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{106, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{107, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{108, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{109, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{110, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{111, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{112, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{113, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{114, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{115, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{116, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{117, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{118, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{119, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{120, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{121, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{122, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{123, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{124, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{125, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{126, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{127, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{128, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{129, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{130, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{131, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{132, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{133, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{134, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{135, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{136, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{137, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{138, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{139, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{140, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{141, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{142, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{143, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{144, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{145, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{146, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{147, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{148, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{149, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{150, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{151, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{152, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{153, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{154, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{155, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{156, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{157, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{158, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{159, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{160, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{161, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{162, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{163, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{164, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{165, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{166, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{167, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{168, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{169, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{170, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{171, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{172, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{173, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{174, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{175, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{176, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{177, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{178, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{179, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{180, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{181, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{182, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{183, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{184, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{185, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{186, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{187, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{188, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{189, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{190, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{191, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{192, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{193, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{194, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{195, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{196, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADD, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DROP, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOREIGN, FOUND_ROWS, FROM, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INDEX, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, READ, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TO, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VALUES, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, WRITE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{229, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{236, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{316, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{317, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{318, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{319, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{320, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{321, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{322, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{323, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{324, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{325, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{326, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{327, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{328, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{329, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{330, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{331, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{332, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{333, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{334, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{335, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{336, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{337, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{338, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{339, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{340, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{341, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{342, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{343, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{344, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{345, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{346, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{347, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{348, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{349, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{350, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{351, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{352, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{353, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{354, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{355, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{356, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{357, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{358, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{359, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{360, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{361, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{362, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{832, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{833, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{238, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIGINT, BINARY, BIT, BLOB, BOOL, BOOLEAN, BTREE, CHAR, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DECIMAL, DELAY_KEY_WRITE, DESC, DIV, DO, DOUBLE, DYNAMIC, ELSE, END, ENGINE, ENGINES, ENUM, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, INT, INTEGER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, LONGBLOB, LONGTEXT, MAX, MAX_ROWS, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, NUMERIC, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REAL, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SMALLINT, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARBINARY, VARCHAR, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, float, float32, float64, identifier, int64, string, string literal, uint, uint64, ||]", - yyXError{375, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{397, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{398, -1}: "expected one of [!=, $end, &&, '%', '&', '(', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{1033, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DIV, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IN, IS, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, XOR, YEAR, YEARWEEK, identifier, string literal, ||]", - yyXError{1077, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '.', '/', ';', '<', '>', '^', '|', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DIV, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IN, IS, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, XOR, YEAR, YEARWEEK, identifier, string literal, ||]", - yyXError{544, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{545, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARACTER, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{363, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{364, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{365, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{366, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{367, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{368, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{370, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{371, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{601, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNIQUE, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{372, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{373, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{376, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{377, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{379, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{380, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{381, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{387, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{388, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{389, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{390, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{391, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{415, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{416, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{417, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{418, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{428, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{435, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{440, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{447, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{450, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{475, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{484, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{491, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{492, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{495, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{496, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{497, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{499, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{502, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{547, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{549, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{561, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{566, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{571, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{575, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{576, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{577, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{578, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{579, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{580, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{581, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{588, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{589, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{592, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{597, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{600, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{604, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{607, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{610, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{620, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{623, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{624, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{627, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{633, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{641, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{647, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{650, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{652, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{655, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{658, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{661, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{666, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{671, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{674, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{677, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{680, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{683, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{687, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{690, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{694, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{699, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{702, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{705, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{708, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{711, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{715, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{717, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{720, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{723, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{726, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{729, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{732, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{737, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{738, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{741, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{743, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{746, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{749, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{752, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{755, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{760, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{762, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{765, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{768, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{771, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{775, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{790, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{791, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{792, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{793, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{794, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{795, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{796, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{797, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{798, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{799, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{800, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{801, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', '}', <<, <=, <=>, <>, =, >=, >>, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BETWEEN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DIV, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, IN, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MOD, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REGEXP, REPEATABLE, RIGHT, RLIKE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{596, -1}: "expected one of [!=, $end, &&, '%', '&', ')', '*', '+', ',', '-', '/', ';', '<', '>', '^', '|', <<, <=, <=>, <>, =, >=, >>, AND, BETWEEN, COLLATE, DIV, IN, IS, LIKE, MOD, NOT, OR, REGEXP, RLIKE, UNION, XOR, ||]", - yyXError{808, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{314, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{810, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{812, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{815, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{817, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{819, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{830, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{835, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{840, -1}: "expected one of [!=, $end, &&, ')', ',', ';', '<', '>', '}', <=, <=>, <>, =, >=, ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, IS, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{837, -1}: "expected one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{838, -1}: "expected one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{839, -1}: "expected one of [$end, &&, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, AND, ANY, AS, ASC, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DEALLOCATE, DELAY_KEY_WRITE, DESC, DO, DYNAMIC, ELSE, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, OR, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SECOND_MICROSECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, THEN, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHEN, WHERE, XOR, YEAR, YEARWEEK, YEAR_MONTH, identifier, string literal, ||]", - yyXError{197, -1}: "expected one of [$end, '(', ')', ',', '.', ';', '}', ABS, ADD, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARACTER, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DROP, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, IDENTIFIED, IFNULL, IN, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, READ, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHERE, WRITE, YEAR, YEARWEEK, identifier]", - yyXError{208, -1}: "expected one of [$end, '(', ')', ',', ';', '}', ABS, ADD, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARACTER, CHARSET, CHECKSUM, COALESCE, COLLATE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DROP, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, IDENTIFIED, IFNULL, IN, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIKE, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, READ, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, USING, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHERE, WRITE, YEAR, YEARWEEK, identifier]", - yyXError{1383, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRECISION, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1371, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1372, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1373, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1374, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1375, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1376, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1377, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1378, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1379, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1380, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1381, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1382, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1445, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1384, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1475, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1476, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1477, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1478, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1480, -1}: "expected one of [$end, '(', ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1246, -1}: "expected one of [$end, '(', ')', ',', ';']", - yyXError{1247, -1}: "expected one of [$end, '(', ')', ',', ';']", - yyXError{1223, -1}: "expected one of [$end, '(', ',', ';', USING]", - yyXError{279, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{280, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{289, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{290, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{292, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{294, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{846, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{848, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{849, -1}: "expected one of [$end, ')', ',', ';', '}', CROSS, FOR, GROUP, HAVING, INNER, JOIN, LEFT, LIMIT, LOCK, ON, ORDER, RIGHT, SET, UNION, WHERE]", - yyXError{521, -1}: "expected one of [$end, ')', ',', ';', AFTER, ASC, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, DESC, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{525, -1}: "expected one of [$end, ')', ',', ';', AFTER, ASC, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, DESC, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1397, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1399, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1400, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1410, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, BINARY, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{537, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHARACTER, CHARSET, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{543, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COLLATE, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1461, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, KEY, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{528, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{529, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{533, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1449, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1450, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1451, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE, UNSIGNED, ZEROFILL]", - yyXError{1358, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1359, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1360, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1361, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1362, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1363, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1364, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1365, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1366, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1388, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1393, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1395, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1396, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1401, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1406, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1407, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1408, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1409, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1411, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1419, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1421, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1426, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1429, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1430, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1431, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1437, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1441, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1444, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1446, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1458, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1459, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1466, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1468, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1471, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1472, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1474, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1479, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1481, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1482, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1485, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1486, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1487, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1488, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1490, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1491, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1492, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1493, -1}: "expected one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{1456, -1}: "expected one of [$end, ')', ',', ';', AFTER, FIRST]", - yyXError{522, -1}: "expected one of [$end, ')', ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, FOR, KEY_BLOCK_SIZE, LOCK, MAX_ROWS, MIN_ROWS, OFFSET, ON, PASSWORD, ROW_FORMAT, UNION]", - yyXError{523, -1}: "expected one of [$end, ')', ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, FOR, KEY_BLOCK_SIZE, LOCK, MAX_ROWS, MIN_ROWS, OFFSET, ON, PASSWORD, ROW_FORMAT, UNION]", - yyXError{1035, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1036, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1037, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1068, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1069, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1070, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1071, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1073, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1074, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1075, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1078, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{1080, -1}: "expected one of [$end, ')', ',', ';', FOR, FROM, LIMIT, LOCK, ON, UNION]", - yyXError{275, -1}: "expected one of [$end, ')', ',', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, SET, UNION, WHERE]", - yyXError{847, -1}: "expected one of [$end, ')', ',', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, SET, UNION, WHERE]", - yyXError{852, -1}: "expected one of [$end, ')', ',', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, SET, UNION, WHERE]", - yyXError{1044, -1}: "expected one of [$end, ')', ',', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, UNION, WHERE]", - yyXError{871, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{873, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{874, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{875, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{876, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1062, -1}: "expected one of [$end, ')', ',', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{870, -1}: "expected one of [$end, ')', ',', ';', FOR, LIMIT, LOCK, ON, UNION]", - yyXError{1022, -1}: "expected one of [$end, ')', ',', ';', FOR, LOCK, OFFSET, ON, UNION]", - yyXError{262, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1220, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1233, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1238, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1251, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1253, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1255, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1258, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1264, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1269, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1275, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1281, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1287, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{1293, -1}: "expected one of [$end, ')', ',', ';']", - yyXError{860, -1}: "expected one of [$end, ')', ';', FOR, GROUP, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1048, -1}: "expected one of [$end, ')', ';', FOR, HAVING, LIMIT, LOCK, ON, ORDER, UNION]", - yyXError{1043, -1}: "expected one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, UNION, WHERE]", - yyXError{863, -1}: "expected one of [$end, ')', ';', FOR, LIMIT, LOCK, ON, UNION]", - yyXError{1025, -1}: "expected one of [$end, ')', ';', FOR, LOCK, ON, UNION]", - yyXError{1026, -1}: "expected one of [$end, ')', ';', FOR, LOCK, ON, UNION]", - yyXError{1014, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1053, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1058, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1059, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1065, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1066, -1}: "expected one of [$end, ')', ';', ON, UNION]", - yyXError{1021, -1}: "expected one of [$end, ')', ';', ON]", - yyXError{268, -1}: "expected one of [$end, ',', ';', =, IDENTIFIED]", - yyXError{1529, -1}: "expected one of [$end, ',', ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1530, -1}: "expected one of [$end, ',', ';', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1312, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1314, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1317, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1318, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1319, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1320, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1321, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1322, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1323, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1325, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1327, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1329, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1331, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1333, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1335, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1337, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1339, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1341, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1343, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1345, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1347, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1351, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1353, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1354, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1356, -1}: "expected one of [$end, ',', ';', AUTO_INCREMENT, AVG_ROW_LENGTH, CHARACTER, CHARSET, CHECKSUM, COLLATE, COMMENT, COMPRESSION, CONNECTION, DEFAULT, DELAY_KEY_WRITE, ENGINE, KEY_BLOCK_SIZE, MAX_ROWS, MIN_ROWS, PASSWORD, ROW_FORMAT]", - yyXError{1495, -1}: "expected one of [$end, ',', ';', FOREIGN, FULLTEXT, INDEX, KEY, PRIMARY, UNIQUE]", - yyXError{943, -1}: "expected one of [$end, ',', ';', FROM, USING]", - yyXError{940, -1}: "expected one of [$end, ',', ';', FROM]", - yyXError{855, -1}: "expected one of [$end, ',', ';', LIMIT, ORDER, WHERE]", - yyXError{877, -1}: "expected one of [$end, ',', ';', LIMIT, ORDER, WHERE]", - yyXError{202, -1}: "expected one of [$end, ',', ';', LOCAL]", - yyXError{1108, -1}: "expected one of [$end, ',', ';', ON]", - yyXError{1110, -1}: "expected one of [$end, ',', ';', ON]", - yyXError{1114, -1}: "expected one of [$end, ',', ';', ON]", - yyXError{1118, -1}: "expected one of [$end, ',', ';', ON]", - yyXError{1121, -1}: "expected one of [$end, ',', ';', ON]", - yyXError{198, -1}: "expected one of [$end, ',', ';']", - yyXError{200, -1}: "expected one of [$end, ',', ';']", - yyXError{201, -1}: "expected one of [$end, ',', ';']", - yyXError{203, -1}: "expected one of [$end, ',', ';']", - yyXError{204, -1}: "expected one of [$end, ',', ';']", - yyXError{206, -1}: "expected one of [$end, ',', ';']", - yyXError{255, -1}: "expected one of [$end, ',', ';']", - yyXError{256, -1}: "expected one of [$end, ',', ';']", - yyXError{258, -1}: "expected one of [$end, ',', ';']", - yyXError{259, -1}: "expected one of [$end, ',', ';']", - yyXError{263, -1}: "expected one of [$end, ',', ';']", - yyXError{265, -1}: "expected one of [$end, ',', ';']", - yyXError{266, -1}: "expected one of [$end, ',', ';']", - yyXError{941, -1}: "expected one of [$end, ',', ';']", - yyXError{951, -1}: "expected one of [$end, ',', ';']", - yyXError{956, -1}: "expected one of [$end, ',', ';']", - yyXError{967, -1}: "expected one of [$end, ',', ';']", - yyXError{975, -1}: "expected one of [$end, ',', ';']", - yyXError{976, -1}: "expected one of [$end, ',', ';']", - yyXError{979, -1}: "expected one of [$end, ',', ';']", - yyXError{980, -1}: "expected one of [$end, ',', ';']", - yyXError{982, -1}: "expected one of [$end, ',', ';']", - yyXError{985, -1}: "expected one of [$end, ',', ';']", - yyXError{986, -1}: "expected one of [$end, ',', ';']", - yyXError{987, -1}: "expected one of [$end, ',', ';']", - yyXError{988, -1}: "expected one of [$end, ',', ';']", - yyXError{990, -1}: "expected one of [$end, ',', ';']", - yyXError{992, -1}: "expected one of [$end, ',', ';']", - yyXError{1085, -1}: "expected one of [$end, ',', ';']", - yyXError{1086, -1}: "expected one of [$end, ',', ';']", - yyXError{1088, -1}: "expected one of [$end, ',', ';']", - yyXError{1144, -1}: "expected one of [$end, ',', ';']", - yyXError{1160, -1}: "expected one of [$end, ',', ';']", - yyXError{1163, -1}: "expected one of [$end, ',', ';']", - yyXError{1189, -1}: "expected one of [$end, ',', ';']", - yyXError{1197, -1}: "expected one of [$end, ',', ';']", - yyXError{1520, -1}: "expected one of [$end, ',', ';']", - yyXError{1521, -1}: "expected one of [$end, ',', ';']", - yyXError{1524, -1}: "expected one of [$end, ',', ';']", - yyXError{1533, -1}: "expected one of [$end, ',', ';']", - yyXError{1534, -1}: "expected one of [$end, ',', ';']", - yyXError{1535, -1}: "expected one of [$end, ',', ';']", - yyXError{1536, -1}: "expected one of [$end, ',', ';']", - yyXError{1538, -1}: "expected one of [$end, ',', ';']", - yyXError{1540, -1}: "expected one of [$end, ',', ';']", - yyXError{1541, -1}: "expected one of [$end, ',', ';']", - yyXError{1543, -1}: "expected one of [$end, ',', ';']", - yyXError{1545, -1}: "expected one of [$end, ',', ';']", - yyXError{269, -1}: "expected one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT, LIKE, WHERE]", - yyXError{1501, -1}: "expected one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{1502, -1}: "expected one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{1506, -1}: "expected one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{1508, -1}: "expected one of [$end, ';', CHARACTER, CHARSET, COLLATE, DEFAULT]", - yyXError{936, -1}: "expected one of [$end, ';', COLLATE]", - yyXError{1004, -1}: "expected one of [$end, ';', COLLATE]", - yyXError{887, -1}: "expected one of [$end, ';', FOR]", - yyXError{919, -1}: "expected one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{920, -1}: "expected one of [$end, ';', FROM, IN, LIKE, WHERE]", - yyXError{889, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{890, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{891, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{895, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{897, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{903, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{904, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{907, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{908, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{909, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{910, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{912, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{921, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{923, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{924, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{925, -1}: "expected one of [$end, ';', LIKE, WHERE]", - yyXError{1102, -1}: "expected one of [$end, ';', ON, UNION]", - yyXError{1128, -1}: "expected one of [$end, ';', ON, UNION]", - yyXError{1103, -1}: "expected one of [$end, ';', ON]", - yyXError{1115, -1}: "expected one of [$end, ';', ON]", - yyXError{1120, -1}: "expected one of [$end, ';', ON]", - yyXError{1123, -1}: "expected one of [$end, ';', ON]", - yyXError{1129, -1}: "expected one of [$end, ';', ON]", - yyXError{1130, -1}: "expected one of [$end, ';', ON]", - yyXError{27, -1}: "expected one of [$end, ';', UNION]", - yyXError{1083, -1}: "expected one of [$end, ';', USING]", - yyXError{2, -1}: "expected one of [$end, ';']", - yyXError{5, -1}: "expected one of [$end, ';']", - yyXError{7, -1}: "expected one of [$end, ';']", - yyXError{22, -1}: "expected one of [$end, ';']", - yyXError{31, -1}: "expected one of [$end, ';']", - yyXError{32, -1}: "expected one of [$end, ';']", - yyXError{33, -1}: "expected one of [$end, ';']", - yyXError{34, -1}: "expected one of [$end, ';']", - yyXError{35, -1}: "expected one of [$end, ';']", - yyXError{36, -1}: "expected one of [$end, ';']", - yyXError{37, -1}: "expected one of [$end, ';']", - yyXError{38, -1}: "expected one of [$end, ';']", - yyXError{39, -1}: "expected one of [$end, ';']", - yyXError{40, -1}: "expected one of [$end, ';']", - yyXError{41, -1}: "expected one of [$end, ';']", - yyXError{42, -1}: "expected one of [$end, ';']", - yyXError{43, -1}: "expected one of [$end, ';']", - yyXError{44, -1}: "expected one of [$end, ';']", - yyXError{45, -1}: "expected one of [$end, ';']", - yyXError{46, -1}: "expected one of [$end, ';']", - yyXError{47, -1}: "expected one of [$end, ';']", - yyXError{48, -1}: "expected one of [$end, ';']", - yyXError{49, -1}: "expected one of [$end, ';']", - yyXError{50, -1}: "expected one of [$end, ';']", - yyXError{51, -1}: "expected one of [$end, ';']", - yyXError{52, -1}: "expected one of [$end, ';']", - yyXError{53, -1}: "expected one of [$end, ';']", - yyXError{54, -1}: "expected one of [$end, ';']", - yyXError{55, -1}: "expected one of [$end, ';']", - yyXError{56, -1}: "expected one of [$end, ';']", - yyXError{57, -1}: "expected one of [$end, ';']", - yyXError{58, -1}: "expected one of [$end, ';']", - yyXError{59, -1}: "expected one of [$end, ';']", - yyXError{60, -1}: "expected one of [$end, ';']", - yyXError{61, -1}: "expected one of [$end, ';']", - yyXError{62, -1}: "expected one of [$end, ';']", - yyXError{209, -1}: "expected one of [$end, ';']", - yyXError{270, -1}: "expected one of [$end, ';']", - yyXError{866, -1}: "expected one of [$end, ';']", - yyXError{867, -1}: "expected one of [$end, ';']", - yyXError{882, -1}: "expected one of [$end, ';']", - yyXError{884, -1}: "expected one of [$end, ';']", - yyXError{927, -1}: "expected one of [$end, ';']", - yyXError{929, -1}: "expected one of [$end, ';']", - yyXError{931, -1}: "expected one of [$end, ';']", - yyXError{932, -1}: "expected one of [$end, ';']", - yyXError{944, -1}: "expected one of [$end, ';']", - yyXError{963, -1}: "expected one of [$end, ';']", - yyXError{997, -1}: "expected one of [$end, ';']", - yyXError{998, -1}: "expected one of [$end, ';']", - yyXError{1002, -1}: "expected one of [$end, ';']", - yyXError{1003, -1}: "expected one of [$end, ';']", - yyXError{1006, -1}: "expected one of [$end, ';']", - yyXError{1082, -1}: "expected one of [$end, ';']", - yyXError{1091, -1}: "expected one of [$end, ';']", - yyXError{1092, -1}: "expected one of [$end, ';']", - yyXError{1093, -1}: "expected one of [$end, ';']", - yyXError{1107, -1}: "expected one of [$end, ';']", - yyXError{1139, -1}: "expected one of [$end, ';']", - yyXError{1146, -1}: "expected one of [$end, ';']", - yyXError{1147, -1}: "expected one of [$end, ';']", - yyXError{1148, -1}: "expected one of [$end, ';']", - yyXError{1149, -1}: "expected one of [$end, ';']", - yyXError{1150, -1}: "expected one of [$end, ';']", - yyXError{1151, -1}: "expected one of [$end, ';']", - yyXError{1152, -1}: "expected one of [$end, ';']", - yyXError{1169, -1}: "expected one of [$end, ';']", - yyXError{1171, -1}: "expected one of [$end, ';']", - yyXError{1180, -1}: "expected one of [$end, ';']", - yyXError{1185, -1}: "expected one of [$end, ';']", - yyXError{1188, -1}: "expected one of [$end, ';']", - yyXError{1297, -1}: "expected one of [$end, ';']", - yyXError{1498, -1}: "expected one of [$end, ';']", - yyXError{1515, -1}: "expected one of [$end, ';']", - yyXError{1516, -1}: "expected one of [$end, ';']", - yyXError{1548, -1}: "expected one of [$end, ';']", - yyXError{630, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{629, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{634, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1028, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1029, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1031, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{1032, -1}: "expected one of ['!', '(', '*', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{822, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{823, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{824, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{825, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{826, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{827, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{828, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{829, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ALL, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{614, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{615, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{616, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{424, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{425, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{426, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{427, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOT, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{806, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{807, -1}: "expected one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{813, -1}: "expected one of ['%', '&', '*', '+', '-', '/', '^', '|', <<, >>, AND, DIV, MOD]", - yyXError{215, -1}: "expected one of ['(', ',', ON, USER]", - yyXError{211, -1}: "expected one of ['(', ',', ON]", - yyXError{213, -1}: "expected one of ['(', ',', ON]", - yyXError{214, -1}: "expected one of ['(', ',', ON]", - yyXError{216, -1}: "expected one of ['(', ',', ON]", - yyXError{217, -1}: "expected one of ['(', ',', ON]", - yyXError{218, -1}: "expected one of ['(', ',', ON]", - yyXError{219, -1}: "expected one of ['(', ',', ON]", - yyXError{220, -1}: "expected one of ['(', ',', ON]", - yyXError{221, -1}: "expected one of ['(', ',', ON]", - yyXError{223, -1}: "expected one of ['(', ',', ON]", - yyXError{225, -1}: "expected one of ['(', ',', ON]", - yyXError{226, -1}: "expected one of ['(', ',', ON]", - yyXError{227, -1}: "expected one of ['(', ',', ON]", - yyXError{271, -1}: "expected one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{273, -1}: "expected one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLE, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{301, -1}: "expected one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{304, -1}: "expected one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{305, -1}: "expected one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1012, -1}: "expected one of ['(', SELECT]", - yyXError{1013, -1}: "expected one of ['(', SELECT]", - yyXError{230, -1}: "expected one of [')', ',']", - yyXError{231, -1}: "expected one of [')', ',']", - yyXError{234, -1}: "expected one of [')', ',']", - yyXError{283, -1}: "expected one of [')', ',']", - yyXError{530, -1}: "expected one of [')', ',']", - yyXError{569, -1}: "expected one of [')', ',']", - yyXError{599, -1}: "expected one of [')', ',']", - yyXError{603, -1}: "expected one of [')', ',']", - yyXError{679, -1}: "expected one of [')', ',']", - yyXError{707, -1}: "expected one of [')', ',']", - yyXError{714, -1}: "expected one of [')', ',']", - yyXError{735, -1}: "expected one of [')', ',']", - yyXError{745, -1}: "expected one of [')', ',']", - yyXError{748, -1}: "expected one of [')', ',']", - yyXError{751, -1}: "expected one of [')', ',']", - yyXError{759, -1}: "expected one of [')', ',']", - yyXError{764, -1}: "expected one of [')', ',']", - yyXError{774, -1}: "expected one of [')', ',']", - yyXError{818, -1}: "expected one of [')', ',']", - yyXError{1117, -1}: "expected one of [')', ',']", - yyXError{1124, -1}: "expected one of [')', ',']", - yyXError{1205, -1}: "expected one of [')', ',']", - yyXError{1207, -1}: "expected one of [')', ',']", - yyXError{1208, -1}: "expected one of [')', ',']", - yyXError{1210, -1}: "expected one of [')', ',']", - yyXError{1213, -1}: "expected one of [')', ',']", - yyXError{1225, -1}: "expected one of [')', ',']", - yyXError{1227, -1}: "expected one of [')', ',']", - yyXError{1229, -1}: "expected one of [')', ',']", - yyXError{1232, -1}: "expected one of [')', ',']", - yyXError{1237, -1}: "expected one of [')', ',']", - yyXError{1249, -1}: "expected one of [')', ',']", - yyXError{1262, -1}: "expected one of [')', ',']", - yyXError{1267, -1}: "expected one of [')', ',']", - yyXError{1273, -1}: "expected one of [')', ',']", - yyXError{1279, -1}: "expected one of [')', ',']", - yyXError{1285, -1}: "expected one of [')', ',']", - yyXError{1291, -1}: "expected one of [')', ',']", - yyXError{1296, -1}: "expected one of [')', ',']", - yyXError{1413, -1}: "expected one of [')', ',']", - yyXError{1414, -1}: "expected one of [')', ',']", - yyXError{1417, -1}: "expected one of [')', ',']", - yyXError{1423, -1}: "expected one of [')', ',']", - yyXError{1514, -1}: "expected one of [')', ',']", - yyXError{453, -1}: "expected one of [')', FROM]", - yyXError{454, -1}: "expected one of [')', FROM]", - yyXError{455, -1}: "expected one of [')', FROM]", - yyXError{456, -1}: "expected one of [')', FROM]", - yyXError{457, -1}: "expected one of [')', FROM]", - yyXError{458, -1}: "expected one of [')', FROM]", - yyXError{459, -1}: "expected one of [')', FROM]", - yyXError{460, -1}: "expected one of [')', FROM]", - yyXError{461, -1}: "expected one of [')', FROM]", - yyXError{462, -1}: "expected one of [')', FROM]", - yyXError{463, -1}: "expected one of [')', FROM]", - yyXError{464, -1}: "expected one of [')', FROM]", - yyXError{465, -1}: "expected one of [')', FROM]", - yyXError{466, -1}: "expected one of [')', FROM]", - yyXError{467, -1}: "expected one of [')', FROM]", - yyXError{468, -1}: "expected one of [')', FROM]", - yyXError{469, -1}: "expected one of [')', FROM]", - yyXError{470, -1}: "expected one of [')', FROM]", - yyXError{471, -1}: "expected one of [')', FROM]", - yyXError{472, -1}: "expected one of [')', FROM]", - yyXError{286, -1}: "expected one of [')', UNION]", - yyXError{295, -1}: "expected one of [')', UNION]", - yyXError{583, -1}: "expected one of [')', UNION]", - yyXError{595, -1}: "expected one of [')', UNION]", - yyXError{243, -1}: "expected one of ['*', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1177, -1}: "expected one of [',', FROM]", - yyXError{210, -1}: "expected one of [',', ON]", - yyXError{212, -1}: "expected one of [',', ON]", - yyXError{233, -1}: "expected one of [',', ON]", - yyXError{241, -1}: "expected one of [',', ON]", - yyXError{276, -1}: "expected one of [',', SET]", - yyXError{1182, -1}: "expected one of [',', USING]", - yyXError{245, -1}: "expected one of ['.', TO]", - yyXError{246, -1}: "expected one of ['.', TO]", - yyXError{541, -1}: "expected one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{542, -1}: "expected one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{945, -1}: "expected one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{948, -1}: "expected one of [=, FOR]", - yyXError{1256, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, integer literal, string literal]", - yyXError{12, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DELETE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INSERT, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, UPDATE, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{13, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DELETE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INSERT, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, UPDATE, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{14, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DELETE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INSERT, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SELECT, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, UPDATE, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1174, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FROM, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1153, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1154, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1158, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1159, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1132, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1133, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1134, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, IGNORE, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1095, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1096, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INTO, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1199, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1097, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1166, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1531, -1}: "expected one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{777, -1}: "expected one of [BETWEEN, IN, LIKE, NULL, REGEXP, RLIKE, UNKNOWN, false, true]", - yyXError{1244, -1}: "expected one of [BTREE, HASH]", - yyXError{1385, -1}: "expected one of [CHAR, VARCHAR]", - yyXError{1392, -1}: "expected one of [CHAR, VARCHAR]", - yyXError{1298, -1}: "expected one of [CHARACTER, CHARSET, COLLATE]", - yyXError{29, -1}: "expected one of [CHECK, SHOW]", - yyXError{893, -1}: "expected one of [COLUMNS, FIELDS, TABLES]", - yyXError{902, -1}: "expected one of [COLUMNS, FIELDS, TABLES]", - yyXError{984, -1}: "expected one of [COMMITTED, UNCOMMITTED]", - yyXError{1316, -1}: "expected one of [COMPACT, COMPRESSED, DEFAULT, DYNAMIC, FIXED, REDUNDANT]", - yyXError{552, -1}: "expected one of [ELSE, END, WHEN]", - yyXError{558, -1}: "expected one of [ELSE, END, WHEN]", - yyXError{1494, -1}: "expected one of [FOREIGN, FULLTEXT, INDEX, KEY, PRIMARY, UNIQUE]", - yyXError{299, -1}: "expected one of [JOIN, OUTER]", - yyXError{300, -1}: "expected one of [JOIN, OUTER]", - yyXError{836, -1}: "expected one of [NULL, UNKNOWN, false, true]", - yyXError{978, -1}: "expected one of [ONLY, WRITE]", - yyXError{896, -1}: "expected one of [STATUS, VARIABLES]", - yyXError{900, -1}: "expected one of [STATUS, VARIABLES]", - yyXError{901, -1}: "expected one of [STATUS, VARIABLES]", - yyXError{820, -1}: "expected optional NOT or one of [NOT, NULL, UNKNOWN, false, true]", - yyXError{298, -1}: "expected optional OUTER clause or one of [JOIN, OUTER]", - yyXError{1357, -1}: "expected optional column definition option list or one of [$end, ')', ',', ';', AFTER, AUTO_INCREMENT, CHECK, COMMENT, DEFAULT, FIRST, NOT, NULL, ON, PRIMARY, UNIQUE]", - yyXError{778, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{779, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{780, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{781, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{782, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{783, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{784, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{785, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{786, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{787, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{788, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{789, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{803, -1}: "expected primary expression factor or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{382, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{383, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{384, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{385, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{386, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{804, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{805, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{933, -1}: "expected primary expression or one of ['!', '(', '+', '-', '~', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BINARY, BIT, BOOL, BOOLEAN, BTREE, CASE, CAST, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONVERT, COUNT, CURDATE, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, CUR_TIME, DATABASE, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DEFAULT, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, EXISTS, EXTRACT, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IF, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LOCAL, LOCATE, LOWER, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULL, NULLIF, OFFSET, ONLY, PASSWORD, PLACEHOLDER, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEAT, REPEATABLE, REPLACE, ROLLBACK, ROW, ROW_FORMAT, SCHEMA, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, STRCMP, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYSDATE, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNDERSCORE_CHARSET, UNKNOWN, UPPER, USER, USER_VAR, VALUE, VALUES, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, bit literal, false, floating-point literal, hexadecimal literal, identifier, integer literal, string literal, true]", - yyXError{964, -1}: "expected set variable value or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, SYS_VAR, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, USER_VAR, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1547, -1}: "expected statement or one of [$end, '(', ';', ADMIN, ALTER, BEGIN, COMMIT, CREATE, DEALLOCATE, DELETE, DESC, DESCRIBE, DO, DROP, EXECUTE, EXPLAIN, GRANT, INSERT, LOCK, PREPARE, REPLACE, ROLLBACK, SELECT, SET, SHOW, START, TRUNCATE, UNLOCK, UPDATE, USE]", - yyXError{1412, -1}: "expected string list or string literal", - yyXError{1422, -1}: "expected string list or string literal", - yyXError{267, -1}: "expected string literal", - yyXError{369, -1}: "expected string literal", - yyXError{811, -1}: "expected string literal", - yyXError{1254, -1}: "expected string literal", - yyXError{1336, -1}: "expected string literal", - yyXError{1340, -1}: "expected string literal", - yyXError{1344, -1}: "expected string literal", - yyXError{1416, -1}: "expected string literal", - yyXError{1464, -1}: "expected string literal", - yyXError{947, -1}: "expected string literal or identifier or one of [=, ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{505, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{539, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{574, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{952, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1005, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1350, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1352, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1420, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1505, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{1507, -1}: "expected string literal or identifier or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier, string literal]", - yyXError{281, -1}: "expected table alias name optional or one of [$end, ')', ',', ';', '}', ABS, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CROSS, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOR, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP, GROUP_CONCAT, HASH, HAVING, HOUR, IDENTIFIED, IFNULL, INNER, ISOLATION, JOIN, KEY_BLOCK_SIZE, LEFT, LENGTH, LEVEL, LIMIT, LOCAL, LOCATE, LOCK, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ON, ONLY, ORDER, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, RIGHT, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SET, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, WHERE, YEAR, YEARWEEK, identifier]", - yyXError{296, -1}: "expected table alias name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNION, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{288, -1}: "expected table alias name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{293, -1}: "expected table alias name or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AS, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1537, -1}: "expected table column definition or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1206, -1}: "expected table constraint element or one of [FOREIGN, FULLTEXT, INDEX, KEY, PRIMARY, UNIQUE]", - yyXError{1202, -1}: "expected table definition element list or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONSTRAINT, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOREIGN, FOUND_ROWS, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNIQUE, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1295, -1}: "expected table definition element or one of [ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECK, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, CONSTRAINT, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOREIGN, FOUND_ROWS, FULL, FULLTEXT, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, INDEX, ISOLATION, KEY, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, PRIMARY, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNIQUE, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{297, -1}: "expected table reference or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{308, -1}: "expected table reference or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{850, -1}: "expected table reference or one of ['(', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{274, -1}: "expected table reference or table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1178, -1}: "expected table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - yyXError{1183, -1}: "expected table references or one of ['(', '{', ABS, ADDDATE, ADMIN, AFTER, ANY, AUTO_INCREMENT, AVG, AVG_ROW_LENGTH, BEGIN, BIT, BOOL, BOOLEAN, BTREE, CHARSET, CHECKSUM, COALESCE, COLLATION, COLUMNS, COMMENT, COMMIT, COMMITTED, COMPACT, COMPRESSED, COMPRESSION, CONCAT, CONCAT_WS, CONNECTION, CONNECTION_ID, COUNT, CUR_TIME, DATE, DATETIME, DATE_ADD, DATE_SUB, DAY, DAYNAME, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DEALLOCATE, DELAY_KEY_WRITE, DO, DYNAMIC, END, ENGINE, ENGINES, ESCAPE, EXECUTE, FIELDS, FIRST, FIXED, FOUND_ROWS, FULL, GLOBAL, GRANTS, GROUP_CONCAT, HASH, HOUR, IDENTIFIED, IFNULL, ISOLATION, KEY_BLOCK_SIZE, LENGTH, LEVEL, LOCAL, LOCATE, MAX, MAX_ROWS, MICROSECOND, MIN, MINUTE, MIN_ROWS, MODE, MONTH, NAMES, NATIONAL, NOW, NULLIF, OFFSET, ONLY, PASSWORD, POW, POWER, PREPARE, QUARTER, QUICK, RAND, REDUNDANT, REPEATABLE, ROLLBACK, ROW, ROW_FORMAT, SECOND, SERIALIZABLE, SESSION, SIGNED, SOME, SQL_CALC_FOUND_ROWS, START, STATUS, SUBDATE, SUBSTRING, SUBSTRING_INDEX, SUM, TABLES, TEXT, TIME, TIMESTAMP, TRANSACTION, TRIGGERS, TRIM, TRUNCATE, UNCOMMITTED, UNKNOWN, USER, VALUE, VARIABLES, VERSION, WARNINGS, WEEK, WEEKDAY, WEEKOFYEAR, YEAR, YEARWEEK, identifier]", - } - - yyParseTab = [1549][]uint16{ - // 0 - {2: 766, 766, 23: 894, 895, 44: 905, 881, 883, 49: 897, 885, 56: 898, 58: 882, 939, 133: 900, 147: 944, 153: 904, 163: 890, 213: 893, 243: 899, 246: 935, 248: 887, 307: 903, 315: 902, 901, 929, 322: 940, 329: 886, 332: 892, 343: 884, 350: 906, 355: 880, 358: 942, 372: 913, 377: 925, 380: 928, 386: 933, 389: 908, 391: 909, 393: 910, 401: 911, 916, 917, 918, 919, 409: 912, 896, 412: 889, 920, 921, 922, 923, 907, 914, 888, 915, 891, 424: 924, 432: 937, 440: 926, 443: 927, 930, 931, 447: 938, 453: 932, 943, 936, 941, 458: 934, 511: 879, 533: 877, 878}, - {2: 876}, - {2: 875, 2423}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 2422, 1189}, - {313: 1149, 327: 694, 359: 2393}, - // 5 - {2: 847, 847}, - {82: 2392}, - {2: 837, 837}, - {60: 2070, 204: 2067, 220: 2029, 2030, 245: 800, 327: 2069, 408: 2068, 475: 2066}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 2065}, - // 10 - {344, 344, 4: 344, 344, 344, 9: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 146: 344, 313: 344, 360: 1147, 433: 2048}, - {22: 2035, 327, 220: 2029, 2030, 245: 2032, 327: 2034, 408: 2031, 539: 2033}, - {765, 765, 4: 765, 765, 765, 9: 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 213: 765, 243: 765, 322: 765, 329: 765, 332: 765}, - {764, 764, 4: 764, 764, 764, 9: 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 213: 764, 243: 764, 322: 764, 329: 764, 332: 764}, - {763, 763, 4: 763, 763, 763, 9: 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, 213: 763, 243: 763, 322: 763, 329: 763, 332: 763}, - // 15 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 213: 893, 243: 899, 303: 2021, 307: 2023, 322: 940, 329: 886, 332: 892, 372: 2024, 377: 2026, 380: 2027, 386: 2025, 485: 2022}, - {348, 348, 4: 348, 348, 348, 9: 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 313: 348, 320: 348, 360: 2008, 411: 2010, 497: 2009, 514: 2007}, - {532, 532, 4: 532, 532, 532, 9: 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 532, 320: 532, 360: 1971, 411: 1972, 522: 1970}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1965, 948, 947}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1959, 948, 947}, - // 20 - {23: 1957}, - {23: 328}, - {2: 326, 326}, - {290, 290, 4: 290, 290, 290, 9: 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 131: 290, 290, 290, 290, 290, 290, 290, 165: 290, 197: 290, 202: 290, 210: 290, 212: 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 305: 1904, 330: 1905, 525: 1906, 528: 1903}, - {133: 1461, 243: 899, 307: 1471, 315: 902, 901, 1460}, - // 25 - {139: 1886}, - {139: 274}, - {2: 177, 177, 139: 272}, - {1005, 949, 244, 244, 950, 971, 1821, 8: 244, 1010, 1824, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 1826, 1018, 974, 1028, 1822, 998, 1013, 1026, 1023, 1027, 1825, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 1823, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1829, 948, 947, 1416, 214: 1831, 222: 1830, 323: 1828, 459: 1832, 547: 1827}, - {205: 1814, 350: 1813}, - // 30 - {21: 209, 206, 25: 209, 27: 206, 31: 206, 65: 1773, 67: 1765, 1778, 1776, 1763, 79: 1777, 83: 1774, 85: 1771, 209: 1768, 245: 1764, 327: 1770, 343: 1762, 407: 1766, 493: 1772, 508: 1769, 517: 1775, 523: 1767, 531: 1761}, - {2: 199, 199}, - {2: 198, 198}, - {2: 197, 197}, - {2: 196, 196}, - // 35 - {2: 195, 195}, - {2: 194, 194}, - {2: 193, 193}, - {2: 192, 192}, - {2: 191, 191}, - // 40 - {2: 190, 190}, - {2: 189, 189}, - {2: 188, 188}, - {2: 187, 187}, - {2: 186, 186}, - // 45 - {2: 185, 185}, - {2: 184, 184}, - {2: 183, 183}, - {2: 182, 182}, - {2: 181, 181}, - // 50 - {2: 180, 180}, - {2: 179, 179}, - {2: 178, 178}, - {2: 176, 176}, - {2: 175, 175}, - // 55 - {2: 174, 174}, - {2: 173, 173}, - {2: 172, 172}, - {2: 171, 171}, - {2: 170, 170}, - // 60 - {2: 169, 169}, - {2: 168, 168}, - {2: 162, 162}, - {327: 1759}, - {344, 344, 4: 344, 344, 344, 9: 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 133: 344, 313: 344, 318: 344, 360: 1147, 433: 1148}, - // 65 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1145, 948, 947, 345: 1146}, - {24: 1094, 243: 1097, 245: 1095, 248: 1093, 305: 1089, 322: 1099, 329: 1092, 332: 1096, 343: 1091, 350: 1098, 355: 1090, 358: 1100, 441: 1088, 1087, 515: 1086}, - {22: 1085}, - {22: 945}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1075, 451: 1076, 538: 1074}, - // 70 - {682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 682, 209: 682, 211: 682, 243: 682, 682, 682, 247: 682, 682, 682, 682, 682, 253: 682, 682, 682, 682, 258: 682, 682, 682, 263: 682, 682, 682, 682, 682, 274: 682, 682, 682, 682, 682, 682, 682, 682, 284: 682, 682, 682, 288: 682, 682, 682, 682, 682, 682, 295: 682}, - {681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 681, 209: 681, 211: 681, 243: 681, 681, 681, 247: 681, 681, 681, 681, 681, 253: 681, 681, 681, 681, 258: 681, 681, 681, 263: 681, 681, 681, 681, 681, 274: 681, 681, 681, 681, 681, 681, 681, 681, 284: 681, 681, 681, 288: 681, 681, 681, 681, 681, 681, 295: 681}, - {680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, 209: 680, 211: 680, 243: 680, 680, 680, 247: 680, 680, 680, 680, 680, 253: 680, 680, 680, 680, 258: 680, 680, 680, 263: 680, 680, 680, 680, 680, 274: 680, 680, 680, 680, 680, 680, 680, 680, 284: 680, 680, 680, 288: 680, 680, 680, 680, 680, 680, 295: 680}, - {679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 679, 209: 679, 211: 679, 243: 679, 679, 679, 247: 679, 679, 679, 679, 679, 253: 679, 679, 679, 679, 258: 679, 679, 679, 263: 679, 679, 679, 679, 679, 274: 679, 679, 679, 679, 679, 679, 679, 679, 284: 679, 679, 679, 288: 679, 679, 679, 679, 679, 679, 295: 679}, - {678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 209: 678, 211: 678, 243: 678, 678, 678, 247: 678, 678, 678, 678, 678, 253: 678, 678, 678, 678, 258: 678, 678, 678, 263: 678, 678, 678, 678, 678, 274: 678, 678, 678, 678, 678, 678, 678, 678, 284: 678, 678, 678, 288: 678, 678, 678, 678, 678, 678, 295: 678}, - // 75 - {677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 209: 677, 211: 677, 243: 677, 677, 677, 247: 677, 677, 677, 677, 677, 253: 677, 677, 677, 677, 258: 677, 677, 677, 263: 677, 677, 677, 677, 677, 274: 677, 677, 677, 677, 677, 677, 677, 677, 284: 677, 677, 677, 288: 677, 677, 677, 677, 677, 677, 295: 677}, - {676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 676, 209: 676, 211: 676, 243: 676, 676, 676, 247: 676, 676, 676, 676, 676, 253: 676, 676, 676, 676, 258: 676, 676, 676, 263: 676, 676, 676, 676, 676, 274: 676, 676, 676, 676, 676, 676, 676, 676, 284: 676, 676, 676, 288: 676, 676, 676, 676, 676, 676, 295: 676}, - {675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 675, 209: 675, 211: 675, 243: 675, 675, 675, 247: 675, 675, 675, 675, 675, 253: 675, 675, 675, 675, 258: 675, 675, 675, 263: 675, 675, 675, 675, 675, 274: 675, 675, 675, 675, 675, 675, 675, 675, 284: 675, 675, 675, 288: 675, 675, 675, 675, 675, 675, 295: 675}, - {674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 209: 674, 211: 674, 243: 674, 674, 674, 247: 674, 674, 674, 674, 674, 253: 674, 674, 674, 674, 258: 674, 674, 674, 263: 674, 674, 674, 674, 674, 274: 674, 674, 674, 674, 674, 674, 674, 674, 284: 674, 674, 674, 288: 674, 674, 674, 674, 674, 674, 295: 674}, - {673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 673, 209: 673, 211: 673, 243: 673, 673, 673, 247: 673, 673, 673, 673, 673, 253: 673, 673, 673, 673, 258: 673, 673, 673, 263: 673, 673, 673, 673, 673, 274: 673, 673, 673, 673, 673, 673, 673, 673, 284: 673, 673, 673, 288: 673, 673, 673, 673, 673, 673, 295: 673}, - // 80 - {672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, 209: 672, 211: 672, 243: 672, 672, 672, 247: 672, 672, 672, 672, 672, 253: 672, 672, 672, 672, 258: 672, 672, 672, 263: 672, 672, 672, 672, 672, 274: 672, 672, 672, 672, 672, 672, 672, 672, 284: 672, 672, 672, 288: 672, 672, 672, 672, 672, 672, 295: 672}, - {671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 209: 671, 211: 671, 243: 671, 671, 671, 247: 671, 671, 671, 671, 671, 253: 671, 671, 671, 671, 258: 671, 671, 671, 263: 671, 671, 671, 671, 671, 274: 671, 671, 671, 671, 671, 671, 671, 671, 284: 671, 671, 671, 288: 671, 671, 671, 671, 671, 671, 295: 671}, - {670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 670, 209: 670, 211: 670, 243: 670, 670, 670, 247: 670, 670, 670, 670, 670, 253: 670, 670, 670, 670, 258: 670, 670, 670, 263: 670, 670, 670, 670, 670, 274: 670, 670, 670, 670, 670, 670, 670, 670, 284: 670, 670, 670, 288: 670, 670, 670, 670, 670, 670, 295: 670}, - {669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 209: 669, 211: 669, 243: 669, 669, 669, 247: 669, 669, 669, 669, 669, 253: 669, 669, 669, 669, 258: 669, 669, 669, 263: 669, 669, 669, 669, 669, 274: 669, 669, 669, 669, 669, 669, 669, 669, 284: 669, 669, 669, 288: 669, 669, 669, 669, 669, 669, 295: 669}, - {668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 668, 209: 668, 211: 668, 243: 668, 668, 668, 247: 668, 668, 668, 668, 668, 253: 668, 668, 668, 668, 258: 668, 668, 668, 263: 668, 668, 668, 668, 668, 274: 668, 668, 668, 668, 668, 668, 668, 668, 284: 668, 668, 668, 288: 668, 668, 668, 668, 668, 668, 295: 668}, - // 85 - {667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 667, 209: 667, 211: 667, 243: 667, 667, 667, 247: 667, 667, 667, 667, 667, 253: 667, 667, 667, 667, 258: 667, 667, 667, 263: 667, 667, 667, 667, 667, 274: 667, 667, 667, 667, 667, 667, 667, 667, 284: 667, 667, 667, 288: 667, 667, 667, 667, 667, 667, 295: 667}, - {666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 209: 666, 211: 666, 243: 666, 666, 666, 247: 666, 666, 666, 666, 666, 253: 666, 666, 666, 666, 258: 666, 666, 666, 263: 666, 666, 666, 666, 666, 274: 666, 666, 666, 666, 666, 666, 666, 666, 284: 666, 666, 666, 288: 666, 666, 666, 666, 666, 666, 295: 666}, - {665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 665, 209: 665, 211: 665, 243: 665, 665, 665, 247: 665, 665, 665, 665, 665, 253: 665, 665, 665, 665, 258: 665, 665, 665, 263: 665, 665, 665, 665, 665, 274: 665, 665, 665, 665, 665, 665, 665, 665, 284: 665, 665, 665, 288: 665, 665, 665, 665, 665, 665, 295: 665}, - {664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 664, 209: 664, 211: 664, 243: 664, 664, 664, 247: 664, 664, 664, 664, 664, 253: 664, 664, 664, 664, 258: 664, 664, 664, 263: 664, 664, 664, 664, 664, 274: 664, 664, 664, 664, 664, 664, 664, 664, 284: 664, 664, 664, 288: 664, 664, 664, 664, 664, 664, 295: 664}, - {663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 663, 209: 663, 211: 663, 243: 663, 663, 663, 247: 663, 663, 663, 663, 663, 253: 663, 663, 663, 663, 258: 663, 663, 663, 263: 663, 663, 663, 663, 663, 274: 663, 663, 663, 663, 663, 663, 663, 663, 284: 663, 663, 663, 288: 663, 663, 663, 663, 663, 663, 295: 663}, - // 90 - {662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 662, 209: 662, 211: 662, 243: 662, 662, 662, 247: 662, 662, 662, 662, 662, 253: 662, 662, 662, 662, 258: 662, 662, 662, 263: 662, 662, 662, 662, 662, 274: 662, 662, 662, 662, 662, 662, 662, 662, 284: 662, 662, 662, 288: 662, 662, 662, 662, 662, 662, 295: 662}, - {661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 209: 661, 211: 661, 243: 661, 661, 661, 247: 661, 661, 661, 661, 661, 253: 661, 661, 661, 661, 258: 661, 661, 661, 263: 661, 661, 661, 661, 661, 274: 661, 661, 661, 661, 661, 661, 661, 661, 284: 661, 661, 661, 288: 661, 661, 661, 661, 661, 661, 295: 661}, - {660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 660, 209: 660, 211: 660, 243: 660, 660, 660, 247: 660, 660, 660, 660, 660, 253: 660, 660, 660, 660, 258: 660, 660, 660, 263: 660, 660, 660, 660, 660, 274: 660, 660, 660, 660, 660, 660, 660, 660, 284: 660, 660, 660, 288: 660, 660, 660, 660, 660, 660, 295: 660}, - {659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 209: 659, 211: 659, 243: 659, 659, 659, 247: 659, 659, 659, 659, 659, 253: 659, 659, 659, 659, 258: 659, 659, 659, 263: 659, 659, 659, 659, 659, 274: 659, 659, 659, 659, 659, 659, 659, 659, 284: 659, 659, 659, 288: 659, 659, 659, 659, 659, 659, 295: 659}, - {658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 658, 209: 658, 211: 658, 243: 658, 658, 658, 247: 658, 658, 658, 658, 658, 253: 658, 658, 658, 658, 258: 658, 658, 658, 263: 658, 658, 658, 658, 658, 274: 658, 658, 658, 658, 658, 658, 658, 658, 284: 658, 658, 658, 288: 658, 658, 658, 658, 658, 658, 295: 658}, - // 95 - {657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, 209: 657, 211: 657, 243: 657, 657, 657, 247: 657, 657, 657, 657, 657, 253: 657, 657, 657, 657, 258: 657, 657, 657, 263: 657, 657, 657, 657, 657, 274: 657, 657, 657, 657, 657, 657, 657, 657, 284: 657, 657, 657, 288: 657, 657, 657, 657, 657, 657, 295: 657}, - {656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, 209: 656, 211: 656, 243: 656, 656, 656, 247: 656, 656, 656, 656, 656, 253: 656, 656, 656, 656, 258: 656, 656, 656, 263: 656, 656, 656, 656, 656, 274: 656, 656, 656, 656, 656, 656, 656, 656, 284: 656, 656, 656, 288: 656, 656, 656, 656, 656, 656, 295: 656}, - {655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 655, 209: 655, 211: 655, 243: 655, 655, 655, 247: 655, 655, 655, 655, 655, 253: 655, 655, 655, 655, 258: 655, 655, 655, 263: 655, 655, 655, 655, 655, 274: 655, 655, 655, 655, 655, 655, 655, 655, 284: 655, 655, 655, 288: 655, 655, 655, 655, 655, 655, 295: 655}, - {654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 654, 209: 654, 211: 654, 243: 654, 654, 654, 247: 654, 654, 654, 654, 654, 253: 654, 654, 654, 654, 258: 654, 654, 654, 263: 654, 654, 654, 654, 654, 274: 654, 654, 654, 654, 654, 654, 654, 654, 284: 654, 654, 654, 288: 654, 654, 654, 654, 654, 654, 295: 654}, - {653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, 209: 653, 211: 653, 243: 653, 653, 653, 247: 653, 653, 653, 653, 653, 253: 653, 653, 653, 653, 258: 653, 653, 653, 263: 653, 653, 653, 653, 653, 274: 653, 653, 653, 653, 653, 653, 653, 653, 284: 653, 653, 653, 288: 653, 653, 653, 653, 653, 653, 295: 653}, - // 100 - {652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 652, 209: 652, 211: 652, 243: 652, 652, 652, 247: 652, 652, 652, 652, 652, 253: 652, 652, 652, 652, 258: 652, 652, 652, 263: 652, 652, 652, 652, 652, 274: 652, 652, 652, 652, 652, 652, 652, 652, 284: 652, 652, 652, 288: 652, 652, 652, 652, 652, 652, 295: 652}, - {651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 651, 209: 651, 211: 651, 243: 651, 651, 651, 247: 651, 651, 651, 651, 651, 253: 651, 651, 651, 651, 258: 651, 651, 651, 263: 651, 651, 651, 651, 651, 274: 651, 651, 651, 651, 651, 651, 651, 651, 284: 651, 651, 651, 288: 651, 651, 651, 651, 651, 651, 295: 651}, - {650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 209: 650, 211: 650, 243: 650, 650, 650, 247: 650, 650, 650, 650, 650, 253: 650, 650, 650, 650, 258: 650, 650, 650, 263: 650, 650, 650, 650, 650, 274: 650, 650, 650, 650, 650, 650, 650, 650, 284: 650, 650, 650, 288: 650, 650, 650, 650, 650, 650, 295: 650}, - {649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 649, 209: 649, 211: 649, 243: 649, 649, 649, 247: 649, 649, 649, 649, 649, 253: 649, 649, 649, 649, 258: 649, 649, 649, 263: 649, 649, 649, 649, 649, 274: 649, 649, 649, 649, 649, 649, 649, 649, 284: 649, 649, 649, 288: 649, 649, 649, 649, 649, 649, 295: 649}, - {648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 209: 648, 211: 648, 243: 648, 648, 648, 247: 648, 648, 648, 648, 648, 253: 648, 648, 648, 648, 258: 648, 648, 648, 263: 648, 648, 648, 648, 648, 274: 648, 648, 648, 648, 648, 648, 648, 648, 284: 648, 648, 648, 288: 648, 648, 648, 648, 648, 648, 295: 648}, - // 105 - {647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 209: 647, 211: 647, 243: 647, 647, 647, 247: 647, 647, 647, 647, 647, 253: 647, 647, 647, 647, 258: 647, 647, 647, 263: 647, 647, 647, 647, 647, 274: 647, 647, 647, 647, 647, 647, 647, 647, 284: 647, 647, 647, 288: 647, 647, 647, 647, 647, 647, 295: 647}, - {646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 646, 209: 646, 211: 646, 243: 646, 646, 646, 247: 646, 646, 646, 646, 646, 253: 646, 646, 646, 646, 258: 646, 646, 646, 263: 646, 646, 646, 646, 646, 274: 646, 646, 646, 646, 646, 646, 646, 646, 284: 646, 646, 646, 288: 646, 646, 646, 646, 646, 646, 295: 646}, - {645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, 209: 645, 211: 645, 243: 645, 645, 645, 247: 645, 645, 645, 645, 645, 253: 645, 645, 645, 645, 258: 645, 645, 645, 263: 645, 645, 645, 645, 645, 274: 645, 645, 645, 645, 645, 645, 645, 645, 284: 645, 645, 645, 288: 645, 645, 645, 645, 645, 645, 295: 645}, - {644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, 209: 644, 211: 644, 243: 644, 644, 644, 247: 644, 644, 644, 644, 644, 253: 644, 644, 644, 644, 258: 644, 644, 644, 263: 644, 644, 644, 644, 644, 274: 644, 644, 644, 644, 644, 644, 644, 644, 284: 644, 644, 644, 288: 644, 644, 644, 644, 644, 644, 295: 644}, - {643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 643, 209: 643, 211: 643, 243: 643, 643, 643, 247: 643, 643, 643, 643, 643, 253: 643, 643, 643, 643, 258: 643, 643, 643, 263: 643, 643, 643, 643, 643, 274: 643, 643, 643, 643, 643, 643, 643, 643, 284: 643, 643, 643, 288: 643, 643, 643, 643, 643, 643, 295: 643}, - // 110 - {642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, 209: 642, 211: 642, 243: 642, 642, 642, 247: 642, 642, 642, 642, 642, 253: 642, 642, 642, 642, 258: 642, 642, 642, 263: 642, 642, 642, 642, 642, 274: 642, 642, 642, 642, 642, 642, 642, 642, 284: 642, 642, 642, 288: 642, 642, 642, 642, 642, 642, 295: 642}, - {641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 209: 641, 211: 641, 243: 641, 641, 641, 247: 641, 641, 641, 641, 641, 253: 641, 641, 641, 641, 258: 641, 641, 641, 263: 641, 641, 641, 641, 641, 274: 641, 641, 641, 641, 641, 641, 641, 641, 284: 641, 641, 641, 288: 641, 641, 641, 641, 641, 641, 295: 641}, - {640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 209: 640, 211: 640, 243: 640, 640, 640, 247: 640, 640, 640, 640, 640, 253: 640, 640, 640, 640, 258: 640, 640, 640, 263: 640, 640, 640, 640, 640, 274: 640, 640, 640, 640, 640, 640, 640, 640, 284: 640, 640, 640, 288: 640, 640, 640, 640, 640, 640, 295: 640}, - {639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 639, 209: 639, 211: 639, 243: 639, 639, 639, 247: 639, 639, 639, 639, 639, 253: 639, 639, 639, 639, 258: 639, 639, 639, 263: 639, 639, 639, 639, 639, 274: 639, 639, 639, 639, 639, 639, 639, 639, 284: 639, 639, 639, 288: 639, 639, 639, 639, 639, 639, 295: 639}, - {638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 638, 209: 638, 211: 638, 243: 638, 638, 638, 247: 638, 638, 638, 638, 638, 253: 638, 638, 638, 638, 258: 638, 638, 638, 263: 638, 638, 638, 638, 638, 274: 638, 638, 638, 638, 638, 638, 638, 638, 284: 638, 638, 638, 288: 638, 638, 638, 638, 638, 638, 295: 638}, - // 115 - {637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 209: 637, 211: 637, 243: 637, 637, 637, 247: 637, 637, 637, 637, 637, 253: 637, 637, 637, 637, 258: 637, 637, 637, 263: 637, 637, 637, 637, 637, 274: 637, 637, 637, 637, 637, 637, 637, 637, 284: 637, 637, 637, 288: 637, 637, 637, 637, 637, 637, 295: 637}, - {636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 209: 636, 211: 636, 243: 636, 636, 636, 247: 636, 636, 636, 636, 636, 253: 636, 636, 636, 636, 258: 636, 636, 636, 263: 636, 636, 636, 636, 636, 274: 636, 636, 636, 636, 636, 636, 636, 636, 284: 636, 636, 636, 288: 636, 636, 636, 636, 636, 636, 295: 636}, - {635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 635, 209: 635, 211: 635, 243: 635, 635, 635, 247: 635, 635, 635, 635, 635, 253: 635, 635, 635, 635, 258: 635, 635, 635, 263: 635, 635, 635, 635, 635, 274: 635, 635, 635, 635, 635, 635, 635, 635, 284: 635, 635, 635, 288: 635, 635, 635, 635, 635, 635, 295: 635}, - {634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 634, 209: 634, 211: 634, 243: 634, 634, 634, 247: 634, 634, 634, 634, 634, 253: 634, 634, 634, 634, 258: 634, 634, 634, 263: 634, 634, 634, 634, 634, 274: 634, 634, 634, 634, 634, 634, 634, 634, 284: 634, 634, 634, 288: 634, 634, 634, 634, 634, 634, 295: 634}, - {633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 209: 633, 211: 633, 243: 633, 633, 633, 247: 633, 633, 633, 633, 633, 253: 633, 633, 633, 633, 258: 633, 633, 633, 263: 633, 633, 633, 633, 633, 274: 633, 633, 633, 633, 633, 633, 633, 633, 284: 633, 633, 633, 288: 633, 633, 633, 633, 633, 633, 295: 633}, - // 120 - {632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 209: 632, 211: 632, 243: 632, 632, 632, 247: 632, 632, 632, 632, 632, 253: 632, 632, 632, 632, 258: 632, 632, 632, 263: 632, 632, 632, 632, 632, 274: 632, 632, 632, 632, 632, 632, 632, 632, 284: 632, 632, 632, 288: 632, 632, 632, 632, 632, 632, 295: 632}, - {631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 209: 631, 211: 631, 243: 631, 631, 631, 247: 631, 631, 631, 631, 631, 253: 631, 631, 631, 631, 258: 631, 631, 631, 263: 631, 631, 631, 631, 631, 274: 631, 631, 631, 631, 631, 631, 631, 631, 284: 631, 631, 631, 288: 631, 631, 631, 631, 631, 631, 295: 631}, - {630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 209: 630, 211: 630, 243: 630, 630, 630, 247: 630, 630, 630, 630, 630, 253: 630, 630, 630, 630, 258: 630, 630, 630, 263: 630, 630, 630, 630, 630, 274: 630, 630, 630, 630, 630, 630, 630, 630, 284: 630, 630, 630, 288: 630, 630, 630, 630, 630, 630, 295: 630}, - {629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 209: 629, 211: 629, 243: 629, 629, 629, 247: 629, 629, 629, 629, 629, 253: 629, 629, 629, 629, 258: 629, 629, 629, 263: 629, 629, 629, 629, 629, 274: 629, 629, 629, 629, 629, 629, 629, 629, 284: 629, 629, 629, 288: 629, 629, 629, 629, 629, 629, 295: 629}, - {628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 209: 628, 211: 628, 243: 628, 628, 628, 247: 628, 628, 628, 628, 628, 253: 628, 628, 628, 628, 258: 628, 628, 628, 263: 628, 628, 628, 628, 628, 274: 628, 628, 628, 628, 628, 628, 628, 628, 284: 628, 628, 628, 288: 628, 628, 628, 628, 628, 628, 295: 628}, - // 125 - {627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 209: 627, 211: 627, 243: 627, 627, 627, 247: 627, 627, 627, 627, 627, 253: 627, 627, 627, 627, 258: 627, 627, 627, 263: 627, 627, 627, 627, 627, 274: 627, 627, 627, 627, 627, 627, 627, 627, 284: 627, 627, 627, 288: 627, 627, 627, 627, 627, 627, 295: 627}, - {626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 209: 626, 211: 626, 243: 626, 626, 626, 247: 626, 626, 626, 626, 626, 253: 626, 626, 626, 626, 258: 626, 626, 626, 263: 626, 626, 626, 626, 626, 274: 626, 626, 626, 626, 626, 626, 626, 626, 284: 626, 626, 626, 288: 626, 626, 626, 626, 626, 626, 295: 626}, - {625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 209: 625, 211: 625, 243: 625, 625, 625, 247: 625, 625, 625, 625, 625, 253: 625, 625, 625, 625, 258: 625, 625, 625, 263: 625, 625, 625, 625, 625, 274: 625, 625, 625, 625, 625, 625, 625, 625, 284: 625, 625, 625, 288: 625, 625, 625, 625, 625, 625, 295: 625}, - {624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 209: 624, 211: 624, 243: 624, 624, 624, 247: 624, 624, 624, 624, 624, 253: 624, 624, 624, 624, 258: 624, 624, 624, 263: 624, 624, 624, 624, 624, 274: 624, 624, 624, 624, 624, 624, 624, 624, 284: 624, 624, 624, 288: 624, 624, 624, 624, 624, 624, 295: 624}, - {623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 209: 623, 211: 623, 243: 623, 623, 623, 247: 623, 623, 623, 623, 623, 253: 623, 623, 623, 623, 258: 623, 623, 623, 263: 623, 623, 623, 623, 623, 274: 623, 623, 623, 623, 623, 623, 623, 623, 284: 623, 623, 623, 288: 623, 623, 623, 623, 623, 623, 295: 623}, - // 130 - {622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 209: 622, 211: 622, 243: 622, 622, 622, 247: 622, 622, 622, 622, 622, 253: 622, 622, 622, 622, 258: 622, 622, 622, 263: 622, 622, 622, 622, 622, 274: 622, 622, 622, 622, 622, 622, 622, 622, 284: 622, 622, 622, 288: 622, 622, 622, 622, 622, 622, 295: 622}, - {621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 209: 621, 211: 621, 243: 621, 621, 621, 247: 621, 621, 621, 621, 621, 253: 621, 621, 621, 621, 258: 621, 621, 621, 263: 621, 621, 621, 621, 621, 274: 621, 621, 621, 621, 621, 621, 621, 621, 284: 621, 621, 621, 288: 621, 621, 621, 621, 621, 621, 295: 621}, - {620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 209: 620, 211: 620, 243: 620, 620, 620, 247: 620, 620, 620, 620, 620, 253: 620, 620, 620, 620, 258: 620, 620, 620, 263: 620, 620, 620, 620, 620, 274: 620, 620, 620, 620, 620, 620, 620, 620, 284: 620, 620, 620, 288: 620, 620, 620, 620, 620, 620, 295: 620}, - {619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 619, 209: 619, 211: 619, 243: 619, 619, 619, 247: 619, 619, 619, 619, 619, 253: 619, 619, 619, 619, 258: 619, 619, 619, 263: 619, 619, 619, 619, 619, 274: 619, 619, 619, 619, 619, 619, 619, 619, 284: 619, 619, 619, 288: 619, 619, 619, 619, 619, 619, 295: 619}, - {618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 618, 209: 618, 211: 618, 243: 618, 618, 618, 247: 618, 618, 618, 618, 618, 253: 618, 618, 618, 618, 258: 618, 618, 618, 263: 618, 618, 618, 618, 618, 274: 618, 618, 618, 618, 618, 618, 618, 618, 284: 618, 618, 618, 288: 618, 618, 618, 618, 618, 618, 295: 618}, - // 135 - {617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 209: 617, 211: 617, 243: 617, 617, 617, 247: 617, 617, 617, 617, 617, 253: 617, 617, 617, 617, 258: 617, 617, 617, 263: 617, 617, 617, 617, 617, 274: 617, 617, 617, 617, 617, 617, 617, 617, 284: 617, 617, 617, 288: 617, 617, 617, 617, 617, 617, 295: 617}, - {616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 209: 616, 211: 616, 243: 616, 616, 616, 247: 616, 616, 616, 616, 616, 253: 616, 616, 616, 616, 258: 616, 616, 616, 263: 616, 616, 616, 616, 616, 274: 616, 616, 616, 616, 616, 616, 616, 616, 284: 616, 616, 616, 288: 616, 616, 616, 616, 616, 616, 295: 616}, - {615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 209: 615, 211: 615, 243: 615, 615, 615, 247: 615, 615, 615, 615, 615, 253: 615, 615, 615, 615, 258: 615, 615, 615, 263: 615, 615, 615, 615, 615, 274: 615, 615, 615, 615, 615, 615, 615, 615, 284: 615, 615, 615, 288: 615, 615, 615, 615, 615, 615, 295: 615}, - {614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 209: 614, 211: 614, 243: 614, 614, 614, 247: 614, 614, 614, 614, 614, 253: 614, 614, 614, 614, 258: 614, 614, 614, 263: 614, 614, 614, 614, 614, 274: 614, 614, 614, 614, 614, 614, 614, 614, 284: 614, 614, 614, 288: 614, 614, 614, 614, 614, 614, 295: 614}, - {613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 209: 613, 211: 613, 243: 613, 613, 613, 247: 613, 613, 613, 613, 613, 253: 613, 613, 613, 613, 258: 613, 613, 613, 263: 613, 613, 613, 613, 613, 274: 613, 613, 613, 613, 613, 613, 613, 613, 284: 613, 613, 613, 288: 613, 613, 613, 613, 613, 613, 295: 613}, - // 140 - {612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 612, 209: 612, 211: 612, 243: 612, 612, 612, 247: 612, 612, 612, 612, 612, 253: 612, 612, 612, 612, 258: 612, 612, 612, 263: 612, 612, 612, 612, 612, 274: 612, 612, 612, 612, 612, 612, 612, 612, 284: 612, 612, 612, 288: 612, 612, 612, 612, 612, 612, 295: 612}, - {611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 611, 209: 611, 211: 611, 243: 611, 611, 611, 247: 611, 611, 611, 611, 611, 253: 611, 611, 611, 611, 258: 611, 611, 611, 263: 611, 611, 611, 611, 611, 274: 611, 611, 611, 611, 611, 611, 611, 611, 284: 611, 611, 611, 288: 611, 611, 611, 611, 611, 611, 295: 611}, - {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 209: 610, 211: 610, 243: 610, 610, 610, 247: 610, 610, 610, 610, 610, 253: 610, 610, 610, 610, 258: 610, 610, 610, 263: 610, 610, 610, 610, 610, 274: 610, 610, 610, 610, 610, 610, 610, 610, 284: 610, 610, 610, 288: 610, 610, 610, 610, 610, 610, 295: 610}, - {609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 209: 609, 211: 609, 243: 609, 609, 609, 247: 609, 609, 609, 609, 609, 253: 609, 609, 609, 609, 258: 609, 609, 609, 263: 609, 609, 609, 609, 609, 274: 609, 609, 609, 609, 609, 609, 609, 609, 284: 609, 609, 609, 288: 609, 609, 609, 609, 609, 609, 295: 609}, - {608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 608, 209: 608, 211: 608, 243: 608, 608, 608, 247: 608, 608, 608, 608, 608, 253: 608, 608, 608, 608, 258: 608, 608, 608, 263: 608, 608, 608, 608, 608, 274: 608, 608, 608, 608, 608, 608, 608, 608, 284: 608, 608, 608, 288: 608, 608, 608, 608, 608, 608, 295: 608}, - // 145 - {607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 209: 607, 211: 607, 243: 607, 607, 607, 247: 607, 607, 607, 607, 607, 253: 607, 607, 607, 607, 258: 607, 607, 607, 263: 607, 607, 607, 607, 607, 274: 607, 607, 607, 607, 607, 607, 607, 607, 284: 607, 607, 607, 288: 607, 607, 607, 607, 607, 607, 295: 607}, - {606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 606, 209: 606, 211: 606, 243: 606, 606, 606, 247: 606, 606, 606, 606, 606, 253: 606, 606, 606, 606, 258: 606, 606, 606, 263: 606, 606, 606, 606, 606, 274: 606, 606, 606, 606, 606, 606, 606, 606, 284: 606, 606, 606, 288: 606, 606, 606, 606, 606, 606, 295: 606}, - {605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 605, 209: 605, 211: 605, 243: 605, 605, 605, 247: 605, 605, 605, 605, 605, 253: 605, 605, 605, 605, 258: 605, 605, 605, 263: 605, 605, 605, 605, 605, 274: 605, 605, 605, 605, 605, 605, 605, 605, 284: 605, 605, 605, 288: 605, 605, 605, 605, 605, 605, 295: 605}, - {604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 209: 604, 211: 604, 243: 604, 604, 604, 247: 604, 604, 604, 604, 604, 253: 604, 604, 604, 604, 258: 604, 604, 604, 263: 604, 604, 604, 604, 604, 274: 604, 604, 604, 604, 604, 604, 604, 604, 284: 604, 604, 604, 288: 604, 604, 604, 604, 604, 604, 295: 604}, - {603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 603, 209: 603, 211: 603, 243: 603, 603, 603, 247: 603, 603, 603, 603, 603, 253: 603, 603, 603, 603, 258: 603, 603, 603, 263: 603, 603, 603, 603, 603, 274: 603, 603, 603, 603, 603, 603, 603, 603, 284: 603, 603, 603, 288: 603, 603, 603, 603, 603, 603, 295: 603}, - // 150 - {602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 602, 209: 602, 211: 602, 243: 602, 602, 602, 247: 602, 602, 602, 602, 602, 253: 602, 602, 602, 602, 258: 602, 602, 602, 263: 602, 602, 602, 602, 602, 274: 602, 602, 602, 602, 602, 602, 602, 602, 284: 602, 602, 602, 288: 602, 602, 602, 602, 602, 602, 295: 602}, - {601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 209: 601, 211: 601, 243: 601, 601, 601, 247: 601, 601, 601, 601, 601, 253: 601, 601, 601, 601, 258: 601, 601, 601, 263: 601, 601, 601, 601, 601, 274: 601, 601, 601, 601, 601, 601, 601, 601, 284: 601, 601, 601, 288: 601, 601, 601, 601, 601, 601, 295: 601}, - {600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 209: 600, 211: 600, 243: 600, 600, 600, 247: 600, 600, 600, 600, 600, 253: 600, 600, 600, 600, 258: 600, 600, 600, 263: 600, 600, 600, 600, 600, 274: 600, 600, 600, 600, 600, 600, 600, 600, 284: 600, 600, 600, 288: 600, 600, 600, 600, 600, 600, 295: 600}, - {599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 209: 599, 211: 599, 243: 599, 599, 599, 247: 599, 599, 599, 599, 599, 253: 599, 599, 599, 599, 258: 599, 599, 599, 263: 599, 599, 599, 599, 599, 274: 599, 599, 599, 599, 599, 599, 599, 599, 284: 599, 599, 599, 288: 599, 599, 599, 599, 599, 599, 295: 599}, - {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 209: 598, 211: 598, 243: 598, 598, 598, 247: 598, 598, 598, 598, 598, 253: 598, 598, 598, 598, 258: 598, 598, 598, 263: 598, 598, 598, 598, 598, 274: 598, 598, 598, 598, 598, 598, 598, 598, 284: 598, 598, 598, 288: 598, 598, 598, 598, 598, 598, 295: 598}, - // 155 - {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 209: 597, 211: 597, 243: 597, 597, 597, 247: 597, 597, 597, 597, 597, 253: 597, 597, 597, 597, 258: 597, 597, 597, 263: 597, 597, 597, 597, 597, 274: 597, 597, 597, 597, 597, 597, 597, 597, 284: 597, 597, 597, 288: 597, 597, 597, 597, 597, 597, 295: 597}, - {596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 209: 596, 211: 596, 243: 596, 596, 596, 247: 596, 596, 596, 596, 596, 253: 596, 596, 596, 596, 258: 596, 596, 596, 263: 596, 596, 596, 596, 596, 274: 596, 596, 596, 596, 596, 596, 596, 596, 284: 596, 596, 596, 288: 596, 596, 596, 596, 596, 596, 295: 596}, - {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 209: 595, 211: 595, 243: 595, 595, 595, 247: 595, 595, 595, 595, 595, 253: 595, 595, 595, 595, 258: 595, 595, 595, 263: 595, 595, 595, 595, 595, 274: 595, 595, 595, 595, 595, 595, 595, 595, 284: 595, 595, 595, 288: 595, 595, 595, 595, 595, 595, 295: 595}, - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 209: 594, 211: 594, 243: 594, 594, 594, 247: 594, 594, 594, 594, 594, 253: 594, 594, 594, 594, 258: 594, 594, 594, 263: 594, 594, 594, 594, 594, 274: 594, 594, 594, 594, 594, 594, 594, 594, 284: 594, 594, 594, 288: 594, 594, 594, 594, 594, 594, 295: 594}, - {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 209: 593, 211: 593, 243: 593, 593, 593, 247: 593, 593, 593, 593, 593, 253: 593, 593, 593, 593, 258: 593, 593, 593, 263: 593, 593, 593, 593, 593, 274: 593, 593, 593, 593, 593, 593, 593, 593, 284: 593, 593, 593, 288: 593, 593, 593, 593, 593, 593, 295: 593}, - // 160 - {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 209: 592, 211: 592, 243: 592, 592, 592, 247: 592, 592, 592, 592, 592, 253: 592, 592, 592, 592, 258: 592, 592, 592, 263: 592, 592, 592, 592, 592, 274: 592, 592, 592, 592, 592, 592, 592, 592, 284: 592, 592, 592, 288: 592, 592, 592, 592, 592, 592, 295: 592}, - {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 209: 591, 211: 591, 243: 591, 591, 591, 247: 591, 591, 591, 591, 591, 253: 591, 591, 591, 591, 258: 591, 591, 591, 263: 591, 591, 591, 591, 591, 274: 591, 591, 591, 591, 591, 591, 591, 591, 284: 591, 591, 591, 288: 591, 591, 591, 591, 591, 591, 295: 591}, - {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 209: 590, 211: 590, 243: 590, 590, 590, 247: 590, 590, 590, 590, 590, 253: 590, 590, 590, 590, 258: 590, 590, 590, 263: 590, 590, 590, 590, 590, 274: 590, 590, 590, 590, 590, 590, 590, 590, 284: 590, 590, 590, 288: 590, 590, 590, 590, 590, 590, 295: 590}, - {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 209: 589, 211: 589, 243: 589, 589, 589, 247: 589, 589, 589, 589, 589, 253: 589, 589, 589, 589, 258: 589, 589, 589, 263: 589, 589, 589, 589, 589, 274: 589, 589, 589, 589, 589, 589, 589, 589, 284: 589, 589, 589, 288: 589, 589, 589, 589, 589, 589, 295: 589}, - {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 209: 588, 211: 588, 243: 588, 588, 588, 247: 588, 588, 588, 588, 588, 253: 588, 588, 588, 588, 258: 588, 588, 588, 263: 588, 588, 588, 588, 588, 274: 588, 588, 588, 588, 588, 588, 588, 588, 284: 588, 588, 588, 288: 588, 588, 588, 588, 588, 588, 295: 588}, - // 165 - {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 209: 587, 211: 587, 243: 587, 587, 587, 247: 587, 587, 587, 587, 587, 253: 587, 587, 587, 587, 258: 587, 587, 587, 263: 587, 587, 587, 587, 587, 274: 587, 587, 587, 587, 587, 587, 587, 587, 284: 587, 587, 587, 288: 587, 587, 587, 587, 587, 587, 295: 587}, - {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 209: 586, 211: 586, 243: 586, 586, 586, 247: 586, 586, 586, 586, 586, 253: 586, 586, 586, 586, 258: 586, 586, 586, 263: 586, 586, 586, 586, 586, 274: 586, 586, 586, 586, 586, 586, 586, 586, 284: 586, 586, 586, 288: 586, 586, 586, 586, 586, 586, 295: 586}, - {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 209: 585, 211: 585, 243: 585, 585, 585, 247: 585, 585, 585, 585, 585, 253: 585, 585, 585, 585, 258: 585, 585, 585, 263: 585, 585, 585, 585, 585, 274: 585, 585, 585, 585, 585, 585, 585, 585, 284: 585, 585, 585, 288: 585, 585, 585, 585, 585, 585, 295: 585}, - {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 209: 584, 211: 584, 243: 584, 584, 584, 247: 584, 584, 584, 584, 584, 253: 584, 584, 584, 584, 258: 584, 584, 584, 263: 584, 584, 584, 584, 584, 274: 584, 584, 584, 584, 584, 584, 584, 584, 284: 584, 584, 584, 288: 584, 584, 584, 584, 584, 584, 295: 584}, - {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 209: 583, 211: 583, 243: 583, 583, 583, 247: 583, 583, 583, 583, 583, 253: 583, 583, 583, 583, 258: 583, 583, 583, 263: 583, 583, 583, 583, 583, 274: 583, 583, 583, 583, 583, 583, 583, 583, 284: 583, 583, 583, 288: 583, 583, 583, 583, 583, 583, 295: 583}, - // 170 - {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 209: 582, 211: 582, 243: 582, 582, 582, 247: 582, 582, 582, 582, 582, 253: 582, 582, 582, 582, 258: 582, 582, 582, 263: 582, 582, 582, 582, 582, 274: 582, 582, 582, 582, 582, 582, 582, 582, 284: 582, 582, 582, 288: 582, 582, 582, 582, 582, 582, 295: 582}, - {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 209: 581, 211: 581, 243: 581, 581, 581, 247: 581, 581, 581, 581, 581, 253: 581, 581, 581, 581, 258: 581, 581, 581, 263: 581, 581, 581, 581, 581, 274: 581, 581, 581, 581, 581, 581, 581, 581, 284: 581, 581, 581, 288: 581, 581, 581, 581, 581, 581, 295: 581}, - {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 209: 580, 211: 580, 243: 580, 580, 580, 247: 580, 580, 580, 580, 580, 253: 580, 580, 580, 580, 258: 580, 580, 580, 263: 580, 580, 580, 580, 580, 274: 580, 580, 580, 580, 580, 580, 580, 580, 284: 580, 580, 580, 288: 580, 580, 580, 580, 580, 580, 295: 580}, - {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 209: 579, 211: 579, 243: 579, 579, 579, 247: 579, 579, 579, 579, 579, 253: 579, 579, 579, 579, 258: 579, 579, 579, 263: 579, 579, 579, 579, 579, 274: 579, 579, 579, 579, 579, 579, 579, 579, 284: 579, 579, 579, 288: 579, 579, 579, 579, 579, 579, 295: 579}, - {578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 209: 578, 211: 578, 243: 578, 578, 578, 247: 578, 578, 578, 578, 578, 253: 578, 578, 578, 578, 258: 578, 578, 578, 263: 578, 578, 578, 578, 578, 274: 578, 578, 578, 578, 578, 578, 578, 578, 284: 578, 578, 578, 288: 578, 578, 578, 578, 578, 578, 295: 578}, - // 175 - {577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 209: 577, 211: 577, 243: 577, 577, 577, 247: 577, 577, 577, 577, 577, 253: 577, 577, 577, 577, 258: 577, 577, 577, 263: 577, 577, 577, 577, 577, 274: 577, 577, 577, 577, 577, 577, 577, 577, 284: 577, 577, 577, 288: 577, 577, 577, 577, 577, 577, 295: 577}, - {576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 209: 576, 211: 576, 243: 576, 576, 576, 247: 576, 576, 576, 576, 576, 253: 576, 576, 576, 576, 258: 576, 576, 576, 263: 576, 576, 576, 576, 576, 274: 576, 576, 576, 576, 576, 576, 576, 576, 284: 576, 576, 576, 288: 576, 576, 576, 576, 576, 576, 295: 576}, - {575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 209: 575, 211: 575, 243: 575, 575, 575, 247: 575, 575, 575, 575, 575, 253: 575, 575, 575, 575, 258: 575, 575, 575, 263: 575, 575, 575, 575, 575, 274: 575, 575, 575, 575, 575, 575, 575, 575, 284: 575, 575, 575, 288: 575, 575, 575, 575, 575, 575, 295: 575}, - {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 209: 574, 211: 574, 243: 574, 574, 574, 247: 574, 574, 574, 574, 574, 253: 574, 574, 574, 574, 258: 574, 574, 574, 263: 574, 574, 574, 574, 574, 274: 574, 574, 574, 574, 574, 574, 574, 574, 284: 574, 574, 574, 288: 574, 574, 574, 574, 574, 574, 295: 574}, - {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 209: 573, 211: 573, 243: 573, 573, 573, 247: 573, 573, 573, 573, 573, 253: 573, 573, 573, 573, 258: 573, 573, 573, 263: 573, 573, 573, 573, 573, 274: 573, 573, 573, 573, 573, 573, 573, 573, 284: 573, 573, 573, 288: 573, 573, 573, 573, 573, 573, 295: 573}, - // 180 - {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 209: 572, 211: 572, 243: 572, 572, 572, 247: 572, 572, 572, 572, 572, 253: 572, 572, 572, 572, 258: 572, 572, 572, 263: 572, 572, 572, 572, 572, 274: 572, 572, 572, 572, 572, 572, 572, 572, 284: 572, 572, 572, 288: 572, 572, 572, 572, 572, 572, 295: 572}, - {571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 209: 571, 211: 571, 243: 571, 571, 571, 247: 571, 571, 571, 571, 571, 253: 571, 571, 571, 571, 258: 571, 571, 571, 263: 571, 571, 571, 571, 571, 274: 571, 571, 571, 571, 571, 571, 571, 571, 284: 571, 571, 571, 288: 571, 571, 571, 571, 571, 571, 295: 571}, - {570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 209: 570, 211: 570, 243: 570, 570, 570, 247: 570, 570, 570, 570, 570, 253: 570, 570, 570, 570, 258: 570, 570, 570, 263: 570, 570, 570, 570, 570, 274: 570, 570, 570, 570, 570, 570, 570, 570, 284: 570, 570, 570, 288: 570, 570, 570, 570, 570, 570, 295: 570}, - {569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 209: 569, 211: 569, 243: 569, 569, 569, 247: 569, 569, 569, 569, 569, 253: 569, 569, 569, 569, 258: 569, 569, 569, 263: 569, 569, 569, 569, 569, 274: 569, 569, 569, 569, 569, 569, 569, 569, 284: 569, 569, 569, 288: 569, 569, 569, 569, 569, 569, 295: 569}, - {568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 209: 568, 211: 568, 243: 568, 568, 568, 247: 568, 568, 568, 568, 568, 253: 568, 568, 568, 568, 258: 568, 568, 568, 263: 568, 568, 568, 568, 568, 274: 568, 568, 568, 568, 568, 568, 568, 568, 284: 568, 568, 568, 288: 568, 568, 568, 568, 568, 568, 295: 568}, - // 185 - {567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 209: 567, 211: 567, 243: 567, 567, 567, 247: 567, 567, 567, 567, 567, 253: 567, 567, 567, 567, 258: 567, 567, 567, 263: 567, 567, 567, 567, 567, 274: 567, 567, 567, 567, 567, 567, 567, 567, 284: 567, 567, 567, 288: 567, 567, 567, 567, 567, 567, 295: 567}, - {566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 209: 566, 211: 566, 243: 566, 566, 566, 247: 566, 566, 566, 566, 566, 253: 566, 566, 566, 566, 258: 566, 566, 566, 263: 566, 566, 566, 566, 566, 274: 566, 566, 566, 566, 566, 566, 566, 566, 284: 566, 566, 566, 288: 566, 566, 566, 566, 566, 566, 295: 566}, - {565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 565, 209: 565, 211: 565, 243: 565, 565, 565, 247: 565, 565, 565, 565, 565, 253: 565, 565, 565, 565, 258: 565, 565, 565, 263: 565, 565, 565, 565, 565, 274: 565, 565, 565, 565, 565, 565, 565, 565, 284: 565, 565, 565, 288: 565, 565, 565, 565, 565, 565, 295: 565}, - {564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 209: 564, 211: 564, 243: 564, 564, 564, 247: 564, 564, 564, 564, 564, 253: 564, 564, 564, 564, 258: 564, 564, 564, 263: 564, 564, 564, 564, 564, 274: 564, 564, 564, 564, 564, 564, 564, 564, 284: 564, 564, 564, 288: 564, 564, 564, 564, 564, 564, 295: 564}, - {563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 209: 563, 211: 563, 243: 563, 563, 563, 247: 563, 563, 563, 563, 563, 253: 563, 563, 563, 563, 258: 563, 563, 563, 263: 563, 563, 563, 563, 563, 274: 563, 563, 563, 563, 563, 563, 563, 563, 284: 563, 563, 563, 288: 563, 563, 563, 563, 563, 563, 295: 563}, - // 190 - {562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 209: 562, 211: 562, 243: 562, 562, 562, 247: 562, 562, 562, 562, 562, 253: 562, 562, 562, 562, 258: 562, 562, 562, 263: 562, 562, 562, 562, 562, 274: 562, 562, 562, 562, 562, 562, 562, 562, 284: 562, 562, 562, 288: 562, 562, 562, 562, 562, 562, 295: 562}, - {561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 209: 561, 211: 561, 243: 561, 561, 561, 247: 561, 561, 561, 561, 561, 253: 561, 561, 561, 561, 258: 561, 561, 561, 263: 561, 561, 561, 561, 561, 274: 561, 561, 561, 561, 561, 561, 561, 561, 284: 561, 561, 561, 288: 561, 561, 561, 561, 561, 561, 295: 561}, - {560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 209: 560, 211: 560, 243: 560, 560, 560, 247: 560, 560, 560, 560, 560, 253: 560, 560, 560, 560, 258: 560, 560, 560, 263: 560, 560, 560, 560, 560, 274: 560, 560, 560, 560, 560, 560, 560, 560, 284: 560, 560, 560, 288: 560, 560, 560, 560, 560, 560, 295: 560}, - {559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 209: 559, 211: 559, 243: 559, 559, 559, 247: 559, 559, 559, 559, 559, 253: 559, 559, 559, 559, 258: 559, 559, 559, 263: 559, 559, 559, 559, 559, 274: 559, 559, 559, 559, 559, 559, 559, 559, 284: 559, 559, 559, 288: 559, 559, 559, 559, 559, 559, 295: 559}, - {558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 209: 558, 211: 558, 243: 558, 558, 558, 247: 558, 558, 558, 558, 558, 253: 558, 558, 558, 558, 258: 558, 558, 558, 263: 558, 558, 558, 558, 558, 274: 558, 558, 558, 558, 558, 558, 558, 558, 284: 558, 558, 558, 288: 558, 558, 558, 558, 558, 558, 295: 558}, - // 195 - {557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 209: 557, 211: 557, 243: 557, 557, 557, 247: 557, 557, 557, 557, 557, 253: 557, 557, 557, 557, 258: 557, 557, 557, 263: 557, 557, 557, 557, 557, 274: 557, 557, 557, 557, 557, 557, 557, 557, 284: 557, 557, 557, 288: 557, 557, 557, 557, 557, 557, 295: 557}, - {556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 209: 556, 211: 556, 243: 556, 556, 556, 247: 556, 556, 556, 556, 556, 253: 556, 556, 556, 556, 258: 556, 556, 556, 263: 556, 556, 556, 556, 556, 274: 556, 556, 556, 556, 556, 556, 556, 556, 284: 556, 556, 556, 288: 556, 556, 556, 556, 556, 556, 295: 556}, - {342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 130: 342, 132: 342, 342, 136: 342, 139: 342, 144: 342, 342, 342, 342, 342, 342, 342, 152: 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 180: 342, 202: 342, 209: 342, 211: 1083, 243: 342, 248: 342, 250: 342, 258: 342, 295: 342}, - {2: 7, 7, 8: 1081}, - {250: 1078, 295: 1079, 503: 1077}, - // 200 - {2: 2, 2, 8: 2}, - {2: 6, 6, 8: 6}, - {2: 5, 5, 8: 5, 73: 1080}, - {2: 3, 3, 8: 3}, - {2: 4, 4, 8: 4}, - // 205 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1075, 451: 1082}, - {2: 1, 1, 8: 1}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1084, 948, 947}, - {341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 130: 341, 132: 341, 341, 136: 341, 139: 341, 144: 341, 341, 341, 341, 341, 341, 341, 152: 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 180: 341, 202: 341, 209: 341, 243: 341, 248: 341, 250: 341, 258: 341, 295: 341}, - {2: 8, 8}, - // 210 - {8: 1116, 130: 1115}, - {8: 32, 130: 32, 133: 1104}, - {8: 30, 130: 30}, - {8: 28, 130: 28, 133: 28}, - {8: 27, 130: 27, 133: 27}, - // 215 - {8: 26, 60: 1103, 130: 26, 133: 26}, - {8: 24, 130: 24, 133: 24}, - {8: 23, 130: 23, 133: 23}, - {8: 22, 130: 22, 133: 22}, - {8: 21, 130: 21, 133: 21}, - // 220 - {8: 20, 130: 20, 133: 20}, - {8: 19, 130: 19, 133: 19}, - {407: 1102}, - {8: 17, 130: 17, 133: 17}, - {509: 1101}, - // 225 - {8: 16, 130: 16, 133: 16}, - {8: 18, 130: 18, 133: 18}, - {8: 25, 130: 25, 133: 25}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1106, 398: 1107}, - {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 138: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 211: 1111, 247: 844, 253: 844, 844, 256: 844, 259: 844, 844, 263: 844, 844, 844, 844, 844, 274: 844, 844, 844, 844, 844, 844, 844, 844, 284: 844, 844, 844, 288: 844, 844, 844, 844, 844, 844}, - // 230 - {7: 841, 841}, - {7: 1109, 1108}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1110}, - {8: 31, 130: 31}, - {7: 840, 840}, - // 235 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1112, 948, 947}, - {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 138: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 211: 1113, 247: 843, 253: 843, 843, 256: 843, 259: 843, 843, 263: 843, 843, 843, 843, 843, 274: 843, 843, 843, 843, 843, 843, 843, 843, 284: 843, 843, 843, 288: 843, 843, 843, 843, 843, 843}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1114, 948, 947}, - {842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 138: 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 842, 247: 842, 253: 842, 842, 256: 842, 259: 842, 842, 263: 842, 842, 842, 842, 842, 274: 842, 842, 842, 842, 842, 842, 842, 842, 284: 842, 842, 842, 288: 842, 842, 842, 842, 842, 842}, - {15, 15, 4: 15, 15, 15, 9: 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 165: 15, 327: 1119, 506: 1118}, - // 240 - {24: 1094, 243: 1097, 245: 1095, 248: 1093, 305: 1089, 322: 1099, 329: 1092, 332: 1096, 343: 1091, 350: 1098, 355: 1090, 358: 1100, 441: 1117, 1087}, - {8: 29, 130: 29}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 165: 1121, 206: 1122, 948, 947, 516: 1120}, - {14, 14, 4: 14, 14, 14, 9: 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 165: 14}, - {255: 1128}, - // 245 - {211: 1126, 255: 13}, - {211: 1123, 255: 9}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 165: 1124, 206: 1125, 948, 947}, - {255: 11}, - {255: 10}, - // 250 - {165: 1127}, - {255: 12}, - {131: 1129, 354: 1130, 387: 1131, 457: 1132}, - {463: 1143}, - {2: 37, 37, 8: 37, 53: 1136, 464: 1135}, - // 255 - {2: 39, 39, 8: 39}, - {2: 33, 33, 8: 1133}, - {131: 1129, 354: 1130, 387: 1134}, - {2: 38, 38, 8: 38}, - {2: 40, 40, 8: 40}, - // 260 - {366: 1137}, - {10: 1140, 131: 1138, 392: 1139}, - {2: 234, 234, 7: 234, 234}, - {2: 36, 36, 8: 36}, - {131: 1142, 495: 1141}, - // 265 - {2: 35, 35, 8: 35}, - {2: 34, 34, 8: 34}, - {131: 1144}, - {2: 237, 237, 8: 237, 53: 237, 151: 237}, - {2: 793, 793, 6: 793, 136: 793, 148: 793, 793, 161: 793, 209: 793}, - // 270 - {2: 47, 47}, - {343, 343, 4: 343, 343, 343, 9: 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 133: 343, 146: 343, 313: 343, 318: 343}, - {694, 694, 4: 694, 694, 694, 9: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 133: 694, 313: 1149, 318: 694, 359: 1150}, - {693, 693, 4: 693, 693, 693, 9: 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 693, 133: 693, 146: 693, 318: 693, 320: 693, 327: 693}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 318: 1154, 325: 1156, 1155, 328: 1153, 334: 1151, 342: 1152}, - // 275 - {2: 320, 320, 7: 320, 320, 130: 320, 139: 320, 144: 320, 320, 147: 320, 320, 150: 320, 152: 320, 320, 156: 320}, - {8: 1721, 153: 1756}, - {8: 318, 132: 1175, 153: 1729, 1177, 157: 1178, 1179, 1176, 344: 1173, 347: 1174}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1726, 948, 947}, - {2: 316, 316, 7: 316, 316, 130: 316, 132: 316, 139: 316, 144: 316, 316, 147: 316, 316, 150: 316, 152: 316, 316, 316, 156: 316, 316, 316, 316, 316}, - // 280 - {2: 315, 315, 7: 315, 315, 130: 315, 132: 315, 139: 315, 144: 315, 315, 147: 315, 315, 150: 315, 152: 315, 315, 315, 156: 315, 315, 315, 315, 315}, - {1005, 949, 310, 310, 950, 971, 957, 310, 310, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 130: 310, 132: 310, 139: 310, 144: 310, 310, 147: 310, 310, 150: 310, 152: 310, 310, 310, 156: 310, 310, 310, 310, 310, 162: 1167, 206: 1166, 948, 947, 364: 1725, 536: 1724}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1161, 206: 1073, 948, 947, 243: 899, 303: 1157, 307: 1162, 315: 902, 901, 1163, 1154, 325: 1156, 1155, 328: 1160, 334: 1151, 342: 1159}, - {7: 1722, 1721}, - {2: 318, 318, 7: 318, 318, 130: 318, 132: 1175, 139: 318, 144: 318, 318, 147: 318, 318, 150: 318, 152: 318, 318, 1177, 156: 318, 1178, 1179, 1176, 344: 1173, 347: 1174}, - // 285 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1161, 206: 1073, 948, 947, 243: 899, 303: 1157, 307: 1171, 315: 902, 901, 1163, 1154, 325: 1156, 1155, 328: 1160, 334: 1151, 342: 1159}, - {7: 1169, 139: 272}, - {7: 1164}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 162: 1167, 206: 1166, 948, 947, 364: 1165}, - {2: 312, 312, 7: 312, 312, 130: 312, 132: 312, 139: 312, 144: 312, 312, 147: 312, 312, 150: 312, 152: 312, 312, 312, 156: 312, 312, 312, 312, 312}, - // 290 - {2: 308, 308, 7: 308, 308, 130: 308, 132: 308, 139: 308, 144: 308, 308, 147: 308, 308, 150: 308, 152: 308, 308, 308, 156: 308, 308, 308, 308, 308}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1168, 948, 947}, - {2: 307, 307, 7: 307, 307, 130: 307, 132: 307, 139: 307, 144: 307, 307, 147: 307, 307, 150: 307, 152: 307, 307, 307, 156: 307, 307, 307, 307, 307}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 162: 1167, 206: 1166, 948, 947, 364: 1170}, - {2: 313, 313, 7: 313, 313, 130: 313, 132: 313, 139: 313, 144: 313, 313, 147: 313, 313, 150: 313, 152: 313, 313, 313, 156: 313, 313, 313, 313, 313}, - // 295 - {7: 1172, 139: 272}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 139: 271, 162: 1167, 206: 1166, 948, 947, 364: 1170}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 325: 1156, 1155, 328: 1718}, - {154: 301, 378: 1183, 510: 1182}, - {154: 303, 378: 303}, - // 300 - {154: 302, 378: 302}, - {299, 299, 4: 299, 299, 299, 9: 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 133: 299}, - {154: 1181}, - {154: 1180}, - {297, 297, 4: 297, 297, 297, 9: 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 133: 297}, - // 305 - {298, 298, 4: 298, 298, 298, 9: 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 133: 298}, - {154: 1184}, - {154: 300}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 325: 1156, 1155, 328: 1185}, - {130: 1186, 132: 1175, 154: 1177, 157: 1178, 1179, 1176, 344: 1173, 347: 1174}, - // 310 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1187, 1189}, - {2: 304, 304, 7: 304, 304, 130: 304, 132: 304, 138: 1303, 304, 1302, 1301, 1300, 1298, 304, 304, 147: 304, 304, 150: 304, 152: 304, 304, 304, 156: 304, 304, 304, 304, 304, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1717, 1189}, - {750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 130: 750, 750, 750, 138: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 150: 750, 1704, 750, 750, 750, 750, 750, 750, 750, 750, 750, 162: 750, 750, 750, 166: 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 750, 181: 1701, 1699, 1698, 1696, 1700, 1702, 1703, 1705, 473: 1697}, - {737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 130: 737, 737, 737, 138: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 150: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 162: 737, 737, 737, 166: 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 737, 181: 737, 737, 737, 737, 737, 737, 737, 737}, - // 315 - {720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 1653, 720, 720, 720, 134: 1658, 1659, 138: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 150: 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 715, 720, 720, 720, 1660, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 720, 715, 720, 720, 720, 720, 720, 720, 720, 720, 715, 715, 715, 1662, 1655, 1661, 1665, 1654, 198: 1663, 1656, 1664, 1657, 434: 1652}, - {677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 1648, 677, 677, 138: 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 677, 198: 677, 677, 677, 677, 211: 677}, - {666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 1645, 666, 666, 138: 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 666, 198: 666, 666, 666, 666, 211: 666}, - {631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 1642, 631, 631, 138: 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 198: 631, 631, 631, 631, 211: 631}, - {629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 1639, 629, 629, 138: 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 198: 629, 629, 629, 629, 211: 629}, - // 320 - {626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 1637, 626, 626, 138: 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 626, 198: 626, 626, 626, 626, 211: 626}, - {614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 1632, 614, 614, 138: 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 614, 198: 614, 614, 614, 614, 211: 614}, - {598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 1629, 598, 598, 138: 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 198: 598, 598, 598, 598, 211: 598}, - {597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 413, 597, 597, 138: 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 597, 198: 597, 597, 597, 597, 211: 597}, - {595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 1626, 595, 595, 138: 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 198: 595, 595, 595, 595, 211: 595}, - // 325 - {594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 1623, 594, 594, 138: 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 198: 594, 594, 594, 594, 211: 594}, - {593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 1620, 593, 593, 138: 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 198: 593, 593, 593, 593, 211: 593}, - {592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 1618, 592, 592, 138: 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 198: 592, 592, 592, 592, 211: 592}, - {591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 1615, 591, 591, 138: 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 198: 591, 591, 591, 591, 211: 591}, - {590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 1609, 590, 590, 138: 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 590, 198: 590, 590, 590, 590, 211: 590}, - // 330 - {589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 1606, 589, 589, 138: 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 198: 589, 589, 589, 589, 211: 589}, - {588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 415, 588, 588, 138: 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 198: 588, 588, 588, 588, 211: 588}, - {587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 414, 587, 587, 138: 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 198: 587, 587, 587, 587, 211: 587}, - {586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 1603, 586, 586, 138: 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 198: 586, 586, 586, 586, 211: 586}, - {585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 1600, 585, 585, 138: 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 198: 585, 585, 585, 585, 211: 585}, - // 335 - {584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 1597, 584, 584, 138: 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 198: 584, 584, 584, 584, 211: 584}, - {583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 1594, 583, 583, 138: 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 583, 198: 583, 583, 583, 583, 211: 583}, - {582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 1592, 582, 582, 138: 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 582, 198: 582, 582, 582, 582, 211: 582}, - {581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 1588, 581, 581, 138: 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 581, 198: 581, 581, 581, 581, 211: 581}, - {580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 1585, 580, 580, 138: 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 198: 580, 580, 580, 580, 211: 580}, - // 340 - {579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1582, 579, 579, 138: 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 198: 579, 579, 579, 579, 211: 579}, - {578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 1579, 578, 578, 138: 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 578, 198: 578, 578, 578, 578, 211: 578}, - {577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 1571, 577, 577, 138: 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 577, 198: 577, 577, 577, 577, 211: 577}, - {576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 1567, 576, 576, 138: 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 576, 198: 576, 576, 576, 576, 211: 576}, - {575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 1564, 575, 575, 138: 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 198: 575, 575, 575, 575, 211: 575}, - // 345 - {574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 1560, 574, 574, 138: 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 574, 198: 574, 574, 574, 574, 211: 574}, - {573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 1557, 573, 573, 138: 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 573, 198: 573, 573, 573, 573, 211: 573}, - {572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1554, 572, 572, 138: 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 198: 572, 572, 572, 572, 211: 572}, - {571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 1551, 571, 571, 138: 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 571, 198: 571, 571, 571, 571, 211: 571}, - {570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 1548, 570, 570, 138: 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 198: 570, 570, 570, 570, 211: 570}, - // 350 - {569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 1543, 569, 569, 138: 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 569, 198: 569, 569, 569, 569, 211: 569}, - {568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 1538, 568, 568, 138: 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, 198: 568, 568, 568, 568, 211: 568}, - {567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 1535, 567, 567, 138: 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 198: 567, 567, 567, 567, 211: 567}, - {566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 1532, 566, 566, 138: 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 566, 198: 566, 566, 566, 566, 211: 566}, - {564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 412, 564, 564, 138: 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 564, 198: 564, 564, 564, 564, 211: 564}, - // 355 - {563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1518, 563, 563, 138: 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 198: 563, 563, 563, 563, 211: 563}, - {562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 1511, 562, 562, 138: 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 562, 198: 562, 562, 562, 562, 211: 562}, - {561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 1504, 561, 561, 138: 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 198: 561, 561, 561, 561, 211: 561}, - {560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1487, 560, 560, 138: 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 198: 560, 560, 560, 560, 211: 560}, - {559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 481, 559, 559, 138: 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 198: 559, 559, 559, 559, 211: 559}, - // 360 - {558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 1484, 558, 558, 138: 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 558, 198: 558, 558, 558, 558, 211: 558}, - {557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 1481, 557, 557, 138: 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 198: 557, 557, 557, 557, 211: 557}, - {556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 1478, 556, 556, 138: 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 556, 198: 556, 556, 556, 556, 211: 556}, - {529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 134: 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 198: 529, 529, 529, 529, 203: 529, 529, 529}, - {528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 134: 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 198: 528, 528, 528, 528, 203: 528, 528, 528}, - // 365 - {527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 134: 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 198: 527, 527, 527, 527, 203: 527, 527, 527}, - {526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 134: 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 526, 198: 526, 526, 526, 526, 203: 526, 526, 526}, - {525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 134: 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, 198: 525, 525, 525, 525, 203: 525, 525, 525}, - {524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 134: 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 198: 524, 524, 524, 524, 203: 524, 524, 524}, - {131: 1477}, - // 370 - {522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 134: 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 198: 522, 522, 522, 522, 203: 522, 522, 522}, - {521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 134: 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 198: 521, 521, 521, 521, 203: 521, 521, 521}, - {520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 134: 520, 520, 138: 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 198: 520, 520, 520, 520}, - {519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 134: 519, 519, 138: 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 519, 198: 519, 519, 519, 519}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1470, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 899, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1469, 1189, 307: 1459, 315: 902, 901, 1460}, - // 375 - {517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 1466, 517, 517, 138: 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 198: 517, 517, 517, 517}, - {515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 134: 515, 515, 138: 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 515, 198: 515, 515, 515, 515}, - {514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 134: 514, 514, 138: 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 198: 514, 514, 514, 514}, - {133: 1458, 246: 1457}, - {501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 134: 501, 501, 138: 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 501, 198: 501, 501, 501, 501}, - // 380 - {500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 134: 500, 500, 138: 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 198: 500, 500, 500, 500}, - {499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 134: 499, 499, 138: 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 499, 198: 499, 499, 499, 499}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1456, 287: 1291, 294: 1252}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1455, 287: 1291, 294: 1252}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1454, 287: 1291, 294: 1252}, - // 385 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1453, 287: 1291, 294: 1252}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1452, 287: 1291, 294: 1252}, - {349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 134: 349, 349, 138: 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 1450, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 198: 349, 349, 349, 349}, - {492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 134: 492, 492, 138: 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 492, 198: 492, 492, 492, 492}, - {491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 134: 491, 491, 138: 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 198: 491, 491, 491, 491}, - // 390 - {490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 134: 490, 490, 138: 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 198: 490, 490, 490, 490}, - {489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 134: 489, 489, 138: 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 198: 489, 489, 489, 489}, - {133: 488}, - {133: 487}, - {133: 486}, - // 395 - {133: 485}, - {133: 484}, - {479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 483, 479, 479, 138: 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 479, 198: 479, 479, 479, 479}, - {478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 482, 478, 478, 138: 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 478, 198: 478, 478, 478, 478}, - {133: 1443}, - // 400 - {133: 1438}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 164: 376, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1309, 1189, 346: 1426}, - {133: 1379}, - {133: 1376}, - {133: 1374}, - // 405 - {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 1369, 399, 399, 138: 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 198: 399, 399, 399, 399, 423: 1373}, - {399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 1369, 399, 399, 138: 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 399, 198: 399, 399, 399, 399, 423: 1368}, - {133: 1361}, - {133: 1352}, - {133: 1327}, - // 410 - {133: 1324}, - {133: 1317}, - {133: 1312}, - {133: 1308}, - {133: 1295}, - // 415 - {241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 134: 241, 241, 138: 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 198: 241, 241, 241, 241}, - {240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 134: 240, 240, 138: 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 198: 240, 240, 240, 240}, - {239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 134: 239, 239, 138: 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 198: 239, 239, 239, 239}, - {238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 134: 238, 238, 138: 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 198: 238, 238, 238, 238}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1296, 1189}, - // 420 - {7: 1304, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1307, 1189}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1306, 1189}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1305, 1189}, - {749, 749, 4: 749, 749, 749, 9: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 131: 749, 749, 749, 749, 749, 749, 749, 197: 749, 202: 749, 210: 749, 212: 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749, 749}, - // 425 - {748, 748, 4: 748, 748, 748, 9: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 131: 748, 748, 748, 748, 748, 748, 748, 197: 748, 202: 748, 210: 748, 212: 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748, 748}, - {747, 747, 4: 747, 747, 747, 9: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 131: 747, 747, 747, 747, 747, 747, 747, 197: 747, 202: 747, 210: 747, 212: 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747, 747}, - {746, 746, 4: 746, 746, 746, 9: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 131: 746, 746, 746, 746, 746, 746, 746, 197: 746, 202: 746, 210: 746, 212: 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746, 746}, - {420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 134: 420, 420, 138: 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 198: 420, 420, 420, 420}, - {755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 130: 755, 755, 755, 138: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 150: 755, 152: 755, 755, 755, 755, 755, 755, 755, 755, 755, 162: 755, 755, 755, 166: 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 300: 1299, 1297}, - // 430 - {756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 130: 756, 756, 756, 138: 1303, 756, 1302, 756, 756, 756, 756, 756, 756, 756, 756, 150: 756, 152: 756, 756, 756, 756, 756, 756, 756, 756, 756, 162: 756, 756, 756, 166: 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 300: 1299, 1297}, - {757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 130: 757, 757, 757, 138: 1303, 757, 1302, 757, 757, 1298, 757, 757, 757, 757, 757, 150: 757, 152: 757, 757, 757, 757, 757, 757, 757, 757, 757, 162: 757, 757, 757, 166: 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 757, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 376, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1309, 1189, 346: 1310}, - {7: 375, 138: 1303, 140: 1302, 1301, 1300, 1298, 164: 375, 300: 1299, 1297}, - {7: 1311}, - // 435 - {425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 134: 425, 425, 138: 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 425, 198: 425, 425, 425, 425}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1313, 1189}, - {8: 1314, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1315, 1189}, - {7: 1316, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 440 - {431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 134: 431, 431, 138: 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 431, 198: 431, 431, 431, 431}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1318, 1189}, - {8: 1319, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1320, 1189}, - {8: 1321, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 445 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1322, 1189}, - {7: 1323, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 134: 433, 433, 138: 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 433, 198: 433, 433, 433, 433}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1325, 1189}, - {7: 1326, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 450 - {442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 134: 442, 442, 138: 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 442, 198: 442, 442, 442, 442}, - {26: 1337, 30: 1333, 32: 1332, 34: 1329, 1331, 1335, 38: 1336, 1330, 43: 1334, 168: 1347, 1344, 1346, 1345, 1341, 1343, 1342, 1339, 1340, 1338, 1348, 384: 1328}, - {146: 1349}, - {7: 396, 146: 396}, - {7: 395, 146: 395}, - // 455 - {7: 394, 146: 394}, - {7: 393, 146: 393}, - {7: 392, 146: 392}, - {7: 391, 146: 391}, - {7: 390, 146: 390}, - // 460 - {7: 389, 146: 389}, - {7: 388, 146: 388}, - {7: 387, 146: 387}, - {7: 386, 146: 386}, - {7: 385, 146: 385}, - // 465 - {7: 384, 146: 384}, - {7: 383, 146: 383}, - {7: 382, 146: 382}, - {7: 381, 146: 381}, - {7: 380, 146: 380}, - // 470 - {7: 379, 146: 379}, - {7: 378, 146: 378}, - {7: 377, 146: 377}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1350, 1189}, - {7: 1351, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 475 - {449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 134: 449, 449, 138: 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 449, 198: 449, 449, 449, 449}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1353, 1189}, - {8: 1354, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1355, 1189, 427: 1357, 479: 1356}, - {7: 411, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 480 - {7: 1360}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1358, 1189}, - {26: 1337, 30: 1333, 32: 1332, 34: 1329, 1331, 1335, 38: 1336, 1330, 43: 1334, 138: 1303, 140: 1302, 1301, 1300, 1298, 168: 1347, 1344, 1346, 1345, 1341, 1343, 1342, 1339, 1340, 1338, 1348, 300: 1299, 1297, 384: 1359}, - {7: 410}, - {450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 134: 450, 450, 138: 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 198: 450, 450, 450, 450}, - // 485 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1362, 1189}, - {8: 1363, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {427: 1364}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1365, 1189}, - {26: 1337, 30: 1333, 32: 1332, 34: 1329, 1331, 1335, 38: 1336, 1330, 43: 1334, 138: 1303, 140: 1302, 1301, 1300, 1298, 168: 1347, 1344, 1346, 1345, 1341, 1343, 1342, 1339, 1340, 1338, 1348, 300: 1299, 1297, 384: 1366}, - // 490 - {7: 1367}, - {451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 134: 451, 451, 138: 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 451, 198: 451, 451, 451, 451}, - {460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 134: 460, 460, 138: 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 460, 198: 460, 460, 460, 460}, - {1005, 949, 4: 950, 971, 957, 1371, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1370, 1189}, - {7: 1372, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 495 - {398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 134: 398, 398, 138: 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 398, 198: 398, 398, 398, 398}, - {397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 134: 397, 397, 138: 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 198: 397, 397, 397, 397}, - {461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 134: 461, 461, 138: 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 198: 461, 461, 461, 461}, - {7: 1375}, - {463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 134: 463, 463, 138: 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 198: 463, 463, 463, 463}, - // 500 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1377}, - {7: 1378}, - {467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 134: 467, 467, 138: 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 198: 467, 467, 467, 467}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1380, 1189}, - {8: 1382, 138: 1303, 140: 1302, 1301, 1300, 1298, 155: 1381, 300: 1299, 1297}, - // 505 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 1424}, - {28: 1387, 1386, 40: 1389, 57: 1390, 197: 1384, 247: 1385, 253: 1388, 302: 1391, 395: 1383}, - {7: 1423}, - {7: 71, 133: 1396, 306: 1397, 312: 1422}, - {6: 71, 71, 133: 1396, 197: 71, 209: 71, 306: 1397, 312: 1411}, - // 510 - {7: 367}, - {7: 71, 133: 1396, 306: 1397, 312: 1410}, - {7: 65, 133: 1403, 306: 1404, 375: 1402, 379: 1405}, - {7: 71, 133: 1396, 306: 1397, 312: 1395}, - {7: 105, 254: 1393, 437: 1394}, - // 515 - {7: 105, 254: 1393, 437: 1392}, - {7: 362}, - {7: 104}, - {7: 363}, - {7: 364}, - // 520 - {210: 1399, 310: 1400, 1398}, - {70, 70, 70, 70, 70, 70, 70, 70, 70, 129: 70, 70, 136: 70, 70, 149: 70, 163: 70, 166: 70, 197: 70, 203: 70, 70, 70, 209: 70, 302: 70, 304: 70}, - {759, 759, 759, 759, 6: 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 37: 759, 130: 759, 136: 759, 139: 759, 144: 759, 147: 759, 149: 759, 209: 759}, - {758, 758, 758, 758, 6: 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 37: 758, 130: 758, 136: 758, 139: 758, 144: 758, 147: 758, 149: 758, 209: 758}, - {7: 1401}, - // 525 - {72, 72, 72, 72, 72, 72, 72, 72, 72, 129: 72, 72, 136: 72, 72, 149: 72, 163: 72, 166: 72, 197: 72, 203: 72, 72, 72, 209: 72, 302: 72, 304: 72}, - {7: 365}, - {210: 1399, 310: 1406, 1398}, - {64, 64, 64, 64, 64, 64, 7: 64, 64, 129: 64, 64, 136: 64, 64, 203: 64, 64, 64, 302: 64, 304: 64}, - {63, 63, 63, 63, 63, 63, 7: 63, 63, 129: 63, 63, 136: 63, 63, 203: 63, 63, 63, 302: 63, 304: 63}, - // 530 - {7: 1401, 1407}, - {210: 1399, 310: 1408, 1398}, - {7: 1409}, - {62, 62, 62, 62, 62, 62, 7: 62, 62, 129: 62, 62, 136: 62, 62, 203: 62, 62, 62, 302: 62, 304: 62}, - {7: 366}, - // 535 - {6: 61, 61, 197: 1413, 209: 61, 348: 1412}, - {6: 1417, 59, 209: 1416, 323: 1415, 336: 1414}, - {60, 60, 60, 60, 60, 60, 60, 60, 60, 129: 60, 60, 136: 60, 60, 149: 60, 203: 60, 60, 60, 209: 60}, - {7: 368}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 1419}, - // 540 - {153: 1418}, - {56, 56, 4: 56, 56, 56, 9: 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 131: 56, 151: 56}, - {57, 57, 4: 57, 57, 57, 9: 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 131: 57, 151: 57}, - {58, 58, 58, 58, 58, 58, 7: 58, 58, 129: 58, 58, 136: 58, 58, 149: 58, 203: 58, 58, 58}, - {51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 134: 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 198: 51, 51, 51, 51, 203: 51, 51, 51, 209: 51}, - // 545 - {50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 134: 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 198: 50, 50, 50, 50, 203: 50, 50, 50, 209: 50}, - {7: 369}, - {470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 134: 470, 470, 138: 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 198: 470, 470, 470, 470}, - {7: 1425}, - {471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 134: 471, 471, 138: 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 198: 471, 471, 471, 471}, - // 550 - {164: 1429, 460: 1428, 548: 1427}, - {20: 371, 164: 1429, 167: 1435, 460: 1434, 484: 1433}, - {20: 374, 164: 374, 167: 374}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1430, 1189}, - {138: 1303, 140: 1302, 1301, 1300, 1298, 179: 1431, 300: 1299, 1297}, - // 555 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1432, 1189}, - {20: 372, 138: 1303, 140: 1302, 1301, 1300, 1298, 164: 372, 167: 372, 300: 1299, 1297}, - {20: 1437}, - {20: 373, 164: 373, 167: 373}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1436, 1189}, - // 560 - {20: 370, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 134: 472, 472, 138: 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 198: 472, 472, 472, 472}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1439, 1189}, - {138: 1303, 140: 1302, 1301, 1300, 1298, 162: 1440, 300: 1299, 1297}, - {28: 1387, 1386, 40: 1389, 57: 1390, 197: 1384, 247: 1385, 253: 1388, 302: 1391, 395: 1441}, - // 565 - {7: 1442}, - {473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 134: 473, 473, 138: 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 198: 473, 473, 473, 473}, - {1005, 949, 4: 950, 971, 957, 742, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1445, 486: 1446}, - {2: 744, 744, 7: 744, 744, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {7: 741, 1448}, - // 570 - {7: 1447}, - {480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 134: 480, 480, 138: 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 198: 480, 480, 480, 480}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1449, 1189}, - {2: 743, 743, 7: 743, 743, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 1451}, - // 575 - {493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 134: 493, 493, 138: 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 198: 493, 493, 493, 493}, - {494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 134: 494, 494, 138: 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 1450, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 494, 198: 494, 494, 494, 494}, - {495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 134: 495, 495, 138: 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 1450, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 198: 495, 495, 495, 495}, - {496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 134: 496, 496, 138: 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 1450, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 198: 496, 496, 496, 496}, - {497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 134: 497, 497, 138: 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 1450, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 198: 497, 497, 497, 497}, - // 580 - {498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 134: 498, 498, 138: 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 1450, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 198: 498, 498, 498, 498}, - {511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 134: 511, 511, 138: 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, 198: 511, 511, 511, 511}, - {133: 1461, 243: 899, 307: 1459, 315: 902, 901, 1460}, - {7: 1465, 139: 272}, - {7: 1464}, - // 585 - {243: 899, 307: 1462}, - {7: 1463}, - {139: 271}, - {280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 134: 280, 280, 138: 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 198: 280, 280, 280, 280}, - {281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 134: 281, 281, 138: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 198: 281, 281, 281, 281}, - // 590 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1467}, - {7: 1468}, - {516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 134: 516, 516, 138: 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 198: 516, 516, 516, 516}, - {7: 1473, 1474, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1470, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 899, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1469, 1189, 307: 1471, 315: 902, 901, 1460}, - // 595 - {7: 1472, 139: 272}, - {2: 281, 281, 7: 281, 281, 129: 281, 134: 281, 281, 138: 281, 271, 281, 281, 281, 281, 149: 281, 151: 281, 161: 281, 165: 281, 180: 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 198: 281, 281, 281, 281}, - {518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 134: 518, 518, 138: 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 198: 518, 518, 518, 518}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1475}, - {7: 1476, 1448}, - // 600 - {512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 134: 512, 512, 138: 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 198: 512, 512, 512, 512}, - {523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 134: 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 198: 523, 523, 523, 523, 203: 523, 523, 523}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1479}, - {7: 1480, 1448}, - {417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 134: 417, 417, 138: 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 417, 198: 417, 417, 417, 417}, - // 605 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1482, 1189}, - {7: 1483, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 134: 418, 418, 138: 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 418, 198: 418, 418, 418, 418}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1485, 1189}, - {7: 1486, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 610 - {419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 134: 419, 419, 138: 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 198: 419, 419, 419, 419}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1488, 1189, 467: 1490, 501: 1491, 542: 1492, 1489}, - {7: 1500, 138: 1303, 140: 1302, 1301, 1300, 1298, 146: 1501, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 146: 1494, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1493, 1189}, - {409, 409, 4: 409, 409, 409, 9: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 131: 409, 409, 409, 409, 409, 409, 409, 146: 409, 197: 409, 202: 409, 210: 409, 212: 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409}, - // 615 - {408, 408, 4: 408, 408, 408, 9: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 131: 408, 408, 408, 408, 408, 408, 408, 146: 408, 197: 408, 202: 408, 210: 408, 212: 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408, 408}, - {407, 407, 4: 407, 407, 407, 9: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 131: 407, 407, 407, 407, 407, 407, 407, 146: 407, 197: 407, 202: 407, 210: 407, 212: 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407, 407}, - {138: 1303, 140: 1302, 1301, 1300, 1298, 146: 1497, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1495, 1189}, - {7: 1496, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 620 - {422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 134: 422, 422, 138: 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 422, 198: 422, 422, 422, 422}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1498, 1189}, - {7: 1499, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 134: 421, 421, 138: 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 198: 421, 421, 421, 421}, - {424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 134: 424, 424, 138: 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 198: 424, 424, 424, 424}, - // 625 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1502, 1189}, - {7: 1503, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 134: 423, 423, 138: 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 198: 423, 423, 423, 423}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1507}, - {476, 476, 4: 476, 476, 476, 9: 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 131: 476, 476, 476, 476, 476, 476, 476, 165: 476, 197: 476, 202: 476, 210: 476, 212: 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476, 476}, - // 630 - {475, 475, 4: 475, 475, 475, 9: 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 131: 475, 475, 475, 475, 475, 475, 475, 165: 475, 197: 475, 202: 475, 210: 475, 212: 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, 305: 1510}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1508, 1189}, - {7: 1509, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 134: 400, 400, 138: 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 198: 400, 400, 400, 400}, - {474, 474, 4: 474, 474, 474, 9: 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 131: 474, 474, 474, 474, 474, 474, 474, 165: 474, 197: 474, 202: 474, 210: 474, 212: 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474}, - // 635 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1512, 1189}, - {8: 1513, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1514, 1189}, - {8: 1515, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1516, 1189}, - // 640 - {7: 1517, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 134: 426, 426, 138: 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 198: 426, 426, 426, 426}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1519, 1189}, - {8: 1520, 138: 1303, 140: 1302, 1301, 1300, 1298, 146: 1521, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1527, 1189}, - // 645 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1522, 1189}, - {7: 1523, 138: 1303, 140: 1302, 1301, 1300, 1298, 1524, 300: 1299, 1297}, - {429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 134: 429, 429, 138: 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 198: 429, 429, 429, 429}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1525, 1189}, - {7: 1526, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 650 - {427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 134: 427, 427, 138: 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 427, 198: 427, 427, 427, 427}, - {7: 1528, 1529, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 134: 430, 430, 138: 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 198: 430, 430, 430, 430}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1530, 1189}, - {7: 1531, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 655 - {428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 134: 428, 428, 138: 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 198: 428, 428, 428, 428}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1533, 1189}, - {7: 1534, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 134: 432, 432, 138: 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 432, 198: 432, 432, 432, 432}, - {1005, 949, 4: 950, 971, 957, 376, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1309, 1189, 346: 1536}, - // 660 - {7: 1537}, - {434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 134: 434, 434, 138: 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 434, 198: 434, 434, 434, 434}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1539, 1189}, - {8: 1540, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1541, 1189}, - // 665 - {7: 1542, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 134: 435, 435, 138: 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 435, 198: 435, 435, 435, 435}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1544, 1189}, - {8: 1545, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1546, 1189}, - // 670 - {7: 1547, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 134: 436, 436, 138: 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 198: 436, 436, 436, 436}, - {1005, 949, 4: 950, 971, 957, 376, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1309, 1189, 346: 1549}, - {7: 1550}, - {438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 134: 438, 438, 138: 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 198: 438, 438, 438, 438}, - // 675 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1552, 1189}, - {7: 1553, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 134: 439, 439, 138: 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 439, 198: 439, 439, 439, 439}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1555}, - {7: 1556, 1448}, - // 680 - {437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 134: 437, 437, 138: 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 437, 198: 437, 437, 437, 437}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1558, 1189}, - {7: 1559, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 134: 440, 440, 138: 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 440, 198: 440, 440, 440, 440}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1561}, - // 685 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1562, 1189}, - {7: 1563, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 134: 401, 401, 138: 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 401, 198: 401, 401, 401, 401}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1565, 1189}, - {7: 1566, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 690 - {441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 134: 441, 441, 138: 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 441, 198: 441, 441, 441, 441}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1568}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1569, 1189}, - {7: 1570, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 134: 402, 402, 138: 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 198: 402, 402, 402, 402}, - // 695 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1572, 1189}, - {8: 1573, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1574, 1189}, - {7: 1575, 1576, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 134: 444, 444, 138: 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, 198: 444, 444, 444, 444}, - // 700 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1577, 1189}, - {7: 1578, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 134: 443, 443, 138: 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 443, 198: 443, 443, 443, 443}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1580, 1189}, - {7: 1581, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 705 - {445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 134: 445, 445, 138: 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, 198: 445, 445, 445, 445}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1583}, - {7: 1584, 1448}, - {446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 134: 446, 446, 138: 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 446, 198: 446, 446, 446, 446}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1586, 1189}, - // 710 - {7: 1587, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 134: 447, 447, 138: 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 447, 198: 447, 447, 447, 447}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1589}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1590}, - {7: 1591, 1448}, - // 715 - {403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 134: 403, 403, 138: 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, 198: 403, 403, 403, 403}, - {7: 1593}, - {448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 134: 448, 448, 138: 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 448, 198: 448, 448, 448, 448}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1595, 1189}, - {7: 1596, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 720 - {452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 134: 452, 452, 138: 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 452, 198: 452, 452, 452, 452}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1598, 1189}, - {7: 1599, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 134: 454, 454, 138: 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, 198: 454, 454, 454, 454}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1601, 1189}, - // 725 - {7: 1602, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 134: 453, 453, 138: 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 198: 453, 453, 453, 453}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1604, 1189}, - {7: 1605, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 134: 455, 455, 138: 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 198: 455, 455, 455, 455}, - // 730 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1607, 1189}, - {7: 1608, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 134: 456, 456, 138: 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 198: 456, 456, 456, 456}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 165: 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1610}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 165: 1612, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1611}, - // 735 - {7: 1614, 1448}, - {7: 1613}, - {404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 134: 404, 404, 138: 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 404, 198: 404, 404, 404, 404}, - {405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 134: 405, 405, 138: 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 405, 198: 405, 405, 405, 405}, - {1005, 949, 4: 950, 971, 957, 376, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1309, 1189, 346: 1616}, - // 740 - {7: 1617}, - {462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 134: 462, 462, 138: 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 462, 198: 462, 462, 462, 462}, - {7: 1619}, - {416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 134: 416, 416, 138: 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 198: 416, 416, 416, 416}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1621}, - // 745 - {7: 1622, 1448}, - {457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 134: 457, 457, 138: 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 457, 198: 457, 457, 457, 457}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1624}, - {7: 1625, 1448}, - {458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 134: 458, 458, 138: 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 198: 458, 458, 458, 458}, - // 750 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1627}, - {7: 1628, 1448}, - {464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 134: 464, 464, 138: 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 198: 464, 464, 464, 464}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1630, 1189}, - {7: 1631, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 755 - {459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 134: 459, 459, 138: 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 198: 459, 459, 459, 459}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1633, 1189}, - {8: 1634, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1635}, - {7: 1636, 1448}, - // 760 - {513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 134: 513, 513, 138: 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 198: 513, 513, 513, 513}, - {7: 1638}, - {468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 134: 468, 468, 138: 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 198: 468, 468, 468, 468}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1640}, - {7: 1641, 1448}, - // 765 - {466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 134: 466, 466, 138: 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 198: 466, 466, 466, 466}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1643, 1189}, - {7: 1644, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 134: 465, 465, 138: 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 198: 465, 465, 465, 465}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1646, 1189}, - // 770 - {7: 1647, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 134: 469, 469, 138: 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 469, 198: 469, 469, 469, 469}, - {477, 477, 4: 477, 477, 477, 9: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 131: 477, 477, 477, 477, 477, 477, 477, 197: 477, 202: 477, 210: 477, 212: 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 477, 305: 1505, 330: 1506, 339: 1649}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1650}, - {7: 1651, 1448}, - // 775 - {406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 134: 406, 406, 138: 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 406, 198: 406, 406, 406, 406}, - {161: 1680, 180: 1678, 189: 1679, 1682, 1683, 521: 1681}, - {41: 714, 137: 714, 161: 714, 180: 714, 189: 714, 714, 714, 215: 714, 714}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1677}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1676}, - // 780 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1675}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1674}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1673}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1672}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1671}, - // 785 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1670}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1669}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1668}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1667}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1666}, - // 790 - {350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 134: 350, 350, 138: 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 150: 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 198: 350, 350, 350, 350}, - {351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 134: 351, 351, 138: 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 150: 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 1665, 351, 198: 351, 351, 351, 351}, - {352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 134: 352, 352, 138: 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 150: 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 1665, 352, 198: 352, 352, 352, 352}, - {353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 134: 353, 353, 138: 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 150: 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 1665, 353, 198: 353, 353, 353, 353}, - {354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 134: 354, 354, 138: 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 150: 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 1665, 354, 198: 354, 354, 354, 354}, - // 795 - {355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 134: 355, 355, 138: 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 150: 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 1665, 355, 198: 355, 355, 355, 355}, - {356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 134: 356, 356, 138: 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 150: 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 1660, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 1662, 356, 1661, 1665, 356, 198: 1663, 356, 1664, 356}, - {357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 134: 357, 357, 138: 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 150: 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 1660, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 1662, 357, 1661, 1665, 357, 198: 1663, 357, 1664, 357}, - {358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 134: 1658, 1659, 138: 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 150: 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 1660, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 1662, 358, 1661, 1665, 358, 198: 1663, 358, 1664, 358}, - {359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 134: 1658, 1659, 138: 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 150: 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 1660, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 1662, 359, 1661, 1665, 359, 198: 1663, 359, 1664, 359}, - // 800 - {360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 134: 1658, 1659, 138: 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 150: 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 1660, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 360, 1662, 360, 1661, 1665, 360, 198: 1663, 1656, 1664, 1657}, - {361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 134: 1658, 1659, 138: 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 150: 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 1660, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 361, 1662, 1655, 1661, 1665, 361, 198: 1663, 1656, 1664, 1657}, - {133: 1692, 246: 1693}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1689}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1685, 287: 1291, 294: 1252}, - // 805 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1684, 287: 1291, 294: 1252}, - {719, 719, 4: 719, 719, 719, 9: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 131: 719, 719, 719, 719, 719, 719, 719, 197: 719, 202: 719, 210: 719, 212: 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719}, - {718, 718, 4: 718, 718, 718, 9: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 131: 718, 718, 718, 718, 718, 718, 718, 197: 718, 202: 718, 210: 718, 212: 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, 718}, - {721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 130: 721, 721, 721, 138: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 1450, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 162: 721, 721, 721, 166: 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, 181: 721, 721, 721, 721, 721, 721, 721, 721}, - {717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 1687, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 130: 717, 717, 717, 138: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 1450, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 162: 717, 717, 717, 166: 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 717, 181: 717, 717, 717, 717, 717, 717, 717, 717, 502: 1686}, - // 810 - {722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 130: 722, 722, 722, 138: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 150: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 162: 722, 722, 722, 166: 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 722, 181: 722, 722, 722, 722, 722, 722, 722, 722}, - {131: 1688}, - {716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 130: 716, 716, 716, 138: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 150: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 162: 716, 716, 716, 166: 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, 181: 716, 716, 716, 716, 716, 716, 716, 716}, - {134: 1658, 1659, 138: 1690, 165: 1660, 192: 1662, 1655, 1661, 1665, 1654, 198: 1663, 1656, 1664, 1657}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1691}, - // 815 - {723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 130: 723, 723, 723, 138: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 150: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 162: 723, 723, 723, 166: 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 181: 723, 723, 723, 723, 723, 723, 723, 723}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1470, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 899, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 307: 1459, 309: 1694, 315: 902, 901, 1460}, - {724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 130: 724, 724, 724, 138: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 150: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 162: 724, 724, 724, 166: 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 724, 181: 724, 724, 724, 724, 724, 724, 724, 724}, - {7: 1695, 1448}, - {725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 130: 725, 725, 725, 138: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 150: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 162: 725, 725, 725, 166: 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 181: 725, 725, 725, 725, 725, 725, 725, 725}, - // 820 - {41: 715, 129: 1653, 137: 715, 215: 715, 715, 434: 1712}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1708, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1709, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1706, 305: 1710, 462: 1707}, - {736, 736, 4: 736, 736, 736, 9: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 131: 736, 736, 736, 736, 736, 736, 736, 197: 736, 202: 736, 210: 736, 212: 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 736, 305: 736}, - {735, 735, 4: 735, 735, 735, 9: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 131: 735, 735, 735, 735, 735, 735, 735, 197: 735, 202: 735, 210: 735, 212: 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 735, 305: 735}, - {734, 734, 4: 734, 734, 734, 9: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 131: 734, 734, 734, 734, 734, 734, 734, 197: 734, 202: 734, 210: 734, 212: 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 734, 305: 734}, - // 825 - {733, 733, 4: 733, 733, 733, 9: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 131: 733, 733, 733, 733, 733, 733, 733, 197: 733, 202: 733, 210: 733, 212: 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 733, 305: 733}, - {732, 732, 4: 732, 732, 732, 9: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 131: 732, 732, 732, 732, 732, 732, 732, 197: 732, 202: 732, 210: 732, 212: 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 732, 305: 732}, - {731, 731, 4: 731, 731, 731, 9: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 131: 731, 731, 731, 731, 731, 731, 731, 197: 731, 202: 731, 210: 731, 212: 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 731, 305: 731}, - {730, 730, 4: 730, 730, 730, 9: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 131: 730, 730, 730, 730, 730, 730, 730, 197: 730, 202: 730, 210: 730, 212: 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 305: 730}, - {729, 729, 4: 729, 729, 729, 9: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 131: 729, 729, 729, 729, 729, 729, 729, 197: 729, 202: 729, 210: 729, 212: 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 729, 305: 729}, - // 830 - {739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 130: 739, 739, 739, 138: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 150: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 162: 739, 739, 739, 166: 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 739, 181: 739, 739, 739, 739, 739, 739, 739, 739}, - {133: 1458, 246: 1711}, - {628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 728, 628, 628, 138: 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 198: 628, 628, 628, 628, 211: 628}, - {627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 727, 627, 627, 138: 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 627, 198: 627, 627, 627, 627, 211: 627}, - {133: 726}, - // 835 - {738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 130: 738, 738, 738, 138: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 150: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 162: 738, 738, 738, 166: 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 181: 738, 738, 738, 738, 738, 738, 738, 738}, - {41: 1715, 137: 1716, 215: 1714, 1713}, - {753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 130: 753, 753, 753, 138: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 150: 753, 152: 753, 753, 753, 753, 753, 753, 753, 753, 753, 162: 753, 753, 753, 166: 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753}, - {752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 130: 752, 752, 752, 138: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 150: 752, 152: 752, 752, 752, 752, 752, 752, 752, 752, 752, 162: 752, 752, 752, 166: 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752, 752}, - {751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 130: 751, 751, 751, 138: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 150: 751, 152: 751, 751, 751, 751, 751, 751, 751, 751, 751, 162: 751, 751, 751, 166: 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751, 751}, - // 840 - {740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 130: 740, 740, 740, 138: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 150: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 162: 740, 740, 740, 166: 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, 181: 740, 740, 740, 740, 740, 740, 740, 740}, - {754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 130: 754, 754, 754, 138: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 150: 754, 152: 754, 754, 754, 754, 754, 754, 754, 754, 754, 162: 754, 754, 754, 166: 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 300: 1299, 1297}, - {2: 306, 306, 7: 306, 306, 130: 1719, 132: 306, 139: 306, 144: 306, 306, 147: 306, 306, 150: 306, 152: 306, 306, 306, 156: 306, 306, 306, 306, 306, 344: 1173, 347: 1174}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1720, 1189}, - {2: 305, 305, 7: 305, 305, 130: 305, 132: 305, 138: 1303, 305, 1302, 1301, 1300, 1298, 305, 305, 147: 305, 305, 150: 305, 152: 305, 305, 305, 156: 305, 305, 305, 305, 305, 300: 1299, 1297}, - // 845 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 318: 1154, 325: 1156, 1155, 328: 1160, 334: 1723}, - {2: 311, 311, 7: 311, 311, 130: 311, 132: 311, 139: 311, 144: 311, 311, 147: 311, 311, 150: 311, 152: 311, 311, 311, 156: 311, 311, 311, 311, 311}, - {2: 319, 319, 7: 319, 319, 130: 319, 139: 319, 144: 319, 319, 147: 319, 319, 150: 319, 152: 319, 319, 156: 319}, - {2: 314, 314, 7: 314, 314, 130: 314, 132: 314, 139: 314, 144: 314, 314, 147: 314, 314, 150: 314, 152: 314, 314, 314, 156: 314, 314, 314, 314, 314}, - {2: 309, 309, 7: 309, 309, 130: 309, 132: 309, 139: 309, 144: 309, 309, 147: 309, 309, 150: 309, 152: 309, 309, 309, 156: 309, 309, 309, 309, 309}, - // 850 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 325: 1156, 1155, 328: 1727}, - {132: 1175, 154: 1177, 157: 1178, 1179, 1176, 1728, 344: 1173, 347: 1174}, - {2: 317, 317, 7: 317, 317, 130: 317, 139: 317, 144: 317, 317, 147: 317, 317, 150: 317, 152: 317, 317, 156: 317}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1730, 356: 1731, 365: 1732}, - {151: 1754}, - // 855 - {2: 851, 851, 8: 851, 145: 851, 148: 851, 150: 851}, - {2: 45, 45, 8: 1733, 145: 45, 148: 1735, 150: 45, 337: 1736, 1734}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1730, 356: 1753}, - {2: 503, 503, 145: 503, 150: 1738, 361: 1739, 1740}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1737, 1189}, - // 860 - {2: 44, 44, 7: 44, 130: 44, 139: 44, 144: 44, 44, 147: 44, 150: 44, 152: 44, 156: 44}, - {2: 46, 46, 7: 46, 130: 46, 138: 1303, 46, 1302, 1301, 1300, 1298, 46, 46, 147: 46, 150: 46, 152: 46, 156: 46, 300: 1299, 1297}, - {366: 1744}, - {2: 502, 502, 7: 502, 130: 502, 139: 502, 144: 502, 502, 147: 502}, - {2: 296, 296, 145: 1741, 429: 1742}, - // 865 - {210: 1399, 310: 1743, 1398}, - {2: 49, 49}, - {2: 295, 295}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1745, 1189, 367: 1747, 394: 1746}, - {2: 506, 506, 7: 506, 506, 130: 506, 138: 1303, 506, 1302, 1301, 1300, 1298, 506, 506, 147: 506, 150: 506, 152: 506, 163: 1752, 166: 1751, 300: 1299, 1297, 438: 1750}, - // 870 - {2: 510, 510, 7: 510, 1748, 130: 510, 139: 510, 144: 510, 510, 147: 510}, - {2: 509, 509, 7: 509, 509, 130: 509, 139: 509, 144: 509, 509, 147: 509, 150: 509, 152: 509}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1745, 1189, 367: 1749}, - {2: 508, 508, 7: 508, 508, 130: 508, 139: 508, 144: 508, 508, 147: 508, 150: 508, 152: 508}, - {2: 507, 507, 7: 507, 507, 130: 507, 139: 507, 144: 507, 507, 147: 507, 150: 507, 152: 507}, - // 875 - {2: 505, 505, 7: 505, 505, 130: 505, 139: 505, 144: 505, 505, 147: 505, 150: 505, 152: 505}, - {2: 504, 504, 7: 504, 504, 130: 504, 139: 504, 144: 504, 504, 147: 504, 150: 504, 152: 504}, - {2: 850, 850, 8: 850, 145: 850, 148: 850, 150: 850}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1755, 1189}, - {2: 852, 852, 8: 852, 138: 1303, 140: 1302, 1301, 1300, 1298, 145: 852, 148: 852, 150: 852, 300: 1299, 1297}, - // 880 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1730, 356: 1731, 365: 1757}, - {2: 45, 45, 8: 1733, 148: 1735, 337: 1736, 1758}, - {2: 48, 48}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1760}, - {2: 133, 133}, - // 885 - {2: 212, 212, 148: 1810, 161: 1809, 530: 1808}, - {327: 1806}, - {2: 229, 229, 144: 1804}, - {146: 1802}, - {2: 226, 226, 148: 226, 161: 226}, - // 890 - {2: 225, 225, 148: 225, 161: 225}, - {2: 224, 224, 148: 224, 161: 224}, - {153: 1801}, - {22: 1789, 27: 1790, 31: 1791}, - {21: 1787}, - // 895 - {2: 218, 218, 148: 218, 161: 218}, - {21: 1786, 25: 1785}, - {2: 215, 215, 148: 215, 161: 215}, - {2: 204, 204, 146: 1781, 148: 204, 161: 204, 180: 1782, 351: 1780}, - {21: 1779}, - // 900 - {21: 208, 25: 208}, - {21: 207, 25: 207}, - {22: 205, 27: 205, 31: 205}, - {2: 213, 213, 148: 213, 161: 213}, - {2: 214, 214, 148: 214, 161: 214}, - // 905 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1145, 948, 947, 345: 1784}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1145, 948, 947, 345: 1783}, - {2: 202, 202, 148: 202, 161: 202}, - {2: 203, 203, 148: 203, 161: 203}, - {2: 217, 217, 148: 217, 161: 217}, - // 910 - {2: 216, 216, 148: 216, 161: 216}, - {2: 204, 204, 146: 1781, 148: 204, 161: 204, 180: 1782, 351: 1788}, - {2: 221, 221, 148: 221, 161: 221}, - {2: 204, 204, 146: 1781, 148: 204, 161: 204, 180: 1782, 351: 1800}, - {146: 1793, 180: 1794, 446: 1798}, - // 915 - {146: 1793, 180: 1794, 446: 1792}, - {2: 204, 204, 146: 1781, 148: 204, 161: 204, 180: 1782, 351: 1797}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1796}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1795}, - {2: 200, 200, 146: 200, 148: 200, 161: 200, 180: 200}, - // 920 - {2: 201, 201, 146: 201, 148: 201, 161: 201, 180: 201}, - {2: 219, 219, 148: 219, 161: 219}, - {2: 204, 204, 146: 1781, 148: 204, 161: 204, 180: 1782, 351: 1799}, - {2: 220, 220, 148: 220, 161: 220}, - {2: 222, 222, 148: 222, 161: 222}, - // 925 - {2: 223, 223, 148: 223, 161: 223}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1803}, - {2: 227, 227}, - {131: 1129, 354: 1805}, - {2: 228, 228}, - // 930 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1807}, - {2: 230, 230}, - {2: 231, 231}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1812, 287: 1291, 294: 1252}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1811, 1189}, - // 935 - {2: 210, 210, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {2: 211, 211, 149: 1450}, - {480: 1820}, - {327: 1815}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1816, 352: 1817}, - // 940 - {2: 340, 340, 8: 340, 146: 340}, - {2: 232, 232, 8: 1818}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1819}, - {2: 339, 339, 8: 339, 146: 339, 155: 339}, - {2: 233, 233}, - // 945 - {56, 56, 4: 56, 56, 56, 9: 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 131: 56, 151: 671}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 653, 206: 1883, 948, 947}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 151: 652, 206: 1421, 948, 947, 321: 1880}, - {144: 1870, 151: 1869}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 1867, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 645, 206: 1847, 948, 947}, - // 950 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 1850, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 641, 206: 1844, 948, 947}, - {2: 267, 267, 8: 1840}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 1839}, - {151: 1837}, - {151: 1835}, - // 955 - {151: 1833}, - {2: 243, 243, 8: 243}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1834, 1189}, - {2: 245, 245, 8: 245, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1836, 1189}, - // 960 - {2: 246, 246, 8: 246, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1838, 1189}, - {2: 250, 250, 8: 250, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {2: 264, 264}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 1842, 1018, 974, 1028, 1822, 998, 1013, 1026, 1023, 1027, 1841, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1829, 948, 947, 214: 1831, 222: 1830, 459: 1843}, - // 965 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 645, 206: 1847, 948, 947}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 641, 206: 1844, 948, 947}, - {2: 242, 242, 8: 242}, - {151: 1845}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1846, 1189}, - // 970 - {2: 249, 249, 8: 249, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {151: 1848}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1849, 1189}, - {2: 248, 248, 8: 248, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {33: 1853, 151: 636, 250: 1854, 385: 1852, 452: 1851}, - // 975 - {2: 261, 261, 8: 1865}, - {2: 259, 259, 8: 259}, - {72: 1857}, - {76: 1856, 295: 1855}, - {2: 256, 256, 8: 256}, - // 980 - {2: 255, 255, 8: 255}, - {77: 1859, 1861, 250: 1860, 499: 1858}, - {2: 257, 257, 8: 257}, - {250: 1864}, - {66: 1862, 84: 1863}, - // 985 - {2: 251, 251, 8: 251}, - {2: 253, 253, 8: 253}, - {2: 252, 252, 8: 252}, - {2: 254, 254, 8: 254}, - {33: 1853, 250: 1854, 385: 1866}, - // 990 - {2: 258, 258, 8: 258}, - {33: 1853, 151: 636, 250: 1854, 385: 1852, 452: 1868}, - {2: 260, 260, 8: 1865}, - {10: 1875, 131: 1874, 439: 1879}, - {131: 1129, 354: 1871}, - // 995 - {151: 1872}, - {10: 1875, 131: 1874, 439: 1873}, - {2: 262, 262}, - {2: 236, 236}, - {133: 1876}, - // 1000 - {131: 1138, 392: 1877}, - {7: 1878}, - {2: 235, 235}, - {2: 263, 263}, - {2: 266, 266, 149: 1881}, - // 1005 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 1882}, - {2: 265, 265}, - {151: 1884}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1885, 1189}, - {2: 247, 247, 8: 247, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - // 1010 - {133: 270, 243: 270, 305: 1888, 330: 1889, 545: 1887}, - {133: 1891, 243: 899, 307: 1890, 315: 1892}, - {133: 269, 243: 269}, - {133: 268, 243: 268}, - {2: 276, 276, 7: 276, 130: 276, 139: 272}, - // 1015 - {243: 899, 307: 1893}, - {139: 273}, - {7: 1894}, - {2: 503, 503, 7: 503, 130: 503, 139: 271, 145: 503, 150: 1738, 361: 1739, 1895}, - {2: 294, 294, 7: 294, 130: 294, 145: 1896, 363: 1897}, - // 1020 - {210: 1399, 310: 1898, 1398}, - {2: 275, 275, 7: 275, 130: 275}, - {2: 293, 293, 7: 293, 1899, 37: 1900, 130: 293, 139: 293, 144: 293, 147: 293}, - {210: 1399, 310: 1902, 1398}, - {210: 1399, 310: 1901, 1398}, - // 1025 - {2: 291, 291, 7: 291, 130: 291, 139: 291, 144: 291, 147: 291}, - {2: 292, 292, 7: 292, 130: 292, 139: 292, 144: 292, 147: 292}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 165: 1911, 197: 1262, 202: 1279, 206: 1909, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1910, 1189, 422: 1912, 489: 1913, 526: 1914}, - {289, 289, 4: 289, 289, 289, 9: 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 131: 289, 289, 289, 289, 289, 289, 289, 165: 289, 197: 289, 202: 289, 210: 289, 212: 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289, 289}, - {288, 288, 4: 288, 288, 288, 9: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 131: 288, 288, 288, 288, 288, 288, 288, 165: 288, 197: 288, 202: 288, 210: 288, 212: 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288, 288}, - // 1030 - {286, 286, 4: 286, 286, 286, 9: 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 1908, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 131: 286, 286, 286, 286, 286, 286, 286, 165: 286, 197: 286, 202: 286, 210: 286, 212: 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 286, 524: 1907}, - {287, 287, 4: 287, 287, 287, 9: 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 131: 287, 287, 287, 287, 287, 287, 287, 165: 287, 197: 287, 202: 287, 210: 287, 212: 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287}, - {285, 285, 4: 285, 285, 285, 9: 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 131: 285, 285, 285, 285, 285, 285, 285, 165: 285, 197: 285, 202: 285, 210: 285, 212: 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285, 285}, - {844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 134: 844, 844, 138: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 149: 844, 151: 844, 161: 844, 844, 165: 844, 180: 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 844, 198: 844, 844, 844, 844, 211: 1952}, - {1005, 949, 709, 709, 950, 971, 957, 709, 709, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 130: 709, 1949, 138: 1303, 709, 1302, 1301, 1300, 1298, 709, 709, 709, 709, 162: 1948, 206: 1947, 948, 947, 300: 1299, 1297, 487: 1946, 1945}, - // 1035 - {2: 713, 713, 7: 713, 713, 130: 713, 139: 713, 144: 713, 713, 713, 713}, - {2: 703, 703, 7: 703, 703, 130: 703, 139: 703, 144: 703, 703, 703, 703}, - {2: 284, 284, 7: 284, 1943, 130: 284, 139: 284, 144: 284, 284, 284, 284}, - {2: 294, 294, 7: 294, 130: 294, 139: 294, 144: 294, 1896, 1917, 294, 363: 1915, 492: 1916}, - {2: 279, 279, 7: 279, 130: 279, 139: 279, 144: 1930, 147: 1931, 381: 1942}, - // 1040 - {2: 45, 45, 7: 45, 130: 45, 139: 45, 144: 45, 45, 147: 45, 1735, 337: 1736, 1939}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 318: 1154, 325: 1156, 1155, 328: 1160, 334: 1151, 342: 1920, 482: 1919, 540: 1918}, - {2: 45, 45, 7: 45, 130: 45, 139: 45, 144: 45, 45, 147: 45, 1735, 150: 45, 152: 45, 156: 45, 337: 1736, 1921}, - {2: 322, 322, 7: 322, 130: 322, 139: 322, 144: 322, 322, 147: 322, 322}, - {2: 321, 321, 7: 321, 1721, 130: 321, 139: 321, 144: 321, 321, 147: 321, 321, 150: 321, 152: 321, 156: 321}, - // 1045 - {2: 283, 283, 7: 283, 130: 283, 139: 283, 144: 283, 283, 147: 283, 150: 283, 152: 283, 156: 1922, 494: 1924, 527: 1923}, - {366: 1937}, - {2: 700, 700, 7: 700, 130: 700, 139: 700, 144: 700, 700, 147: 700, 150: 700, 152: 1925, 496: 1926}, - {2: 282, 282, 7: 282, 130: 282, 139: 282, 144: 282, 282, 147: 282, 150: 282, 152: 282}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1936, 1189}, - // 1050 - {2: 503, 503, 7: 503, 130: 503, 139: 503, 144: 503, 503, 147: 503, 150: 1738, 361: 1739, 1927}, - {2: 294, 294, 7: 294, 130: 294, 139: 294, 144: 294, 1896, 147: 294, 363: 1928}, - {2: 279, 279, 7: 279, 130: 279, 139: 279, 144: 1930, 147: 1931, 381: 1929}, - {2: 323, 323, 7: 323, 130: 323, 139: 323}, - {322: 1935}, - // 1055 - {180: 1932}, - {529: 1933}, - {74: 1934}, - {2: 277, 277, 7: 277, 130: 277, 139: 277}, - {2: 278, 278, 7: 278, 130: 278, 139: 278}, - // 1060 - {2: 699, 699, 7: 699, 130: 699, 138: 1303, 699, 1302, 1301, 1300, 1298, 699, 699, 147: 699, 150: 699, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1745, 1189, 367: 1747, 394: 1938}, - {2: 701, 701, 7: 701, 1748, 130: 701, 139: 701, 144: 701, 701, 147: 701, 150: 701, 152: 701}, - {2: 294, 294, 7: 294, 130: 294, 139: 294, 144: 294, 1896, 147: 294, 363: 1940}, - {2: 279, 279, 7: 279, 130: 279, 139: 279, 144: 1930, 147: 1931, 381: 1941}, - // 1065 - {2: 324, 324, 7: 324, 130: 324, 139: 324}, - {2: 325, 325, 7: 325, 130: 325, 139: 325}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 165: 1911, 197: 1262, 202: 1279, 206: 1909, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1910, 1189, 422: 1944}, - {2: 702, 702, 7: 702, 702, 130: 702, 139: 702, 144: 702, 702, 702, 702}, - {2: 710, 710, 7: 710, 710, 130: 710, 139: 710, 144: 710, 710, 710, 710}, - // 1070 - {2: 708, 708, 7: 708, 708, 130: 708, 139: 708, 144: 708, 708, 708, 708}, - {2: 707, 707, 7: 707, 707, 130: 707, 139: 707, 144: 707, 707, 707, 707}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1951, 206: 1950, 948, 947}, - {2: 705, 705, 7: 705, 705, 130: 705, 139: 705, 144: 705, 705, 705, 705}, - {2: 706, 706, 7: 706, 706, 130: 706, 139: 706, 144: 706, 706, 706, 706}, - // 1075 - {2: 704, 704, 7: 704, 704, 130: 704, 139: 704, 144: 704, 704, 704, 704}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 165: 1954, 206: 1953, 948, 947}, - {843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 134: 843, 843, 138: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 149: 843, 151: 843, 161: 843, 843, 165: 843, 180: 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 843, 198: 843, 843, 843, 843, 211: 1955}, - {2: 712, 712, 7: 712, 712, 130: 712, 139: 712, 144: 712, 712, 712, 712}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 165: 1956, 206: 1114, 948, 947}, - // 1080 - {2: 711, 711, 7: 711, 711, 130: 711, 139: 711, 144: 711, 711, 711, 711}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1958, 948, 947}, - {2: 329, 329}, - {2: 333, 333, 155: 1960}, - {214: 1294, 252: 1962, 546: 1961}, - // 1085 - {2: 332, 332, 8: 1963}, - {2: 331, 331, 8: 331}, - {214: 1294, 252: 1964}, - {2: 330, 330, 8: 330}, - {146: 1966}, - // 1090 - {131: 1968, 214: 1294, 252: 1969, 513: 1967}, - {2: 336, 336}, - {2: 335, 335}, - {2: 334, 334}, - {554, 554, 4: 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 320: 1973, 428: 1974}, - // 1095 - {531, 531, 4: 531, 531, 531, 9: 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 531, 320: 531}, - {530, 530, 4: 530, 530, 530, 9: 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 320: 530}, - {553, 553, 4: 553, 553, 553, 9: 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553, 553}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1975}, - {42: 1981, 133: 1976, 153: 1980, 202: 1982, 243: 899, 307: 1978, 315: 902, 901, 1979, 388: 1977, 426: 1983}, - // 1100 - {1005, 949, 4: 950, 971, 957, 839, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1106, 899, 307: 1462, 398: 2000, 468: 2001}, - {133: 1992, 357: 1991}, - {2: 548, 548, 130: 548, 139: 272}, - {2: 547, 547, 130: 547}, - {1005, 949, 538, 538, 950, 971, 957, 8: 538, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 130: 538, 206: 1105, 948, 947, 242: 1985, 400: 1986, 472: 1984}, - // 1105 - {133: 545}, - {133: 544}, - {2: 533, 533}, - {2: 546, 546, 8: 1989, 130: 546}, - {151: 1987}, - // 1110 - {2: 537, 537, 8: 537, 130: 537}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1988, 1189}, - {2: 539, 539, 8: 539, 130: 539, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1985, 400: 1990}, - {2: 536, 536, 8: 536, 130: 536}, - // 1115 - {2: 549, 549, 130: 549}, - {1005, 949, 4: 950, 971, 957, 1994, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 1444, 1189, 309: 1993}, - {7: 1997, 1448}, - {2: 543, 543, 8: 1995, 130: 543}, - {133: 1992, 357: 1996}, - // 1120 - {2: 542, 542, 130: 542}, - {2: 541, 541, 8: 1998, 130: 541}, - {133: 1992, 357: 1999}, - {2: 540, 540, 130: 540}, - {7: 838, 1108}, - // 1125 - {7: 2002}, - {42: 1981, 133: 1461, 202: 1982, 243: 899, 307: 2004, 315: 902, 901, 2005, 388: 2003}, - {133: 1992, 357: 2006}, - {2: 551, 551, 130: 551, 139: 272}, - {2: 550, 550, 130: 550}, - // 1130 - {2: 552, 552, 130: 552}, - {694, 694, 4: 694, 694, 694, 9: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 313: 1149, 320: 694, 359: 2011}, - {347, 347, 4: 347, 347, 347, 9: 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 313: 347, 320: 347}, - {346, 346, 4: 346, 346, 346, 9: 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 313: 346, 320: 346}, - {345, 345, 4: 345, 345, 345, 9: 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 313: 345, 320: 345}, - // 1135 - {554, 554, 4: 554, 554, 554, 9: 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 554, 320: 1973, 428: 2012}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2013}, - {42: 1981, 133: 1976, 153: 1980, 202: 1982, 243: 899, 307: 1978, 315: 902, 901, 1979, 388: 1977, 426: 2014}, - {2: 535, 535, 130: 2016, 507: 2015}, - {2: 555, 555}, - // 1140 - {483: 2017}, - {244: 2018}, - {322: 2019}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 1730, 356: 1731, 365: 2020}, - {2: 534, 534, 8: 1733}, - // 1145 - {1005, 949, 762, 762, 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2028}, - {2: 760, 760}, - {2: 167, 167}, - {2: 166, 166}, - {2: 165, 165}, - // 1150 - {2: 164, 164}, - {2: 163, 163}, - {2: 761, 761}, - {776, 776, 4: 776, 776, 776, 9: 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 212: 776}, - {775, 775, 4: 775, 775, 775, 9: 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 775, 212: 775}, - // 1155 - {698, 698, 4: 698, 698, 698, 9: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 212: 2041, 425: 2046}, - {698, 698, 4: 698, 698, 698, 9: 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 212: 2041, 425: 2040}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 212: 2037, 303: 1816, 352: 2036}, - {770, 770, 4: 770, 770, 770, 9: 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 770, 212: 770}, - {769, 769, 4: 769, 769, 769, 9: 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 769, 212: 769}, - // 1160 - {2: 772, 772, 8: 1818}, - {217: 2038}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 1816, 352: 2039}, - {2: 771, 771, 8: 1818}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2043, 948, 947}, - // 1165 - {217: 2042}, - {697, 697, 4: 697, 697, 697, 9: 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697, 697}, - {130: 2044}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2045}, - {2: 773, 773}, - // 1170 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1145, 948, 947, 345: 2047}, - {2: 774, 774}, - {338, 338, 4: 338, 338, 338, 9: 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 2050, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 338, 146: 338, 313: 338, 518: 2049}, - {694, 694, 4: 694, 694, 694, 9: 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 694, 146: 694, 313: 1149, 359: 2051}, - {337, 337, 4: 337, 337, 337, 9: 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 337, 146: 337, 313: 337}, - // 1175 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 146: 2052, 206: 1073, 948, 947, 303: 1816, 352: 2053}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2057, 352: 2058}, - {8: 1818, 146: 2054}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 318: 1154, 325: 1156, 1155, 328: 1160, 334: 1151, 342: 2055}, - {2: 45, 45, 8: 1721, 148: 1735, 337: 1736, 2056}, - // 1180 - {2: 778, 778}, - {2: 45, 45, 8: 340, 145: 45, 148: 1735, 150: 45, 155: 340, 337: 1736, 2062}, - {8: 1818, 155: 2059}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 1158, 206: 1073, 948, 947, 303: 1157, 318: 1154, 325: 1156, 1155, 328: 1160, 334: 1151, 342: 2060}, - {2: 45, 45, 8: 1721, 148: 1735, 337: 1736, 2061}, - // 1185 - {2: 777, 777}, - {2: 503, 503, 145: 503, 150: 1738, 361: 1739, 2063}, - {2: 296, 296, 145: 1741, 429: 2064}, - {2: 779, 779}, - {2: 780, 780, 8: 1448}, - // 1190 - {245: 2385}, - {245: 799}, - {696, 696, 4: 696, 696, 696, 9: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 212: 2071, 376: 2372}, - {696, 696, 4: 696, 696, 696, 9: 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 696, 212: 2071, 376: 2076}, - {131: 696, 212: 2071, 376: 2072}, - // 1195 - {129: 2074}, - {131: 1129, 354: 1130, 387: 1131, 457: 2073}, - {2: 41, 41, 8: 1133}, - {217: 2075}, - {695, 695, 4: 695, 695, 695, 9: 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 695, 131: 695}, - // 1200 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2077}, - {133: 2078}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 203: 856, 856, 2085, 1105, 948, 947, 242: 2080, 244: 856, 856, 249: 856, 251: 856, 368: 2083, 2079, 2084, 2082, 450: 2086, 537: 2081}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 203: 855, 855, 206: 2371, 948, 947, 244: 855, 855, 249: 855, 251: 855, 449: 2370}, - {26: 2281, 28: 2278, 2277, 40: 2280, 61: 2260, 2254, 2253, 75: 2268, 80: 2274, 2279, 153: 2267, 197: 2262, 247: 87, 253: 2255, 2251, 256: 87, 259: 2252, 2270, 263: 2259, 2266, 2237, 2238, 2257, 274: 2239, 2250, 2272, 2276, 2271, 2249, 2275, 2256, 284: 2258, 2248, 2240, 288: 2269, 2247, 2273, 2242, 2241, 2263, 465: 2246, 2264, 478: 2236, 490: 2244, 2245, 498: 2243, 504: 2261, 2234, 535: 2235, 541: 2265, 544: 2233}, - // 1205 - {7: 2170, 2171}, - {203: 2090, 2094, 244: 2093, 2092, 249: 2095, 251: 2091, 474: 2096}, - {7: 159, 159}, - {7: 158, 158}, - {133: 2087}, - // 1210 - {7: 156, 156}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 2088, 1189}, - {7: 2089, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {7: 157, 157}, - {244: 2164}, - // 1215 - {244: 2158}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 155: 692, 206: 2099, 948, 947, 331: 2152}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 155: 692, 206: 2099, 948, 947, 331: 2146}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 155: 692, 206: 2099, 948, 947, 244: 2117, 2116, 331: 2115}, - {244: 2097}, - // 1220 - {2: 160, 160, 7: 160, 160}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 206: 2099, 948, 947, 331: 2098}, - {133: 2100}, - {2: 691, 691, 8: 691, 133: 691, 155: 691}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2101}, - // 1225 - {7: 2106, 2107}, - {7: 71, 71, 133: 1396, 163: 71, 166: 71, 306: 1397, 312: 2104}, - {7: 796, 796}, - {7: 506, 506, 163: 1752, 166: 1751, 438: 2105}, - {7: 798, 798}, - // 1230 - {519: 2109, 2110}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2108}, - {7: 795, 795}, - {2: 815, 815, 7: 815, 815}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2111}, - // 1235 - {133: 2112}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2113}, - {7: 2114, 2107}, - {2: 814, 814, 7: 814, 814}, - {133: 684, 155: 2120, 314: 2121, 340: 2141}, - // 1240 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 155: 692, 206: 2099, 948, 947, 331: 2135}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 155: 692, 206: 2099, 948, 947, 331: 2118}, - {133: 684, 155: 2120, 314: 2121, 340: 2119}, - {133: 2124}, - {64: 2122, 71: 2123}, - // 1245 - {133: 683}, - {2: 686, 686, 7: 686, 686, 133: 686}, - {2: 685, 685, 7: 685, 685, 133: 685}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2125}, - {7: 2126, 2107}, - // 1250 - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2127}, - {2: 816, 816, 7: 816, 816}, - {151: 2132, 210: 768, 308: 2133}, - {2: 688, 688, 7: 688, 688}, - {131: 2131}, - // 1255 - {2: 687, 687, 7: 687, 687}, - {767, 767, 4: 767, 767, 767, 9: 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 767, 131: 767, 136: 767, 210: 767}, - {210: 1399, 310: 2134, 1398}, - {2: 689, 689, 7: 689, 689}, - {133: 684, 155: 2120, 314: 2121, 340: 2136}, - // 1260 - {133: 2137}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2138}, - {7: 2139, 2107}, - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2140}, - {2: 817, 817, 7: 817, 817}, - // 1265 - {133: 2142}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2143}, - {7: 2144, 2107}, - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2145}, - {2: 818, 818, 7: 818, 818}, - // 1270 - {133: 684, 155: 2120, 314: 2121, 340: 2147}, - {133: 2148}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2149}, - {7: 2150, 2107}, - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2151}, - // 1275 - {2: 819, 819, 7: 819, 819}, - {133: 684, 155: 2120, 314: 2121, 340: 2153}, - {133: 2154}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2155}, - {7: 2156, 2107}, - // 1280 - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2157}, - {2: 820, 820, 7: 820, 820}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 133: 692, 206: 2099, 948, 947, 331: 2159}, - {133: 2160}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2161}, - // 1285 - {7: 2162, 2107}, - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2163}, - {2: 821, 821, 7: 821, 821}, - {133: 684, 155: 2120, 314: 2121, 340: 2165}, - {133: 2166}, - // 1290 - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2167}, - {7: 2168, 2107}, - {2130, 2: 690, 690, 7: 690, 690, 2128, 155: 2120, 314: 2129, 335: 2169}, - {2: 822, 822, 7: 822, 822}, - {2178, 2177, 138, 138, 6: 782, 9: 2184, 2182, 2179, 2181, 2183, 2180, 2187, 2175, 2185, 2186, 2191, 136: 2174, 149: 782, 209: 782, 333: 2176, 349: 2188, 353: 2190, 382: 2189, 2173}, - // 1295 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 203: 856, 856, 2085, 1105, 948, 947, 242: 2080, 244: 856, 856, 249: 856, 251: 856, 368: 2083, 2079, 2084, 2082, 450: 2172}, - {7: 155, 155}, - {2: 786, 786}, - {6: 781, 149: 781, 209: 781}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 151: 2231, 206: 2230, 948, 947}, - // 1300 - {6: 1417, 149: 2225, 209: 1416, 323: 2224}, - {151: 2222}, - {131: 768, 151: 2132, 308: 2220}, - {151: 2132, 210: 768, 308: 2218}, - {131: 768, 151: 2132, 308: 2216}, - // 1305 - {151: 2132, 210: 768, 308: 2214}, - {131: 768, 151: 2132, 308: 2212}, - {768, 768, 4: 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 151: 2132, 308: 2210}, - {151: 2132, 210: 768, 308: 2208}, - {151: 2132, 210: 768, 308: 2206}, - // 1310 - {151: 2132, 210: 768, 308: 2204}, - {151: 2132, 210: 768, 308: 2202}, - {139, 139, 139, 139, 6: 139, 8: 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 136: 139, 149: 139, 209: 139}, - {2178, 2177, 137, 137, 6: 782, 8: 2200, 2184, 2182, 2179, 2181, 2183, 2180, 2187, 2175, 2185, 2186, 2191, 136: 2174, 149: 782, 209: 782, 333: 2176, 349: 2188, 353: 2199}, - {136, 136, 136, 136, 6: 136, 8: 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136: 136, 149: 136, 209: 136}, - // 1315 - {47: 768, 768, 51: 768, 768, 55: 768, 136: 768, 151: 2132, 308: 2192}, - {47: 2198, 2196, 51: 2194, 2195, 55: 2197, 136: 2193}, - {132, 132, 132, 132, 6: 132, 8: 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 136: 132, 149: 132, 209: 132}, - {131, 131, 131, 131, 6: 131, 8: 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 136: 131, 149: 131, 209: 131}, - {130, 130, 130, 130, 6: 130, 8: 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 136: 130, 149: 130, 209: 130}, - // 1320 - {129, 129, 129, 129, 6: 129, 8: 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 136: 129, 149: 129, 209: 129}, - {128, 128, 128, 128, 6: 128, 8: 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 136: 128, 149: 128, 209: 128}, - {127, 127, 127, 127, 6: 127, 8: 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 136: 127, 149: 127, 209: 127}, - {135, 135, 135, 135, 6: 135, 8: 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136: 135, 149: 135, 209: 135}, - {2178, 2177, 6: 782, 9: 2184, 2182, 2179, 2181, 2183, 2180, 2187, 2175, 2185, 2186, 2191, 136: 2174, 149: 782, 209: 782, 333: 2176, 349: 2188, 353: 2201}, - // 1325 - {134, 134, 134, 134, 6: 134, 8: 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 136: 134, 149: 134, 209: 134}, - {210: 1399, 310: 2203, 1398}, - {140, 140, 140, 140, 6: 140, 8: 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 136: 140, 149: 140, 209: 140}, - {210: 1399, 310: 2205, 1398}, - {141, 141, 141, 141, 6: 141, 8: 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 136: 141, 149: 141, 209: 141}, - // 1330 - {210: 1399, 310: 2207, 1398}, - {142, 142, 142, 142, 6: 142, 8: 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 136: 142, 149: 142, 209: 142}, - {210: 1399, 310: 2209, 1398}, - {143, 143, 143, 143, 6: 143, 8: 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 136: 143, 149: 143, 209: 143}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2211, 948, 947}, - // 1335 - {144, 144, 144, 144, 6: 144, 8: 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 136: 144, 149: 144, 209: 144}, - {131: 2213}, - {145, 145, 145, 145, 6: 145, 8: 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 136: 145, 149: 145, 209: 145}, - {210: 1399, 310: 2215, 1398}, - {146, 146, 146, 146, 6: 146, 8: 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 136: 146, 149: 146, 209: 146}, - // 1340 - {131: 2217}, - {147, 147, 147, 147, 6: 147, 8: 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 136: 147, 149: 147, 209: 147}, - {210: 1399, 310: 2219, 1398}, - {148, 148, 148, 148, 6: 148, 8: 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 136: 148, 149: 148, 209: 148}, - {131: 2221}, - // 1345 - {149, 149, 149, 149, 6: 149, 8: 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 136: 149, 149: 149, 209: 149}, - {210: 1399, 310: 2223, 1398}, - {150, 150, 150, 150, 6: 150, 8: 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 136: 150, 149: 150, 209: 150}, - {768, 768, 4: 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 131: 768, 151: 2132, 308: 2228}, - {768, 768, 4: 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 131: 768, 151: 2132, 308: 2226}, - // 1350 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 2227}, - {151, 151, 151, 151, 6: 151, 8: 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 136: 151, 149: 151, 209: 151}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 2229}, - {152, 152, 152, 152, 6: 152, 8: 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 136: 152, 149: 152, 209: 152}, - {154, 154, 154, 154, 6: 154, 8: 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 136: 154, 149: 154, 209: 154}, - // 1355 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2232, 948, 947}, - {153, 153, 153, 153, 6: 153, 8: 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 136: 153, 149: 153, 209: 153}, - {2340, 2335, 824, 824, 824, 824, 7: 824, 824, 129: 2333, 2339, 136: 2338, 2334, 203: 2336, 2337, 2341, 399: 2342, 469: 2343, 2332}, - {126, 126, 126, 126, 126, 126, 7: 126, 126, 129: 126, 126, 136: 126, 126, 203: 126, 126, 126}, - {125, 125, 125, 125, 125, 125, 7: 125, 125, 129: 125, 125, 136: 125, 125, 203: 125, 125, 125}, - // 1360 - {124, 124, 124, 124, 124, 124, 7: 124, 124, 129: 124, 124, 136: 124, 124, 203: 124, 124, 124}, - {123, 123, 123, 123, 123, 123, 7: 123, 123, 129: 123, 123, 136: 123, 123, 203: 123, 123, 123}, - {122, 122, 122, 122, 122, 122, 7: 122, 122, 129: 122, 122, 136: 122, 122, 203: 122, 122, 122}, - {121, 121, 121, 121, 121, 121, 7: 121, 121, 129: 121, 121, 136: 121, 121, 203: 121, 121, 121}, - {120, 120, 120, 120, 120, 120, 7: 120, 120, 129: 120, 120, 136: 120, 120, 203: 120, 120, 120}, - // 1365 - {119, 119, 119, 119, 119, 119, 7: 119, 119, 129: 119, 119, 136: 119, 119, 203: 119, 119, 119}, - {118, 118, 118, 118, 118, 118, 7: 118, 118, 129: 118, 118, 136: 118, 118, 203: 118, 118, 118}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 302: 71, 304: 71, 306: 1397, 312: 2330}, - {65, 65, 65, 65, 65, 65, 7: 65, 65, 129: 65, 65, 133: 1403, 136: 65, 65, 203: 65, 65, 65, 302: 65, 304: 65, 306: 1404, 375: 2328, 379: 1405}, - {65, 65, 65, 65, 65, 65, 7: 65, 65, 129: 65, 65, 133: 1403, 136: 65, 65, 203: 65, 65, 65, 302: 65, 304: 65, 306: 1404, 375: 2323, 379: 1405}, - // 1370 - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2322}, - {113, 113, 113, 113, 113, 113, 7: 113, 113, 129: 113, 113, 133: 113, 136: 113, 113, 203: 113, 113, 113, 302: 113, 304: 113}, - {112, 112, 112, 112, 112, 112, 7: 112, 112, 129: 112, 112, 133: 112, 136: 112, 112, 203: 112, 112, 112, 302: 112, 304: 112}, - {111, 111, 111, 111, 111, 111, 7: 111, 111, 129: 111, 111, 133: 111, 136: 111, 111, 203: 111, 111, 111, 302: 111, 304: 111}, - {110, 110, 110, 110, 110, 110, 7: 110, 110, 129: 110, 110, 133: 110, 136: 110, 110, 203: 110, 110, 110, 302: 110, 304: 110}, - // 1375 - {109, 109, 109, 109, 109, 109, 7: 109, 109, 129: 109, 109, 133: 109, 136: 109, 109, 203: 109, 109, 109, 302: 109, 304: 109}, - {108, 108, 108, 108, 108, 108, 7: 108, 108, 129: 108, 108, 133: 108, 136: 108, 108, 203: 108, 108, 108, 302: 108, 304: 108}, - {107, 107, 107, 107, 107, 107, 7: 107, 107, 129: 107, 107, 133: 107, 136: 107, 107, 203: 107, 107, 107, 302: 107, 304: 107}, - {106, 106, 106, 106, 106, 106, 7: 106, 106, 129: 106, 106, 133: 106, 136: 106, 106, 203: 106, 106, 106, 302: 106, 304: 106}, - {103, 103, 103, 103, 103, 103, 7: 103, 103, 129: 103, 103, 133: 103, 136: 103, 103, 203: 103, 103, 103, 302: 103, 304: 103}, - // 1380 - {102, 102, 102, 102, 102, 102, 7: 102, 102, 129: 102, 102, 133: 102, 136: 102, 102, 203: 102, 102, 102, 302: 102, 304: 102}, - {101, 101, 101, 101, 101, 101, 7: 101, 101, 129: 101, 101, 133: 101, 136: 101, 101, 203: 101, 101, 101, 302: 101, 304: 101}, - {100, 100, 100, 100, 100, 100, 7: 100, 100, 129: 100, 100, 133: 100, 136: 100, 100, 203: 100, 100, 100, 302: 100, 304: 100}, - {99, 99, 99, 99, 99, 99, 7: 99, 99, 129: 99, 99, 133: 99, 136: 99, 99, 203: 99, 99, 99, 302: 99, 304: 99, 512: 2321}, - {97, 97, 97, 97, 97, 97, 7: 97, 97, 129: 97, 97, 133: 97, 136: 97, 97, 203: 97, 97, 97}, - // 1385 - {247: 2308, 256: 2309}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2307}, - {133: 1396, 306: 2306}, - {91, 91, 91, 91, 91, 91, 7: 91, 91, 129: 91, 91, 136: 91, 91, 203: 91, 91, 91}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 129: 61, 61, 136: 61, 61, 149: 61, 197: 1413, 203: 61, 61, 61, 209: 61, 348: 2303}, - // 1390 - {133: 2298}, - {133: 2288}, - {247: 86, 256: 86}, - {85, 85, 85, 85, 85, 85, 7: 85, 85, 129: 85, 85, 136: 85, 85, 203: 85, 85, 85}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2287}, - // 1395 - {83, 83, 83, 83, 83, 83, 7: 83, 83, 129: 83, 83, 136: 83, 83, 203: 83, 83, 83}, - {82, 82, 82, 82, 82, 82, 7: 82, 82, 129: 82, 82, 136: 82, 82, 203: 82, 82, 82}, - {81, 81, 81, 81, 81, 81, 81, 81, 81, 129: 81, 81, 136: 81, 81, 149: 81, 197: 81, 203: 81, 81, 81, 209: 81}, - {71, 71, 71, 71, 71, 71, 71, 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 149: 71, 197: 71, 203: 71, 71, 71, 209: 71, 306: 1397, 312: 2286}, - {79, 79, 79, 79, 79, 79, 79, 79, 79, 129: 79, 79, 136: 79, 79, 149: 79, 197: 79, 203: 79, 79, 79, 209: 79}, - // 1400 - {78, 78, 78, 78, 78, 78, 78, 78, 78, 129: 78, 78, 136: 78, 78, 149: 78, 197: 78, 203: 78, 78, 78, 209: 78}, - {77, 77, 77, 77, 77, 77, 7: 77, 77, 129: 77, 77, 136: 77, 77, 203: 77, 77, 77}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2285}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2284}, - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2283}, - // 1405 - {71, 71, 71, 71, 71, 71, 7: 71, 71, 129: 71, 71, 133: 1396, 136: 71, 71, 203: 71, 71, 71, 306: 1397, 312: 2282}, - {73, 73, 73, 73, 73, 73, 7: 73, 73, 129: 73, 73, 136: 73, 73, 203: 73, 73, 73}, - {74, 74, 74, 74, 74, 74, 7: 74, 74, 129: 74, 74, 136: 74, 74, 203: 74, 74, 74}, - {75, 75, 75, 75, 75, 75, 7: 75, 75, 129: 75, 75, 136: 75, 75, 203: 75, 75, 75}, - {76, 76, 76, 76, 76, 76, 7: 76, 76, 129: 76, 76, 136: 76, 76, 203: 76, 76, 76}, - // 1410 - {80, 80, 80, 80, 80, 80, 80, 80, 80, 129: 80, 80, 136: 80, 80, 149: 80, 197: 80, 203: 80, 80, 80, 209: 80}, - {84, 84, 84, 84, 84, 84, 7: 84, 84, 129: 84, 84, 136: 84, 84, 203: 84, 84, 84}, - {131: 2290, 448: 2289}, - {7: 2291, 2292}, - {7: 53, 53}, - // 1415 - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2294}, - {131: 2293}, - {7: 52, 52}, - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2295}, - {88, 88, 88, 88, 88, 88, 7: 88, 88, 129: 88, 88, 136: 88, 88, 203: 88, 88, 88}, - // 1420 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 2297}, - {54, 54, 54, 54, 54, 54, 7: 54, 54, 129: 54, 54, 136: 54, 54, 203: 54, 54, 54}, - {131: 2290, 448: 2299}, - {7: 2300, 2292}, - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2301}, - // 1425 - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2302}, - {89, 89, 89, 89, 89, 89, 7: 89, 89, 129: 89, 89, 136: 89, 89, 203: 89, 89, 89}, - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2304}, - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2305}, - {90, 90, 90, 90, 90, 90, 7: 90, 90, 129: 90, 90, 136: 90, 90, 203: 90, 90, 90}, - // 1430 - {92, 92, 92, 92, 92, 92, 7: 92, 92, 129: 92, 92, 136: 92, 92, 203: 92, 92, 92}, - {93, 93, 93, 93, 93, 93, 7: 93, 93, 129: 93, 93, 136: 93, 93, 203: 93, 93, 93}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 129: 61, 61, 133: 1396, 136: 61, 61, 149: 61, 197: 1413, 203: 61, 61, 61, 209: 61, 306: 2314, 348: 2315}, - {133: 1396, 306: 2310}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 129: 61, 61, 136: 61, 61, 149: 61, 197: 1413, 203: 61, 61, 61, 209: 61, 348: 2311}, - // 1435 - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2312}, - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2313}, - {94, 94, 94, 94, 94, 94, 7: 94, 94, 129: 94, 94, 136: 94, 94, 203: 94, 94, 94}, - {61, 61, 61, 61, 61, 61, 61, 61, 61, 129: 61, 61, 136: 61, 61, 149: 61, 197: 1413, 203: 61, 61, 61, 209: 61, 348: 2318}, - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2316}, - // 1440 - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2317}, - {95, 95, 95, 95, 95, 95, 7: 95, 95, 129: 95, 95, 136: 95, 95, 203: 95, 95, 95}, - {59, 59, 59, 59, 59, 59, 1417, 59, 59, 129: 59, 59, 136: 59, 59, 149: 59, 203: 59, 59, 59, 209: 1416, 323: 1415, 336: 2319}, - {55, 55, 55, 55, 55, 55, 7: 55, 55, 129: 55, 55, 136: 55, 55, 149: 2296, 203: 55, 55, 55, 341: 2320}, - {96, 96, 96, 96, 96, 96, 7: 96, 96, 129: 96, 96, 136: 96, 96, 203: 96, 96, 96}, - // 1445 - {98, 98, 98, 98, 98, 98, 7: 98, 98, 129: 98, 98, 133: 98, 136: 98, 98, 203: 98, 98, 98, 302: 98, 304: 98}, - {114, 114, 114, 114, 114, 114, 7: 114, 114, 129: 114, 114, 136: 114, 114, 203: 114, 114, 114}, - {67, 67, 67, 67, 67, 67, 7: 67, 67, 129: 67, 67, 136: 67, 67, 203: 67, 67, 67, 302: 67, 304: 67, 374: 2324}, - {115, 115, 115, 115, 115, 115, 7: 115, 115, 129: 115, 115, 136: 115, 115, 203: 115, 115, 115, 302: 2325, 304: 2326, 373: 2327}, - {69, 69, 69, 69, 69, 69, 7: 69, 69, 129: 69, 69, 136: 69, 69, 203: 69, 69, 69, 302: 69, 304: 69}, - // 1450 - {68, 68, 68, 68, 68, 68, 7: 68, 68, 129: 68, 68, 136: 68, 68, 203: 68, 68, 68, 302: 68, 304: 68}, - {66, 66, 66, 66, 66, 66, 7: 66, 66, 129: 66, 66, 136: 66, 66, 203: 66, 66, 66, 302: 66, 304: 66}, - {67, 67, 67, 67, 67, 67, 7: 67, 67, 129: 67, 67, 136: 67, 67, 203: 67, 67, 67, 302: 67, 304: 67, 374: 2329}, - {116, 116, 116, 116, 116, 116, 7: 116, 116, 129: 116, 116, 136: 116, 116, 203: 116, 116, 116, 302: 2325, 304: 2326, 373: 2327}, - {67, 67, 67, 67, 67, 67, 7: 67, 67, 129: 67, 67, 136: 67, 67, 203: 67, 67, 67, 302: 67, 304: 67, 374: 2331}, - // 1455 - {117, 117, 117, 117, 117, 117, 7: 117, 117, 129: 117, 117, 136: 117, 117, 203: 117, 117, 117, 302: 2325, 304: 2326, 373: 2327}, - {2: 845, 845, 845, 845, 7: 845, 845}, - {137: 2369}, - {835, 835, 835, 835, 835, 835, 7: 835, 835, 129: 835, 835, 136: 835, 835, 203: 835, 835, 835}, - {834, 834, 834, 834, 834, 834, 7: 834, 834, 129: 834, 834, 136: 834, 834, 203: 834, 834, 834}, - // 1460 - {244: 2368}, - {832, 832, 832, 832, 832, 832, 7: 832, 832, 129: 832, 832, 136: 832, 832, 203: 832, 832, 832, 244: 2367}, - {54: 2354, 131: 1244, 134: 2359, 2360, 137: 1240, 210: 1243, 215: 1239, 1241, 218: 1242, 2351, 223: 1247, 1246, 1245, 257: 2358, 430: 2352, 2353, 435: 2356, 481: 2355, 532: 2357}, - {322: 2349}, - {131: 2348}, - // 1465 - {133: 2345}, - {826, 826, 826, 826, 826, 826, 7: 826, 826, 129: 826, 826, 136: 826, 826, 203: 826, 826, 826}, - {2340, 2335, 823, 823, 823, 823, 7: 823, 823, 129: 2333, 2339, 136: 2338, 2334, 203: 2336, 2337, 2341, 399: 2344}, - {825, 825, 825, 825, 825, 825, 7: 825, 825, 129: 825, 825, 136: 825, 825, 203: 825, 825, 825}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 1194, 958, 963, 1193, 1206, 1019, 1215, 1022, 1220, 1222, 1224, 977, 1016, 1229, 990, 994, 995, 1195, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1225, 981, 982, 984, 985, 993, 1196, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1198, 1199, 1000, 1192, 1063, 1200, 1201, 1202, 1203, 1205, 1204, 1207, 1208, 1209, 1210, 1211, 1212, 1017, 1213, 1214, 946, 1216, 1217, 1218, 1219, 1221, 976, 1223, 1226, 1227, 980, 1228, 1197, 1001, 1230, 1231, 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1188, 131: 1244, 1271, 1250, 1261, 1260, 1251, 1240, 197: 1262, 202: 1279, 206: 1105, 948, 947, 210: 1243, 212: 1270, 1287, 1294, 1239, 1241, 1254, 1242, 1282, 1268, 1269, 1293, 1247, 1246, 1245, 1258, 1259, 1277, 1276, 1278, 1280, 1274, 1281, 1273, 1285, 1286, 1253, 1272, 1288, 1289, 1290, 1249, 246: 1257, 252: 1292, 257: 1248, 261: 1284, 1283, 268: 1256, 1267, 1266, 1264, 1265, 1275, 282: 1255, 1263, 287: 1291, 294: 1252, 296: 1191, 1190, 2346, 1189}, - // 1470 - {7: 2347, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {827, 827, 827, 827, 827, 827, 7: 827, 827, 129: 827, 827, 136: 827, 827, 203: 827, 827, 827}, - {828, 828, 828, 828, 828, 828, 7: 828, 828, 129: 828, 828, 136: 828, 828, 203: 828, 828, 828}, - {54: 2354, 219: 2351, 430: 2352, 2353, 435: 2350}, - {829, 829, 829, 829, 829, 829, 7: 829, 829, 129: 829, 829, 136: 829, 829, 203: 829, 829, 829}, - // 1475 - {810, 810, 810, 810, 810, 810, 7: 810, 810, 129: 810, 810, 133: 810, 136: 810, 810, 203: 810, 810, 810}, - {809, 809, 809, 809, 809, 809, 7: 809, 809, 129: 809, 809, 133: 809, 136: 809, 809, 203: 809, 809, 809}, - {808, 808, 808, 808, 808, 808, 7: 808, 808, 129: 808, 808, 133: 808, 136: 808, 808, 203: 808, 808, 808}, - {807, 807, 807, 807, 807, 807, 7: 807, 807, 129: 807, 807, 133: 807, 136: 807, 807, 203: 807, 807, 807}, - {830, 830, 830, 830, 830, 830, 7: 830, 830, 129: 830, 830, 136: 830, 830, 203: 830, 830, 830}, - // 1480 - {813, 813, 813, 813, 813, 813, 7: 813, 813, 129: 813, 813, 133: 2365, 136: 813, 813, 203: 813, 813, 813}, - {811, 811, 811, 811, 811, 811, 7: 811, 811, 129: 811, 811, 136: 811, 811, 203: 811, 811, 811}, - {806, 806, 806, 806, 806, 806, 7: 806, 806, 129: 806, 806, 136: 806, 806, 203: 806, 806, 806}, - {210: 2362, 218: 2363, 436: 2364}, - {210: 2362, 218: 2363, 436: 2361}, - // 1485 - {804, 804, 804, 804, 804, 804, 7: 804, 804, 129: 804, 804, 136: 804, 804, 203: 804, 804, 804}, - {803, 803, 803, 803, 803, 803, 7: 803, 803, 129: 803, 803, 136: 803, 803, 203: 803, 803, 803}, - {802, 802, 802, 802, 802, 802, 7: 802, 802, 129: 802, 802, 136: 802, 802, 203: 802, 802, 802}, - {805, 805, 805, 805, 805, 805, 7: 805, 805, 129: 805, 805, 136: 805, 805, 203: 805, 805, 805}, - {7: 2366}, - // 1490 - {812, 812, 812, 812, 812, 812, 7: 812, 812, 129: 812, 812, 136: 812, 812, 203: 812, 812, 812}, - {831, 831, 831, 831, 831, 831, 7: 831, 831, 129: 831, 831, 136: 831, 831, 203: 831, 831, 831}, - {833, 833, 833, 833, 833, 833, 7: 833, 833, 129: 833, 833, 136: 833, 833, 203: 833, 833, 833}, - {836, 836, 836, 836, 836, 836, 7: 836, 836, 129: 836, 836, 136: 836, 836, 203: 836, 836, 836}, - {203: 854, 854, 244: 854, 854, 249: 854, 251: 854}, - // 1495 - {2: 853, 853, 8: 853, 203: 853, 853, 244: 853, 853, 249: 853, 251: 853}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1145, 948, 947, 345: 2373}, - {2: 790, 790, 6: 782, 136: 2174, 149: 782, 209: 782, 333: 2375, 406: 2377, 476: 2376, 2374}, - {2: 794, 794}, - {6: 1417, 149: 2380, 209: 1416, 323: 2379}, - // 1500 - {2: 789, 789, 6: 782, 136: 2174, 149: 782, 209: 782, 333: 2375, 406: 2378}, - {2: 788, 788, 6: 788, 136: 788, 149: 788, 209: 788}, - {2: 787, 787, 6: 787, 136: 787, 149: 787, 209: 787}, - {768, 768, 4: 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 131: 768, 151: 2132, 308: 2383}, - {768, 768, 4: 768, 768, 768, 9: 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 131: 768, 151: 2132, 308: 2381}, - // 1505 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 2382}, - {2: 791, 791, 6: 791, 136: 791, 149: 791, 209: 791}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 131: 1420, 206: 1421, 948, 947, 321: 2384}, - {2: 792, 792, 6: 792, 136: 792, 149: 792, 209: 792}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2386, 948, 947}, - // 1510 - {130: 2387}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2388}, - {133: 2389}, - {1005, 949, 4: 950, 971, 957, 797, 797, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2102, 319: 2103, 324: 2390}, - {7: 2391, 2107}, - // 1515 - {2: 801, 801}, - {2: 846, 846}, - {327: 2394}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1073, 948, 947, 303: 2395}, - {2178, 2177, 138, 138, 6: 782, 8: 138, 2184, 2182, 2179, 2181, 2183, 2180, 2187, 2175, 2185, 2186, 2191, 136: 2174, 149: 782, 209: 782, 248: 2399, 258: 2398, 333: 2176, 349: 2188, 353: 2190, 382: 2189, 2397, 390: 2400, 461: 2396}, - // 1520 - {2: 873, 873, 8: 2420}, - {2: 872, 872, 8: 872}, - {863, 863, 4: 863, 863, 863, 9: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 203: 856, 856, 244: 856, 856, 249: 856, 251: 856, 369: 2079, 2414, 2082, 396: 2407, 2413}, - {863, 863, 4: 863, 863, 863, 9: 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 203: 2402, 244: 2405, 2406, 249: 2404, 396: 2407, 2401, 500: 2403}, - {2: 858, 858, 8: 858}, - // 1525 - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2412}, - {244: 2411}, - {1005, 949, 692, 692, 950, 971, 957, 8: 692, 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2099, 948, 947, 331: 2410}, - {244: 2408}, - {865, 865, 865, 865, 865, 865, 865, 8: 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865, 865}, - // 1530 - {864, 864, 864, 864, 864, 864, 864, 8: 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864, 864}, - {862, 862, 4: 862, 862, 862, 9: 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 2371, 948, 947, 449: 2409}, - {2: 866, 866, 8: 866}, - {2: 867, 867, 8: 867}, - // 1535 - {2: 868, 868, 8: 868}, - {2: 869, 869, 8: 869}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2080, 368: 2415}, - {2: 870, 870, 8: 870}, - {2: 861, 861, 2418, 2417, 8: 861, 471: 2416}, - // 1540 - {2: 871, 871, 8: 871}, - {2: 860, 860, 8: 860}, - {1005, 949, 4: 950, 971, 957, 9: 1010, 978, 1006, 1008, 1009, 1007, 1021, 968, 1011, 1012, 1015, 967, 986, 988, 979, 970, 1029, 997, 958, 963, 962, 1039, 1019, 1048, 1022, 1053, 1055, 1057, 977, 1016, 1062, 990, 994, 995, 999, 1032, 952, 959, 960, 961, 964, 965, 966, 972, 1003, 1058, 981, 982, 984, 985, 993, 1002, 953, 955, 954, 956, 1004, 1024, 969, 973, 987, 1018, 974, 1028, 975, 998, 1013, 1026, 1023, 1027, 983, 989, 991, 992, 1020, 1025, 996, 1030, 1031, 1000, 951, 1063, 1033, 1034, 1035, 1036, 1038, 1037, 1040, 1041, 1042, 1043, 1044, 1045, 1017, 1046, 1047, 946, 1049, 1050, 1051, 1052, 1054, 976, 1056, 1059, 1060, 980, 1061, 1014, 1001, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 206: 1105, 948, 947, 242: 2419}, - {2: 859, 859, 8: 859}, - {2178, 2177, 138, 138, 6: 782, 8: 138, 2184, 2182, 2179, 2181, 2183, 2180, 2187, 2175, 2185, 2186, 2191, 136: 2174, 149: 782, 209: 782, 248: 2399, 258: 2398, 333: 2176, 349: 2188, 353: 2190, 382: 2189, 2397, 390: 2421}, - // 1545 - {2: 857, 857, 8: 857}, - {2: 874, 138: 1303, 140: 1302, 1301, 1300, 1298, 300: 1299, 1297}, - {2: 766, 766, 23: 894, 895, 44: 905, 881, 883, 49: 897, 885, 56: 898, 58: 882, 939, 133: 900, 147: 944, 153: 904, 163: 890, 213: 893, 243: 899, 246: 935, 248: 887, 307: 903, 315: 902, 901, 929, 322: 940, 329: 886, 332: 892, 343: 884, 350: 906, 355: 880, 358: 942, 372: 913, 377: 925, 380: 928, 386: 933, 389: 908, 391: 909, 393: 910, 401: 911, 916, 917, 918, 919, 409: 912, 896, 412: 889, 920, 921, 922, 923, 907, 914, 888, 915, 891, 424: 924, 432: 937, 440: 926, 443: 927, 930, 931, 447: 2424, 453: 932, 943, 936, 941, 458: 934}, - {2: 161, 161}, - } -) - -var yyDebug = 0 - -type yyLexer interface { - Lex(lval *yySymType) int - Error(s string) -} - -type yyLexerEx interface { - yyLexer - Reduced(rule, state int, lval *yySymType) bool -} - -func yySymName(c int) (s string) { - x, ok := yyXLAT[c] - if ok { - return yySymNames[x] - } - - return __yyfmt__.Sprintf("%d", c) -} - -func yylex1(yylex yyLexer, lval *yySymType) (n int) { - n = yylex.Lex(lval) - if n <= 0 { - n = yyEOFCode - } - if yyDebug >= 3 { - __yyfmt__.Printf("\nlex %s(%#x %d), lval: %+v\n", yySymName(n), n, n, lval) - } - return n -} - -func yyParse(yylex yyLexer) int { - const yyError = 556 - - yyEx, _ := yylex.(yyLexerEx) - var yyn int - var yylval yySymType - var yyVAL yySymType - yyS := make([]yySymType, 200) - - Nerrs := 0 /* number of errors */ - Errflag := 0 /* error recovery flag */ - yyerrok := func() { - if yyDebug >= 2 { - __yyfmt__.Printf("yyerrok()\n") - } - Errflag = 0 - } - _ = yyerrok - yystate := 0 - yychar := -1 - var yyxchar int - var yyshift int - yyp := -1 - goto yystack - -ret0: - return 0 - -ret1: - return 1 - -yystack: - /* put a state and value onto the stack */ - yyp++ - if yyp >= len(yyS) { - nyys := make([]yySymType, len(yyS)*2) - copy(nyys, yyS) - yyS = nyys - } - yyS[yyp] = yyVAL - yyS[yyp].yys = yystate - -yynewstate: - if yychar < 0 { - yychar = yylex1(yylex, &yylval) - var ok bool - if yyxchar, ok = yyXLAT[yychar]; !ok { - yyxchar = len(yySymNames) // > tab width - } - } - if yyDebug >= 4 { - var a []int - for _, v := range yyS[:yyp+1] { - a = append(a, v.yys) - } - __yyfmt__.Printf("state stack %v\n", a) - } - row := yyParseTab[yystate] - yyn = 0 - if yyxchar < len(row) { - if yyn = int(row[yyxchar]); yyn != 0 { - yyn += yyTabOfs - } - } - switch { - case yyn > 0: // shift - yychar = -1 - yyVAL = yylval - yystate = yyn - yyshift = yyn - if yyDebug >= 2 { - __yyfmt__.Printf("shift, and goto state %d\n", yystate) - } - if Errflag > 0 { - Errflag-- - } - goto yystack - case yyn < 0: // reduce - case yystate == 1: // accept - if yyDebug >= 2 { - __yyfmt__.Println("accept") - } - goto ret0 - } - - if yyn == 0 { - /* error ... attempt to resume parsing */ - switch Errflag { - case 0: /* brand new error */ - if yyDebug >= 1 { - __yyfmt__.Printf("no action for %s in state %d\n", yySymName(yychar), yystate) - } - msg, ok := yyXErrors[yyXError{yystate, yyxchar}] - if !ok { - msg, ok = yyXErrors[yyXError{yystate, -1}] - } - if !ok && yyshift != 0 { - msg, ok = yyXErrors[yyXError{yyshift, yyxchar}] - } - if !ok { - msg, ok = yyXErrors[yyXError{yyshift, -1}] - } - if !ok || msg == "" { - msg = "syntax error" - } - yylex.Error(msg) - Nerrs++ - fallthrough - - case 1, 2: /* incompletely recovered error ... try again */ - Errflag = 3 - - /* find a state where "error" is a legal shift action */ - for yyp >= 0 { - row := yyParseTab[yyS[yyp].yys] - if yyError < len(row) { - yyn = int(row[yyError]) + yyTabOfs - if yyn > 0 { // hit - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery found error shift in state %d\n", yyS[yyp].yys) - } - yystate = yyn /* simulate a shift of "error" */ - goto yystack - } - } - - /* the current p has no shift on "error", pop stack */ - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) - } - yyp-- - } - /* there is no state on the stack with an error shift ... abort */ - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery failed\n") - } - goto ret1 - - case 3: /* no shift yet; clobber input char */ - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery discards %s\n", yySymName(yychar)) - } - if yychar == yyEOFCode { - goto ret1 - } - - yychar = -1 - goto yynewstate /* try again in the same state */ - } - } - - r := -yyn - x0 := yyReductions[r] - x, n := x0.xsym, x0.components - yypt := yyp - _ = yypt // guard against "declared and not used" - - yyp -= n - if yyp+1 >= len(yyS) { - nyys := make([]yySymType, len(yyS)*2) - copy(nyys, yyS) - yyS = nyys - } - yyVAL = yyS[yyp+1] - - /* consult goto table to find next state */ - exState := yystate - yystate = int(yyParseTab[yyS[yyp].yys][x]) + yyTabOfs - /* reduction by production r */ - if yyDebug >= 2 { - __yyfmt__.Printf("reduce using rule %v (%s), and goto state %d\n", r, yySymNames[x], yystate) - } - - switch r { - case 2: - { - yylex.(*lexer).expr = yyS[yypt-0].item.(ast.ExprNode) - } - case 3: - { - yyVAL.item = &ast.AlterTableStmt{ - Table: yyS[yypt-1].item.(*ast.TableName), - Specs: yyS[yypt-0].item.([]*ast.AlterTableSpec), - } - } - case 4: - { - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableOption, - Options: yyS[yypt-0].item.([]*ast.TableOption), - } - } - case 5: - { - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableAddColumn, - Column: yyS[yypt-1].item.(*ast.ColumnDef), - Position: yyS[yypt-0].item.(*ast.ColumnPosition), - } - } - case 6: - { - constraint := yyS[yypt-0].item.(*ast.Constraint) - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableAddConstraint, - Constraint: constraint, - } - } - case 7: - { - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableDropColumn, - DropColumn: yyS[yypt-0].item.(*ast.ColumnName), - } - } - case 8: - { - yyVAL.item = &ast.AlterTableSpec{Tp: ast.AlterTableDropPrimaryKey} - } - case 9: - { - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableDropIndex, - Name: yyS[yypt-0].item.(string), - } - } - case 10: - { - yyVAL.item = &ast.AlterTableSpec{ - Tp: ast.AlterTableDropForeignKey, - Name: yyS[yypt-0].item.(string), - } - } - case 15: - { - yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionNone} - } - case 16: - { - yyVAL.item = &ast.ColumnPosition{Tp: ast.ColumnPositionFirst} - } - case 17: - { - yyVAL.item = &ast.ColumnPosition{ - Tp: ast.ColumnPositionAfter, - RelativeColumn: yyS[yypt-0].item.(*ast.ColumnName), - } - } - case 18: - { - yyVAL.item = []*ast.AlterTableSpec{yyS[yypt-0].item.(*ast.AlterTableSpec)} - } - case 19: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.AlterTableSpec), yyS[yypt-0].item.(*ast.AlterTableSpec)) - } - case 20: - { - yyVAL.item = nil - } - case 21: - { - yyVAL.item = nil - } - case 22: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 24: - { - yyVAL.item = &ast.Assignment{Column: yyS[yypt-2].item.(*ast.ColumnName), Expr: yyS[yypt-0].item.(ast.ExprNode)} - } - case 25: - { - yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} - } - case 26: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) - } - case 27: - { - yyVAL.item = []*ast.Assignment{} - } - case 29: - { - yyVAL.item = &ast.BeginStmt{} - } - case 30: - { - yyVAL.item = &ast.BeginStmt{} - } - case 31: - { - yyVAL.item = &ast.ColumnDef{Name: yyS[yypt-2].item.(*ast.ColumnName), Tp: yyS[yypt-1].item.(*types.FieldType), Options: yyS[yypt-0].item.([]*ast.ColumnOption)} - } - case 32: - { - yyVAL.item = &ast.ColumnName{Name: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 33: - { - yyVAL.item = &ast.ColumnName{Table: model.NewCIStr(yyS[yypt-2].item.(string)), Name: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 34: - { - yyVAL.item = &ast.ColumnName{Schema: model.NewCIStr(yyS[yypt-4].item.(string)), Table: model.NewCIStr(yyS[yypt-2].item.(string)), Name: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 35: - { - yyVAL.item = []*ast.ColumnName{yyS[yypt-0].item.(*ast.ColumnName)} - } - case 36: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.ColumnName), yyS[yypt-0].item.(*ast.ColumnName)) - } - case 37: - { - yyVAL.item = []*ast.ColumnName{} - } - case 38: - { - yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnName) - } - case 39: - { - yyVAL.item = &ast.CommitStmt{} - } - case 40: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNotNull} - } - case 41: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionNull} - } - case 42: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionAutoIncrement} - } - case 43: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionPrimaryKey} - } - case 44: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniq} - } - case 45: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionUniqKey} - } - case 46: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionDefaultValue, Expr: yyS[yypt-0].item.(ast.ExprNode)} - } - case 47: - { - nowFunc := &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionOnUpdate, Expr: nowFunc} - } - case 48: - { - yyVAL.item = &ast.ColumnOption{Tp: ast.ColumnOptionComment} - } - case 49: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/create-table.html - // The CHECK clause is parsed but ignored by all storage engines. - yyVAL.item = &ast.ColumnOption{} - } - case 50: - { - yyVAL.item = []*ast.ColumnOption{yyS[yypt-0].item.(*ast.ColumnOption)} - } - case 51: - { - yyVAL.item = append(yyS[yypt-1].item.([]*ast.ColumnOption), yyS[yypt-0].item.(*ast.ColumnOption)) - } - case 52: - { - yyVAL.item = []*ast.ColumnOption{} - } - case 53: - { - yyVAL.item = yyS[yypt-0].item.([]*ast.ColumnOption) - } - case 54: - { - c := &ast.Constraint{ - Tp: ast.ConstraintPrimaryKey, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 55: - { - c := &ast.Constraint{ - Tp: ast.ConstraintFulltext, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-4].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - yyVAL.item = c - } - case 56: - { - c := &ast.Constraint{ - Tp: ast.ConstraintIndex, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-5].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 57: - { - c := &ast.Constraint{ - Tp: ast.ConstraintKey, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-5].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 58: - { - c := &ast.Constraint{ - Tp: ast.ConstraintUniq, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-5].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 59: - { - c := &ast.Constraint{ - Tp: ast.ConstraintUniqIndex, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-5].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 60: - { - c := &ast.Constraint{ - Tp: ast.ConstraintUniqKey, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-5].item.(string), - } - if yyS[yypt-0].item != nil { - c.Option = yyS[yypt-0].item.(*ast.IndexOption) - } - if yyS[yypt-4].item != nil { - if c.Option == nil { - c.Option = &ast.IndexOption{} - } - c.Option.Tp = yyS[yypt-4].item.(model.IndexType) - } - yyVAL.item = c - } - case 61: - { - yyVAL.item = &ast.Constraint{ - Tp: ast.ConstraintForeignKey, - Keys: yyS[yypt-2].item.([]*ast.IndexColName), - Name: yyS[yypt-4].item.(string), - Refer: yyS[yypt-0].item.(*ast.ReferenceDef), - } - } - case 62: - { - yyVAL.item = &ast.ReferenceDef{Table: yyS[yypt-3].item.(*ast.TableName), IndexColNames: yyS[yypt-1].item.([]*ast.IndexColName)} - } - case 63: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} - } - case 64: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr("CURRENT_TIMESTAMP")} - } - case 70: - { - yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) - } - case 71: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Plus, V: ast.NewValueExpr(yyS[yypt-0].item)} - } - case 72: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(yyS[yypt-0].item)} - } - case 75: - { - yyVAL.item = &ast.CreateIndexStmt{ - Unique: yyS[yypt-7].item.(bool), - IndexName: yyS[yypt-5].item.(string), - Table: yyS[yypt-3].item.(*ast.TableName), - IndexColNames: yyS[yypt-1].item.([]*ast.IndexColName), - } - if yylex.(*lexer).root { - break - } - } - case 76: - { - yyVAL.item = false - } - case 77: - { - yyVAL.item = true - } - case 78: - { - //Order is parsed but just ignored as MySQL did - yyVAL.item = &ast.IndexColName{Column: yyS[yypt-2].item.(*ast.ColumnName), Length: yyS[yypt-1].item.(int)} - } - case 79: - { - yyVAL.item = []*ast.IndexColName{} - } - case 80: - { - yyVAL.item = []*ast.IndexColName{yyS[yypt-0].item.(*ast.IndexColName)} - } - case 81: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.IndexColName), yyS[yypt-0].item.(*ast.IndexColName)) - } - case 82: - { - yyVAL.item = &ast.CreateDatabaseStmt{ - IfNotExists: yyS[yypt-2].item.(bool), - Name: yyS[yypt-1].item.(string), - Options: yyS[yypt-0].item.([]*ast.DatabaseOption), - } - - if yylex.(*lexer).root { - break - } - } - case 84: - { - yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCharset, Value: yyS[yypt-0].item.(string)} - } - case 85: - { - yyVAL.item = &ast.DatabaseOption{Tp: ast.DatabaseOptionCollate, Value: yyS[yypt-0].item.(string)} - } - case 86: - { - yyVAL.item = []*ast.DatabaseOption{} - } - case 88: - { - yyVAL.item = []*ast.DatabaseOption{yyS[yypt-0].item.(*ast.DatabaseOption)} - } - case 89: - { - yyVAL.item = append(yyS[yypt-1].item.([]*ast.DatabaseOption), yyS[yypt-0].item.(*ast.DatabaseOption)) - } - case 90: - { - tes := yyS[yypt-2].item.([]interface{}) - var columnDefs []*ast.ColumnDef - var constraints []*ast.Constraint - for _, te := range tes { - switch te := te.(type) { - case *ast.ColumnDef: - columnDefs = append(columnDefs, te) - case *ast.Constraint: - constraints = append(constraints, te) - } - } - if len(columnDefs) == 0 { - yylex.(*lexer).err("Column Definition List can't be empty.") - return 1 - } - yyVAL.item = &ast.CreateTableStmt{ - Table: yyS[yypt-4].item.(*ast.TableName), - IfNotExists: yyS[yypt-5].item.(bool), - Cols: columnDefs, - Constraints: constraints, - Options: yyS[yypt-0].item.([]*ast.TableOption), - } - } - case 91: - { - yyVAL.item = yyS[yypt-0].item - } - case 92: - { - yyVAL.item = nil - } - case 96: - { - yyVAL.item = &ast.DoStmt{ - Exprs: yyS[yypt-0].item.([]ast.ExprNode), - } - } - case 97: - { - // Single Table - join := &ast.Join{Left: &ast.TableSource{Source: yyS[yypt-3].item.(ast.ResultSetNode)}, Right: nil} - x := &ast.DeleteStmt{ - TableRefs: &ast.TableRefsClause{TableRefs: join}, - LowPriority: yyS[yypt-7].item.(bool), - Quick: yyS[yypt-6].item.(bool), - Ignore: yyS[yypt-5].item.(bool), - } - if yyS[yypt-2].item != nil { - x.Where = yyS[yypt-2].item.(ast.ExprNode) - } - if yyS[yypt-1].item != nil { - x.Order = yyS[yypt-1].item.(*ast.OrderByClause) - } - if yyS[yypt-0].item != nil { - x.Limit = yyS[yypt-0].item.(*ast.Limit) - } - - yyVAL.item = x - if yylex.(*lexer).root { - break - } - } - case 98: - { - // Multiple Table - x := &ast.DeleteStmt{ - LowPriority: yyS[yypt-6].item.(bool), - Quick: yyS[yypt-5].item.(bool), - Ignore: yyS[yypt-4].item.(bool), - IsMultiTable: true, - BeforeFrom: true, - Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, - TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, - } - if yyS[yypt-0].item != nil { - x.Where = yyS[yypt-0].item.(ast.ExprNode) - } - yyVAL.item = x - if yylex.(*lexer).root { - break - } - } - case 99: - { - // Multiple Table - x := &ast.DeleteStmt{ - LowPriority: yyS[yypt-7].item.(bool), - Quick: yyS[yypt-6].item.(bool), - Ignore: yyS[yypt-5].item.(bool), - IsMultiTable: true, - Tables: &ast.DeleteTableList{Tables: yyS[yypt-3].item.([]*ast.TableName)}, - TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-1].item.(*ast.Join)}, - } - if yyS[yypt-0].item != nil { - x.Where = yyS[yypt-0].item.(ast.ExprNode) - } - yyVAL.item = x - if yylex.(*lexer).root { - break - } - } - case 102: - { - yyVAL.item = &ast.DropDatabaseStmt{IfExists: yyS[yypt-1].item.(bool), Name: yyS[yypt-0].item.(string)} - if yylex.(*lexer).root { - break - } - } - case 103: - { - yyVAL.item = &ast.DropIndexStmt{IfExists: yyS[yypt-3].item.(bool), IndexName: yyS[yypt-2].item.(string), Table: yyS[yypt-0].item.(*ast.TableName)} - } - case 104: - { - yyVAL.item = &ast.DropTableStmt{Tables: yyS[yypt-0].item.([]*ast.TableName)} - if yylex.(*lexer).root { - break - } - } - case 105: - { - yyVAL.item = &ast.DropTableStmt{IfExists: true, Tables: yyS[yypt-0].item.([]*ast.TableName)} - if yylex.(*lexer).root { - break - } - } - case 110: - { - yyVAL.item = nil - } - case 114: - { - yyVAL.item = &ast.ExplainStmt{ - Stmt: &ast.ShowStmt{ - Tp: ast.ShowColumns, - Table: yyS[yypt-0].item.(*ast.TableName), - }, - } - } - case 115: - { - yyVAL.item = &ast.ExplainStmt{ - Stmt: &ast.ShowStmt{ - Tp: ast.ShowColumns, - Table: yyS[yypt-1].item.(*ast.TableName), - Column: yyS[yypt-0].item.(*ast.ColumnName), - }, - } - } - case 116: - { - yyVAL.item = &ast.ExplainStmt{Stmt: yyS[yypt-0].item.(ast.StmtNode)} - } - case 117: - { - switch v := yyS[yypt-0].item.(type) { - case int64: - yyVAL.item = uint64(v) - case uint64: - yyVAL.item = uint64(v) - } - } - case 119: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.OrOr, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 120: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.LogicXor, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 121: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.AndAnd, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 122: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].item.(ast.ExprNode)} - } - case 123: - { - yyVAL.item = &ast.IsTruthExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Not: yyS[yypt-1].item.(bool), True: int64(1)} - } - case 124: - { - yyVAL.item = &ast.IsTruthExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Not: yyS[yypt-1].item.(bool), True: int64(0)} - } - case 125: - { - /* https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_is */ - yyVAL.item = &ast.IsNullExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Not: yyS[yypt-1].item.(bool)} - } - case 132: - { - yyVAL.item = []ast.ExprNode{yyS[yypt-0].item.(ast.ExprNode)} - } - case 133: - { - yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].item.(ast.ExprNode)) - } - case 134: - { - yyVAL.item = []ast.ExprNode{} - } - case 136: - { - yyVAL.item = &ast.IsNullExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Not: yyS[yypt-1].item.(bool)} - } - case 137: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: yyS[yypt-1].item.(opcode.Op), L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 138: - { - yyVAL.item = &ast.CompareSubqueryExpr{Op: yyS[yypt-2].item.(opcode.Op), L: yyS[yypt-3].item.(ast.ExprNode), R: yyS[yypt-0].item.(*ast.SubqueryExpr), All: yyS[yypt-1].item.(bool)} - } - case 140: - { - yyVAL.item = opcode.GE - } - case 141: - { - yyVAL.item = opcode.GT - } - case 142: - { - yyVAL.item = opcode.LE - } - case 143: - { - yyVAL.item = opcode.LT - } - case 144: - { - yyVAL.item = opcode.NE - } - case 145: - { - yyVAL.item = opcode.NE - } - case 146: - { - yyVAL.item = opcode.EQ - } - case 147: - { - yyVAL.item = opcode.NullEQ - } - case 148: - { - yyVAL.item = false - } - case 149: - { - yyVAL.item = false - } - case 150: - { - yyVAL.item = true - } - case 151: - { - yyVAL.item = &ast.PatternInExpr{Expr: yyS[yypt-5].item.(ast.ExprNode), Not: yyS[yypt-4].item.(bool), List: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 152: - { - yyVAL.item = &ast.PatternInExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Not: yyS[yypt-2].item.(bool), Sel: yyS[yypt-0].item.(*ast.SubqueryExpr)} - } - case 153: - { - yyVAL.item = &ast.BetweenExpr{ - Expr: yyS[yypt-5].item.(ast.ExprNode), - Left: yyS[yypt-2].item.(ast.ExprNode), - Right: yyS[yypt-0].item.(ast.ExprNode), - Not: yyS[yypt-4].item.(bool), - } - } - case 154: - { - escape := yyS[yypt-0].item.(string) - if len(escape) > 1 { - yylex.(*lexer).errf("Incorrect arguments %s to ESCAPE", escape) - return 1 - } else if len(escape) == 0 { - escape = "\\" - } - yyVAL.item = &ast.PatternLikeExpr{ - Expr: yyS[yypt-4].item.(ast.ExprNode), - Pattern: yyS[yypt-1].item.(ast.ExprNode), - Not: yyS[yypt-3].item.(bool), - Escape: escape[0], - } - } - case 155: - { - yyVAL.item = &ast.PatternRegexpExpr{Expr: yyS[yypt-3].item.(ast.ExprNode), Pattern: yyS[yypt-0].item.(ast.ExprNode), Not: yyS[yypt-2].item.(bool)} - } - case 159: - { - yyVAL.item = "\\" - } - case 160: - { - yyVAL.item = yyS[yypt-0].item - } - case 161: - { - yyVAL.item = false - } - case 162: - { - yyVAL.item = true - } - case 163: - { - yyVAL.item = &ast.SelectField{WildCard: &ast.WildCardField{}} - } - case 164: - { - wildCard := &ast.WildCardField{Table: model.NewCIStr(yyS[yypt-2].item.(string))} - yyVAL.item = &ast.SelectField{WildCard: wildCard} - } - case 165: - { - wildCard := &ast.WildCardField{Schema: model.NewCIStr(yyS[yypt-4].item.(string)), Table: model.NewCIStr(yyS[yypt-2].item.(string))} - yyVAL.item = &ast.SelectField{WildCard: wildCard} - } - case 166: - { - expr := yyS[yypt-1].item.(ast.ExprNode) - asName := yyS[yypt-0].item.(string) - yyVAL.item = &ast.SelectField{Expr: expr, AsName: model.NewCIStr(asName)} - } - case 167: - { - yyVAL.item = "" - } - case 168: - { - yyVAL.item = yyS[yypt-0].item - } - case 169: - { - yyVAL.item = yyS[yypt-0].item - } - case 170: - { - yyVAL.item = yyS[yypt-0].item - } - case 171: - { - yyVAL.item = yyS[yypt-0].item - } - case 172: - { - yyVAL.item = yyS[yypt-0].item - } - case 173: - { - field := yyS[yypt-0].item.(*ast.SelectField) - field.Offset = yylex.(*lexer).startOffset(yyS[yypt].offset) - yyVAL.item = []*ast.SelectField{field} - } - case 174: - { - - fl := yyS[yypt-2].item.([]*ast.SelectField) - last := fl[len(fl)-1] - l := yylex.(*lexer) - if last.Expr != nil && last.AsName.O == "" { - lastEnd := l.endOffset(yyS[yypt-1].offset) - last.SetText(l.src[last.Offset:lastEnd]) - } - newField := yyS[yypt-0].item.(*ast.SelectField) - newField.Offset = l.startOffset(yyS[yypt].offset) - yyVAL.item = append(fl, newField) - } - case 175: - { - yyVAL.item = &ast.GroupByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} - } - case 176: - { - yyVAL.item = nil - } - case 177: - { - yyVAL.item = &ast.HavingClause{Expr: yyS[yypt-0].item.(ast.ExprNode)} - } - case 178: - { - yyVAL.item = false - } - case 179: - { - yyVAL.item = true - } - case 180: - { - yyVAL.item = false - } - case 181: - { - yyVAL.item = true - } - case 182: - { - yyVAL.item = false - } - case 183: - { - yyVAL.item = true - } - case 184: - { - yyVAL.item = "" - } - case 185: - { - //"index name" - yyVAL.item = yyS[yypt-0].item.(string) - } - case 186: - { - yyVAL.item = nil - } - case 187: - { - yyVAL.item = &ast.IndexOption{ - KeyBlockSize: yyS[yypt-2].item.(uint64), - } - } - case 188: - { - yyVAL.item = &ast.IndexOption{ - Tp: yyS[yypt-0].item.(model.IndexType), - } - } - case 189: - { - yyVAL.item = &ast.IndexOption{ - Comment: yyS[yypt-0].item.(string), - } - } - case 190: - { - yyVAL.item = model.IndexTypeBtree - } - case 191: - { - yyVAL.item = model.IndexTypeHash - } - case 192: - { - yyVAL.item = nil - } - case 193: - { - yyVAL.item = yyS[yypt-0].item - } - case 321: - { - x := yyS[yypt-1].item.(*ast.InsertStmt) - x.Priority = yyS[yypt-5].item.(int) - // Wraps many layers here so that it can be processed the same way as select statement. - ts := &ast.TableSource{Source: yyS[yypt-2].item.(*ast.TableName)} - x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} - if yyS[yypt-0].item != nil { - x.OnDuplicate = yyS[yypt-0].item.([]*ast.Assignment) - } - yyVAL.item = x - if yylex.(*lexer).root { - break - } - } - case 324: - { - yyVAL.item = &ast.InsertStmt{ - Columns: yyS[yypt-3].item.([]*ast.ColumnName), - Lists: yyS[yypt-0].item.([][]ast.ExprNode), - } - } - case 325: - { - yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].item.(*ast.SelectStmt)} - } - case 326: - { - yyVAL.item = &ast.InsertStmt{Columns: yyS[yypt-2].item.([]*ast.ColumnName), Select: yyS[yypt-0].item.(*ast.UnionStmt)} - } - case 327: - { - yyVAL.item = &ast.InsertStmt{Lists: yyS[yypt-0].item.([][]ast.ExprNode)} - } - case 328: - { - yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].item.(*ast.SelectStmt)} - } - case 329: - { - yyVAL.item = &ast.InsertStmt{Select: yyS[yypt-0].item.(*ast.UnionStmt)} - } - case 330: - { - yyVAL.item = &ast.InsertStmt{Setlist: yyS[yypt-0].item.([]*ast.Assignment)} - } - case 333: - { - yyVAL.item = [][]ast.ExprNode{[]ast.ExprNode{}} - } - case 334: - { - yyVAL.item = append([][]ast.ExprNode{[]ast.ExprNode{}}, yyS[yypt-0].item.([][]ast.ExprNode)...) - } - case 335: - { - yyVAL.item = [][]ast.ExprNode{yyS[yypt-1].item.([]ast.ExprNode)} - } - case 336: - { - yyVAL.item = append([][]ast.ExprNode{yyS[yypt-3].item.([]ast.ExprNode)}, yyS[yypt-0].item.([][]ast.ExprNode)...) - } - case 337: - { - yyVAL.item = &ast.Assignment{ - Column: yyS[yypt-2].item.(*ast.ColumnName), - Expr: yyS[yypt-0].item.(ast.ExprNode), - } - } - case 338: - { - yyVAL.item = []*ast.Assignment{} - } - case 339: - { - yyVAL.item = []*ast.Assignment{yyS[yypt-0].item.(*ast.Assignment)} - } - case 340: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.Assignment), yyS[yypt-0].item.(*ast.Assignment)) - } - case 341: - { - yyVAL.item = nil - } - case 342: - { - yyVAL.item = yyS[yypt-0].item - } - case 343: - { - x := yyS[yypt-0].item.(*ast.InsertStmt) - x.IsReplace = true - x.Priority = yyS[yypt-3].item.(int) - ts := &ast.TableSource{Source: yyS[yypt-1].item.(*ast.TableName)} - x.Table = &ast.TableRefsClause{TableRefs: &ast.Join{Left: ts}} - yyVAL.item = x - } - case 344: - { - yyVAL.item = ast.NoPriority - } - case 345: - { - yyVAL.item = ast.LowPriority - } - case 346: - { - yyVAL.item = ast.DelayedPriority - } - case 347: - { - yyVAL.item = int64(0) - } - case 349: - { - yyVAL.item = int64(1) - } - case 352: - { - tp := types.NewFieldType(mysql.TypeString) - l := yylex.(*lexer) - tp.Charset, tp.Collate = l.GetCharsetInfo() - expr := ast.NewValueExpr(yyS[yypt-0].item) - expr.SetType(tp) - yyVAL.item = expr - } - case 353: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html - tp := types.NewFieldType(mysql.TypeString) - tp.Charset = yyS[yypt-1].item.(string) - co, err := charset.GetDefaultCollation(tp.Charset) - if err != nil { - l := yylex.(*lexer) - l.errf("Get collation error for charset: %s", tp.Charset) - return 1 - } - tp.Collate = co - expr := ast.NewValueExpr(yyS[yypt-0].item) - expr.SetType(tp) - yyVAL.item = expr - } - case 356: - { - yyVAL.item = ast.NewValueExpr(yyS[yypt-0].item) - } - case 357: - { - yyVAL.item = &ast.ColumnNameExpr{Name: yyS[yypt-0].item.(*ast.ColumnName)} - } - case 358: - { - l := yylex.(*lexer) - startOffset := l.startOffset(yyS[yypt-1].offset) - endOffset := l.endOffset(yyS[yypt].offset) - expr := yyS[yypt-1].item.(ast.ExprNode) - expr.SetText(l.src[startOffset:endOffset]) - yyVAL.item = &ast.ParenthesesExpr{Expr: expr} - } - case 359: - { - yyVAL.item = &ast.DefaultExpr{} - } - case 360: - { - yyVAL.item = &ast.DefaultExpr{Name: yyS[yypt-1].item.(*ast.ColumnName)} - } - case 361: - { - yyVAL.item = yyS[yypt-0].item - } - case 362: - { - yyVAL.item = &ast.ParamMarkerExpr{ - Offset: yyS[yypt].offset, - } - } - case 363: - { - values := append([]ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode)}, yyS[yypt-1].item.([]ast.ExprNode)...) - yyVAL.item = &ast.RowExpr{Values: values} - } - case 364: - { - values := append([]ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode)}, yyS[yypt-1].item.([]ast.ExprNode)...) - yyVAL.item = &ast.RowExpr{Values: values} - } - case 365: - { - yyVAL.item = &ast.ExistsSubqueryExpr{Sel: yyS[yypt-0].item.(*ast.SubqueryExpr)} - } - case 366: - { - yyVAL.item = &ast.OrderByClause{Items: yyS[yypt-0].item.([]*ast.ByItem)} - } - case 367: - { - yyVAL.item = []*ast.ByItem{yyS[yypt-0].item.(*ast.ByItem)} - } - case 368: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.ByItem), yyS[yypt-0].item.(*ast.ByItem)) - } - case 369: - { - expr := yyS[yypt-1].item - valueExpr, ok := expr.(*ast.ValueExpr) - if ok { - position, isPosition := valueExpr.GetValue().(int64) - if isPosition { - expr = &ast.PositionExpr{N: int(position)} - } - } - yyVAL.item = &ast.ByItem{Expr: expr.(ast.ExprNode), Desc: yyS[yypt-0].item.(bool)} - } - case 370: - { - yyVAL.item = false // ASC by default - } - case 371: - { - yyVAL.item = false - } - case 372: - { - yyVAL.item = true - } - case 373: - { - yyVAL.item = nil - } - case 374: - { - yyVAL.item = yyS[yypt-0].item - } - case 378: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Not, V: yyS[yypt-0].item.(ast.ExprNode)} - } - case 379: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.BitNeg, V: yyS[yypt-0].item.(ast.ExprNode)} - } - case 380: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Minus, V: yyS[yypt-0].item.(ast.ExprNode)} - } - case 381: - { - yyVAL.item = &ast.UnaryOperationExpr{Op: opcode.Plus, V: yyS[yypt-0].item.(ast.ExprNode)} - } - case 382: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#operator_binary - x := types.NewFieldType(mysql.TypeString) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = &ast.FuncCastExpr{ - Expr: yyS[yypt-0].item.(ast.ExprNode), - Tp: x, - FunctionType: ast.CastBinaryOperator, - } - } - case 383: - { - // TODO: Create a builtin function hold expr and collation. When do evaluation, convert expr result using the collation. - yyVAL.item = yyS[yypt-2].item - } - case 396: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 397: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 398: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 399: - { - yyVAL.item = false - } - case 400: - { - yyVAL.item = false - } - case 401: - { - yyVAL.item = true - } - case 402: - { - yyVAL.item = true - } - case 403: - { - /* See: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_cast */ - yyVAL.item = &ast.FuncCastExpr{ - Expr: yyS[yypt-3].item.(ast.ExprNode), - Tp: yyS[yypt-1].item.(*types.FieldType), - FunctionType: ast.CastFunction, - } - } - case 404: - { - x := &ast.CaseExpr{WhenClauses: yyS[yypt-2].item.([]*ast.WhenClause)} - if yyS[yypt-3].item != nil { - x.Value = yyS[yypt-3].item.(ast.ExprNode) - } - if yyS[yypt-1].item != nil { - x.ElseClause = yyS[yypt-1].item.(ast.ExprNode) - } - yyVAL.item = x - } - case 405: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert - charset := ast.NewValueExpr(yyS[yypt-1].item) - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), charset}, - } - } - case 406: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert - yyVAL.item = &ast.FuncCastExpr{ - Expr: yyS[yypt-3].item.(ast.ExprNode), - Tp: yyS[yypt-1].item.(*types.FieldType), - FunctionType: ast.CastConvertFunction, - } - } - case 407: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 408: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].item.(string))} - } - case 409: - { - // TODO: support qualified identifier for column_name - yyVAL.item = &ast.ValuesExpr{Column: &ast.ColumnNameExpr{Name: yyS[yypt-1].item.(*ast.ColumnName)}} - } - case 410: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 411: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 412: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 413: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].item.(string))} - } - case 414: - { - args := []ast.ExprNode{} - if yyS[yypt-1].item != nil { - args = append(args, yyS[yypt-1].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: args} - } - case 415: - { - args := []ast.ExprNode{} - if yyS[yypt-0].item != nil { - args = append(args, yyS[yypt-0].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].item.(string)), Args: args} - } - case 416: - { - args := []ast.ExprNode{} - if yyS[yypt-0].item != nil { - args = append(args, yyS[yypt-0].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-1].item.(string)), Args: args} - } - case 417: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 418: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 419: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 420: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 421: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 422: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 423: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 424: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 425: - { - op := ast.NewValueExpr(yyS[yypt-7].item) - dateArithInterval := ast.NewValueExpr( - ast.DateArithInterval{ - Unit: yyS[yypt-1].item.(string), - Interval: yyS[yypt-2].item.(ast.ExprNode), - }, - ) - - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr("DATE_ARITH"), - Args: []ast.ExprNode{ - op, - yyS[yypt-5].item.(ast.ExprNode), - dateArithInterval, - }, - } - } - case 426: - { - op := ast.NewValueExpr(yyS[yypt-5].item) - dateArithInterval := ast.NewValueExpr(yyS[yypt-1].item) - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr("DATE_ARITH"), - Args: []ast.ExprNode{ - op, - yyS[yypt-3].item.(ast.ExprNode), - dateArithInterval, - }, - } - } - case 427: - { - timeUnit := ast.NewValueExpr(yyS[yypt-3].item) - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{timeUnit, yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 428: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].item.(string))} - } - case 429: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 430: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 431: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 432: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 433: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-7].item.(string)), - Args: []ast.ExprNode{yyS[yypt-5].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 434: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 435: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 436: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 437: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 438: - { - args := []ast.ExprNode{} - if yyS[yypt-1].item != nil { - args = append(args, yyS[yypt-1].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: args} - } - case 439: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 440: - { - args := []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)} - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].item.(string)), Args: args} - } - case 441: - { - args := []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)} - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].item.(string)), Args: args} - } - case 442: - { - - args := []ast.ExprNode{} - if yyS[yypt-1].item != nil { - args = append(args, yyS[yypt-1].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: args} - } - case 443: - { - args := []ast.ExprNode{yyS[yypt-5].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)} - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-7].item.(string)), Args: args} - } - case 444: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 445: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-5].item.(string)), Args: []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}} - } - case 446: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 447: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 448: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-7].item.(string)), - Args: []ast.ExprNode{yyS[yypt-5].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 449: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-7].item.(string)), - Args: []ast.ExprNode{yyS[yypt-5].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 450: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-7].item.(string)), - Args: []ast.ExprNode{yyS[yypt-5].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 451: - { - args := []ast.ExprNode{} - if yyS[yypt-1].item != nil { - args = append(args, yyS[yypt-1].item.(ast.ExprNode)) - } - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: args} - } - case 452: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-3].item.(string)), - Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}, - } - } - case 453: - { - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode)}, - } - } - case 454: - { - nilVal := ast.NewValueExpr(nil) - direction := ast.NewValueExpr(yyS[yypt-3].item) - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-5].item.(string)), - Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode), nilVal, direction}, - } - } - case 455: - { - direction := ast.NewValueExpr(yyS[yypt-4].item) - yyVAL.item = &ast.FuncCallExpr{ - FnName: model.NewCIStr(yyS[yypt-6].item.(string)), - Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode), yyS[yypt-3].item.(ast.ExprNode), direction}, - } - } - case 456: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 457: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 458: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}} - } - case 459: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-3].item.(string)), Args: yyS[yypt-1].item.([]ast.ExprNode)} - } - case 460: - { - yyVAL.item = &ast.FuncCallExpr{FnName: model.NewCIStr(yyS[yypt-2].item.(string))} - } - case 461: - { - yyVAL.item = ast.DateAdd - } - case 462: - { - yyVAL.item = ast.DateSub - } - case 463: - { - yyVAL.item = ast.DateAdd - } - case 464: - { - yyVAL.item = ast.DateSub - } - case 465: - { - yyVAL.item = ast.DateArithInterval{ - Unit: "day", - Interval: yyS[yypt-0].item.(ast.ExprNode), - } - } - case 466: - { - yyVAL.item = ast.DateArithInterval{Unit: yyS[yypt-0].item.(string), Interval: yyS[yypt-1].item.(ast.ExprNode)} - } - case 467: - { - yyVAL.item = ast.TrimBoth - } - case 468: - { - yyVAL.item = ast.TrimLeading - } - case 469: - { - yyVAL.item = ast.TrimTrailing - } - case 470: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: yyS[yypt-2].item.(bool)} - } - case 471: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: yyS[yypt-2].item.(bool)} - } - case 472: - { - args := []ast.ExprNode{ast.NewValueExpr(ast.UnquoteString("*"))} - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: args, Distinct: yyS[yypt-2].item.(bool)} - } - case 473: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: yyS[yypt-1].item.([]ast.ExprNode), Distinct: yyS[yypt-2].item.(bool)} - } - case 474: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}, Distinct: yyS[yypt-2].item.(bool)} - } - case 475: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}, Distinct: yyS[yypt-2].item.(bool)} - } - case 476: - { - yyVAL.item = &ast.AggregateFuncExpr{F: yyS[yypt-4].item.(string), Args: []ast.ExprNode{yyS[yypt-1].item.(ast.ExprNode)}, Distinct: yyS[yypt-2].item.(bool)} - } - case 477: - { - yyVAL.item = nil - } - case 478: - { - yyVAL.item = nil - } - case 479: - { - yyVAL.item = yyS[yypt-1].item - } - case 500: - { - yyVAL.item = nil - } - case 501: - { - yyVAL.item = yyS[yypt-0].item - } - case 502: - { - yyVAL.item = []*ast.WhenClause{yyS[yypt-0].item.(*ast.WhenClause)} - } - case 503: - { - yyVAL.item = append(yyS[yypt-1].item.([]*ast.WhenClause), yyS[yypt-0].item.(*ast.WhenClause)) - } - case 504: - { - yyVAL.item = &ast.WhenClause{ - Expr: yyS[yypt-2].item.(ast.ExprNode), - Result: yyS[yypt-0].item.(ast.ExprNode), - } - } - case 505: - { - yyVAL.item = nil - } - case 506: - { - yyVAL.item = yyS[yypt-0].item - } - case 507: - { - x := types.NewFieldType(mysql.TypeString) - x.Flen = yyS[yypt-0].item.(int) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 508: - { - x := types.NewFieldType(mysql.TypeString) - x.Flen = yyS[yypt-2].item.(int) - if yyS[yypt-1].item.(bool) { - x.Flag |= mysql.BinaryFlag - } - x.Charset = yyS[yypt-0].item.(string) - yyVAL.item = x - } - case 509: - { - x := types.NewFieldType(mysql.TypeDate) - yyVAL.item = x - } - case 510: - { - x := types.NewFieldType(mysql.TypeDatetime) - x.Decimal = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 511: - { - fopt := yyS[yypt-0].item.(*ast.FloatOpt) - x := types.NewFieldType(mysql.TypeNewDecimal) - x.Flen = fopt.Flen - x.Decimal = fopt.Decimal - yyVAL.item = x - } - case 512: - { - x := types.NewFieldType(mysql.TypeDuration) - x.Decimal = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 513: - { - x := types.NewFieldType(mysql.TypeLonglong) - yyVAL.item = x - } - case 514: - { - x := types.NewFieldType(mysql.TypeLonglong) - x.Flag |= mysql.UnsignedFlag - yyVAL.item = x - } - case 515: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Or, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 516: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.And, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 517: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.LeftShift, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 518: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.RightShift, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 519: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Plus, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 520: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Minus, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 521: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Mul, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 522: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Div, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 523: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 524: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.IntDiv, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 525: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Mod, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 526: - { - yyVAL.item = &ast.BinaryOperationExpr{Op: opcode.Xor, L: yyS[yypt-2].item.(ast.ExprNode), R: yyS[yypt-0].item.(ast.ExprNode)} - } - case 528: - { - yyVAL.item = ast.NoPriority - } - case 529: - { - yyVAL.item = ast.LowPriority - } - case 530: - { - yyVAL.item = ast.HighPriority - } - case 531: - { - yyVAL.item = ast.DelayedPriority - } - case 532: - { - yyVAL.item = false - } - case 533: - { - yyVAL.item = true - } - case 534: - { - yyVAL.item = &ast.TableName{Name: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 535: - { - yyVAL.item = &ast.TableName{Schema: model.NewCIStr(yyS[yypt-2].item.(string)), Name: model.NewCIStr(yyS[yypt-0].item.(string))} - } - case 536: - { - tbl := []*ast.TableName{yyS[yypt-0].item.(*ast.TableName)} - yyVAL.item = tbl - } - case 537: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableName), yyS[yypt-0].item.(*ast.TableName)) - } - case 538: - { - yyVAL.item = false - } - case 539: - { - yyVAL.item = true - } - case 540: - { - var sqlText string - var sqlVar *ast.VariableExpr - switch yyS[yypt-0].item.(type) { - case string: - sqlText = yyS[yypt-0].item.(string) - case *ast.VariableExpr: - sqlVar = yyS[yypt-0].item.(*ast.VariableExpr) - } - yyVAL.item = &ast.PrepareStmt{ - Name: yyS[yypt-2].item.(string), - SQLText: sqlText, - SQLVar: sqlVar, - } - } - case 543: - { - yyVAL.item = &ast.ExecuteStmt{Name: yyS[yypt-0].item.(string)} - } - case 544: - { - yyVAL.item = &ast.ExecuteStmt{ - Name: yyS[yypt-2].item.(string), - UsingVars: yyS[yypt-0].item.([]ast.ExprNode), - } - } - case 545: - { - yyVAL.item = []ast.ExprNode{yyS[yypt-0].item.(ast.ExprNode)} - } - case 546: - { - yyVAL.item = append(yyS[yypt-2].item.([]ast.ExprNode), yyS[yypt-0].item.(ast.ExprNode)) - } - case 547: - { - yyVAL.item = &ast.DeallocateStmt{Name: yyS[yypt-0].item.(string)} - } - case 550: - { - yyVAL.item = &ast.RollbackStmt{} - } - case 551: - { - st := &ast.SelectStmt{ - Distinct: yyS[yypt-3].item.(bool), - Fields: yyS[yypt-2].item.(*ast.FieldList), - LockTp: yyS[yypt-0].item.(ast.SelectLockType), - } - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Expr != nil && lastField.AsName.O == "" { - src := yylex.(*lexer).src - var lastEnd int - if yyS[yypt-1].item != nil { - lastEnd = yyS[yypt-1].offset - 1 - } else if yyS[yypt-0].item != ast.SelectLockNone { - lastEnd = yyS[yypt].offset - 1 - } else { - lastEnd = len(src) - if src[lastEnd-1] == ';' { - lastEnd-- - } - } - lastField.SetText(src[lastField.Offset:lastEnd]) - } - if yyS[yypt-1].item != nil { - st.Limit = yyS[yypt-1].item.(*ast.Limit) - } - yyVAL.item = st - } - case 552: - { - st := &ast.SelectStmt{ - Distinct: yyS[yypt-5].item.(bool), - Fields: yyS[yypt-4].item.(*ast.FieldList), - LockTp: yyS[yypt-0].item.(ast.SelectLockType), - } - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Expr != nil && lastField.AsName.O == "" { - lastEnd := yyS[yypt-3].offset - 1 - lastField.SetText(yylex.(*lexer).src[lastField.Offset:lastEnd]) - } - if yyS[yypt-2].item != nil { - st.Where = yyS[yypt-2].item.(ast.ExprNode) - } - if yyS[yypt-1].item != nil { - st.Limit = yyS[yypt-1].item.(*ast.Limit) - } - yyVAL.item = st - } - case 553: - { - st := &ast.SelectStmt{ - Distinct: yyS[yypt-9].item.(bool), - Fields: yyS[yypt-8].item.(*ast.FieldList), - From: yyS[yypt-6].item.(*ast.TableRefsClause), - LockTp: yyS[yypt-0].item.(ast.SelectLockType), - } - - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Expr != nil && lastField.AsName.O == "" { - lastEnd := yyS[yypt-7].offset - 1 - lastField.SetText(yylex.(*lexer).src[lastField.Offset:lastEnd]) - } - - if yyS[yypt-5].item != nil { - st.Where = yyS[yypt-5].item.(ast.ExprNode) - } - - if yyS[yypt-4].item != nil { - st.GroupBy = yyS[yypt-4].item.(*ast.GroupByClause) - } - - if yyS[yypt-3].item != nil { - st.Having = yyS[yypt-3].item.(*ast.HavingClause) - } - - if yyS[yypt-2].item != nil { - st.OrderBy = yyS[yypt-2].item.(*ast.OrderByClause) - } - - if yyS[yypt-1].item != nil { - st.Limit = yyS[yypt-1].item.(*ast.Limit) - } - - yyVAL.item = st - } - case 555: - { - yyVAL.item = &ast.TableRefsClause{TableRefs: yyS[yypt-0].item.(*ast.Join)} - } - case 556: - { - if j, ok := yyS[yypt-0].item.(*ast.Join); ok { - // if $1 is Join, use it directly - yyVAL.item = j - } else { - yyVAL.item = &ast.Join{Left: yyS[yypt-0].item.(ast.ResultSetNode), Right: nil} - } - } - case 557: - { - /* from a, b is default cross join */ - yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} - } - case 558: - { - yyVAL.item = yyS[yypt-0].item - } - case 559: - { - /* - * ODBC escape syntax for outer join is { OJ join_table } - * Use an Identifier for OJ - */ - yyVAL.item = yyS[yypt-1].item - } - case 560: - { - yyVAL.item = yyS[yypt-0].item - } - case 561: - { - yyVAL.item = yyS[yypt-0].item - } - case 562: - { - yyVAL.item = &ast.TableSource{Source: yyS[yypt-1].item.(*ast.TableName), AsName: yyS[yypt-0].item.(model.CIStr)} - } - case 563: - { - st := yyS[yypt-2].item.(*ast.SelectStmt) - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt-1].offset) - l.SetLastSelectFieldText(st, endOffset) - yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].item.(*ast.SelectStmt), AsName: yyS[yypt-0].item.(model.CIStr)} - } - case 564: - { - yyVAL.item = &ast.TableSource{Source: yyS[yypt-2].item.(*ast.UnionStmt), AsName: yyS[yypt-0].item.(model.CIStr)} - } - case 565: - { - yyVAL.item = yyS[yypt-1].item - } - case 566: - { - yyVAL.item = model.CIStr{} - } - case 567: - { - yyVAL.item = yyS[yypt-0].item - } - case 568: - { - yyVAL.item = model.NewCIStr(yyS[yypt-0].item.(string)) - } - case 569: - { - yyVAL.item = model.NewCIStr(yyS[yypt-0].item.(string)) - } - case 570: - { - yyVAL.item = &ast.Join{Left: yyS[yypt-2].item.(ast.ResultSetNode), Right: yyS[yypt-0].item.(ast.ResultSetNode), Tp: ast.CrossJoin} - } - case 571: - { - on := &ast.OnCondition{Expr: yyS[yypt-0].item.(ast.ExprNode)} - yyVAL.item = &ast.Join{Left: yyS[yypt-4].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: ast.CrossJoin, On: on} - } - case 572: - { - on := &ast.OnCondition{Expr: yyS[yypt-0].item.(ast.ExprNode)} - yyVAL.item = &ast.Join{Left: yyS[yypt-6].item.(ast.ResultSetNode), Right: yyS[yypt-2].item.(ast.ResultSetNode), Tp: yyS[yypt-5].item.(ast.JoinType), On: on} - } - case 573: - { - yyVAL.item = ast.LeftJoin - } - case 574: - { - yyVAL.item = ast.RightJoin - } - case 575: - { - yyVAL.item = nil - } - case 580: - { - yyVAL.item = nil - } - case 581: - { - yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(uint64)} - } - case 582: - { - yyVAL.item = nil - } - case 583: - { - yyVAL.item = &ast.Limit{Count: yyS[yypt-0].item.(uint64)} - } - case 584: - { - yyVAL.item = &ast.Limit{Offset: yyS[yypt-2].item.(uint64), Count: yyS[yypt-0].item.(uint64)} - } - case 585: - { - yyVAL.item = &ast.Limit{Offset: yyS[yypt-0].item.(uint64), Count: yyS[yypt-2].item.(uint64)} - } - case 586: - { - yyVAL.item = false - } - case 587: - { - yyVAL.item = false - } - case 588: - { - yyVAL.item = true - } - case 589: - { - // TODO: return calc_found_rows opt and support more other options - yyVAL.item = yyS[yypt-1].item - } - case 590: - { - yyVAL.item = false - } - case 591: - { - yyVAL.item = true - } - case 592: - { - yyVAL.item = &ast.FieldList{Fields: yyS[yypt-0].item.([]*ast.SelectField)} - } - case 593: - { - yyVAL.item = nil - } - case 595: - { - s := yyS[yypt-1].item.(*ast.SelectStmt) - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt].offset) - l.SetLastSelectFieldText(s, endOffset) - src := yylex.(*lexer).src - // See the implemention of yyParse function - s.SetText(src[yyS[yypt-1].offset-1 : yyS[yypt].offset-1]) - yyVAL.item = &ast.SubqueryExpr{Query: s} - } - case 596: - { - s := yyS[yypt-1].item.(*ast.UnionStmt) - src := yylex.(*lexer).src - // See the implemention of yyParse function - s.SetText(src[yyS[yypt-1].offset-1 : yyS[yypt].offset-1]) - yyVAL.item = &ast.SubqueryExpr{Query: s} - } - case 597: - { - yyVAL.item = ast.SelectLockNone - } - case 598: - { - yyVAL.item = ast.SelectLockForUpdate - } - case 599: - { - yyVAL.item = ast.SelectLockInShareMode - } - case 600: - { - union := yyS[yypt-3].item.(*ast.UnionStmt) - union.Distinct = union.Distinct || yyS[yypt-1].item.(bool) - lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt-2].offset) - l.SetLastSelectFieldText(lastSelect, endOffset) - union.SelectList.Selects = append(union.SelectList.Selects, yyS[yypt-0].item.(*ast.SelectStmt)) - yyVAL.item = union - } - case 601: - { - union := yyS[yypt-7].item.(*ast.UnionStmt) - union.Distinct = union.Distinct || yyS[yypt-5].item.(bool) - lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt-6].offset) - l.SetLastSelectFieldText(lastSelect, endOffset) - st := yyS[yypt-3].item.(*ast.SelectStmt) - endOffset = l.endOffset(yyS[yypt-2].offset) - l.SetLastSelectFieldText(st, endOffset) - union.SelectList.Selects = append(union.SelectList.Selects, st) - if yyS[yypt-1].item != nil { - union.OrderBy = yyS[yypt-1].item.(*ast.OrderByClause) - } - if yyS[yypt-0].item != nil { - union.Limit = yyS[yypt-0].item.(*ast.Limit) - } - yyVAL.item = union - } - case 602: - { - selectList := &ast.UnionSelectList{Selects: []*ast.SelectStmt{yyS[yypt-0].item.(*ast.SelectStmt)}} - yyVAL.item = &ast.UnionStmt{ - SelectList: selectList, - } - } - case 603: - { - union := yyS[yypt-3].item.(*ast.UnionStmt) - union.Distinct = union.Distinct || yyS[yypt-1].item.(bool) - lastSelect := union.SelectList.Selects[len(union.SelectList.Selects)-1] - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt-2].offset) - l.SetLastSelectFieldText(lastSelect, endOffset) - union.SelectList.Selects = append(union.SelectList.Selects, yyS[yypt-0].item.(*ast.SelectStmt)) - yyVAL.item = union - } - case 605: - { - st := yyS[yypt-1].item.(*ast.SelectStmt) - l := yylex.(*lexer) - endOffset := l.endOffset(yyS[yypt].offset) - l.SetLastSelectFieldText(st, endOffset) - yyVAL.item = st - } - case 606: - { - yyVAL.item = true - } - case 607: - { - yyVAL.item = false - } - case 608: - { - yyVAL.item = true - } - case 609: - { - yyVAL.item = &ast.SetStmt{Variables: yyS[yypt-0].item.([]*ast.VariableAssignment)} - } - case 610: - { - yyVAL.item = &ast.SetCharsetStmt{Charset: yyS[yypt-0].item.(string)} - } - case 611: - { - yyVAL.item = &ast.SetCharsetStmt{ - Charset: yyS[yypt-2].item.(string), - Collate: yyS[yypt-0].item.(string), - } - } - case 612: - { - yyVAL.item = &ast.SetCharsetStmt{Charset: yyS[yypt-0].item.(string)} - } - case 613: - { - yyVAL.item = &ast.SetPwdStmt{Password: yyS[yypt-0].item.(string)} - } - case 614: - { - yyVAL.item = &ast.SetPwdStmt{User: yyS[yypt-2].item.(string), Password: yyS[yypt-0].item.(string)} - } - case 615: - { - // Parsed but ignored - } - case 616: - { - // Parsed but ignored - } - case 626: - { - yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].item.(string), Value: yyS[yypt-0].item.(ast.ExprNode), IsSystem: true} - } - case 627: - { - yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].item.(string), Value: yyS[yypt-0].item.(ast.ExprNode), IsGlobal: true, IsSystem: true} - } - case 628: - { - yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].item.(string), Value: yyS[yypt-0].item.(ast.ExprNode), IsSystem: true} - } - case 629: - { - yyVAL.item = &ast.VariableAssignment{Name: yyS[yypt-2].item.(string), Value: yyS[yypt-0].item.(ast.ExprNode), IsSystem: true} - } - case 630: - { - v := strings.ToLower(yyS[yypt-2].item.(string)) - var isGlobal bool - if strings.HasPrefix(v, "@@global.") { - isGlobal = true - v = strings.TrimPrefix(v, "@@global.") - } else if strings.HasPrefix(v, "@@session.") { - v = strings.TrimPrefix(v, "@@session.") - } else if strings.HasPrefix(v, "@@local.") { - v = strings.TrimPrefix(v, "@@local.") - } else if strings.HasPrefix(v, "@@") { - v = strings.TrimPrefix(v, "@@") - } - yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].item.(ast.ExprNode), IsGlobal: isGlobal, IsSystem: true} - } - case 631: - { - v := yyS[yypt-2].item.(string) - v = strings.TrimPrefix(v, "@") - yyVAL.item = &ast.VariableAssignment{Name: v, Value: yyS[yypt-0].item.(ast.ExprNode)} - } - case 632: - { - yyVAL.item = []*ast.VariableAssignment{} - } - case 633: - { - yyVAL.item = []*ast.VariableAssignment{yyS[yypt-0].item.(*ast.VariableAssignment)} - } - case 634: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.VariableAssignment), yyS[yypt-0].item.(*ast.VariableAssignment)) - } - case 637: - { - v := strings.ToLower(yyS[yypt-0].item.(string)) - var isGlobal bool - if strings.HasPrefix(v, "@@global.") { - isGlobal = true - v = strings.TrimPrefix(v, "@@global.") - } else if strings.HasPrefix(v, "@@session.") { - v = strings.TrimPrefix(v, "@@session.") - } else if strings.HasPrefix(v, "@@local.") { - v = strings.TrimPrefix(v, "@@local.") - } else if strings.HasPrefix(v, "@@") { - v = strings.TrimPrefix(v, "@@") - } - yyVAL.item = &ast.VariableExpr{Name: v, IsGlobal: isGlobal, IsSystem: true} - } - case 638: - { - v := yyS[yypt-0].item.(string) - v = strings.TrimPrefix(v, "@") - yyVAL.item = &ast.VariableExpr{Name: v, IsGlobal: false, IsSystem: false} - } - case 639: - { - yyVAL.item = yyS[yypt-2].item.(string) + "@" + yyS[yypt-0].item.(string) - } - case 640: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 641: - { - yyVAL.item = yyS[yypt-1].item.(string) - } - case 642: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 643: - { - yyVAL.item = &ast.AdminStmt{Tp: ast.AdminShowDDL} - } - case 644: - { - yyVAL.item = &ast.AdminStmt{ - Tp: ast.AdminCheckTable, - Tables: yyS[yypt-0].item.([]*ast.TableName), - } - } - case 645: - { - stmt := yyS[yypt-1].item.(*ast.ShowStmt) - if yyS[yypt-0].item != nil { - if x, ok := yyS[yypt-0].item.(*ast.PatternLikeExpr); ok { - stmt.Pattern = x - } else { - stmt.Where = yyS[yypt-0].item.(ast.ExprNode) - } - } - yyVAL.item = stmt - } - case 646: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowCreateTable, - Table: yyS[yypt-0].item.(*ast.TableName), - } - } - case 647: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/show-grants.html - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowGrants} - } - case 648: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/show-grants.html - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowGrants, - User: yyS[yypt-0].item.(string), - } - } - case 649: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowIndex, - Table: yyS[yypt-0].item.(*ast.TableName), - } - } - case 650: - { - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowEngines} - } - case 651: - { - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} - } - case 652: - { - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowDatabases} - } - case 653: - { - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowCharset} - } - case 654: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowTables, - DBName: yyS[yypt-0].item.(string), - Full: yyS[yypt-2].item.(bool), - } - } - case 655: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowTableStatus, - DBName: yyS[yypt-0].item.(string), - } - } - case 656: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowColumns, - Table: yyS[yypt-1].item.(*ast.TableName), - DBName: yyS[yypt-0].item.(string), - Full: yyS[yypt-3].item.(bool), - } - } - case 657: - { - // SHOW FIELDS is a synonym for SHOW COLUMNS. - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowColumns, - Table: yyS[yypt-1].item.(*ast.TableName), - DBName: yyS[yypt-0].item.(string), - Full: yyS[yypt-3].item.(bool), - } - } - case 658: - { - yyVAL.item = &ast.ShowStmt{Tp: ast.ShowWarnings} - } - case 659: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowVariables, - GlobalScope: yyS[yypt-1].item.(bool), - } - } - case 660: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowStatus, - GlobalScope: yyS[yypt-1].item.(bool), - } - } - case 661: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowCollation, - } - } - case 662: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowTriggers, - DBName: yyS[yypt-0].item.(string), - } - } - case 663: - { - yyVAL.item = &ast.ShowStmt{ - Tp: ast.ShowProcedureStatus, - } - } - case 664: - { - yyVAL.item = nil - } - case 665: - { - yyVAL.item = &ast.PatternLikeExpr{Pattern: yyS[yypt-0].item.(ast.ExprNode)} - } - case 666: - { - yyVAL.item = yyS[yypt-0].item.(ast.ExprNode) - } - case 667: - { - yyVAL.item = false - } - case 668: - { - yyVAL.item = true - } - case 669: - { - yyVAL.item = false - } - case 670: - { - yyVAL.item = false - } - case 671: - { - yyVAL.item = true - } - case 672: - { - yyVAL.item = "" - } - case 673: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 674: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 675: - { - yyVAL.item = yyS[yypt-0].item.(*ast.TableName) - } - case 676: - { - yyVAL.item = yyS[yypt-0].item.(*ast.TableName) - } - case 706: - { - // `(select 1)`; is a valid select statement - // TODO: This is used to fix issue #320. There may be a better solution. - yyVAL.item = yyS[yypt-0].item.(*ast.SubqueryExpr).Query - } - case 714: - { - if yyS[yypt-0].item != nil { - s := yyS[yypt-0].item.(ast.StmtNode) - s.SetText(yylex.(*lexer).stmtText()) - yylex.(*lexer).list = append(yylex.(*lexer).list, s) - } - } - case 715: - { - if yyS[yypt-0].item != nil { - s := yyS[yypt-0].item.(ast.StmtNode) - s.SetText(yylex.(*lexer).stmtText()) - yylex.(*lexer).list = append(yylex.(*lexer).list, s) - } - } - case 716: - { - cst := yyS[yypt-0].item.(*ast.Constraint) - if yyS[yypt-1].item != nil { - cst.Name = yyS[yypt-1].item.(string) - } - yyVAL.item = cst - } - case 717: - { - yyVAL.item = yyS[yypt-0].item.(*ast.ColumnDef) - } - case 718: - { - yyVAL.item = yyS[yypt-0].item.(*ast.Constraint) - } - case 719: - { - /* Nothing to do now */ - yyVAL.item = nil - } - case 720: - { - if yyS[yypt-0].item != nil { - yyVAL.item = []interface{}{yyS[yypt-0].item.(interface{})} - } else { - yyVAL.item = []interface{}{} - } - } - case 721: - { - if yyS[yypt-0].item != nil { - yyVAL.item = append(yyS[yypt-2].item.([]interface{}), yyS[yypt-0].item) - } else { - yyVAL.item = yyS[yypt-2].item - } - } - case 722: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} - } - case 723: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionEngine, StrValue: yyS[yypt-0].item.(string)} - } - case 724: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCharset, StrValue: yyS[yypt-0].item.(string)} - } - case 725: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCollate, StrValue: yyS[yypt-0].item.(string)} - } - case 726: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAutoIncrement, UintValue: yyS[yypt-0].item.(uint64)} - } - case 727: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionComment, StrValue: yyS[yypt-0].item.(string)} - } - case 728: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionAvgRowLength, UintValue: yyS[yypt-0].item.(uint64)} - } - case 729: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionConnection, StrValue: yyS[yypt-0].item.(string)} - } - case 730: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCheckSum, UintValue: yyS[yypt-0].item.(uint64)} - } - case 731: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionPassword, StrValue: yyS[yypt-0].item.(string)} - } - case 732: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionCompression, StrValue: yyS[yypt-0].item.(string)} - } - case 733: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionKeyBlockSize, UintValue: yyS[yypt-0].item.(uint64)} - } - case 734: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMaxRows, UintValue: yyS[yypt-0].item.(uint64)} - } - case 735: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionMinRows, UintValue: yyS[yypt-0].item.(uint64)} - } - case 736: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionDelayKeyWrite, UintValue: yyS[yypt-0].item.(uint64)} - } - case 737: - { - yyVAL.item = &ast.TableOption{Tp: ast.TableOptionRowFormat, UintValue: yyS[yypt-0].item.(uint64)} - } - case 738: - { - yyVAL.item = []*ast.TableOption{} - } - case 740: - { - yyVAL.item = []*ast.TableOption{yyS[yypt-0].item.(*ast.TableOption)} - } - case 741: - { - yyVAL.item = append(yyS[yypt-1].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) - } - case 742: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.TableOption), yyS[yypt-0].item.(*ast.TableOption)) - } - case 743: - { - yyVAL.item = &ast.TruncateTableStmt{Table: yyS[yypt-0].item.(*ast.TableName)} - } - case 744: - { - yyVAL.item = ast.RowFormatDefault - } - case 745: - { - yyVAL.item = ast.RowFormatDynamic - } - case 746: - { - yyVAL.item = ast.RowFormatFixed - } - case 747: - { - yyVAL.item = ast.RowFormatCompressed - } - case 748: - { - yyVAL.item = ast.RowFormatRedundant - } - case 749: - { - yyVAL.item = ast.RowFormatCompact - } - case 750: - { - yyVAL.item = yyS[yypt-0].item - } - case 751: - { - yyVAL.item = yyS[yypt-0].item - } - case 752: - { - yyVAL.item = yyS[yypt-0].item - } - case 753: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 754: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 755: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 756: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 757: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 758: - { - x := types.NewFieldType(yyS[yypt-0].item.(byte)) - yyVAL.item = x - } - case 759: - { - // TODO: check flen 0 - x := types.NewFieldType(yyS[yypt-2].item.(byte)) - x.Flen = yyS[yypt-1].item.(int) - for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { - if o.IsUnsigned { - x.Flag |= mysql.UnsignedFlag - } - if o.IsZerofill { - x.Flag |= mysql.ZerofillFlag - } - } - yyVAL.item = x - } - case 760: - { - fopt := yyS[yypt-1].item.(*ast.FloatOpt) - x := types.NewFieldType(yyS[yypt-2].item.(byte)) - x.Flen = fopt.Flen - x.Decimal = fopt.Decimal - for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { - if o.IsUnsigned { - x.Flag |= mysql.UnsignedFlag - } - if o.IsZerofill { - x.Flag |= mysql.ZerofillFlag - } - } - yyVAL.item = x - } - case 761: - { - fopt := yyS[yypt-1].item.(*ast.FloatOpt) - x := types.NewFieldType(yyS[yypt-2].item.(byte)) - x.Flen = fopt.Flen - if x.Tp == mysql.TypeFloat { - // Fix issue #312 - if x.Flen > 53 { - yylex.(*lexer).errf("Float len(%d) should not be greater than 53", x.Flen) - return 1 - } - if x.Flen > 24 { - x.Tp = mysql.TypeDouble - } - } - x.Decimal = fopt.Decimal - for _, o := range yyS[yypt-0].item.([]*ast.TypeOpt) { - if o.IsUnsigned { - x.Flag |= mysql.UnsignedFlag - } - if o.IsZerofill { - x.Flag |= mysql.ZerofillFlag - } - } - yyVAL.item = x - } - case 762: - { - x := types.NewFieldType(yyS[yypt-1].item.(byte)) - x.Flen = yyS[yypt-0].item.(int) - if x.Flen == -1 || x.Flen == 0 { - x.Flen = 1 - } else if x.Flen > 64 { - yylex.(*lexer).errf("invalid field length %d for bit type, must in [1, 64]", x.Flen) - } - yyVAL.item = x - } - case 763: - { - yyVAL.item = mysql.TypeTiny - } - case 764: - { - yyVAL.item = mysql.TypeShort - } - case 765: - { - yyVAL.item = mysql.TypeInt24 - } - case 766: - { - yyVAL.item = mysql.TypeLong - } - case 767: - { - yyVAL.item = mysql.TypeLong - } - case 768: - { - yyVAL.item = mysql.TypeLonglong - } - case 769: - { - yyVAL.item = mysql.TypeTiny - } - case 770: - { - yyVAL.item = mysql.TypeTiny - } - case 773: - { - yyVAL.item = mysql.TypeNewDecimal - } - case 774: - { - yyVAL.item = mysql.TypeNewDecimal - } - case 775: - { - yyVAL.item = mysql.TypeFloat - } - case 776: - { - yyVAL.item = mysql.TypeDouble - } - case 777: - { - yyVAL.item = mysql.TypeDouble - } - case 778: - { - yyVAL.item = mysql.TypeDouble - } - case 779: - { - yyVAL.item = mysql.TypeBit - } - case 780: - { - x := types.NewFieldType(mysql.TypeString) - x.Flen = yyS[yypt-3].item.(int) - if yyS[yypt-2].item.(bool) { - x.Flag |= mysql.BinaryFlag - } - yyVAL.item = x - } - case 781: - { - x := types.NewFieldType(mysql.TypeString) - if yyS[yypt-2].item.(bool) { - x.Flag |= mysql.BinaryFlag - } - yyVAL.item = x - } - case 782: - { - x := types.NewFieldType(mysql.TypeVarchar) - x.Flen = yyS[yypt-3].item.(int) - if yyS[yypt-2].item.(bool) { - x.Flag |= mysql.BinaryFlag - } - x.Charset = yyS[yypt-1].item.(string) - x.Collate = yyS[yypt-0].item.(string) - yyVAL.item = x - } - case 783: - { - x := types.NewFieldType(mysql.TypeString) - x.Flen = yyS[yypt-0].item.(int) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 784: - { - x := types.NewFieldType(mysql.TypeVarchar) - x.Flen = yyS[yypt-0].item.(int) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 785: - { - yyVAL.item = yyS[yypt-0].item.(*types.FieldType) - } - case 786: - { - x := yyS[yypt-3].item.(*types.FieldType) - if yyS[yypt-2].item.(bool) { - x.Flag |= mysql.BinaryFlag - } - x.Charset = yyS[yypt-1].item.(string) - x.Collate = yyS[yypt-0].item.(string) - yyVAL.item = x - } - case 787: - { - x := types.NewFieldType(mysql.TypeEnum) - x.Elems = yyS[yypt-3].item.([]string) - x.Charset = yyS[yypt-1].item.(string) - x.Collate = yyS[yypt-0].item.(string) - yyVAL.item = x - } - case 788: - { - x := types.NewFieldType(mysql.TypeSet) - x.Elems = yyS[yypt-3].item.([]string) - x.Charset = yyS[yypt-1].item.(string) - x.Collate = yyS[yypt-0].item.(string) - yyVAL.item = x - } - case 791: - { - x := types.NewFieldType(mysql.TypeTinyBlob) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 792: - { - x := types.NewFieldType(mysql.TypeBlob) - x.Flen = yyS[yypt-0].item.(int) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 793: - { - x := types.NewFieldType(mysql.TypeMediumBlob) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 794: - { - x := types.NewFieldType(mysql.TypeLongBlob) - x.Charset = charset.CharsetBin - x.Collate = charset.CharsetBin - yyVAL.item = x - } - case 795: - { - x := types.NewFieldType(mysql.TypeTinyBlob) - yyVAL.item = x - - } - case 796: - { - x := types.NewFieldType(mysql.TypeBlob) - x.Flen = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 797: - { - x := types.NewFieldType(mysql.TypeMediumBlob) - yyVAL.item = x - } - case 798: - { - x := types.NewFieldType(mysql.TypeLongBlob) - yyVAL.item = x - } - case 799: - { - x := types.NewFieldType(mysql.TypeDate) - yyVAL.item = x - } - case 800: - { - x := types.NewFieldType(mysql.TypeDatetime) - x.Decimal = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 801: - { - x := types.NewFieldType(mysql.TypeTimestamp) - x.Decimal = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 802: - { - x := types.NewFieldType(mysql.TypeDuration) - x.Decimal = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 803: - { - x := types.NewFieldType(mysql.TypeYear) - x.Flen = yyS[yypt-0].item.(int) - yyVAL.item = x - } - case 804: - { - yyVAL.item = int(yyS[yypt-1].item.(uint64)) - } - case 805: - { - /* -1 means unspecified field length*/ - yyVAL.item = types.UnspecifiedLength - } - case 806: - { - yyVAL.item = yyS[yypt-0].item.(int) - } - case 807: - { - yyVAL.item = &ast.TypeOpt{IsUnsigned: true} - } - case 808: - { - yyVAL.item = &ast.TypeOpt{IsZerofill: true, IsUnsigned: true} - } - case 809: - { - yyVAL.item = []*ast.TypeOpt{} - } - case 810: - { - yyVAL.item = append(yyS[yypt-1].item.([]*ast.TypeOpt), yyS[yypt-0].item.(*ast.TypeOpt)) - } - case 811: - { - yyVAL.item = &ast.FloatOpt{Flen: types.UnspecifiedLength, Decimal: types.UnspecifiedLength} - } - case 812: - { - yyVAL.item = &ast.FloatOpt{Flen: yyS[yypt-0].item.(int), Decimal: types.UnspecifiedLength} - } - case 813: - { - yyVAL.item = yyS[yypt-0].item.(*ast.FloatOpt) - } - case 814: - { - yyVAL.item = &ast.FloatOpt{Flen: int(yyS[yypt-3].item.(uint64)), Decimal: int(yyS[yypt-1].item.(uint64))} - } - case 815: - { - yyVAL.item = false - } - case 816: - { - yyVAL.item = true - } - case 817: - { - yyVAL.item = "" - } - case 818: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 821: - { - yyVAL.item = "" - } - case 822: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 823: - { - yyVAL.item = []string{yyS[yypt-0].item.(string)} - } - case 824: - { - yyVAL.item = append(yyS[yypt-2].item.([]string), yyS[yypt-0].item.(string)) - } - case 825: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 826: - { - yyVAL.item = yyS[yypt-0].item.(string) - } - case 827: - { - var refs *ast.Join - if x, ok := yyS[yypt-5].item.(*ast.Join); ok { - refs = x - } else { - refs = &ast.Join{Left: yyS[yypt-5].item.(ast.ResultSetNode)} - } - st := &ast.UpdateStmt{ - LowPriority: yyS[yypt-7].item.(bool), - TableRefs: &ast.TableRefsClause{TableRefs: refs}, - List: yyS[yypt-3].item.([]*ast.Assignment), - } - if yyS[yypt-2].item != nil { - st.Where = yyS[yypt-2].item.(ast.ExprNode) - } - if yyS[yypt-1].item != nil { - st.Order = yyS[yypt-1].item.(*ast.OrderByClause) - } - if yyS[yypt-0].item != nil { - st.Limit = yyS[yypt-0].item.(*ast.Limit) - } - yyVAL.item = st - if yylex.(*lexer).root { - break - } - } - case 828: - { - st := &ast.UpdateStmt{ - LowPriority: yyS[yypt-5].item.(bool), - TableRefs: &ast.TableRefsClause{TableRefs: yyS[yypt-3].item.(*ast.Join)}, - List: yyS[yypt-1].item.([]*ast.Assignment), - } - if yyS[yypt-0].item != nil { - st.Where = yyS[yypt-0].item.(ast.ExprNode) - } - yyVAL.item = st - if yylex.(*lexer).root { - break - } - } - case 829: - { - yyVAL.item = &ast.UseStmt{DBName: yyS[yypt-0].item.(string)} - if yylex.(*lexer).root { - break - } - } - case 830: - { - yyVAL.item = yyS[yypt-0].item.(ast.ExprNode) - } - case 831: - { - yyVAL.item = nil - } - case 832: - { - yyVAL.item = yyS[yypt-0].item - } - case 835: - { - // See: https://dev.mysql.com/doc/refman/5.7/en/create-user.html - yyVAL.item = &ast.CreateUserStmt{ - IfNotExists: yyS[yypt-1].item.(bool), - Specs: yyS[yypt-0].item.([]*ast.UserSpec), - } - } - case 836: - { - userSpec := &ast.UserSpec{ - User: yyS[yypt-1].item.(string), - } - if yyS[yypt-0].item != nil { - userSpec.AuthOpt = yyS[yypt-0].item.(*ast.AuthOption) - } - yyVAL.item = userSpec - } - case 837: - { - yyVAL.item = []*ast.UserSpec{yyS[yypt-0].item.(*ast.UserSpec)} - } - case 838: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.UserSpec), yyS[yypt-0].item.(*ast.UserSpec)) - } - case 839: - { - yyVAL.item = nil - } - case 840: - { - yyVAL.item = &ast.AuthOption{ - AuthString: yyS[yypt-0].item.(string), - ByAuthString: true, - } - } - case 841: - { - yyVAL.item = &ast.AuthOption{ - HashString: yyS[yypt-0].item.(string), - } - } - case 843: - { - yyVAL.item = &ast.GrantStmt{ - Privs: yyS[yypt-5].item.([]*ast.PrivElem), - ObjectType: yyS[yypt-3].item.(ast.ObjectTypeType), - Level: yyS[yypt-2].item.(*ast.GrantLevel), - Users: yyS[yypt-0].item.([]*ast.UserSpec), - } - } - case 844: - { - yyVAL.item = &ast.PrivElem{ - Priv: yyS[yypt-0].item.(mysql.PrivilegeType), - } - } - case 845: - { - yyVAL.item = &ast.PrivElem{ - Priv: yyS[yypt-3].item.(mysql.PrivilegeType), - Cols: yyS[yypt-1].item.([]*ast.ColumnName), - } - } - case 846: - { - yyVAL.item = []*ast.PrivElem{yyS[yypt-0].item.(*ast.PrivElem)} - } - case 847: - { - yyVAL.item = append(yyS[yypt-2].item.([]*ast.PrivElem), yyS[yypt-0].item.(*ast.PrivElem)) - } - case 848: - { - yyVAL.item = mysql.AllPriv - } - case 849: - { - yyVAL.item = mysql.AlterPriv - } - case 850: - { - yyVAL.item = mysql.CreatePriv - } - case 851: - { - yyVAL.item = mysql.CreateUserPriv - } - case 852: - { - yyVAL.item = mysql.DeletePriv - } - case 853: - { - yyVAL.item = mysql.DropPriv - } - case 854: - { - yyVAL.item = mysql.ExecutePriv - } - case 855: - { - yyVAL.item = mysql.IndexPriv - } - case 856: - { - yyVAL.item = mysql.InsertPriv - } - case 857: - { - yyVAL.item = mysql.SelectPriv - } - case 858: - { - yyVAL.item = mysql.ShowDBPriv - } - case 859: - { - yyVAL.item = mysql.UpdatePriv - } - case 860: - { - yyVAL.item = mysql.GrantPriv - } - case 861: - { - yyVAL.item = ast.ObjectTypeNone - } - case 862: - { - yyVAL.item = ast.ObjectTypeTable - } - case 863: - { - yyVAL.item = &ast.GrantLevel{ - Level: ast.GrantLevelDB, - } - } - case 864: - { - yyVAL.item = &ast.GrantLevel{ - Level: ast.GrantLevelGlobal, - } - } - case 865: - { - yyVAL.item = &ast.GrantLevel{ - Level: ast.GrantLevelDB, - DBName: yyS[yypt-2].item.(string), - } - } - case 866: - { - yyVAL.item = &ast.GrantLevel{ - Level: ast.GrantLevelTable, - DBName: yyS[yypt-2].item.(string), - TableName: yyS[yypt-0].item.(string), - } - } - case 867: - { - yyVAL.item = &ast.GrantLevel{ - Level: ast.GrantLevelTable, - TableName: yyS[yypt-0].item.(string), - } - } - - } - - if yyEx != nil && yyEx.Reduced(r, exState, &yyVAL) { - return -1 - } - goto yystack /* stack new state and value */ -} diff --git a/vendor/github.com/pingcap/tidb/parser/scanner.go b/vendor/github.com/pingcap/tidb/parser/scanner.go deleted file mode 100644 index 5f952c29b5d6..000000000000 --- a/vendor/github.com/pingcap/tidb/parser/scanner.go +++ /dev/null @@ -1,15707 +0,0 @@ -// Code generated by goyacc -// CAUTION: Generated file - DO NOT EDIT. - -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "fmt" - "math" - "strconv" - "strings" - "unicode" - - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/stringutil" -) - -type lexer struct { - c int - col int - errs []error - expr ast.ExprNode - i int - inj int - lcol int - line int - list []ast.StmtNode - ncol int - nline int - sc int - src string - val []byte - ungetBuf []byte - root bool - prepare bool - stmtStartPos int - stringLit []byte - - // record token's offset of the input - tokenEndOffset int - tokenStartOffset int - - // Charset information - charset string - collation string -} - -// NewLexer builds a new lexer. -func NewLexer(src string) (l *lexer) { - l = &lexer{ - src: src, - nline: 1, - ncol: 0, - } - l.next() - return -} - -func (l *lexer) Errors() []error { - return l.errs -} - -func (l *lexer) Stmts() []ast.StmtNode { - return l.list -} - -func (l *lexer) Expr() ast.ExprNode { - return l.expr -} - -func (l *lexer) Inj() int { - return l.inj -} - -func (l *lexer) SetInj(inj int) { - l.inj = inj -} - -func (l *lexer) SetPrepare() { - l.prepare = true -} - -func (l *lexer) IsPrepare() bool { - return l.prepare -} - -func (l *lexer) Root() bool { - return l.root -} - -func (l *lexer) SetRoot(root bool) { - l.root = root -} - -func (l *lexer) SetCharsetInfo(charset, collation string) { - l.charset = charset - l.collation = collation -} - -func (l *lexer) GetCharsetInfo() (string, string) { - return l.charset, l.collation -} - -// The select statement is not at the end of the whole statement, if the last -// field text was set from its offset to the end of the src string, update -// the last field text. -func (l *lexer) SetLastSelectFieldText(st *ast.SelectStmt, lastEnd int) { - lastField := st.Fields.Fields[len(st.Fields.Fields)-1] - if lastField.Offset+len(lastField.Text()) >= len(l.src)-1 { - lastField.SetText(l.src[lastField.Offset:lastEnd]) - } -} - -func (l *lexer) startOffset(offset int) int { - offset-- - for unicode.IsSpace(rune(l.src[offset])) { - offset++ - } - return offset -} - -func (l *lexer) endOffset(offset int) int { - offset-- - for offset > 0 && unicode.IsSpace(rune(l.src[offset-1])) { - offset-- - } - return offset -} - -func (l *lexer) unget(b byte) { - l.ungetBuf = append(l.ungetBuf, b) - l.i-- - l.ncol-- - l.tokenEndOffset-- -} - -func (l *lexer) next() int { - if un := len(l.ungetBuf); un > 0 { - nc := l.ungetBuf[0] - l.ungetBuf = l.ungetBuf[1:] - l.c = int(nc) - return l.c - } - - if l.c != 0 { - l.val = append(l.val, byte(l.c)) - } - l.c = 0 - if l.i < len(l.src) { - l.c = int(l.src[l.i]) - l.i++ - } - switch l.c { - case '\n': - l.lcol = l.ncol - l.nline++ - l.ncol = 0 - default: - l.ncol++ - } - l.tokenEndOffset++ - return l.c -} - -func (l *lexer) err0(ln, c int, arg interface{}) { - var argStr string - if arg != nil { - argStr = fmt.Sprintf(" %v", arg) - } - - err := fmt.Errorf("line %d column %d near \"%s\"%s", ln, c, l.val, argStr) - l.errs = append(l.errs, err) -} - -func (l *lexer) err(arg interface{}) { - l.err0(l.line, l.col, arg) -} - -func (l *lexer) errf(format string, args ...interface{}) { - s := fmt.Sprintf(format, args...) - l.err0(l.line, l.col, s) -} - -func (l *lexer) Error(s string) { - // Notice: ignore origin error info. - l.err(nil) -} - -func (l *lexer) stmtText() string { - endPos := l.i - if l.src[l.i-1] == '\n' { - endPos = l.i - 1 // trim new line - } - if l.src[l.stmtStartPos] == '\n' { - l.stmtStartPos++ - } - - text := l.src[l.stmtStartPos:endPos] - - l.stmtStartPos = l.i - return text -} - -func (l *lexer) Lex(lval *yySymType) (r int) { - defer func() { - lval.line, lval.col, lval.offset = l.line, l.col, l.tokenStartOffset - l.tokenStartOffset = l.tokenEndOffset - }() - const ( - INITIAL = iota - S1 - S2 - S3 - S4 - ) - - if n := l.inj; n != 0 { - l.inj = 0 - return n - } - - c0, c := 0, l.c - -yystate0: - - l.val = l.val[:0] - c0, l.line, l.col = l.c, l.nline, l.ncol - - switch yyt := l.sc; yyt { - default: - panic(fmt.Errorf(`invalid start condition %d`, yyt)) - case 0: // start condition: INITIAL - goto yystart1 - case 1: // start condition: S1 - goto yystart1254 - case 2: // start condition: S2 - goto yystart1260 - case 3: // start condition: S3 - goto yystart1266 - case 4: // start condition: S4 - goto yystart1269 - } - - goto yystate0 // silence unused label error - goto yystate1 // silence unused label error -yystate1: - c = l.next() -yystart1: - switch { - default: - goto yystate3 // c >= '\x01' && c <= '\b' || c == '\v' || c == '\f' || c >= '\x0e' && c <= '\x1f' || c == '$' || c == '%%' || c >= '(' && c <= ',' || c == ':' || c == ';' || c >= '[' && c <= '^' || c == '{' || c >= '}' && c <= 'ÿ' - case c == '!': - goto yystate6 - case c == '"': - goto yystate8 - case c == '#': - goto yystate9 - case c == '&': - goto yystate11 - case c == '-': - goto yystate15 - case c == '.': - goto yystate17 - case c == '/': - goto yystate22 - case c == '0': - goto yystate27 - case c == '<': - goto yystate36 - case c == '=': - goto yystate41 - case c == '>': - goto yystate42 - case c == '?': - goto yystate45 - case c == '@': - goto yystate46 - case c == 'A' || c == 'a': - goto yystate65 - case c == 'B' || c == 'b': - goto yystate118 - case c == 'C' || c == 'c': - goto yystate159 - case c == 'D' || c == 'd': - goto yystate294 - case c == 'E' || c == 'e': - goto yystate438 - case c == 'F' || c == 'f': - goto yystate476 - case c == 'G' || c == 'g': - goto yystate520 - case c == 'H' || c == 'h': - goto yystate541 - case c == 'I' || c == 'i': - goto yystate586 - case c == 'J' || c == 'j': - goto yystate635 - case c == 'K' || c == 'k': - goto yystate639 - case c == 'L' || c == 'l': - goto yystate653 - case c == 'M' || c == 'm': - goto yystate713 - case c == 'N' || c == 'n': - goto yystate780 - case c == 'O' || c == 'o': - goto yystate804 - case c == 'P' || c == 'p': - goto yystate826 - case c == 'Q' || c == 'q': - goto yystate862 - case c == 'R': - goto yystate872 - case c == 'S' || c == 's': - goto yystate927 - case c == 'T' || c == 't': - goto yystate1046 - case c == 'U' || c == 'u': - goto yystate1109 - case c == 'V' || c == 'v': - goto yystate1155 - case c == 'W' || c == 'w': - goto yystate1184 - case c == 'X' || c == 'x': - goto yystate1213 - case c == 'Y' || c == 'y': - goto yystate1219 - case c == 'Z' || c == 'z': - goto yystate1233 - case c == '\'': - goto yystate14 - case c == '\n': - goto yystate5 - case c == '\t' || c == '\r' || c == ' ': - goto yystate4 - case c == '\x00': - goto yystate2 - case c == '_': - goto yystate1241 - case c == '`': - goto yystate1242 - case c == 'r': - goto yystate1243 - case c == '|': - goto yystate1252 - case c >= '1' && c <= '9': - goto yystate34 - } - -yystate2: - c = l.next() - goto yyrule1 - -yystate3: - c = l.next() - goto yyrule319 - -yystate4: - c = l.next() - switch { - default: - goto yyrule2 - case c == '\t' || c == '\n' || c == '\r' || c == ' ': - goto yystate5 - } - -yystate5: - c = l.next() - switch { - default: - goto yyrule2 - case c == '\t' || c == '\n' || c == '\r' || c == ' ': - goto yystate5 - } - -yystate6: - c = l.next() - switch { - default: - goto yyrule319 - case c == '=': - goto yystate7 - } - -yystate7: - c = l.next() - goto yyrule33 - -yystate8: - c = l.next() - goto yyrule13 - -yystate9: - c = l.next() - switch { - default: - goto yyrule3 - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate10 - } - -yystate10: - c = l.next() - switch { - default: - goto yyrule3 - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate10 - } - -yystate11: - c = l.next() - switch { - default: - goto yyrule319 - case c == '&': - goto yystate12 - case c == '^': - goto yystate13 - } - -yystate12: - c = l.next() - goto yyrule27 - -yystate13: - c = l.next() - goto yyrule28 - -yystate14: - c = l.next() - goto yyrule14 - -yystate15: - c = l.next() - switch { - default: - goto yyrule319 - case c == '-': - goto yystate16 - } - -yystate16: - c = l.next() - goto yyrule6 - -yystate17: - c = l.next() - switch { - default: - goto yyrule319 - case c >= '0' && c <= '9': - goto yystate18 - } - -yystate18: - c = l.next() - switch { - default: - goto yyrule10 - case c == 'E' || c == 'e': - goto yystate19 - case c >= '0' && c <= '9': - goto yystate18 - } - -yystate19: - c = l.next() - switch { - default: - goto yyabort - case c == '+' || c == '-': - goto yystate20 - case c >= '0' && c <= '9': - goto yystate21 - } - -yystate20: - c = l.next() - switch { - default: - goto yyabort - case c >= '0' && c <= '9': - goto yystate21 - } - -yystate21: - c = l.next() - switch { - default: - goto yyrule10 - case c >= '0' && c <= '9': - goto yystate21 - } - -yystate22: - c = l.next() - switch { - default: - goto yyrule319 - case c == '*': - goto yystate23 - case c == '/': - goto yystate26 - } - -yystate23: - c = l.next() - switch { - default: - goto yyabort - case c == '*': - goto yystate24 - case c >= '\x01' && c <= ')' || c >= '+' && c <= 'ÿ': - goto yystate23 - } - -yystate24: - c = l.next() - switch { - default: - goto yyabort - case c == '*': - goto yystate24 - case c == '/': - goto yystate25 - case c >= '\x01' && c <= ')' || c >= '+' && c <= '.' || c >= '0' && c <= 'ÿ': - goto yystate23 - } - -yystate25: - c = l.next() - goto yyrule5 - -yystate26: - c = l.next() - switch { - default: - goto yyrule4 - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate26 - } - -yystate27: - c = l.next() - switch { - default: - goto yyrule9 - case c == '.': - goto yystate18 - case c == '8' || c == '9': - goto yystate29 - case c == 'B' || c == 'b': - goto yystate30 - case c == 'E' || c == 'e': - goto yystate19 - case c == 'X' || c == 'x': - goto yystate32 - case c >= '0' && c <= '7': - goto yystate28 - } - -yystate28: - c = l.next() - switch { - default: - goto yyrule9 - case c == '.': - goto yystate18 - case c == '8' || c == '9': - goto yystate29 - case c == 'E' || c == 'e': - goto yystate19 - case c >= '0' && c <= '7': - goto yystate28 - } - -yystate29: - c = l.next() - switch { - default: - goto yyabort - case c == '.': - goto yystate18 - case c == 'E' || c == 'e': - goto yystate19 - case c >= '0' && c <= '9': - goto yystate29 - } - -yystate30: - c = l.next() - switch { - default: - goto yyabort - case c == '0' || c == '1': - goto yystate31 - } - -yystate31: - c = l.next() - switch { - default: - goto yyrule12 - case c == '0' || c == '1': - goto yystate31 - } - -yystate32: - c = l.next() - switch { - default: - goto yyabort - case c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f': - goto yystate33 - } - -yystate33: - c = l.next() - switch { - default: - goto yyrule11 - case c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f': - goto yystate33 - } - -yystate34: - c = l.next() - switch { - default: - goto yyrule9 - case c == '.': - goto yystate18 - case c == 'E' || c == 'e': - goto yystate19 - case c >= '0' && c <= '9': - goto yystate35 - } - -yystate35: - c = l.next() - switch { - default: - goto yyrule9 - case c == '.': - goto yystate18 - case c == 'E' || c == 'e': - goto yystate19 - case c >= '0' && c <= '9': - goto yystate35 - } - -yystate36: - c = l.next() - switch { - default: - goto yyrule319 - case c == '<': - goto yystate37 - case c == '=': - goto yystate38 - case c == '>': - goto yystate40 - } - -yystate37: - c = l.next() - goto yyrule29 - -yystate38: - c = l.next() - switch { - default: - goto yyrule30 - case c == '>': - goto yystate39 - } - -yystate39: - c = l.next() - goto yyrule37 - -yystate40: - c = l.next() - goto yyrule34 - -yystate41: - c = l.next() - goto yyrule31 - -yystate42: - c = l.next() - switch { - default: - goto yyrule319 - case c == '=': - goto yystate43 - case c == '>': - goto yystate44 - } - -yystate43: - c = l.next() - goto yyrule32 - -yystate44: - c = l.next() - goto yyrule36 - -yystate45: - c = l.next() - goto yyrule39 - -yystate46: - c = l.next() - switch { - default: - goto yyrule38 - case c == '@': - goto yystate47 - case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate64 - } - -yystate47: - c = l.next() - switch { - default: - goto yyabort - case c == 'G' || c == 'g': - goto yystate49 - case c == 'L' || c == 'l': - goto yystate56 - case c == 'S' || c == 's': - goto yystate58 - case c >= 'A' && c <= 'F' || c >= 'H' && c <= 'K' || c >= 'M' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'k' || c >= 'm' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate48 - } - -yystate48: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate48 - } - -yystate49: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate48 - case c == 'L' || c == 'l': - goto yystate50 - } - -yystate50: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate48 - case c == 'O' || c == 'o': - goto yystate51 - } - -yystate51: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate48 - case c == 'B' || c == 'b': - goto yystate52 - } - -yystate52: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate48 - case c == 'A' || c == 'a': - goto yystate53 - } - -yystate53: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate48 - case c == 'L' || c == 'l': - goto yystate54 - } - -yystate54: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate48 - case c == '.': - goto yystate55 - } - -yystate55: - c = l.next() - switch { - default: - goto yyabort - case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate48 - } - -yystate56: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate48 - case c == 'O' || c == 'o': - goto yystate57 - } - -yystate57: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate48 - case c == 'C' || c == 'c': - goto yystate52 - } - -yystate58: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate48 - case c == 'E' || c == 'e': - goto yystate59 - } - -yystate59: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate48 - case c == 'S' || c == 's': - goto yystate60 - } - -yystate60: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate48 - case c == 'S' || c == 's': - goto yystate61 - } - -yystate61: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate48 - case c == 'I' || c == 'i': - goto yystate62 - } - -yystate62: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate48 - case c == 'O' || c == 'o': - goto yystate63 - } - -yystate63: - c = l.next() - switch { - default: - goto yyrule224 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate48 - case c == 'N' || c == 'n': - goto yystate54 - } - -yystate64: - c = l.next() - switch { - default: - goto yyrule225 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate64 - } - -yystate65: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'C' || c == 'E' || c >= 'G' && c <= 'K' || c == 'M' || c >= 'O' && c <= 'R' || c == 'T' || c >= 'W' && c <= 'Z' || c == '_' || c == 'a' || c == 'c' || c == 'e' || c >= 'g' && c <= 'k' || c == 'm' || c >= 'o' && c <= 'r' || c == 't' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate67 - case c == 'D' || c == 'd': - goto yystate69 - case c == 'F' || c == 'f': - goto yystate78 - case c == 'L' || c == 'l': - goto yystate82 - case c == 'N' || c == 'n': - goto yystate87 - case c == 'S' || c == 's': - goto yystate90 - case c == 'U' || c == 'u': - goto yystate92 - case c == 'V' || c == 'v': - goto yystate105 - } - -yystate66: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate67: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate68 - } - -yystate68: - c = l.next() - switch { - default: - goto yyrule40 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate69: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate70 - case c == 'M' || c == 'm': - goto yystate75 - } - -yystate70: - c = l.next() - switch { - default: - goto yyrule41 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate71 - } - -yystate71: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate72 - } - -yystate72: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate73 - } - -yystate73: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate74 - } - -yystate74: - c = l.next() - switch { - default: - goto yyrule42 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate75: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate76 - } - -yystate76: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate77 - } - -yystate77: - c = l.next() - switch { - default: - goto yyrule43 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate78: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate79 - } - -yystate79: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate80 - } - -yystate80: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate81 - } - -yystate81: - c = l.next() - switch { - default: - goto yyrule44 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate82: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate83 - case c == 'T' || c == 't': - goto yystate84 - } - -yystate83: - c = l.next() - switch { - default: - goto yyrule45 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate84: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate85 - } - -yystate85: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate86 - } - -yystate86: - c = l.next() - switch { - default: - goto yyrule46 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate87: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate88 - case c == 'Y' || c == 'y': - goto yystate89 - } - -yystate88: - c = l.next() - switch { - default: - goto yyrule47 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate89: - c = l.next() - switch { - default: - goto yyrule48 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate90: - c = l.next() - switch { - default: - goto yyrule50 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate91 - } - -yystate91: - c = l.next() - switch { - default: - goto yyrule49 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate92: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate93 - } - -yystate93: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate94 - } - -yystate94: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate95 - } - -yystate95: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate96 - } - -yystate96: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate97 - } - -yystate97: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate98 - } - -yystate98: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate99 - } - -yystate99: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate100 - } - -yystate100: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate101 - } - -yystate101: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate102 - } - -yystate102: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate103 - } - -yystate103: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate104 - } - -yystate104: - c = l.next() - switch { - default: - goto yyrule51 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate105: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate106 - } - -yystate106: - c = l.next() - switch { - default: - goto yyrule52 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate107 - } - -yystate107: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate108 - } - -yystate108: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate109 - } - -yystate109: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate110 - } - -yystate110: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate111 - } - -yystate111: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate112 - } - -yystate112: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate113 - } - -yystate113: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate114 - } - -yystate114: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate115 - } - -yystate115: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate116 - } - -yystate116: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate117 - } - -yystate117: - c = l.next() - switch { - default: - goto yyrule53 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate118: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c == 'J' || c == 'K' || c == 'M' || c == 'N' || c >= 'P' && c <= 'S' || c >= 'U' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c == 'j' || c == 'k' || c == 'm' || c == 'n' || c >= 'p' && c <= 's' || c >= 'u' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate122 - case c == 'I' || c == 'i': - goto yystate131 - case c == 'L' || c == 'l': - goto yystate141 - case c == 'O' || c == 'o': - goto yystate144 - case c == 'T' || c == 't': - goto yystate152 - case c == 'Y' || c == 'y': - goto yystate156 - case c == '\'': - goto yystate119 - } - -yystate119: - c = l.next() - switch { - default: - goto yyabort - case c == '0' || c == '1': - goto yystate120 - } - -yystate120: - c = l.next() - switch { - default: - goto yyabort - case c == '0' || c == '1': - goto yystate120 - case c == '\'': - goto yystate121 - } - -yystate121: - c = l.next() - goto yyrule12 - -yystate122: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate123 - case c == 'T' || c == 't': - goto yystate126 - } - -yystate123: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate124 - } - -yystate124: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate125 - } - -yystate125: - c = l.next() - switch { - default: - goto yyrule54 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate126: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate127 - } - -yystate127: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate128 - } - -yystate128: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate129 - } - -yystate129: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate130 - } - -yystate130: - c = l.next() - switch { - default: - goto yyrule55 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate131: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'M' || c >= 'O' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'm' || c >= 'o' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate132 - case c == 'N' || c == 'n': - goto yystate136 - case c == 'T' || c == 't': - goto yystate140 - } - -yystate132: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate133 - } - -yystate133: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate134 - } - -yystate134: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate135 - } - -yystate135: - c = l.next() - switch { - default: - goto yyrule289 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate136: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate137 - } - -yystate137: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate138 - } - -yystate138: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate139 - } - -yystate139: - c = l.next() - switch { - default: - goto yyrule303 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate140: - c = l.next() - switch { - default: - goto yyrule284 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate141: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate142 - } - -yystate142: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate143 - } - -yystate143: - c = l.next() - switch { - default: - goto yyrule306 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate144: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate145 - case c == 'T' || c == 't': - goto yystate150 - } - -yystate145: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate146 - } - -yystate146: - c = l.next() - switch { - default: - goto yyrule313 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate147 - } - -yystate147: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate148 - } - -yystate148: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate149 - } - -yystate149: - c = l.next() - switch { - default: - goto yyrule314 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate150: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate151 - } - -yystate151: - c = l.next() - switch { - default: - goto yyrule56 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate152: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate153 - } - -yystate153: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate154 - } - -yystate154: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate155 - } - -yystate155: - c = l.next() - switch { - default: - goto yyrule57 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate156: - c = l.next() - switch { - default: - goto yyrule58 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate157 - } - -yystate157: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate158 - } - -yystate158: - c = l.next() - switch { - default: - goto yyrule315 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate159: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'G' || c >= 'I' && c <= 'N' || c == 'P' || c == 'Q' || c == 'S' || c == 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'g' || c >= 'i' && c <= 'n' || c == 'p' || c == 'q' || c == 's' || c == 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate160 - case c == 'H' || c == 'h': - goto yystate164 - case c == 'O' || c == 'o': - goto yystate181 - case c == 'R' || c == 'r': - goto yystate254 - case c == 'U' || c == 'u': - goto yystate262 - } - -yystate160: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate161 - } - -yystate161: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate162 - case c == 'T' || c == 't': - goto yystate163 - } - -yystate162: - c = l.next() - switch { - default: - goto yyrule59 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate163: - c = l.next() - switch { - default: - goto yyrule60 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate164: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate165 - case c == 'E' || c == 'e': - goto yystate175 - } - -yystate165: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate166 - } - -yystate166: - c = l.next() - switch { - default: - goto yyrule301 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate167 - case c == 'S' || c == 's': - goto yystate172 - } - -yystate167: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate168 - } - -yystate168: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate169 - } - -yystate169: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate170 - } - -yystate170: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate171 - } - -yystate171: - c = l.next() - switch { - default: - goto yyrule61 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate172: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate173 - } - -yystate173: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate174 - } - -yystate174: - c = l.next() - switch { - default: - goto yyrule62 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate175: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate176 - } - -yystate176: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate177 - } - -yystate177: - c = l.next() - switch { - default: - goto yyrule63 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate178 - } - -yystate178: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate179 - } - -yystate179: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate180 - } - -yystate180: - c = l.next() - switch { - default: - goto yyrule64 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate181: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'K' || c >= 'O' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'k' || c >= 'o' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate182 - case c == 'L' || c == 'l': - goto yystate188 - case c == 'M' || c == 'm': - goto yystate200 - case c == 'N' || c == 'n': - goto yystate223 - case c == 'U' || c == 'u': - goto yystate251 - } - -yystate182: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate183 - } - -yystate183: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate184 - } - -yystate184: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate185 - } - -yystate185: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate186 - } - -yystate186: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate187 - } - -yystate187: - c = l.next() - switch { - default: - goto yyrule65 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate188: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate189 - case c == 'U' || c == 'u': - goto yystate196 - } - -yystate189: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate190 - } - -yystate190: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate191 - } - -yystate191: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate192 - case c == 'I' || c == 'i': - goto yystate193 - } - -yystate192: - c = l.next() - switch { - default: - goto yyrule66 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate193: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate194 - } - -yystate194: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate195 - } - -yystate195: - c = l.next() - switch { - default: - goto yyrule67 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate196: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate197 - } - -yystate197: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate198 - } - -yystate198: - c = l.next() - switch { - default: - goto yyrule68 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate199 - } - -yystate199: - c = l.next() - switch { - default: - goto yyrule69 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate200: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c == 'N' || c == 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c == 'n' || c == 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate201 - case c == 'P' || c == 'p': - goto yystate210 - } - -yystate201: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate202 - case c == 'I' || c == 'i': - goto yystate205 - } - -yystate202: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate203 - } - -yystate203: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate204 - } - -yystate204: - c = l.next() - switch { - default: - goto yyrule70 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate205: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate206 - } - -yystate206: - c = l.next() - switch { - default: - goto yyrule71 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate207 - } - -yystate207: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate208 - } - -yystate208: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate209 - } - -yystate209: - c = l.next() - switch { - default: - goto yyrule72 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate210: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate211 - case c == 'R' || c == 'r': - goto yystate214 - } - -yystate211: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate212 - } - -yystate212: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate213 - } - -yystate213: - c = l.next() - switch { - default: - goto yyrule73 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate214: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate215 - } - -yystate215: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate216 - } - -yystate216: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate217 - } - -yystate217: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate218 - case c == 'I' || c == 'i': - goto yystate220 - } - -yystate218: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate219 - } - -yystate219: - c = l.next() - switch { - default: - goto yyrule74 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate220: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate221 - } - -yystate221: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate222 - } - -yystate222: - c = l.next() - switch { - default: - goto yyrule75 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate223: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'M' || c >= 'O' && c <= 'R' || c == 'T' || c == 'U' || c >= 'W' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'm' || c >= 'o' && c <= 'r' || c == 't' || c == 'u' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate224 - case c == 'N' || c == 'n': - goto yystate230 - case c == 'S' || c == 's': - goto yystate240 - case c == 'V' || c == 'v': - goto yystate247 - } - -yystate224: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate225 - } - -yystate225: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate226 - } - -yystate226: - c = l.next() - switch { - default: - goto yyrule76 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate227 - } - -yystate227: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate228 - } - -yystate228: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate229 - } - -yystate229: - c = l.next() - switch { - default: - goto yyrule77 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate230: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate231 - } - -yystate231: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate232 - } - -yystate232: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate233 - } - -yystate233: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate234 - } - -yystate234: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate235 - } - -yystate235: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate236 - } - -yystate236: - c = l.next() - switch { - default: - goto yyrule78 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate237 - } - -yystate237: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate238 - } - -yystate238: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate239 - } - -yystate239: - c = l.next() - switch { - default: - goto yyrule79 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate240: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate241 - } - -yystate241: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate242 - } - -yystate242: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate243 - } - -yystate243: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate244 - } - -yystate244: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate245 - } - -yystate245: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate246 - } - -yystate246: - c = l.next() - switch { - default: - goto yyrule80 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate247: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate248 - } - -yystate248: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate249 - } - -yystate249: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate250 - } - -yystate250: - c = l.next() - switch { - default: - goto yyrule81 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate251: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate252 - } - -yystate252: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate253 - } - -yystate253: - c = l.next() - switch { - default: - goto yyrule82 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate254: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate255 - case c == 'O' || c == 'o': - goto yystate259 - } - -yystate255: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate256 - } - -yystate256: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate257 - } - -yystate257: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate258 - } - -yystate258: - c = l.next() - switch { - default: - goto yyrule83 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate259: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate260 - } - -yystate260: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate261 - } - -yystate261: - c = l.next() - switch { - default: - goto yyrule84 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate262: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate263 - } - -yystate263: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Q' || c == 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'q' || c == 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate264 - case c == 'R' || c == 'r': - goto yystate268 - case c == 'T' || c == 't': - goto yystate290 - } - -yystate264: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate265 - } - -yystate265: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate266 - } - -yystate266: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate267 - } - -yystate267: - c = l.next() - switch { - default: - goto yyrule85 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate268: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate269 - } - -yystate269: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate270 - } - -yystate270: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate271 - } - -yystate271: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate272 - } - -yystate272: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'S' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 's' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate273 - case c == 'T' || c == 't': - goto yystate277 - case c == 'U' || c == 'u': - goto yystate286 - } - -yystate273: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate274 - } - -yystate274: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate275 - } - -yystate275: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate276 - } - -yystate276: - c = l.next() - switch { - default: - goto yyrule86 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate277: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate278 - } - -yystate278: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate279 - } - -yystate279: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate280 - } - -yystate280: - c = l.next() - switch { - default: - goto yyrule88 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate281 - } - -yystate281: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate282 - } - -yystate282: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate283 - } - -yystate283: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate284 - } - -yystate284: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate285 - } - -yystate285: - c = l.next() - switch { - default: - goto yyrule280 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate286: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate287 - } - -yystate287: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate288 - } - -yystate288: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate289 - } - -yystate289: - c = l.next() - switch { - default: - goto yyrule89 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate290: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate291 - } - -yystate291: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate292 - } - -yystate292: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate293 - } - -yystate293: - c = l.next() - switch { - default: - goto yyrule87 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate294: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'B' || c == 'C' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'N' || c == 'P' || c == 'Q' || c == 'S' || c == 'T' || c >= 'V' && c <= 'X' || c == 'Z' || c == '_' || c == 'b' || c == 'c' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'n' || c == 'p' || c == 'q' || c == 's' || c == 't' || c >= 'v' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate295 - case c == 'D' || c == 'd': - goto yystate361 - case c == 'E' || c == 'e': - goto yystate363 - case c == 'I' || c == 'i': - goto yystate406 - case c == 'O' || c == 'o': - goto yystate414 - case c == 'R' || c == 'r': - goto yystate419 - case c == 'U' || c == 'u': - goto yystate422 - case c == 'Y' || c == 'y': - goto yystate432 - } - -yystate295: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate296 - case c == 'Y' || c == 'y': - goto yystate315 - } - -yystate296: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate297 - case c == 'E' || c == 'e': - goto yystate303 - } - -yystate297: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate298 - } - -yystate298: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate299 - } - -yystate299: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate300 - } - -yystate300: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate301 - } - -yystate301: - c = l.next() - switch { - default: - goto yyrule90 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate302 - } - -yystate302: - c = l.next() - switch { - default: - goto yyrule91 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate303: - c = l.next() - switch { - default: - goto yyrule296 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate304 - case c == '_': - goto yystate308 - } - -yystate304: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate305 - } - -yystate305: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate306 - } - -yystate306: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate307 - } - -yystate307: - c = l.next() - switch { - default: - goto yyrule299 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate308: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate309 - case c == 'S' || c == 's': - goto yystate312 - } - -yystate309: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate310 - } - -yystate310: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate311 - } - -yystate311: - c = l.next() - switch { - default: - goto yyrule92 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate312: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate313 - } - -yystate313: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate314 - } - -yystate314: - c = l.next() - switch { - default: - goto yyrule93 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate315: - c = l.next() - switch { - default: - goto yyrule94 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'P' && c <= 'Z' || c >= 'a' && c <= 'm' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate316 - case c == 'O' || c == 'o': - goto yystate320 - case c == '_': - goto yystate335 - } - -yystate316: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate317 - } - -yystate317: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate318 - } - -yystate318: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate319 - } - -yystate319: - c = l.next() - switch { - default: - goto yyrule95 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate320: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate321 - } - -yystate321: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'V' || c == 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'v' || c == 'x' || c == 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate322 - case c == 'W' || c == 'w': - goto yystate327 - case c == 'Y' || c == 'y': - goto yystate331 - } - -yystate322: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate323 - } - -yystate323: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate324 - } - -yystate324: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate325 - } - -yystate325: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate326 - } - -yystate326: - c = l.next() - switch { - default: - goto yyrule97 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate327: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate328 - } - -yystate328: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate329 - } - -yystate329: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate330 - } - -yystate330: - c = l.next() - switch { - default: - goto yyrule96 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate331: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate332 - } - -yystate332: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate333 - } - -yystate333: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate334 - } - -yystate334: - c = l.next() - switch { - default: - goto yyrule98 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate335: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'L' || c >= 'N' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'l' || c >= 'n' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate336 - case c == 'M' || c == 'm': - goto yystate340 - case c == 'S' || c == 's': - goto yystate355 - } - -yystate336: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate337 - } - -yystate337: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate338 - } - -yystate338: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate339 - } - -yystate339: - c = l.next() - switch { - default: - goto yyrule99 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate340: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate341 - } - -yystate341: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate342 - case c == 'N' || c == 'n': - goto yystate351 - } - -yystate342: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate343 - } - -yystate343: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate344 - } - -yystate344: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate345 - } - -yystate345: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate346 - } - -yystate346: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate347 - } - -yystate347: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate348 - } - -yystate348: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate349 - } - -yystate349: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate350 - } - -yystate350: - c = l.next() - switch { - default: - goto yyrule100 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate351: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate352 - } - -yystate352: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate353 - } - -yystate353: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate354 - } - -yystate354: - c = l.next() - switch { - default: - goto yyrule101 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate355: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate356 - } - -yystate356: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate357 - } - -yystate357: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate358 - } - -yystate358: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate359 - } - -yystate359: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate360 - } - -yystate360: - c = l.next() - switch { - default: - goto yyrule102 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate361: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate362 - } - -yystate362: - c = l.next() - switch { - default: - goto yyrule103 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate363: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'B' || c == 'D' || c == 'E' || c >= 'G' && c <= 'K' || c >= 'M' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c == 'b' || c == 'd' || c == 'e' || c >= 'g' && c <= 'k' || c >= 'm' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate364 - case c == 'C' || c == 'c': - goto yystate372 - case c == 'F' || c == 'f': - goto yystate377 - case c == 'L' || c == 'l': - goto yystate382 - case c == 'S' || c == 's': - goto yystate400 - } - -yystate364: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate365 - } - -yystate365: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate366 - } - -yystate366: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate367 - } - -yystate367: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate368 - } - -yystate368: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate369 - } - -yystate369: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate370 - } - -yystate370: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate371 - } - -yystate371: - c = l.next() - switch { - default: - goto yyrule104 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate372: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate373 - } - -yystate373: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate374 - } - -yystate374: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate375 - } - -yystate375: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate376 - } - -yystate376: - c = l.next() - switch { - default: - goto yyrule290 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate377: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate378 - } - -yystate378: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate379 - } - -yystate379: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate380 - } - -yystate380: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate381 - } - -yystate381: - c = l.next() - switch { - default: - goto yyrule105 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate382: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate383 - case c == 'E' || c == 'e': - goto yystate397 - } - -yystate383: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate384 - } - -yystate384: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate385 - case c == '_': - goto yystate387 - } - -yystate385: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate386 - } - -yystate386: - c = l.next() - switch { - default: - goto yyrule106 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate387: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate388 - } - -yystate388: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate389 - } - -yystate389: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate390 - } - -yystate390: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate391 - } - -yystate391: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate392 - } - -yystate392: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate393 - } - -yystate393: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate394 - } - -yystate394: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate395 - } - -yystate395: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate396 - } - -yystate396: - c = l.next() - switch { - default: - goto yyrule107 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate397: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate398 - } - -yystate398: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate399 - } - -yystate399: - c = l.next() - switch { - default: - goto yyrule108 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate400: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate401 - } - -yystate401: - c = l.next() - switch { - default: - goto yyrule109 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate402 - } - -yystate402: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate403 - } - -yystate403: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate404 - } - -yystate404: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate405 - } - -yystate405: - c = l.next() - switch { - default: - goto yyrule110 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate406: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c == 'T' || c == 'U' || c >= 'W' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c == 't' || c == 'u' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate407 - case c == 'V' || c == 'v': - goto yystate413 - } - -yystate407: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate408 - } - -yystate408: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate409 - } - -yystate409: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate410 - } - -yystate410: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate411 - } - -yystate411: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate412 - } - -yystate412: - c = l.next() - switch { - default: - goto yyrule112 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate413: - c = l.next() - switch { - default: - goto yyrule113 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate414: - c = l.next() - switch { - default: - goto yyrule114 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate415 - } - -yystate415: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate416 - } - -yystate416: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate417 - } - -yystate417: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate418 - } - -yystate418: - c = l.next() - switch { - default: - goto yyrule293 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate419: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate420 - } - -yystate420: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate421 - } - -yystate421: - c = l.next() - switch { - default: - goto yyrule111 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate422: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate423 - case c == 'P' || c == 'p': - goto yystate425 - } - -yystate423: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate424 - } - -yystate424: - c = l.next() - switch { - default: - goto yyrule115 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate425: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate426 - } - -yystate426: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate427 - } - -yystate427: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate428 - } - -yystate428: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate429 - } - -yystate429: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate430 - } - -yystate430: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate431 - } - -yystate431: - c = l.next() - switch { - default: - goto yyrule116 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate432: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate433 - } - -yystate433: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate434 - } - -yystate434: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate435 - } - -yystate435: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate436 - } - -yystate436: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate437 - } - -yystate437: - c = l.next() - switch { - default: - goto yyrule117 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate438: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c == 'M' || c >= 'O' && c <= 'R' || c >= 'T' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'k' || c == 'm' || c >= 'o' && c <= 'r' || c >= 't' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate439 - case c == 'N' || c == 'n': - goto yystate442 - case c == 'S' || c == 's': - goto yystate451 - case c == 'X' || c == 'x': - goto yystate456 - } - -yystate439: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate440 - } - -yystate440: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate441 - } - -yystate441: - c = l.next() - switch { - default: - goto yyrule118 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate442: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c == 'E' || c == 'F' || c >= 'H' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c == 'e' || c == 'f' || c >= 'h' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate443 - case c == 'G' || c == 'g': - goto yystate444 - case c == 'U' || c == 'u': - goto yystate449 - } - -yystate443: - c = l.next() - switch { - default: - goto yyrule119 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate444: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate445 - } - -yystate445: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate446 - } - -yystate446: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate447 - } - -yystate447: - c = l.next() - switch { - default: - goto yyrule120 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate448 - } - -yystate448: - c = l.next() - switch { - default: - goto yyrule121 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate449: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate450 - } - -yystate450: - c = l.next() - switch { - default: - goto yyrule123 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate451: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate452 - } - -yystate452: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate453 - } - -yystate453: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate454 - } - -yystate454: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate455 - } - -yystate455: - c = l.next() - switch { - default: - goto yyrule124 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate456: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'O' || c >= 'Q' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'o' || c >= 'q' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate457 - case c == 'I' || c == 'i': - goto yystate462 - case c == 'P' || c == 'p': - goto yystate466 - case c == 'T' || c == 't': - goto yystate471 - } - -yystate457: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate458 - } - -yystate458: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate459 - } - -yystate459: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate460 - } - -yystate460: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate461 - } - -yystate461: - c = l.next() - switch { - default: - goto yyrule122 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate462: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate463 - } - -yystate463: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate464 - } - -yystate464: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate465 - } - -yystate465: - c = l.next() - switch { - default: - goto yyrule125 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate466: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate467 - } - -yystate467: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate468 - } - -yystate468: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate469 - } - -yystate469: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate470 - } - -yystate470: - c = l.next() - switch { - default: - goto yyrule126 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate471: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate472 - } - -yystate472: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate473 - } - -yystate473: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate474 - } - -yystate474: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate475 - } - -yystate475: - c = l.next() - switch { - default: - goto yyrule127 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate476: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'H' || c == 'J' || c == 'K' || c == 'M' || c == 'N' || c == 'P' || c == 'Q' || c == 'S' || c == 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'h' || c == 'j' || c == 'k' || c == 'm' || c == 'n' || c == 'p' || c == 'q' || c == 's' || c == 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate477 - case c == 'I' || c == 'i': - goto yystate481 - case c == 'L' || c == 'l': - goto yystate492 - case c == 'O' || c == 'o': - goto yystate496 - case c == 'R' || c == 'r': - goto yystate510 - case c == 'U' || c == 'u': - goto yystate513 - } - -yystate477: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate478 - } - -yystate478: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate479 - } - -yystate479: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate480 - } - -yystate480: - c = l.next() - switch { - default: - goto yyrule277 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate481: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Q' || c >= 'S' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'q' || c >= 's' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate482 - case c == 'R' || c == 'r': - goto yystate486 - case c == 'X' || c == 'x': - goto yystate489 - } - -yystate482: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate483 - } - -yystate483: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate484 - } - -yystate484: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate485 - } - -yystate485: - c = l.next() - switch { - default: - goto yyrule128 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate486: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate487 - } - -yystate487: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate488 - } - -yystate488: - c = l.next() - switch { - default: - goto yyrule129 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate489: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate490 - } - -yystate490: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate491 - } - -yystate491: - c = l.next() - switch { - default: - goto yyrule130 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate492: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate493 - } - -yystate493: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate494 - } - -yystate494: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate495 - } - -yystate495: - c = l.next() - switch { - default: - goto yyrule292 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate496: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c == 'S' || c == 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c == 's' || c == 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate497 - case c == 'U' || c == 'u': - goto yystate502 - } - -yystate497: - c = l.next() - switch { - default: - goto yyrule131 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate498 - } - -yystate498: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate499 - } - -yystate499: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate500 - } - -yystate500: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate501 - } - -yystate501: - c = l.next() - switch { - default: - goto yyrule132 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate502: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate503 - } - -yystate503: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate504 - } - -yystate504: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate505 - } - -yystate505: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate506 - } - -yystate506: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate507 - } - -yystate507: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate508 - } - -yystate508: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate509 - } - -yystate509: - c = l.next() - switch { - default: - goto yyrule133 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate510: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate511 - } - -yystate511: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate512 - } - -yystate512: - c = l.next() - switch { - default: - goto yyrule134 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate513: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate514 - } - -yystate514: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate515 - } - -yystate515: - c = l.next() - switch { - default: - goto yyrule135 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate516 - } - -yystate516: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate517 - } - -yystate517: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate518 - } - -yystate518: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate519 - } - -yystate519: - c = l.next() - switch { - default: - goto yyrule136 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate520: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate521 - case c == 'R' || c == 'r': - goto yystate526 - } - -yystate521: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate522 - } - -yystate522: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate523 - } - -yystate523: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate524 - } - -yystate524: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate525 - } - -yystate525: - c = l.next() - switch { - default: - goto yyrule215 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate526: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate527 - case c == 'O' || c == 'o': - goto yystate531 - } - -yystate527: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate528 - } - -yystate528: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate529 - } - -yystate529: - c = l.next() - switch { - default: - goto yyrule137 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate530 - } - -yystate530: - c = l.next() - switch { - default: - goto yyrule138 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate531: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate532 - } - -yystate532: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate533 - } - -yystate533: - c = l.next() - switch { - default: - goto yyrule139 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate534 - } - -yystate534: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate535 - } - -yystate535: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate536 - } - -yystate536: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate537 - } - -yystate537: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate538 - } - -yystate538: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate539 - } - -yystate539: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate540 - } - -yystate540: - c = l.next() - switch { - default: - goto yyrule140 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate541: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'H' || c >= 'J' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'h' || c >= 'j' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate542 - case c == 'I' || c == 'i': - goto yystate549 - case c == 'O' || c == 'o': - goto yystate561 - } - -yystate542: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c == 'T' || c == 'U' || c >= 'W' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c == 't' || c == 'u' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate543 - case c == 'V' || c == 'v': - goto yystate545 - } - -yystate543: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate544 - } - -yystate544: - c = l.next() - switch { - default: - goto yyrule141 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate545: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate546 - } - -yystate546: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate547 - } - -yystate547: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate548 - } - -yystate548: - c = l.next() - switch { - default: - goto yyrule142 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate549: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate550 - } - -yystate550: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate551 - } - -yystate551: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate552 - } - -yystate552: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate553 - } - -yystate553: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate554 - } - -yystate554: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate555 - } - -yystate555: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate556 - } - -yystate556: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate557 - } - -yystate557: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate558 - } - -yystate558: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate559 - } - -yystate559: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate560 - } - -yystate560: - c = l.next() - switch { - default: - goto yyrule143 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate561: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate562 - } - -yystate562: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate563 - } - -yystate563: - c = l.next() - switch { - default: - goto yyrule144 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate564 - } - -yystate564: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate565 - case c == 'S' || c == 's': - goto yystate580 - } - -yystate565: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate566 - } - -yystate566: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate567 - case c == 'N' || c == 'n': - goto yystate576 - } - -yystate567: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate568 - } - -yystate568: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate569 - } - -yystate569: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate570 - } - -yystate570: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate571 - } - -yystate571: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate572 - } - -yystate572: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate573 - } - -yystate573: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate574 - } - -yystate574: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate575 - } - -yystate575: - c = l.next() - switch { - default: - goto yyrule145 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate576: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate577 - } - -yystate577: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate578 - } - -yystate578: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate579 - } - -yystate579: - c = l.next() - switch { - default: - goto yyrule146 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate580: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate581 - } - -yystate581: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate582 - } - -yystate582: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate583 - } - -yystate583: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate584 - } - -yystate584: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate585 - } - -yystate585: - c = l.next() - switch { - default: - goto yyrule147 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate586: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c == 'E' || c >= 'H' && c <= 'M' || c >= 'O' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c == 'e' || c >= 'h' && c <= 'm' || c >= 'o' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate587 - case c == 'F' || c == 'f': - goto yystate596 - case c == 'G' || c == 'g': - goto yystate601 - case c == 'N' || c == 'n': - goto yystate606 - case c == 'S' || c == 's': - goto yystate627 - } - -yystate587: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate588 - } - -yystate588: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate589 - } - -yystate589: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate590 - } - -yystate590: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate591 - } - -yystate591: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate592 - } - -yystate592: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate593 - } - -yystate593: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate594 - } - -yystate594: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate595 - } - -yystate595: - c = l.next() - switch { - default: - goto yyrule148 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate596: - c = l.next() - switch { - default: - goto yyrule149 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate597 - } - -yystate597: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate598 - } - -yystate598: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate599 - } - -yystate599: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate600 - } - -yystate600: - c = l.next() - switch { - default: - goto yyrule150 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate601: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate602 - } - -yystate602: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate603 - } - -yystate603: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate604 - } - -yystate604: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate605 - } - -yystate605: - c = l.next() - switch { - default: - goto yyrule151 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate606: - c = l.next() - switch { - default: - goto yyrule157 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'M' || c >= 'O' && c <= 'R' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'm' || c >= 'o' && c <= 'r' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate607 - case c == 'N' || c == 'n': - goto yystate610 - case c == 'S' || c == 's': - goto yystate613 - case c == 'T' || c == 't': - goto yystate617 - } - -yystate607: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate608 - } - -yystate608: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate609 - } - -yystate609: - c = l.next() - switch { - default: - goto yyrule152 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate610: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate611 - } - -yystate611: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate612 - } - -yystate612: - c = l.next() - switch { - default: - goto yyrule153 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate613: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate614 - } - -yystate614: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate615 - } - -yystate615: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate616 - } - -yystate616: - c = l.next() - switch { - default: - goto yyrule154 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate617: - c = l.next() - switch { - default: - goto yyrule316 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate618 - case c == 'O' || c == 'o': - goto yystate626 - } - -yystate618: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate619 - case c == 'R' || c == 'r': - goto yystate622 - } - -yystate619: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate620 - } - -yystate620: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate621 - } - -yystate621: - c = l.next() - switch { - default: - goto yyrule317 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate622: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'U' || c >= 'W' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'u' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'V' || c == 'v': - goto yystate623 - } - -yystate623: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate624 - } - -yystate624: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate625 - } - -yystate625: - c = l.next() - switch { - default: - goto yyrule155 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate626: - c = l.next() - switch { - default: - goto yyrule156 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate627: - c = l.next() - switch { - default: - goto yyrule158 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate628 - } - -yystate628: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate629 - } - -yystate629: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate630 - } - -yystate630: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate631 - } - -yystate631: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate632 - } - -yystate632: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate633 - } - -yystate633: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate634 - } - -yystate634: - c = l.next() - switch { - default: - goto yyrule159 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate635: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate636 - } - -yystate636: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate637 - } - -yystate637: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate638 - } - -yystate638: - c = l.next() - switch { - default: - goto yyrule160 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate639: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate640 - } - -yystate640: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate641 - } - -yystate641: - c = l.next() - switch { - default: - goto yyrule161 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate642 - } - -yystate642: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate643 - } - -yystate643: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate644 - } - -yystate644: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate645 - } - -yystate645: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate646 - } - -yystate646: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate647 - } - -yystate647: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate648 - } - -yystate648: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate649 - } - -yystate649: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate650 - } - -yystate650: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Y' || c == '_' || c >= 'a' && c <= 'y': - goto yystate66 - case c == 'Z' || c == 'z': - goto yystate651 - } - -yystate651: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate652 - } - -yystate652: - c = l.next() - switch { - default: - goto yyrule162 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate653: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate654 - case c == 'I' || c == 'i': - goto yystate669 - case c == 'O' || c == 'o': - goto yystate675 - } - -yystate654: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'E' || c >= 'G' && c <= 'M' || c >= 'O' && c <= 'U' || c >= 'W' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'e' || c >= 'g' && c <= 'm' || c >= 'o' && c <= 'u' || c >= 'w' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate655 - case c == 'F' || c == 'f': - goto yystate660 - case c == 'N' || c == 'n': - goto yystate662 - case c == 'V' || c == 'v': - goto yystate666 - } - -yystate655: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate656 - } - -yystate656: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate657 - } - -yystate657: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate658 - } - -yystate658: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate659 - } - -yystate659: - c = l.next() - switch { - default: - goto yyrule163 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate660: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate661 - } - -yystate661: - c = l.next() - switch { - default: - goto yyrule164 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate662: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate663 - } - -yystate663: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate664 - } - -yystate664: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate665 - } - -yystate665: - c = l.next() - switch { - default: - goto yyrule165 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate666: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate667 - } - -yystate667: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate668 - } - -yystate668: - c = l.next() - switch { - default: - goto yyrule166 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate669: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c == 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c == 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate670 - case c == 'M' || c == 'm': - goto yystate672 - } - -yystate670: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate671 - } - -yystate671: - c = l.next() - switch { - default: - goto yyrule167 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate672: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate673 - } - -yystate673: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate674 - } - -yystate674: - c = l.next() - switch { - default: - goto yyrule168 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate675: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'M' || c >= 'O' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'm' || c >= 'o' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate676 - case c == 'N' || c == 'n': - goto yystate691 - case c == 'W' || c == 'w': - goto yystate701 - } - -yystate676: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate677 - case c == 'K' || c == 'k': - goto yystate690 - } - -yystate677: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate678 - case c == 'T' || c == 't': - goto yystate688 - } - -yystate678: - c = l.next() - switch { - default: - goto yyrule169 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate679 - } - -yystate679: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate680 - } - -yystate680: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate681 - } - -yystate681: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate682 - } - -yystate682: - c = l.next() - switch { - default: - goto yyrule281 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate683 - } - -yystate683: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate684 - } - -yystate684: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate685 - } - -yystate685: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate686 - } - -yystate686: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate687 - } - -yystate687: - c = l.next() - switch { - default: - goto yyrule282 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate688: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate689 - } - -yystate689: - c = l.next() - switch { - default: - goto yyrule170 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate690: - c = l.next() - switch { - default: - goto yyrule171 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate691: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate692 - } - -yystate692: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate693 - case c == 'T' || c == 't': - goto yystate697 - } - -yystate693: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate694 - } - -yystate694: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate695 - } - -yystate695: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate696 - } - -yystate696: - c = l.next() - switch { - default: - goto yyrule308 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate697: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate698 - } - -yystate698: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate699 - } - -yystate699: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate700 - } - -yystate700: - c = l.next() - switch { - default: - goto yyrule312 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate701: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate702 - case c == '_': - goto yystate704 - } - -yystate702: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate703 - } - -yystate703: - c = l.next() - switch { - default: - goto yyrule172 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate704: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate705 - } - -yystate705: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate706 - } - -yystate706: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate707 - } - -yystate707: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate708 - } - -yystate708: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate709 - } - -yystate709: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate710 - } - -yystate710: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate711 - } - -yystate711: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate712 - } - -yystate712: - c = l.next() - switch { - default: - goto yyrule173 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate713: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate714 - case c == 'E' || c == 'e': - goto yystate721 - case c == 'I' || c == 'i': - goto yystate737 - case c == 'O' || c == 'o': - goto yystate774 - } - -yystate714: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate715 - } - -yystate715: - c = l.next() - switch { - default: - goto yyrule174 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate716 - } - -yystate716: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate717 - } - -yystate717: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate718 - } - -yystate718: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate719 - } - -yystate719: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate720 - } - -yystate720: - c = l.next() - switch { - default: - goto yyrule175 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate721: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate722 - } - -yystate722: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate723 - } - -yystate723: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate724 - } - -yystate724: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate725 - } - -yystate725: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'H' || c >= 'J' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'h' || c >= 'j' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate726 - case c == 'I' || c == 'i': - goto yystate730 - case c == 'T' || c == 't': - goto yystate733 - } - -yystate726: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate727 - } - -yystate727: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate728 - } - -yystate728: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate729 - } - -yystate729: - c = l.next() - switch { - default: - goto yyrule307 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate730: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate731 - } - -yystate731: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate732 - } - -yystate732: - c = l.next() - switch { - default: - goto yyrule288 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate733: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate734 - } - -yystate734: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate735 - } - -yystate735: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate736 - } - -yystate736: - c = l.next() - switch { - default: - goto yyrule310 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate737: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate738 - case c == 'N' || c == 'n': - goto yystate747 - } - -yystate738: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate739 - } - -yystate739: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate740 - } - -yystate740: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate741 - } - -yystate741: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate742 - } - -yystate742: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate743 - } - -yystate743: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate744 - } - -yystate744: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate745 - } - -yystate745: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate746 - } - -yystate746: - c = l.next() - switch { - default: - goto yyrule176 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate747: - c = l.next() - switch { - default: - goto yyrule177 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate748 - case c == '_': - goto yystate769 - } - -yystate748: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate749 - } - -yystate749: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate750 - } - -yystate750: - c = l.next() - switch { - default: - goto yyrule178 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate751 - } - -yystate751: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate752 - case c == 'S' || c == 's': - goto yystate763 - } - -yystate752: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate753 - } - -yystate753: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate754 - } - -yystate754: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate755 - } - -yystate755: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate756 - } - -yystate756: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate757 - } - -yystate757: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate758 - } - -yystate758: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate759 - } - -yystate759: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate760 - } - -yystate760: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate761 - } - -yystate761: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate762 - } - -yystate762: - c = l.next() - switch { - default: - goto yyrule179 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate763: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate764 - } - -yystate764: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate765 - } - -yystate765: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate766 - } - -yystate766: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate767 - } - -yystate767: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate768 - } - -yystate768: - c = l.next() - switch { - default: - goto yyrule180 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate769: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate770 - } - -yystate770: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate771 - } - -yystate771: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate772 - } - -yystate772: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate773 - } - -yystate773: - c = l.next() - switch { - default: - goto yyrule181 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate774: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate775 - case c == 'N' || c == 'n': - goto yystate777 - } - -yystate775: - c = l.next() - switch { - default: - goto yyrule182 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate776 - } - -yystate776: - c = l.next() - switch { - default: - goto yyrule183 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate777: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate778 - } - -yystate778: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate779 - } - -yystate779: - c = l.next() - switch { - default: - goto yyrule184 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate780: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'N' || c >= 'P' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'n' || c >= 'p' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate781 - case c == 'O' || c == 'o': - goto yystate791 - case c == 'U' || c == 'u': - goto yystate794 - } - -yystate781: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate782 - case c == 'T' || c == 't': - goto yystate785 - } - -yystate782: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate783 - } - -yystate783: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate784 - } - -yystate784: - c = l.next() - switch { - default: - goto yyrule185 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate785: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate786 - } - -yystate786: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate787 - } - -yystate787: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate788 - } - -yystate788: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate789 - } - -yystate789: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate790 - } - -yystate790: - c = l.next() - switch { - default: - goto yyrule186 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate791: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c == 'U' || c == 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c == 'u' || c == 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate792 - case c == 'W' || c == 'w': - goto yystate793 - } - -yystate792: - c = l.next() - switch { - default: - goto yyrule187 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate793: - c = l.next() - switch { - default: - goto yyrule283 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate794: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate795 - case c == 'M' || c == 'm': - goto yystate799 - } - -yystate795: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate796 - } - -yystate796: - c = l.next() - switch { - default: - goto yyrule276 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate797 - } - -yystate797: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate798 - } - -yystate798: - c = l.next() - switch { - default: - goto yyrule252 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate799: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate800 - } - -yystate800: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate801 - } - -yystate801: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate802 - } - -yystate802: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate803 - } - -yystate803: - c = l.next() - switch { - default: - goto yyrule291 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate804: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'M' || c == 'O' || c == 'Q' || c == 'S' || c == 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'm' || c == 'o' || c == 'q' || c == 's' || c == 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate805 - case c == 'N' || c == 'n': - goto yystate810 - case c == 'P' || c == 'p': - goto yystate813 - case c == 'R' || c == 'r': - goto yystate818 - case c == 'U' || c == 'u': - goto yystate822 - } - -yystate805: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate806 - } - -yystate806: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate807 - } - -yystate807: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate808 - } - -yystate808: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate809 - } - -yystate809: - c = l.next() - switch { - default: - goto yyrule188 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate810: - c = l.next() - switch { - default: - goto yyrule189 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate811 - } - -yystate811: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate812 - } - -yystate812: - c = l.next() - switch { - default: - goto yyrule190 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate813: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate814 - } - -yystate814: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate815 - } - -yystate815: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate816 - } - -yystate816: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate817 - } - -yystate817: - c = l.next() - switch { - default: - goto yyrule191 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate818: - c = l.next() - switch { - default: - goto yyrule193 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate819 - } - -yystate819: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate820 - } - -yystate820: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate821 - } - -yystate821: - c = l.next() - switch { - default: - goto yyrule192 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate822: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate823 - } - -yystate823: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate824 - } - -yystate824: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate825 - } - -yystate825: - c = l.next() - switch { - default: - goto yyrule194 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate826: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'N' || c == 'P' || c == 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'n' || c == 'p' || c == 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate827 - case c == 'O' || c == 'o': - goto yystate834 - case c == 'R' || c == 'r': - goto yystate838 - } - -yystate827: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate828 - } - -yystate828: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate829 - } - -yystate829: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate830 - } - -yystate830: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate831 - } - -yystate831: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate832 - } - -yystate832: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate833 - } - -yystate833: - c = l.next() - switch { - default: - goto yyrule195 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate834: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate835 - } - -yystate835: - c = l.next() - switch { - default: - goto yyrule196 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate836 - } - -yystate836: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate837 - } - -yystate837: - c = l.next() - switch { - default: - goto yyrule197 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate838: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate839 - case c == 'I' || c == 'i': - goto yystate850 - case c == 'O' || c == 'o': - goto yystate855 - } - -yystate839: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate840 - case c == 'P' || c == 'p': - goto yystate846 - } - -yystate840: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate841 - } - -yystate841: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate842 - } - -yystate842: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate843 - } - -yystate843: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate844 - } - -yystate844: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate845 - } - -yystate845: - c = l.next() - switch { - default: - goto yyrule294 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate846: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate847 - } - -yystate847: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate848 - } - -yystate848: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate849 - } - -yystate849: - c = l.next() - switch { - default: - goto yyrule198 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate850: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate851 - } - -yystate851: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate852 - } - -yystate852: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate853 - } - -yystate853: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate854 - } - -yystate854: - c = l.next() - switch { - default: - goto yyrule199 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate855: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate856 - } - -yystate856: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate857 - } - -yystate857: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate858 - } - -yystate858: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate859 - } - -yystate859: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate860 - } - -yystate860: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate861 - } - -yystate861: - c = l.next() - switch { - default: - goto yyrule200 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate862: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate863 - } - -yystate863: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate864 - case c == 'I' || c == 'i': - goto yystate869 - } - -yystate864: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate865 - } - -yystate865: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate866 - } - -yystate866: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate867 - } - -yystate867: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate868 - } - -yystate868: - c = l.next() - switch { - default: - goto yyrule201 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate869: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate870 - } - -yystate870: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate871 - } - -yystate871: - c = l.next() - switch { - default: - goto yyrule202 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate872: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'H' || c == 'J' || c == 'K' || c == 'M' || c == 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'h' || c == 'j' || c == 'k' || c == 'm' || c == 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate873 - case c == 'E' || c == 'e': - goto yystate876 - case c == 'I' || c == 'i': - goto yystate904 - case c == 'L' || c == 'l': - goto yystate908 - case c == 'O' || c == 'o': - goto yystate912 - } - -yystate873: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate874 - } - -yystate874: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate875 - } - -yystate875: - c = l.next() - switch { - default: - goto yyrule216 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate876: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'E' || c >= 'H' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'e' || c >= 'h' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate877 - case c == 'F' || c == 'f': - goto yystate880 - case c == 'G' || c == 'g': - goto yystate888 - case c == 'P' || c == 'p': - goto yystate892 - } - -yystate877: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate878 - case c == 'L' || c == 'l': - goto yystate879 - } - -yystate878: - c = l.next() - switch { - default: - goto yyrule217 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate879: - c = l.next() - switch { - default: - goto yyrule295 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate880: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate881 - } - -yystate881: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate882 - } - -yystate882: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate883 - } - -yystate883: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate884 - } - -yystate884: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate885 - } - -yystate885: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate886 - } - -yystate886: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate887 - } - -yystate887: - c = l.next() - switch { - default: - goto yyrule222 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate888: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate889 - } - -yystate889: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate890 - } - -yystate890: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate891 - } - -yystate891: - c = l.next() - switch { - default: - goto yyrule220 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate892: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate893 - case c == 'L' || c == 'l': - goto yystate900 - } - -yystate893: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate894 - } - -yystate894: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate895 - } - -yystate895: - c = l.next() - switch { - default: - goto yyrule218 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate896 - } - -yystate896: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate897 - } - -yystate897: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate898 - } - -yystate898: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate899 - } - -yystate899: - c = l.next() - switch { - default: - goto yyrule219 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate900: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate901 - } - -yystate901: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate902 - } - -yystate902: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate903 - } - -yystate903: - c = l.next() - switch { - default: - goto yyrule221 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate904: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate905 - } - -yystate905: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate906 - } - -yystate906: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate907 - } - -yystate907: - c = l.next() - switch { - default: - goto yyrule204 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate908: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate909 - } - -yystate909: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate910 - } - -yystate910: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate911 - } - -yystate911: - c = l.next() - switch { - default: - goto yyrule223 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate912: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate913 - case c == 'W' || c == 'w': - goto yystate919 - } - -yystate913: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate914 - } - -yystate914: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate915 - } - -yystate915: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate916 - } - -yystate916: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate917 - } - -yystate917: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate918 - } - -yystate918: - c = l.next() - switch { - default: - goto yyrule205 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate919: - c = l.next() - switch { - default: - goto yyrule206 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate920 - } - -yystate920: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate921 - } - -yystate921: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate922 - } - -yystate922: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate923 - } - -yystate923: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate924 - } - -yystate924: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate925 - } - -yystate925: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate926 - } - -yystate926: - c = l.next() - switch { - default: - goto yyrule207 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate927: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c == 'D' || c == 'F' || c == 'G' || c >= 'J' && c <= 'L' || c == 'N' || c == 'P' || c == 'R' || c == 'S' || c >= 'V' && c <= 'X' || c == 'Z' || c == '_' || c == 'a' || c == 'b' || c == 'd' || c == 'f' || c == 'g' || c >= 'j' && c <= 'l' || c == 'n' || c == 'p' || c == 'r' || c == 's' || c >= 'v' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate928 - case c == 'E' || c == 'e': - goto yystate934 - case c == 'H' || c == 'h': - goto yystate971 - case c == 'I' || c == 'i': - goto yystate977 - case c == 'M' || c == 'm': - goto yystate982 - case c == 'O' || c == 'o': - goto yystate989 - case c == 'Q' || c == 'q': - goto yystate992 - case c == 'T' || c == 't': - goto yystate1010 - case c == 'U' || c == 'u': - goto yystate1021 - case c == 'Y' || c == 'y': - goto yystate1040 - } - -yystate928: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate929 - } - -yystate929: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate930 - } - -yystate930: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate931 - } - -yystate931: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate932 - } - -yystate932: - c = l.next() - switch { - default: - goto yyrule208 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate933 - } - -yystate933: - c = l.next() - switch { - default: - goto yyrule209 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate934: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'K' || c >= 'M' && c <= 'Q' || c >= 'U' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'k' || c >= 'm' && c <= 'q' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate935 - case c == 'L' || c == 'l': - goto yystate951 - case c == 'R' || c == 'r': - goto yystate955 - case c == 'S' || c == 's': - goto yystate965 - case c == 'T' || c == 't': - goto yystate970 - } - -yystate935: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate936 - } - -yystate936: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate937 - } - -yystate937: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate938 - } - -yystate938: - c = l.next() - switch { - default: - goto yyrule226 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate939 - } - -yystate939: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate940 - } - -yystate940: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate941 - } - -yystate941: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate942 - } - -yystate942: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate943 - } - -yystate943: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate944 - } - -yystate944: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate945 - } - -yystate945: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate946 - } - -yystate946: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate947 - } - -yystate947: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate948 - } - -yystate948: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate949 - } - -yystate949: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate950 - } - -yystate950: - c = l.next() - switch { - default: - goto yyrule227 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate951: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate952 - } - -yystate952: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate953 - } - -yystate953: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate954 - } - -yystate954: - c = l.next() - switch { - default: - goto yyrule228 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate955: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate956 - } - -yystate956: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate957 - } - -yystate957: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate958 - } - -yystate958: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate959 - } - -yystate959: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Y' || c == '_' || c >= 'a' && c <= 'y': - goto yystate66 - case c == 'Z' || c == 'z': - goto yystate960 - } - -yystate960: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate961 - } - -yystate961: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate962 - } - -yystate962: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate963 - } - -yystate963: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate964 - } - -yystate964: - c = l.next() - switch { - default: - goto yyrule210 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate965: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate966 - } - -yystate966: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate967 - } - -yystate967: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate968 - } - -yystate968: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate969 - } - -yystate969: - c = l.next() - switch { - default: - goto yyrule211 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate970: - c = l.next() - switch { - default: - goto yyrule229 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate971: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate972 - case c == 'O' || c == 'o': - goto yystate975 - } - -yystate972: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate973 - } - -yystate973: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate974 - } - -yystate974: - c = l.next() - switch { - default: - goto yyrule230 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate975: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate976 - } - -yystate976: - c = l.next() - switch { - default: - goto yyrule231 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate977: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate978 - } - -yystate978: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate979 - } - -yystate979: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate980 - } - -yystate980: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate981 - } - -yystate981: - c = l.next() - switch { - default: - goto yyrule273 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate982: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate983 - } - -yystate983: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate984 - } - -yystate984: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate985 - } - -yystate985: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate986 - } - -yystate986: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate987 - } - -yystate987: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate988 - } - -yystate988: - c = l.next() - switch { - default: - goto yyrule287 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate989: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate990 - } - -yystate990: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate991 - } - -yystate991: - c = l.next() - switch { - default: - goto yyrule212 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate992: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate993 - } - -yystate993: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate994 - } - -yystate994: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate995 - } - -yystate995: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate996 - } - -yystate996: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate997 - } - -yystate997: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate998 - } - -yystate998: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate999 - } - -yystate999: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate1000 - } - -yystate1000: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1001 - } - -yystate1001: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate1002 - } - -yystate1002: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1003 - } - -yystate1003: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1004 - } - -yystate1004: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate1005 - } - -yystate1005: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1006 - } - -yystate1006: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1007 - } - -yystate1007: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate1008 - } - -yystate1008: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1009 - } - -yystate1009: - c = l.next() - switch { - default: - goto yyrule279 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1010: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1011 - case c == 'R' || c == 'r': - goto yystate1017 - } - -yystate1011: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c == 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c == 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1012 - case c == 'T' || c == 't': - goto yystate1014 - } - -yystate1012: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1013 - } - -yystate1013: - c = l.next() - switch { - default: - goto yyrule213 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1014: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate1015 - } - -yystate1015: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1016 - } - -yystate1016: - c = l.next() - switch { - default: - goto yyrule214 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1017: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate1018 - } - -yystate1018: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1019 - } - -yystate1019: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate1020 - } - -yystate1020: - c = l.next() - switch { - default: - goto yyrule233 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1021: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1022 - case c == 'M' || c == 'm': - goto yystate1039 - } - -yystate1022: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1023 - case c == 'S' || c == 's': - goto yystate1027 - } - -yystate1023: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1024 - } - -yystate1024: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1025 - } - -yystate1025: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1026 - } - -yystate1026: - c = l.next() - switch { - default: - goto yyrule232 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1027: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1028 - } - -yystate1028: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1029 - } - -yystate1029: - c = l.next() - switch { - default: - goto yyrule234 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1030 - } - -yystate1030: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1031 - } - -yystate1031: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1032 - } - -yystate1032: - c = l.next() - switch { - default: - goto yyrule235 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z': - goto yystate66 - case c == '_': - goto yystate1033 - } - -yystate1033: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1034 - } - -yystate1034: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1035 - } - -yystate1035: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1036 - } - -yystate1036: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1037 - } - -yystate1037: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate1038 - } - -yystate1038: - c = l.next() - switch { - default: - goto yyrule236 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1039: - c = l.next() - switch { - default: - goto yyrule237 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1040: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1041 - } - -yystate1041: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1042 - } - -yystate1042: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1043 - } - -yystate1043: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1044 - } - -yystate1044: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1045 - } - -yystate1045: - c = l.next() - switch { - default: - goto yyrule238 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1046: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c == 'F' || c == 'G' || c >= 'J' && c <= 'N' || c == 'P' || c == 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c == 'f' || c == 'g' || c >= 'j' && c <= 'n' || c == 'p' || c == 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1047 - case c == 'E' || c == 'e': - goto yystate1052 - case c == 'H' || c == 'h': - goto yystate1055 - case c == 'I' || c == 'i': - goto yystate1058 - case c == 'O' || c == 'o': - goto yystate1079 - case c == 'R' || c == 'r': - goto yystate1080 - } - -yystate1047: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1048 - } - -yystate1048: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1049 - } - -yystate1049: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1050 - } - -yystate1050: - c = l.next() - switch { - default: - goto yyrule239 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1051 - } - -yystate1051: - c = l.next() - switch { - default: - goto yyrule240 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1052: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate1053 - } - -yystate1053: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1054 - } - -yystate1054: - c = l.next() - switch { - default: - goto yyrule311 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1055: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1056 - } - -yystate1056: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1057 - } - -yystate1057: - c = l.next() - switch { - default: - goto yyrule241 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1058: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1059 - case c == 'N' || c == 'n': - goto yystate1066 - } - -yystate1059: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1060 - } - -yystate1060: - c = l.next() - switch { - default: - goto yyrule297 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1061 - } - -yystate1061: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1062 - } - -yystate1062: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1063 - } - -yystate1063: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1064 - } - -yystate1064: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'P' || c == 'p': - goto yystate1065 - } - -yystate1065: - c = l.next() - switch { - default: - goto yyrule298 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1066: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate1067 - } - -yystate1067: - c = l.next() - switch { - default: - goto yyrule285 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'H' || c >= 'J' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'h' || c >= 'j' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1068 - case c == 'I' || c == 'i': - goto yystate1072 - case c == 'T' || c == 't': - goto yystate1075 - } - -yystate1068: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1069 - } - -yystate1069: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1070 - } - -yystate1070: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1071 - } - -yystate1071: - c = l.next() - switch { - default: - goto yyrule305 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1072: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1073 - } - -yystate1073: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1074 - } - -yystate1074: - c = l.next() - switch { - default: - goto yyrule286 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1075: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1076 - } - -yystate1076: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'W' || c == 'Y' || c == 'Z' || c == '_' || c >= 'a' && c <= 'w' || c == 'y' || c == 'z': - goto yystate66 - case c == 'X' || c == 'x': - goto yystate1077 - } - -yystate1077: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1078 - } - -yystate1078: - c = l.next() - switch { - default: - goto yyrule309 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1079: - c = l.next() - switch { - default: - goto yyrule242 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1080: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'H' || c >= 'J' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'h' || c >= 'j' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1081 - case c == 'I' || c == 'i': - goto yystate1095 - case c == 'U' || c == 'u': - goto yystate1102 - } - -yystate1081: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1082 - case c == 'N' || c == 'n': - goto yystate1087 - } - -yystate1082: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1083 - } - -yystate1083: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1084 - } - -yystate1084: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1085 - } - -yystate1085: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1086 - } - -yystate1086: - c = l.next() - switch { - default: - goto yyrule243 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1087: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1088 - } - -yystate1088: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1089 - } - -yystate1089: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate1090 - } - -yystate1090: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1091 - } - -yystate1091: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1092 - } - -yystate1092: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1093 - } - -yystate1093: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1094 - } - -yystate1094: - c = l.next() - switch { - default: - goto yyrule244 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1095: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1096 - case c == 'M' || c == 'm': - goto yystate1101 - } - -yystate1096: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1097 - } - -yystate1097: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1098 - } - -yystate1098: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1099 - } - -yystate1099: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1100 - } - -yystate1100: - c = l.next() - switch { - default: - goto yyrule245 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1101: - c = l.next() - switch { - default: - goto yyrule246 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1102: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1103 - case c == 'N' || c == 'n': - goto yystate1104 - } - -yystate1103: - c = l.next() - switch { - default: - goto yyrule278 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1104: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate1105 - } - -yystate1105: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1106 - } - -yystate1106: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1107 - } - -yystate1107: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1108 - } - -yystate1108: - c = l.next() - switch { - default: - goto yyrule247 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1109: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c == 'O' || c == 'Q' || c == 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c == 'o' || c == 'q' || c == 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1110 - case c == 'P' || c == 'p': - goto yystate1141 - case c == 'S' || c == 's': - goto yystate1149 - } - -yystate1110: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'H' || c == 'J' || c >= 'M' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'h' || c == 'j' || c >= 'm' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate1111 - case c == 'I' || c == 'i': - goto yystate1120 - case c == 'K' || c == 'k': - goto yystate1126 - case c == 'L' || c == 'l': - goto yystate1131 - case c == 'S' || c == 's': - goto yystate1135 - } - -yystate1111: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1112 - } - -yystate1112: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1113 - } - -yystate1113: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1114 - } - -yystate1114: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1115 - } - -yystate1115: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1116 - } - -yystate1116: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1117 - } - -yystate1117: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1118 - } - -yystate1118: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1119 - } - -yystate1119: - c = l.next() - switch { - default: - goto yyrule248 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1120: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c == 'P' || c >= 'R' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c == 'p' || c >= 'r' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1121 - case c == 'Q' || c == 'q': - goto yystate1123 - } - -yystate1121: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1122 - } - -yystate1122: - c = l.next() - switch { - default: - goto yyrule249 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1123: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate1124 - } - -yystate1124: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1125 - } - -yystate1125: - c = l.next() - switch { - default: - goto yyrule250 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1126: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1127 - } - -yystate1127: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1128 - } - -yystate1128: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate1129 - } - -yystate1129: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1130 - } - -yystate1130: - c = l.next() - switch { - default: - goto yyrule251 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1131: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1132 - } - -yystate1132: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c == 'B' || c >= 'D' && c <= 'Z' || c == '_' || c == 'a' || c == 'b' || c >= 'd' && c <= 'z': - goto yystate66 - case c == 'C' || c == 'c': - goto yystate1133 - } - -yystate1133: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate1134 - } - -yystate1134: - c = l.next() - switch { - default: - goto yyrule253 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1135: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1136 - } - -yystate1136: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1137 - } - -yystate1137: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1138 - } - -yystate1138: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1139 - } - -yystate1139: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1140 - } - -yystate1140: - c = l.next() - switch { - default: - goto yyrule274 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1141: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1142 - case c == 'P' || c == 'p': - goto yystate1146 - } - -yystate1142: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1143 - } - -yystate1143: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1144 - } - -yystate1144: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1145 - } - -yystate1145: - c = l.next() - switch { - default: - goto yyrule254 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1146: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1147 - } - -yystate1147: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1148 - } - -yystate1148: - c = l.next() - switch { - default: - goto yyrule255 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1149: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1150 - case c == 'I' || c == 'i': - goto yystate1152 - } - -yystate1150: - c = l.next() - switch { - default: - goto yyrule256 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1151 - } - -yystate1151: - c = l.next() - switch { - default: - goto yyrule257 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1152: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1153 - } - -yystate1153: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1154 - } - -yystate1154: - c = l.next() - switch { - default: - goto yyrule258 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1155: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1156 - case c == 'E' || c == 'e': - goto yystate1178 - } - -yystate1156: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1157 - case c == 'R' || c == 'r': - goto yystate1161 - } - -yystate1157: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'T' || c >= 'V' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'U' || c == 'u': - goto yystate1158 - } - -yystate1158: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1159 - } - -yystate1159: - c = l.next() - switch { - default: - goto yyrule259 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1160 - } - -yystate1160: - c = l.next() - switch { - default: - goto yyrule260 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1161: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'D' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c == 'a' || c >= 'd' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1162 - case c == 'C' || c == 'c': - goto yystate1168 - case c == 'I' || c == 'i': - goto yystate1172 - } - -yystate1162: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1163 - } - -yystate1163: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1164 - } - -yystate1164: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1165 - } - -yystate1165: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1166 - } - -yystate1166: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate1167 - } - -yystate1167: - c = l.next() - switch { - default: - goto yyrule304 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1168: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate1169 - } - -yystate1169: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1170 - } - -yystate1170: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1171 - } - -yystate1171: - c = l.next() - switch { - default: - goto yyrule302 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1172: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1173 - } - -yystate1173: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c == 'A' || c >= 'C' && c <= 'Z' || c == '_' || c == 'a' || c >= 'c' && c <= 'z': - goto yystate66 - case c == 'B' || c == 'b': - goto yystate1174 - } - -yystate1174: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1175 - } - -yystate1175: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1176 - } - -yystate1176: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1177 - } - -yystate1177: - c = l.next() - switch { - default: - goto yyrule261 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1178: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1179 - } - -yystate1179: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1180 - } - -yystate1180: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1181 - } - -yystate1181: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1182 - } - -yystate1182: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1183 - } - -yystate1183: - c = l.next() - switch { - default: - goto yyrule262 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1184: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c == 'F' || c == 'G' || c >= 'I' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c == 'f' || c == 'g' || c >= 'i' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1185 - case c == 'E' || c == 'e': - goto yystate1192 - case c == 'H' || c == 'h': - goto yystate1204 - case c == 'R' || c == 'r': - goto yystate1209 - } - -yystate1185: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1186 - } - -yystate1186: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1187 - } - -yystate1187: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1188 - } - -yystate1188: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1189 - } - -yystate1189: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'H' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'f' || c >= 'h' && c <= 'z': - goto yystate66 - case c == 'G' || c == 'g': - goto yystate1190 - } - -yystate1190: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'R' || c >= 'T' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'r' || c >= 't' && c <= 'z': - goto yystate66 - case c == 'S' || c == 's': - goto yystate1191 - } - -yystate1191: - c = l.next() - switch { - default: - goto yyrule263 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1192: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1193 - } - -yystate1193: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate1194 - } - -yystate1194: - c = l.next() - switch { - default: - goto yyrule264 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'C' || c >= 'E' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'D' || c == 'd': - goto yystate1195 - case c == 'O' || c == 'o': - goto yystate1198 - } - -yystate1195: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1196 - } - -yystate1196: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate1197 - } - -yystate1197: - c = l.next() - switch { - default: - goto yyrule265 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1198: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate1199 - } - -yystate1199: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'X' || c == 'Z' || c == '_' || c >= 'a' && c <= 'x' || c == 'z': - goto yystate66 - case c == 'Y' || c == 'y': - goto yystate1200 - } - -yystate1200: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1201 - } - -yystate1201: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1202 - } - -yystate1202: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1203 - } - -yystate1203: - c = l.next() - switch { - default: - goto yyrule266 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1204: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1205 - } - -yystate1205: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1206 - case c == 'R' || c == 'r': - goto yystate1207 - } - -yystate1206: - c = l.next() - switch { - default: - goto yyrule267 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1207: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1208 - } - -yystate1208: - c = l.next() - switch { - default: - goto yyrule268 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1209: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1210 - } - -yystate1210: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1211 - } - -yystate1211: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1212 - } - -yystate1212: - c = l.next() - switch { - default: - goto yyrule269 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1213: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1217 - case c == '\'': - goto yystate1214 - } - -yystate1214: - c = l.next() - switch { - default: - goto yyabort - case c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f': - goto yystate1215 - } - -yystate1215: - c = l.next() - switch { - default: - goto yyabort - case c == '\'': - goto yystate1216 - case c >= '0' && c <= '9' || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f': - goto yystate1215 - } - -yystate1216: - c = l.next() - goto yyrule11 - -yystate1217: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1218 - } - -yystate1218: - c = l.next() - switch { - default: - goto yyrule270 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1219: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1220 - } - -yystate1220: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate1221 - } - -yystate1221: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1222 - } - -yystate1222: - c = l.next() - switch { - default: - goto yyrule300 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'V' || c >= 'X' && c <= 'Z' || c >= 'a' && c <= 'v' || c >= 'x' && c <= 'z': - goto yystate66 - case c == 'W' || c == 'w': - goto yystate1223 - case c == '_': - goto yystate1227 - } - -yystate1223: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1224 - } - -yystate1224: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1225 - } - -yystate1225: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'J' || c >= 'L' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'j' || c >= 'l' && c <= 'z': - goto yystate66 - case c == 'K' || c == 'k': - goto yystate1226 - } - -yystate1226: - c = l.next() - switch { - default: - goto yyrule271 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1227: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'L' || c >= 'N' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'l' || c >= 'n' && c <= 'z': - goto yystate66 - case c == 'M' || c == 'm': - goto yystate1228 - } - -yystate1228: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1229 - } - -yystate1229: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'M' || c >= 'O' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'N' || c == 'n': - goto yystate1230 - } - -yystate1230: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'S' || c >= 'U' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 'T' || c == 't': - goto yystate1231 - } - -yystate1231: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'G' || c >= 'I' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'g' || c >= 'i' && c <= 'z': - goto yystate66 - case c == 'H' || c == 'h': - goto yystate1232 - } - -yystate1232: - c = l.next() - switch { - default: - goto yyrule272 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1233: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'D' || c >= 'F' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'd' || c >= 'f' && c <= 'z': - goto yystate66 - case c == 'E' || c == 'e': - goto yystate1234 - } - -yystate1234: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Q' || c >= 'S' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'q' || c >= 's' && c <= 'z': - goto yystate66 - case c == 'R' || c == 'r': - goto yystate1235 - } - -yystate1235: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'O' || c == 'o': - goto yystate1236 - } - -yystate1236: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'E' || c >= 'G' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'e' || c >= 'g' && c <= 'z': - goto yystate66 - case c == 'F' || c == 'f': - goto yystate1237 - } - -yystate1237: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'H' || c >= 'J' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'h' || c >= 'j' && c <= 'z': - goto yystate66 - case c == 'I' || c == 'i': - goto yystate1238 - } - -yystate1238: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1239 - } - -yystate1239: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'K' || c >= 'M' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'k' || c >= 'm' && c <= 'z': - goto yystate66 - case c == 'L' || c == 'l': - goto yystate1240 - } - -yystate1240: - c = l.next() - switch { - default: - goto yyrule275 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1241: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1242: - c = l.next() - goto yyrule15 - -yystate1243: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'D' || c >= 'F' && c <= 'H' || c == 'J' || c == 'K' || c == 'M' || c == 'N' || c >= 'P' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'd' || c >= 'f' && c <= 'h' || c == 'j' || c == 'k' || c == 'm' || c == 'n' || c >= 'p' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate873 - case c == 'E': - goto yystate876 - case c == 'I' || c == 'i': - goto yystate904 - case c == 'L' || c == 'l': - goto yystate908 - case c == 'O' || c == 'o': - goto yystate912 - case c == 'e': - goto yystate1244 - } - -yystate1244: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'B' && c <= 'E' || c >= 'H' && c <= 'O' || c >= 'Q' && c <= 'Z' || c == '_' || c == 'b' || c == 'c' || c == 'e' || c >= 'h' && c <= 'o' || c >= 'q' && c <= 'z': - goto yystate66 - case c == 'A' || c == 'a': - goto yystate877 - case c == 'F' || c == 'f': - goto yystate880 - case c == 'G' || c == 'g': - goto yystate888 - case c == 'P' || c == 'p': - goto yystate892 - case c == 'd': - goto yystate1245 - } - -yystate1245: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 't' || c >= 'v' && c <= 'z': - goto yystate66 - case c == 'u': - goto yystate1246 - } - -yystate1246: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'n': - goto yystate1247 - } - -yystate1247: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'c' || c >= 'e' && c <= 'z': - goto yystate66 - case c == 'd': - goto yystate1248 - } - -yystate1248: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'b' && c <= 'z': - goto yystate66 - case c == 'a': - goto yystate1249 - } - -yystate1249: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'm' || c >= 'o' && c <= 'z': - goto yystate66 - case c == 'n': - goto yystate1250 - } - -yystate1250: - c = l.next() - switch { - default: - goto yyrule318 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 's' || c >= 'u' && c <= 'z': - goto yystate66 - case c == 't': - goto yystate1251 - } - -yystate1251: - c = l.next() - switch { - default: - goto yyrule203 - case c == '$' || c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z': - goto yystate66 - } - -yystate1252: - c = l.next() - switch { - default: - goto yyrule319 - case c == '|': - goto yystate1253 - } - -yystate1253: - c = l.next() - goto yyrule35 - - goto yystate1254 // silence unused label error -yystate1254: - c = l.next() -yystart1254: - switch { - default: - goto yyrule16 - case c == '"': - goto yystate1256 - case c == '\\': - goto yystate1258 - case c == '\x00': - goto yystate2 - case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ': - goto yystate1255 - } - -yystate1255: - c = l.next() - switch { - default: - goto yyrule16 - case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ': - goto yystate1255 - } - -yystate1256: - c = l.next() - switch { - default: - goto yyrule19 - case c == '"': - goto yystate1257 - } - -yystate1257: - c = l.next() - goto yyrule18 - -yystate1258: - c = l.next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate1259 - } - -yystate1259: - c = l.next() - goto yyrule17 - - goto yystate1260 // silence unused label error -yystate1260: - c = l.next() -yystart1260: - switch { - default: - goto yyrule20 - case c == '\'': - goto yystate1262 - case c == '\\': - goto yystate1264 - case c == '\x00': - goto yystate2 - case c >= '\x01' && c <= '&' || c >= '(' && c <= '[' || c >= ']' && c <= 'ÿ': - goto yystate1261 - } - -yystate1261: - c = l.next() - switch { - default: - goto yyrule20 - case c >= '\x01' && c <= '&' || c >= '(' && c <= '[' || c >= ']' && c <= 'ÿ': - goto yystate1261 - } - -yystate1262: - c = l.next() - switch { - default: - goto yyrule23 - case c == '\'': - goto yystate1263 - } - -yystate1263: - c = l.next() - goto yyrule22 - -yystate1264: - c = l.next() - switch { - default: - goto yyabort - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate1265 - } - -yystate1265: - c = l.next() - goto yyrule21 - - goto yystate1266 // silence unused label error -yystate1266: - c = l.next() -yystart1266: - switch { - default: - goto yystate1267 // c >= '\x01' && c <= '\b' || c >= '\n' && c <= '\x1f' || c >= '!' && c <= 'ÿ' - case c == '\t' || c == ' ': - goto yystate1268 - case c == '\x00': - goto yystate2 - } - -yystate1267: - c = l.next() - goto yyrule8 - -yystate1268: - c = l.next() - switch { - default: - goto yyrule7 - case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ': - goto yystate1268 - } - - goto yystate1269 // silence unused label error -yystate1269: - c = l.next() -yystart1269: - switch { - default: - goto yyrule24 - case c == '\x00': - goto yystate2 - case c == '`': - goto yystate1271 - case c >= '\x01' && c <= '_' || c >= 'a' && c <= 'ÿ': - goto yystate1270 - } - -yystate1270: - c = l.next() - switch { - default: - goto yyrule24 - case c >= '\x01' && c <= '_' || c >= 'a' && c <= 'ÿ': - goto yystate1270 - } - -yystate1271: - c = l.next() - switch { - default: - goto yyrule26 - case c == '`': - goto yystate1272 - } - -yystate1272: - c = l.next() - goto yyrule25 - -yyrule1: // \0 - { - return 0 - } -yyrule2: // [ \t\n\r]+ - - goto yystate0 -yyrule3: // #.* - - goto yystate0 -yyrule4: // \/\/.* - - goto yystate0 -yyrule5: // \/\*([^*]|\*+[^*/])*\*+\/ - - goto yystate0 -yyrule6: // -- - { - l.sc = S3 - goto yystate0 - } -yyrule7: // [ \t]+.* - { - { - l.sc = 0 - } - goto yystate0 - } -yyrule8: // [^ \t] - { - { - l.sc = 0 - l.c = '-' - n := len(l.val) - l.unget(l.val[n-1]) - return '-' - } - goto yystate0 - } -yyrule9: // {int_lit} - { - return l.int(lval) - } -yyrule10: // {float_lit} - { - return l.float(lval) - } -yyrule11: // {hex_lit} - { - return l.hex(lval) - } -yyrule12: // {bit_lit} - { - return l.bit(lval) - } -yyrule13: // \" - { - l.sc = S1 - goto yystate0 - } -yyrule14: // ' - { - l.sc = S2 - goto yystate0 - } -yyrule15: // ` - { - l.sc = S4 - goto yystate0 - } -yyrule16: // [^\"\\]* - { - l.stringLit = append(l.stringLit, l.val...) - goto yystate0 - } -yyrule17: // \\. - { - l.stringLit = append(l.stringLit, l.val...) - goto yystate0 - } -yyrule18: // \"\" - { - l.stringLit = append(l.stringLit, '"') - goto yystate0 - } -yyrule19: // \" - { - l.stringLit = append(l.stringLit, '"') - l.sc = 0 - return l.str(lval, "\"") - } -yyrule20: // [^'\\]* - { - l.stringLit = append(l.stringLit, l.val...) - goto yystate0 - } -yyrule21: // \\. - { - l.stringLit = append(l.stringLit, l.val...) - goto yystate0 - } -yyrule22: // '' - { - l.stringLit = append(l.stringLit, '\'') - goto yystate0 - } -yyrule23: // ' - { - l.stringLit = append(l.stringLit, '\'') - l.sc = 0 - return l.str(lval, "'") - } -yyrule24: // [^`]* - { - l.stringLit = append(l.stringLit, l.val...) - goto yystate0 - } -yyrule25: // `` - { - l.stringLit = append(l.stringLit, '`') - goto yystate0 - } -yyrule26: // ` - { - l.sc = 0 - lval.item = string(l.stringLit) - l.stringLit = l.stringLit[0:0] - return identifier - } -yyrule27: // "&&" - { - return andand - } -yyrule28: // "&^" - { - return andnot - } -yyrule29: // "<<" - { - return lsh - } -yyrule30: // "<=" - { - return le - } -yyrule31: // "=" - { - return eq - } -yyrule32: // ">=" - { - return ge - } -yyrule33: // "!=" - { - return neq - } -yyrule34: // "<>" - { - return neq - } -yyrule35: // "||" - { - return oror - } -yyrule36: // ">>" - { - return rsh - } -yyrule37: // "<=>" - { - return nulleq - } -yyrule38: // "@" - { - return at - } -yyrule39: // "?" - { - return placeholder - } -yyrule40: // {abs} - { - lval.item = string(l.val) - return abs - } -yyrule41: // {add} - { - return add - } -yyrule42: // {adddate} - { - lval.item = string(l.val) - return addDate - } -yyrule43: // {admin} - { - lval.item = string(l.val) - return admin - } -yyrule44: // {after} - { - lval.item = string(l.val) - return after - } -yyrule45: // {all} - { - return all - } -yyrule46: // {alter} - { - return alter - } -yyrule47: // {and} - { - return and - } -yyrule48: // {any} - { - lval.item = string(l.val) - return any - } -yyrule49: // {asc} - { - return asc - } -yyrule50: // {as} - { - return as - } -yyrule51: // {auto_increment} - { - lval.item = string(l.val) - return autoIncrement - } -yyrule52: // {avg} - { - lval.item = string(l.val) - return avg - } -yyrule53: // {avg_row_length} - { - lval.item = string(l.val) - return avgRowLength - } -yyrule54: // {begin} - { - lval.item = string(l.val) - return begin - } -yyrule55: // {between} - { - return between - } -yyrule56: // {both} - { - return both - } -yyrule57: // {btree} - { - lval.item = string(l.val) - return btree - } -yyrule58: // {by} - { - return by - } -yyrule59: // {case} - { - return caseKwd - } -yyrule60: // {cast} - { - lval.item = string(l.val) - return cast - } -yyrule61: // {character} - { - return character - } -yyrule62: // {charset} - { - lval.item = string(l.val) - return charsetKwd - } -yyrule63: // {check} - { - return check - } -yyrule64: // {checksum} - { - lval.item = string(l.val) - return checksum - } -yyrule65: // {coalesce} - { - lval.item = string(l.val) - return coalesce - } -yyrule66: // {collate} - { - return collate - } -yyrule67: // {collation} - { - lval.item = string(l.val) - return collation - } -yyrule68: // {column} - { - return column - } -yyrule69: // {columns} - { - lval.item = string(l.val) - return columns - } -yyrule70: // {comment} - { - lval.item = string(l.val) - return comment - } -yyrule71: // {commit} - { - lval.item = string(l.val) - return commit - } -yyrule72: // {committed} - { - lval.item = string(l.val) - return committed - } -yyrule73: // {compact} - { - lval.item = string(l.val) - return compact - } -yyrule74: // {compressed} - { - lval.item = string(l.val) - return compressed - } -yyrule75: // {compression} - { - lval.item = string(l.val) - return compression - } -yyrule76: // {concat} - { - lval.item = string(l.val) - return concat - } -yyrule77: // {concat_ws} - { - lval.item = string(l.val) - return concatWs - } -yyrule78: // {connection} - { - lval.item = string(l.val) - return connection - } -yyrule79: // {connection_id} - { - lval.item = string(l.val) - return connectionID - } -yyrule80: // {constraint} - { - return constraint - } -yyrule81: // {convert} - { - lval.item = string(l.val) - return convert - } -yyrule82: // {count} - { - lval.item = string(l.val) - return count - } -yyrule83: // {create} - { - return create - } -yyrule84: // {cross} - { - return cross - } -yyrule85: // {curdate} - { - lval.item = string(l.val) - return curDate - } -yyrule86: // {current_date} - { - lval.item = string(l.val) - return currentDate - } -yyrule87: // {curtime} - { - lval.item = string(l.val) - return curTime - } -yyrule88: // {current_time} - { - lval.item = string(l.val) - return currentTime - } -yyrule89: // {current_user} - { - lval.item = string(l.val) - return currentUser - } -yyrule90: // {database} - { - lval.item = string(l.val) - return database - } -yyrule91: // {databases} - { - return databases - } -yyrule92: // {date_add} - { - lval.item = string(l.val) - return dateAdd - } -yyrule93: // {date_sub} - { - lval.item = string(l.val) - return dateSub - } -yyrule94: // {day} - { - lval.item = string(l.val) - return day - } -yyrule95: // {dayname} - { - lval.item = string(l.val) - return dayname - } -yyrule96: // {dayofweek} - { - lval.item = string(l.val) - return dayofweek - } -yyrule97: // {dayofmonth} - { - lval.item = string(l.val) - return dayofmonth - } -yyrule98: // {dayofyear} - { - lval.item = string(l.val) - return dayofyear - } -yyrule99: // {day_hour} - { - lval.item = string(l.val) - return dayHour - } -yyrule100: // {day_microsecond} - { - lval.item = string(l.val) - return dayMicrosecond - } -yyrule101: // {day_minute} - { - lval.item = string(l.val) - return dayMinute - } -yyrule102: // {day_second} - { - lval.item = string(l.val) - return daySecond - } -yyrule103: // {ddl} - { - return ddl - } -yyrule104: // {deallocate} - { - lval.item = string(l.val) - return deallocate - } -yyrule105: // {default} - { - return defaultKwd - } -yyrule106: // {delayed} - { - return delayed - } -yyrule107: // {delay_key_write} - { - lval.item = string(l.val) - return delayKeyWrite - } -yyrule108: // {delete} - { - return deleteKwd - } -yyrule109: // {desc} - { - return desc - } -yyrule110: // {describe} - { - return describe - } -yyrule111: // {drop} - { - return drop - } -yyrule112: // {distinct} - { - return distinct - } -yyrule113: // {div} - { - return div - } -yyrule114: // {do} - { - lval.item = string(l.val) - return do - } -yyrule115: // {dual} - { - return dual - } -yyrule116: // {duplicate} - { - lval.item = string(l.val) - return duplicate - } -yyrule117: // {dynamic} - { - lval.item = string(l.val) - return dynamic - } -yyrule118: // {else} - { - return elseKwd - } -yyrule119: // {end} - { - lval.item = string(l.val) - return end - } -yyrule120: // {engine} - { - lval.item = string(l.val) - return engine - } -yyrule121: // {engines} - { - lval.item = string(l.val) - return engines - } -yyrule122: // {execute} - { - lval.item = string(l.val) - return execute - } -yyrule123: // {enum} - { - return enum - } -yyrule124: // {escape} - { - lval.item = string(l.val) - return escape - } -yyrule125: // {exists} - { - return exists - } -yyrule126: // {explain} - { - return explain - } -yyrule127: // {extract} - { - lval.item = string(l.val) - return extract - } -yyrule128: // {fields} - { - lval.item = string(l.val) - return fields - } -yyrule129: // {first} - { - lval.item = string(l.val) - return first - } -yyrule130: // {fixed} - { - lval.item = string(l.val) - return fixed - } -yyrule131: // {for} - { - return forKwd - } -yyrule132: // {foreign} - { - return foreign - } -yyrule133: // {found_rows} - { - lval.item = string(l.val) - return foundRows - } -yyrule134: // {from} - { - return from - } -yyrule135: // {full} - { - lval.item = string(l.val) - return full - } -yyrule136: // {fulltext} - { - return fulltext - } -yyrule137: // {grant} - { - return grant - } -yyrule138: // {grants} - { - lval.item = string(l.val) - return grants - } -yyrule139: // {group} - { - return group - } -yyrule140: // {group_concat} - { - lval.item = string(l.val) - return groupConcat - } -yyrule141: // {hash} - { - lval.item = string(l.val) - return hash - } -yyrule142: // {having} - { - return having - } -yyrule143: // {high_priority} - { - return highPriority - } -yyrule144: // {hour} - { - lval.item = string(l.val) - return hour - } -yyrule145: // {hour_microsecond} - { - lval.item = string(l.val) - return hourMicrosecond - } -yyrule146: // {hour_minute} - { - lval.item = string(l.val) - return hourMinute - } -yyrule147: // {hour_second} - { - lval.item = string(l.val) - return hourSecond - } -yyrule148: // {identified} - { - lval.item = string(l.val) - return identified - } -yyrule149: // {if} - { - lval.item = string(l.val) - return ifKwd - } -yyrule150: // {ifnull} - { - lval.item = string(l.val) - return ifNull - } -yyrule151: // {ignore} - { - return ignore - } -yyrule152: // {index} - { - return index - } -yyrule153: // {inner} - { - return inner - } -yyrule154: // {insert} - { - return insert - } -yyrule155: // {interval} - { - return interval - } -yyrule156: // {into} - { - return into - } -yyrule157: // {in} - { - return in - } -yyrule158: // {is} - { - return is - } -yyrule159: // {isolation} - { - lval.item = string(l.val) - return isolation - } -yyrule160: // {join} - { - return join - } -yyrule161: // {key} - { - return key - } -yyrule162: // {key_block_size} - { - lval.item = string(l.val) - return keyBlockSize - } -yyrule163: // {leading} - { - return leading - } -yyrule164: // {left} - { - lval.item = string(l.val) - return left - } -yyrule165: // {length} - { - lval.item = string(l.val) - return length - } -yyrule166: // {level} - { - lval.item = string(l.val) - return level - } -yyrule167: // {like} - { - return like - } -yyrule168: // {limit} - { - return limit - } -yyrule169: // {local} - { - lval.item = string(l.val) - return local - } -yyrule170: // {locate} - { - lval.item = string(l.val) - return locate - } -yyrule171: // {lock} - { - return lock - } -yyrule172: // {lower} - { - lval.item = string(l.val) - return lower - } -yyrule173: // {low_priority} - { - return lowPriority - } -yyrule174: // {max} - { - lval.item = string(l.val) - return max - } -yyrule175: // {max_rows} - { - lval.item = string(l.val) - return maxRows - } -yyrule176: // {microsecond} - { - lval.item = string(l.val) - return microsecond - } -yyrule177: // {min} - { - lval.item = string(l.val) - return min - } -yyrule178: // {minute} - { - lval.item = string(l.val) - return minute - } -yyrule179: // {minute_microsecond} - { - lval.item = string(l.val) - return minuteMicrosecond - } -yyrule180: // {minute_second} - { - lval.item = string(l.val) - return minuteSecond - } -yyrule181: // {min_rows} - { - lval.item = string(l.val) - return minRows - } -yyrule182: // {mod} - { - return mod - } -yyrule183: // {mode} - { - lval.item = string(l.val) - return mode - } -yyrule184: // {month} - { - lval.item = string(l.val) - return month - } -yyrule185: // {names} - { - lval.item = string(l.val) - return names - } -yyrule186: // {national} - { - lval.item = string(l.val) - return national - } -yyrule187: // {not} - { - return not - } -yyrule188: // {offset} - { - lval.item = string(l.val) - return offset - } -yyrule189: // {on} - { - return on - } -yyrule190: // {only} - { - lval.item = string(l.val) - return only - } -yyrule191: // {option} - { - return option - } -yyrule192: // {order} - { - return order - } -yyrule193: // {or} - { - return or - } -yyrule194: // {outer} - { - return outer - } -yyrule195: // {password} - { - lval.item = string(l.val) - return password - } -yyrule196: // {pow} - { - lval.item = string(l.val) - return pow - } -yyrule197: // {power} - { - lval.item = string(l.val) - return power - } -yyrule198: // {prepare} - { - lval.item = string(l.val) - return prepare - } -yyrule199: // {primary} - { - return primary - } -yyrule200: // {procedure} - { - return procedure - } -yyrule201: // {quarter} - { - lval.item = string(l.val) - return quarter - } -yyrule202: // {quick} - { - lval.item = string(l.val) - return quick - } -yyrule203: // redundant - { - lval.item = string(l.val) - return redundant - } -yyrule204: // {right} - { - return right - } -yyrule205: // {rollback} - { - lval.item = string(l.val) - return rollback - } -yyrule206: // {row} - { - lval.item = string(l.val) - return row - } -yyrule207: // {row_format} - { - lval.item = string(l.val) - return rowFormat - } -yyrule208: // {schema} - { - lval.item = string(l.val) - return schema - } -yyrule209: // {schemas} - { - return schemas - } -yyrule210: // {serializable} - { - lval.item = string(l.val) - return serializable - } -yyrule211: // {session} - { - lval.item = string(l.val) - return session - } -yyrule212: // {some} - { - lval.item = string(l.val) - return some - } -yyrule213: // {start} - { - lval.item = string(l.val) - return start - } -yyrule214: // {status} - { - lval.item = string(l.val) - return status - } -yyrule215: // {global} - { - lval.item = string(l.val) - return global - } -yyrule216: // {rand} - { - lval.item = string(l.val) - return rand - } -yyrule217: // {read} - { - return read - } -yyrule218: // {repeat} - { - lval.item = string(l.val) - return repeat - } -yyrule219: // {repeatable} - { - lval.item = string(l.val) - return repeatable - } -yyrule220: // {regexp} - { - return regexpKwd - } -yyrule221: // {replace} - { - lval.item = string(l.val) - return replace - } -yyrule222: // {references} - { - return references - } -yyrule223: // {rlike} - { - return rlike - } -yyrule224: // {sys_var} - { - lval.item = string(l.val) - return sysVar - } -yyrule225: // {user_var} - { - lval.item = string(l.val) - return userVar - } -yyrule226: // {second} - { - lval.item = string(l.val) - return second - } -yyrule227: // {second_microsecond} - { - lval.item = string(l.val) - return secondMicrosecond - } -yyrule228: // {select} - { - return selectKwd - } -yyrule229: // {set} - { - return set - } -yyrule230: // {share} - { - return share - } -yyrule231: // {show} - { - return show - } -yyrule232: // {subdate} - { - lval.item = string(l.val) - return subDate - } -yyrule233: // {strcmp} - { - lval.item = string(l.val) - return strcmp - } -yyrule234: // {substr} - { - lval.item = string(l.val) - return substring - } -yyrule235: // {substring} - { - lval.item = string(l.val) - return substring - } -yyrule236: // {substring_index} - { - lval.item = string(l.val) - return substringIndex - } -yyrule237: // {sum} - { - lval.item = string(l.val) - return sum - } -yyrule238: // {sysdate} - { - lval.item = string(l.val) - return sysDate - } -yyrule239: // {table} - { - return tableKwd - } -yyrule240: // {tables} - { - lval.item = string(l.val) - return tables - } -yyrule241: // {then} - { - return then - } -yyrule242: // {to} - { - return to - } -yyrule243: // {trailing} - { - return trailing - } -yyrule244: // {transaction} - { - lval.item = string(l.val) - return transaction - } -yyrule245: // {triggers} - { - lval.item = string(l.val) - return triggers - } -yyrule246: // {trim} - { - lval.item = string(l.val) - return trim - } -yyrule247: // {truncate} - { - lval.item = string(l.val) - return truncate - } -yyrule248: // {uncommitted} - { - lval.item = string(l.val) - return uncommitted - } -yyrule249: // {union} - { - return union - } -yyrule250: // {unique} - { - return unique - } -yyrule251: // {unknown} - { - lval.item = string(l.val) - return unknown - } -yyrule252: // {nullif} - { - lval.item = string(l.val) - return nullIf - } -yyrule253: // {unlock} - { - return unlock - } -yyrule254: // {update} - { - return update - } -yyrule255: // {upper} - { - lval.item = string(l.val) - return upper - } -yyrule256: // {use} - { - return use - } -yyrule257: // {user} - { - lval.item = string(l.val) - return user - } -yyrule258: // {using} - { - return using - } -yyrule259: // {value} - { - lval.item = string(l.val) - return value - } -yyrule260: // {values} - { - return values - } -yyrule261: // {variables} - { - lval.item = string(l.val) - return variables - } -yyrule262: // {version} - { - lval.item = string(l.val) - return version - } -yyrule263: // {warnings} - { - lval.item = string(l.val) - return warnings - } -yyrule264: // {week} - { - lval.item = string(l.val) - return week - } -yyrule265: // {weekday} - { - lval.item = string(l.val) - return weekday - } -yyrule266: // {weekofyear} - { - lval.item = string(l.val) - return weekofyear - } -yyrule267: // {when} - { - return when - } -yyrule268: // {where} - { - return where - } -yyrule269: // {write} - { - return write - } -yyrule270: // {xor} - { - return xor - } -yyrule271: // {yearweek} - { - lval.item = string(l.val) - return yearweek - } -yyrule272: // {year_month} - { - lval.item = string(l.val) - return yearMonth - - } -yyrule273: // {signed} - { - lval.item = string(l.val) - return signed - } -yyrule274: // {unsigned} - { - return unsigned - } -yyrule275: // {zerofill} - { - return zerofill - } -yyrule276: // {null} - { - lval.item = nil - return null - } -yyrule277: // {false} - { - return falseKwd - } -yyrule278: // {true} - { - return trueKwd - } -yyrule279: // {calc_found_rows} - { - lval.item = string(l.val) - return calcFoundRows - } -yyrule280: // {current_ts} - { - lval.item = string(l.val) - return currentTs - } -yyrule281: // {localtime} - { - return localTime - } -yyrule282: // {localts} - { - return localTs - } -yyrule283: // {now} - { - lval.item = string(l.val) - return now - } -yyrule284: // {bit} - { - lval.item = string(l.val) - return bitType - } -yyrule285: // {tiny} - { - lval.item = string(l.val) - return tinyIntType - } -yyrule286: // {tinyint} - { - lval.item = string(l.val) - return tinyIntType - } -yyrule287: // {smallint} - { - lval.item = string(l.val) - return smallIntType - } -yyrule288: // {mediumint} - { - lval.item = string(l.val) - return mediumIntType - } -yyrule289: // {bigint} - { - lval.item = string(l.val) - return bigIntType - } -yyrule290: // {decimal} - { - lval.item = string(l.val) - return decimalType - } -yyrule291: // {numeric} - { - lval.item = string(l.val) - return numericType - } -yyrule292: // {float} - { - lval.item = string(l.val) - return floatType - } -yyrule293: // {double} - { - lval.item = string(l.val) - return doubleType - } -yyrule294: // {precision} - { - lval.item = string(l.val) - return precisionType - } -yyrule295: // {real} - { - lval.item = string(l.val) - return realType - } -yyrule296: // {date} - { - lval.item = string(l.val) - return dateType - } -yyrule297: // {time} - { - lval.item = string(l.val) - return timeType - } -yyrule298: // {timestamp} - { - lval.item = string(l.val) - return timestampType - } -yyrule299: // {datetime} - { - lval.item = string(l.val) - return datetimeType - } -yyrule300: // {year} - { - lval.item = string(l.val) - return yearType - } -yyrule301: // {char} - { - lval.item = string(l.val) - return charType - } -yyrule302: // {varchar} - { - lval.item = string(l.val) - return varcharType - } -yyrule303: // {binary} - { - lval.item = string(l.val) - return binaryType - } -yyrule304: // {varbinary} - { - lval.item = string(l.val) - return varbinaryType - } -yyrule305: // {tinyblob} - { - lval.item = string(l.val) - return tinyblobType - } -yyrule306: // {blob} - { - lval.item = string(l.val) - return blobType - } -yyrule307: // {mediumblob} - { - lval.item = string(l.val) - return mediumblobType - } -yyrule308: // {longblob} - { - lval.item = string(l.val) - return longblobType - } -yyrule309: // {tinytext} - { - lval.item = string(l.val) - return tinytextType - } -yyrule310: // {mediumtext} - { - lval.item = string(l.val) - return mediumtextType - } -yyrule311: // {text} - { - lval.item = string(l.val) - return textType - } -yyrule312: // {longtext} - { - lval.item = string(l.val) - return longtextType - } -yyrule313: // {bool} - { - lval.item = string(l.val) - return boolType - } -yyrule314: // {boolean} - { - lval.item = string(l.val) - return booleanType - } -yyrule315: // {byte} - { - lval.item = string(l.val) - return byteType - } -yyrule316: // {int} - { - lval.item = string(l.val) - return intType - } -yyrule317: // {integer} - { - lval.item = string(l.val) - return integerType - } -yyrule318: // {ident} - { - lval.item = string(l.val) - return l.handleIdent(lval) - } -yyrule319: // . - { - return c0 - } - panic("unreachable") - - goto yyabort // silence unused label error - -yyabort: // no lexem recognized - return int(unicode.ReplacementChar) -} - -func (l *lexer) npos() (line, col int) { - if line, col = l.nline, l.ncol; col == 0 { - line-- - col = l.lcol + 1 - } - return -} - -func (l *lexer) str(lval *yySymType, pref string) int { - l.sc = 0 - // TODO: performance issue. - s := string(l.stringLit) - l.stringLit = l.stringLit[0:0] - if pref == "'" { - s = strings.Replace(s, "\\'", "'", -1) - s = strings.TrimSuffix(s, "'") + "\"" - pref = "\"" - } - v := stringutil.RemoveUselessBackslash(pref + s) - v, err := strconv.Unquote(v) - if err != nil { - v = strings.TrimSuffix(s, pref) - } - lval.item = v - return stringLit -} - -func (l *lexer) trimIdent(idt string) string { - idt = strings.TrimPrefix(idt, "`") - idt = strings.TrimSuffix(idt, "`") - return idt -} - -func (l *lexer) int(lval *yySymType) int { - n, err := strconv.ParseUint(string(l.val), 0, 64) - if err != nil { - l.errf("integer literal: %v", err) - return int(unicode.ReplacementChar) - } - - switch { - case n < math.MaxInt64: - lval.item = int64(n) - default: - lval.item = uint64(n) - } - return intLit -} - -func (l *lexer) float(lval *yySymType) int { - n, err := strconv.ParseFloat(string(l.val), 64) - if err != nil { - l.errf("float literal: %v", err) - return int(unicode.ReplacementChar) - } - - lval.item = float64(n) - return floatLit -} - -// https://dev.mysql.com/doc/refman/5.7/en/hexadecimal-literals.html -func (l *lexer) hex(lval *yySymType) int { - s := string(l.val) - h, err := mysql.ParseHex(s) - if err != nil { - l.errf("hexadecimal literal: %v", err) - return int(unicode.ReplacementChar) - } - lval.item = h - return hexLit -} - -// https://dev.mysql.com/doc/refman/5.7/en/bit-type.html -func (l *lexer) bit(lval *yySymType) int { - s := string(l.val) - b, err := mysql.ParseBit(s, -1) - if err != nil { - l.errf("bit literal: %v", err) - return int(unicode.ReplacementChar) - } - lval.item = b - return bitLit -} - -func (l *lexer) handleIdent(lval *yySymType) int { - s := lval.item.(string) - // A character string literal may have an optional character set introducer and COLLATE clause: - // [_charset_name]'string' [COLLATE collation_name] - // See: https://dev.mysql.com/doc/refman/5.7/en/charset-literal.html - if !strings.HasPrefix(s, "_") { - return identifier - } - cs, _, err := charset.GetCharsetInfo(s[1:]) - if err != nil { - return identifier - } - lval.item = cs - return underscoreCS -} diff --git a/vendor/github.com/pingcap/tidb/parser/yy_parser.go b/vendor/github.com/pingcap/tidb/parser/yy_parser.go deleted file mode 100644 index c56f639f8fc6..000000000000 --- a/vendor/github.com/pingcap/tidb/parser/yy_parser.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package parser - -import ( - "regexp" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" -) - -// Error instances. -var ( - ErrSyntax = terror.ClassParser.New(CodeSyntaxErr, "syntax error") -) - -// Error codes. -const ( - CodeSyntaxErr terror.ErrCode = 1 -) - -var ( - specCodePattern = regexp.MustCompile(`\/\*!(M?[0-9]{5,6})?([^*]|\*+[^*/])*\*+\/`) - specCodeStart = regexp.MustCompile(`^\/\*!(M?[0-9]{5,6} )?[ \t]*`) - specCodeEnd = regexp.MustCompile(`[ \t]*\*\/$`) -) - -func trimComment(txt string) string { - txt = specCodeStart.ReplaceAllString(txt, "") - return specCodeEnd.ReplaceAllString(txt, "") -} - -// See: http://dev.mysql.com/doc/refman/5.7/en/comments.html -// Convert "/*!VersionNumber MySQL-specific-code */" to "MySQL-specific-code". -// TODO: Find a better way: -// 1. RegExpr is slow. -// 2. Handle nested comment. -func handleMySQLSpecificCode(sql string) string { - if strings.Index(sql, "/*!") == -1 { - // Fast way to check if text contains MySQL-specific code. - return sql - } - // SQL text contains MySQL-specific code. We should convert it to normal SQL text. - return specCodePattern.ReplaceAllStringFunc(sql, trimComment) -} - -// Parse parses a query string to raw ast.StmtNode. -// If charset or collation is "", default charset and collation will be used. -func Parse(sql, charset, collation string) ([]ast.StmtNode, error) { - if charset == "" { - charset = mysql.DefaultCharset - } - if collation == "" { - collation = mysql.DefaultCollationName - } - sql = handleMySQLSpecificCode(sql) - l := NewLexer(sql) - l.SetCharsetInfo(charset, collation) - yyParse(l) - if len(l.Errors()) != 0 { - return nil, errors.Trace(l.Errors()[0]) - } - return l.Stmts(), nil -} - -// ParseOneStmt parses a query and returns an ast.StmtNode. -// The query must have one statement, otherwise ErrSyntax is returned. -func ParseOneStmt(sql, charset, collation string) (ast.StmtNode, error) { - stmts, err := Parse(sql, charset, collation) - if err != nil { - return nil, errors.Trace(err) - } - if len(stmts) != 1 { - return nil, ErrSyntax - } - return stmts[0], nil -} diff --git a/vendor/github.com/pingcap/tidb/perfschema/const.go b/vendor/github.com/pingcap/tidb/perfschema/const.go deleted file mode 100644 index f0e789063b20..000000000000 --- a/vendor/github.com/pingcap/tidb/perfschema/const.go +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package perfschema - -// Performance Schema Name. -const ( - Name = "PERFORMANCE_SCHEMA" -) - -// Definition order same as MySQL's reference manual, so don't bother to -// adjust according to alphabetical order. -const ( - TableSetupActors = "SETUP_ACTORS" - TableSetupObjects = "SETUP_OBJECTS" - TableSetupInstruments = "SETUP_INSTRUMENTS" - TableSetupConsumers = "SETUP_CONSUMERS" - TableSetupTimers = "SETUP_TIMERS" - TableStmtsCurrent = "EVENTS_STATEMENTS_CURRENT" - TableStmtsHistory = "EVENTS_STATEMENTS_HISTORY" - TableStmtsHistoryLong = "EVENTS_STATEMENTS_HISTORY_LONG" - TablePreparedStmtsInstances = "PREPARED_STATEMENTS_INSTANCES" - TableTransCurrent = "EVENTS_TRANSACTIONS_CURRENT" - TableTransHistory = "EVENTS_TRANSACTIONS_HISTORY" - TableTransHistoryLong = "EVENTS_TRANSACTIONS_HISTORY_LONG" - TableStagesCurrent = "EVENTS_STAGES_CURRENT" - TableStagesHistory = "EVENTS_STAGES_HISTORY" - TableStagesHistoryLong = "EVENTS_STAGES_HISTORY_LONG" -) - -// PerfSchemaTables is a shortcut to involve all table names. -var PerfSchemaTables = []string{ - TableSetupActors, - TableSetupObjects, - TableSetupInstruments, - TableSetupConsumers, - TableSetupTimers, - TableStmtsCurrent, - TableStmtsHistory, - TableStmtsHistoryLong, - TablePreparedStmtsInstances, - TableTransCurrent, - TableTransHistory, - TableTransHistoryLong, - TableStagesCurrent, - TableStagesHistory, - TableStagesHistoryLong, -} - -// ColumnSetupActors contains the column name definitions for table setup_actors, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.setup_actors ( -// HOST CHAR(60) NOT NULL DEFAULT '%', -// USER CHAR(32) NOT NULL DEFAULT '%', -// ROLE CHAR(16) NOT NULL DEFAULT '%', -// ENABLED ENUM('YES','NO') NOT NULL DEFAULT 'YES', -// HISTORY ENUM('YES','NO') NOT NULL DEFAULT 'YES'); -var ColumnSetupActors = []string{"HOST", "USER", "ROLE", "ENABLED", "HISTORY"} - -// ColumnSetupObjects contains the column name definitions for table setup_objects, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.setup_objects ( -// OBJECT_TYPE ENUM('EVENT','FUNCTION','TABLE') NOT NULL DEFAULT 'TABLE', -// OBJECT_SCHEMA VARCHAR(64) DEFAULT '%', -// OBJECT_NAME VARCHAR(64) NOT NULL DEFAULT '%', -// ENABLED ENUM('YES','NO') NOT NULL DEFAULT 'YES', -// TIMED ENUM('YES','NO') NOT NULL DEFAULT 'YES'); -var ColumnSetupObjects = []string{"OBJECT_TYPE", "OBJECT_SCHEMA", "OBJECT_NAME", "ENABLED", "TIMED"} - -// ColumnSetupInstruments contains the column name definitions for table setup_instruments, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.setup_instruments ( -// NAME VARCHAR(128) NOT NULL, -// ENABLED ENUM('YES','NO') NOT NULL, -// TIMED ENUM('YES','NO') NOT NULL); -var ColumnSetupInstruments = []string{"NAMED", "ENABLED", "TIMED"} - -// ColumnSetupConsumers contains the column name definitions for table setup_consumers, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.setup_consumers ( -// NAME VARCHAR(64) NOT NULL, -// ENABLED ENUM('YES','NO') NOT NULL); -var ColumnSetupConsumers = []string{"NAMED", "ENABLED"} - -// ColumnSetupTimers contains the column name definitions for table setup_timers, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.setup_timers ( -// NAME VARCHAR(64) NOT NULL, -// TIMER_NAME ENUM('NANOSECOND','MICROSECOND','MILLISECOND') NOT NULL); -var ColumnSetupTimers = []string{"NAME", "TIMER_NAME"} - -// ColumnStmtsCurrent contains the column name definitions for table events_statements_current, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_statements_current ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// LOCK_TIME BIGINT(20) UNSIGNED NOT NULL, -// SQL_TEXT LONGTEXT, -// DIGEST VARCHAR(32), -// DIGEST_TEXT LONGTEXT, -// CURRENT_SCHEMA VARCHAR(64), -// OBJECT_TYPE VARCHAR(64), -// OBJECT_SCHEMA VARCHAR(64), -// OBJECT_NAME VARCHAR(64), -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// MYSQL_ERRNO INT(11), -// RETURNED_SQLSTATE VARCHAR(5), -// MESSAGE_TEXT VARCHAR(128), -// ERRORS BIGINT(20) UNSIGNED NOT NULL, -// WARNINGS BIGINT(20) UNSIGNED NOT NULL, -// ROWS_AFFECTED BIGINT(20) UNSIGNED NOT NULL, -// ROWS_SENT BIGINT(20) UNSIGNED NOT NULL, -// ROWS_EXAMINED BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_DISK_TABLES BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_TABLES BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_RANGE_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE_CHECK BIGINT(20) UNSIGNED NOT NULL, -// SELECT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// SORT_MERGE_PASSES BIGINT(20) UNSIGNED NOT NULL, -// SORT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SORT_ROWS BIGINT(20) UNSIGNED NOT NULL, -// SORT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// NO_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NO_GOOD_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE'), -// NESTING_EVENT_LEVEL INT(11)); -var ColumnStmtsCurrent = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "LOCK_TIME", - "SQL_TEXT", - "DIGEST", - "DIGEST_TEXT", - "CURRENT_SCHEMA", - "OBJECT_TYPE", - "OBJECT_SCHEMA", - "OBJECT_NAME", - "OBJECT_INSTANCE_BEGIN", - "MYSQL_ERRNO", - "RETURNED_SQLSTATE", - "MESSAGE_TEXT", - "ERRORS", - "WARNINGS", - "ROWS_AFFECTED", - "ROWS_SENT", - "ROWS_EXAMINED", - "CREATED_TMP_DISK_TABLES", - "CREATED_TMP_TABLES", - "SELECT_FULL_JOIN", - "SELECT_FULL_RANGE_JOIN", - "SELECT_RANGE", - "SELECT_RANGE_CHECK", - "SELECT_SCAN", - "SORT_MERGE_PASSES", - "SORT_RANGE", - "SORT_ROWS", - "SORT_SCAN", - "NO_INDEX_USED", - "NO_GOOD_INDEX_USED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", - "NESTING_EVENT_LEVEL", -} - -// ColumnStmtsHistory contains the column name definitions for table events_statements_history, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_statements_history ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// LOCK_TIME BIGINT(20) UNSIGNED NOT NULL, -// SQL_TEXT LONGTEXT, -// DIGEST VARCHAR(32), -// DIGEST_TEXT LONGTEXT, -// CURRENT_SCHEMA VARCHAR(64), -// OBJECT_TYPE VARCHAR(64), -// OBJECT_SCHEMA VARCHAR(64), -// OBJECT_NAME VARCHAR(64), -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// MYSQL_ERRNO INT(11), -// RETURNED_SQLSTATE VARCHAR(5), -// MESSAGE_TEXT VARCHAR(128), -// ERRORS BIGINT(20) UNSIGNED NOT NULL, -// WARNINGS BIGINT(20) UNSIGNED NOT NULL, -// ROWS_AFFECTED BIGINT(20) UNSIGNED NOT NULL, -// ROWS_SENT BIGINT(20) UNSIGNED NOT NULL, -// ROWS_EXAMINED BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_DISK_TABLES BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_TABLES BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_RANGE_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE_CHECK BIGINT(20) UNSIGNED NOT NULL, -// SELECT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// SORT_MERGE_PASSES BIGINT(20) UNSIGNED NOT NULL, -// SORT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SORT_ROWS BIGINT(20) UNSIGNED NOT NULL, -// SORT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// NO_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NO_GOOD_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE'), -// NESTING_EVENT_LEVEL INT(11)); -var ColumnStmtsHistory = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "LOCK_TIME", - "SQL_TEXT", - "DIGEST", - "DIGEST_TEXT", - "CURRENT_SCHEMA", - "OBJECT_TYPE", - "OBJECT_SCHEMA", - "OBJECT_NAME", - "OBJECT_INSTANCE_BEGIN", - "MYSQL_ERRNO", - "RETURNED_SQLSTATE", - "MESSAGE_TEXT", - "ERRORS", - "WARNINGS", - "ROWS_AFFECTED", - "ROWS_SENT", - "ROWS_EXAMINED", - "CREATED_TMP_DISK_TABLES", - "CREATED_TMP_TABLES", - "SELECT_FULL_JOIN", - "SELECT_FULL_RANGE_JOIN", - "SELECT_RANGE", - "SELECT_RANGE_CHECK", - "SELECT_SCAN", - "SORT_MERGE_PASSES", - "SORT_RANGE", - "SORT_ROWS", - "SORT_SCAN", - "NO_INDEX_USED", - "NO_GOOD_INDEX_USED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", - "NESTING_EVENT_LEVEL", -} - -// ColumnStmtsHistoryLong contains the column name definitions for table events_statements_history_long, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_statements_history_long ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// LOCK_TIME BIGINT(20) UNSIGNED NOT NULL, -// SQL_TEXT LONGTEXT, -// DIGEST VARCHAR(32), -// DIGEST_TEXT LONGTEXT, -// CURRENT_SCHEMA VARCHAR(64), -// OBJECT_TYPE VARCHAR(64), -// OBJECT_SCHEMA VARCHAR(64), -// OBJECT_NAME VARCHAR(64), -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// MYSQL_ERRNO INT(11), -// RETURNED_SQLSTATE VARCHAR(5), -// MESSAGE_TEXT VARCHAR(128), -// ERRORS BIGINT(20) UNSIGNED NOT NULL, -// WARNINGS BIGINT(20) UNSIGNED NOT NULL, -// ROWS_AFFECTED BIGINT(20) UNSIGNED NOT NULL, -// ROWS_SENT BIGINT(20) UNSIGNED NOT NULL, -// ROWS_EXAMINED BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_DISK_TABLES BIGINT(20) UNSIGNED NOT NULL, -// CREATED_TMP_TABLES BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_FULL_RANGE_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SELECT_RANGE_CHECK BIGINT(20) UNSIGNED NOT NULL, -// SELECT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// SORT_MERGE_PASSES BIGINT(20) UNSIGNED NOT NULL, -// SORT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SORT_ROWS BIGINT(20) UNSIGNED NOT NULL, -// SORT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// NO_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NO_GOOD_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE'), -// NESTING_EVENT_LEVEL INT(11)); -var ColumnStmtsHistoryLong = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "LOCK_TIME", - "SQL_TEXT", - "DIGEST", - "DIGEST_TEXT", - "CURRENT_SCHEMA", - "OBJECT_TYPE", - "OBJECT_SCHEMA", - "OBJECT_NAME", - "OBJECT_INSTANCE_BEGIN", - "MYSQL_ERRNO", - "RETURNED_SQLSTATE", - "MESSAGE_TEXT", - "ERRORS", - "WARNINGS", - "ROWS_AFFECTED", - "ROWS_SENT", - "ROWS_EXAMINED", - "CREATED_TMP_DISK_TABLES", - "CREATED_TMP_TABLES", - "SELECT_FULL_JOIN", - "SELECT_FULL_RANGE_JOIN", - "SELECT_RANGE", - "SELECT_RANGE_CHECK", - "SELECT_SCAN", - "SORT_MERGE_PASSES", - "SORT_RANGE", - "SORT_ROWS", - "SORT_SCAN", - "NO_INDEX_USED", - "NO_GOOD_INDEX_USED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", - "NESTING_EVENT_LEVEL", -} - -// ColumnPreparedStmtsInstances contains the column name definitions for table prepared_statements_instances, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.prepared_statements_instances ( -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED NOT NULL, -// STATEMENT_ID BIGINT(20) UNSIGNED NOT NULL, -// STATEMENT_NAME VARCHAR(64), -// SQL_TEXT LONGTEXT NOT NULL, -// OWNER_THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// OWNER_EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// OWNER_OBJECT_TYPE ENUM('EVENT','FUNCTION','TABLE'), -// OWNER_OBJECT_SCHEMA VARCHAR(64), -// OWNER_OBJECT_NAME VARCHAR(64), -// TIMER_PREPARE BIGINT(20) UNSIGNED NOT NULL, -// COUNT_REPREPARE BIGINT(20) UNSIGNED NOT NULL, -// COUNT_EXECUTE BIGINT(20) UNSIGNED NOT NULL, -// SUM_TIMER_EXECUTE BIGINT(20) UNSIGNED NOT NULL, -// MIN_TIMER_EXECUTE BIGINT(20) UNSIGNED NOT NULL, -// AVG_TIMER_EXECUTE BIGINT(20) UNSIGNED NOT NULL, -// MAX_TIMER_EXECUTE BIGINT(20) UNSIGNED NOT NULL, -// SUM_LOCK_TIME BIGINT(20) UNSIGNED NOT NULL, -// SUM_ERRORS BIGINT(20) UNSIGNED NOT NULL, -// SUM_WARNINGS BIGINT(20) UNSIGNED NOT NULL, -// SUM_ROWS_AFFECTED BIGINT(20) UNSIGNED NOT NULL, -// SUM_ROWS_SENT BIGINT(20) UNSIGNED NOT NULL, -// SUM_ROWS_EXAMINED BIGINT(20) UNSIGNED NOT NULL, -// SUM_CREATED_TMP_DISK_TABLES BIGINT(20) UNSIGNED NOT NULL, -// SUM_CREATED_TMP_TABLES BIGINT(20) UNSIGNED NOT NULL, -// SUM_SELECT_FULL_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SUM_SELECT_FULL_RANGE_JOIN BIGINT(20) UNSIGNED NOT NULL, -// SUM_SELECT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SUM_SELECT_RANGE_CHECK BIGINT(20) UNSIGNED NOT NULL, -// SUM_SELECT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// SUM_SORT_MERGE_PASSES BIGINT(20) UNSIGNED NOT NULL, -// SUM_SORT_RANGE BIGINT(20) UNSIGNED NOT NULL, -// SUM_SORT_ROWS BIGINT(20) UNSIGNED NOT NULL, -// SUM_SORT_SCAN BIGINT(20) UNSIGNED NOT NULL, -// SUM_NO_INDEX_USED BIGINT(20) UNSIGNED NOT NULL, -// SUM_NO_GOOD_INDEX_USED BIGINT(20) UNSIGNED NOT NULL); -var ColumnPreparedStmtsInstances = []string{ - "OBJECT_INSTANCE_BEGIN", - "STATEMENT_ID", - "STATEMENT_NAME", - "SQL_TEXT", - "OWNER_THREAD_ID", - "OWNER_EVENT_ID", - "OWNER_OBJECT_TYPE", - "OWNER_OBJECT_SCHEMA", - "OWNER_OBJECT_NAME", - "TIMER_PREPARE", - "COUNT_REPREPARE", - "COUNT_EXECUTE", - "SUM_TIMER_EXECUTE", - "MIN_TIMER_EXECUTE", - "AVG_TIMER_EXECUTE", - "MAX_TIMER_EXECUTE", - "SUM_LOCK_TIME", - "SUM_ERRORS", - "SUM_WARNINGS", - "SUM_ROWS_AFFECTED", - "SUM_ROWS_SENT", - "SUM_ROWS_EXAMINED", - "SUM_CREATED_TMP_DISK_TABLES", - "SUM_CREATED_TMP_TABLES", - "SUM_SELECT_FULL_JOIN", - "SUM_SELECT_FULL_RANGE_JOIN", - "SUM_SELECT_RANGE", - "SUM_SELECT_RANGE_CHECK", - "SUM_SELECT_SCAN", - "SUM_SORT_MERGE_PASSES", - "SUM_SORT_RANGE", - "SUM_SORT_ROWS", - "SUM_SORT_SCAN", - "SUM_NO_INDEX_USED", - "SUM_NO_GOOD_INDEX_USED", -} - -// ColumnTransCurrent contains the column name definitions for table events_transactions_current, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_transactions_current ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// STATE ENUM('ACTIVE','COMMITTED',"ROLLED BACK"), -// TRX_ID BIGINT(20) UNSIGNED, -// GTID VARCHAR(64), -// XID_FORMAT_ID INT(11), -// XID_GTRID VARCHAR(130), -// XID_BQUAL VARCHAR(130), -// XA_STATE VARCHAR(64), -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// ACCESS_MODE ENUM('READ ONLY','READ WRITE'), -// ISOLATION_LEVEL VARCHAR(64), -// AUTOCOMMIT ENUM('YES','NO') NOT NULL, -// NUMBER_OF_SAVEPOINTS BIGINT(20) UNSIGNED, -// NUMBER_OF_ROLLBACK_TO_SAVEPOINT BIGINT(20) UNSIGNED, -// NUMBER_OF_RELEASE_SAVEPOINT BIGINT(20) UNSIGNED, -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnTransCurrent = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "STATE", - "TRX_ID", - "GTID", - "XID_FORMAT_ID", - "XID_GTRID", - "XID_BQUAL", - "XA_STATE", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "ACCESS_MODE", - "ISOLATION_LEVEL", - "AUTOCOMMIT", - "NUMBER_OF_SAVEPOINTS", - "NUMBER_OF_ROLLBACK_TO_SAVEPOINT", - "NUMBER_OF_RELEASE_SAVEPOINT", - "OBJECT_INSTANCE_BEGIN", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} - -// ColumnTransHistory contains the column name definitions for table events_transactions_history, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_transactions_history ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// STATE ENUM('ACTIVE','COMMITTED',"ROLLED BACK"), -// TRX_ID BIGINT(20) UNSIGNED, -// GTID VARCHAR(64), -// XID_FORMAT_ID INT(11), -// XID_GTRID VARCHAR(130), -// XID_BQUAL VARCHAR(130), -// XA_STATE VARCHAR(64), -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// ACCESS_MODE ENUM('READ ONLY','READ WRITE'), -// ISOLATION_LEVEL VARCHAR(64), -// AUTOCOMMIT ENUM('YES','NO') NOT NULL, -// NUMBER_OF_SAVEPOINTS BIGINT(20) UNSIGNED, -// NUMBER_OF_ROLLBACK_TO_SAVEPOINT BIGINT(20) UNSIGNED, -// NUMBER_OF_RELEASE_SAVEPOINT BIGINT(20) UNSIGNED, -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnTransHistory = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "STATE", - "TRX_ID", - "GTID", - "XID_FORMAT_ID", - "XID_GTRID", - "XID_BQUAL", - "XA_STATE", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "ACCESS_MODE", - "ISOLATION_LEVEL", - "AUTOCOMMIT", - "NUMBER_OF_SAVEPOINTS", - "NUMBER_OF_ROLLBACK_TO_SAVEPOINT", - "NUMBER_OF_RELEASE_SAVEPOINT", - "OBJECT_INSTANCE_BEGIN", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} - -// ColumnTransHistoryLong contains the column name definitions for table events_transactions_history_long, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_transactions_history_long ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// STATE ENUM('ACTIVE','COMMITTED',"ROLLED BACK"), -// TRX_ID BIGINT(20) UNSIGNED, -// GTID VARCHAR(64), -// XID_FORMAT_ID INT(11), -// XID_GTRID VARCHAR(130), -// XID_BQUAL VARCHAR(130), -// XA_STATE VARCHAR(64), -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// ACCESS_MODE ENUM('READ ONLY','READ WRITE'), -// ISOLATION_LEVEL VARCHAR(64), -// AUTOCOMMIT ENUM('YES','NO') NOT NULL, -// NUMBER_OF_SAVEPOINTS BIGINT(20) UNSIGNED, -// NUMBER_OF_ROLLBACK_TO_SAVEPOINT BIGINT(20) UNSIGNED, -// NUMBER_OF_RELEASE_SAVEPOINT BIGINT(20) UNSIGNED, -// OBJECT_INSTANCE_BEGIN BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnTransHistoryLong = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "STATE", - "TRX_ID", - "GTID", - "XID_FORMAT_ID", - "XID_GTRID", - "XID_BQUAL", - "XA_STATE", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "ACCESS_MODE", - "ISOLATION_LEVEL", - "AUTOCOMMIT", - "NUMBER_OF_SAVEPOINTS", - "NUMBER_OF_ROLLBACK_TO_SAVEPOINT", - "NUMBER_OF_RELEASE_SAVEPOINT", - "OBJECT_INSTANCE_BEGIN", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} - -// ColumnStagesCurrent contains the column name definitions for table events_stages_current, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_stages_current ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// WORK_COMPLETED BIGINT(20) UNSIGNED, -// WORK_ESTIMATED BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnStagesCurrent = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "WORK_COMPLETED", - "WORK_ESTIMATED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} - -// ColumnStagesHistory contains the column name definitions for table events_stages_history, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_stages_history ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// WORK_COMPLETED BIGINT(20) UNSIGNED, -// WORK_ESTIMATED BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnStagesHistory = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "WORK_COMPLETED", - "WORK_ESTIMATED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} - -// ColumnStagesHistoryLong contains the column name definitions for table events_stages_history_long, same as MySQL. -// -// CREATE TABLE if not exists performance_schema.events_stages_history_long ( -// THREAD_ID BIGINT(20) UNSIGNED NOT NULL, -// EVENT_ID BIGINT(20) UNSIGNED NOT NULL, -// END_EVENT_ID BIGINT(20) UNSIGNED, -// EVENT_NAME VARCHAR(128) NOT NULL, -// SOURCE VARCHAR(64), -// TIMER_START BIGINT(20) UNSIGNED, -// TIMER_END BIGINT(20) UNSIGNED, -// TIMER_WAIT BIGINT(20) UNSIGNED, -// WORK_COMPLETED BIGINT(20) UNSIGNED, -// WORK_ESTIMATED BIGINT(20) UNSIGNED, -// NESTING_EVENT_ID BIGINT(20) UNSIGNED, -// NESTING_EVENT_TYPE ENUM('TRANSACTION','STATEMENT','STAGE')); -var ColumnStagesHistoryLong = []string{ - "THREAD_ID", - "EVENT_ID", - "END_EVENT_ID", - "EVENT_NAME", - "SOURCE", - "TIMER_START", - "TIMER_END", - "TIMER_WAIT", - "WORK_COMPLETED", - "WORK_ESTIMATED", - "NESTING_EVENT_ID", - "NESTING_EVENT_TYPE", -} diff --git a/vendor/github.com/pingcap/tidb/perfschema/init.go b/vendor/github.com/pingcap/tidb/perfschema/init.go deleted file mode 100644 index 39e41035bf84..000000000000 --- a/vendor/github.com/pingcap/tidb/perfschema/init.go +++ /dev/null @@ -1,461 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package perfschema - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/table/tables" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/types" -) - -type columnInfo struct { - tp byte - size int - flag uint - deflt interface{} - elems []string -} - -var setupActorsCols = []columnInfo{ - {mysql.TypeString, 60, mysql.NotNullFlag, `%`, nil}, - {mysql.TypeString, 32, mysql.NotNullFlag, `%`, nil}, - {mysql.TypeString, 16, mysql.NotNullFlag, `%`, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}}, -} - -var setupObjectsCols = []columnInfo{ - {mysql.TypeEnum, -1, mysql.NotNullFlag, "TABLE", []string{"EVENT", "FUNCTION", "TABLE"}}, - {mysql.TypeVarchar, 64, 0, `%`, nil}, - {mysql.TypeVarchar, 64, mysql.NotNullFlag, `%`, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, "YES", []string{"YES", "NO"}}, -} - -var setupInstrumentsCols = []columnInfo{ - {mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}}, -} - -var setupConsumersCols = []columnInfo{ - {mysql.TypeVarchar, 64, mysql.NotNullFlag, nil, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}}, -} - -var setupTimersCols = []columnInfo{ - {mysql.TypeVarchar, 64, mysql.NotNullFlag, nil, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"NANOSECOND", "MICROSECOND", "MILLISECOND"}}, -} - -var stmtsCurrentCols = []columnInfo{ - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLongBlob, -1, 0, nil, nil}, - {mysql.TypeVarchar, 32, 0, nil, nil}, - {mysql.TypeLongBlob, -1, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLong, 11, 0, nil, nil}, - {mysql.TypeVarchar, 5, 0, nil, nil}, - {mysql.TypeVarchar, 128, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}}, - {mysql.TypeLong, 11, 0, nil, nil}, -} - -var preparedStmtsInstancesCols = []columnInfo{ - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLongBlob, -1, mysql.NotNullFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"EVENT", "FUNCTION", "TABLE"}}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, -} - -var transCurrentCols = []columnInfo{ - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"ACTIVE", "COMMITTED", "ROLLED BACK"}}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLong, 11, 0, nil, nil}, - {mysql.TypeVarchar, 130, 0, nil, nil}, - {mysql.TypeVarchar, 130, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"READ ONLY", "READ WRITE"}}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeEnum, -1, mysql.NotNullFlag, nil, []string{"YES", "NO"}}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}}, -} - -var stagesCurrentCols = []columnInfo{ - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.NotNullFlag | mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeVarchar, 128, mysql.NotNullFlag, nil, nil}, - {mysql.TypeVarchar, 64, 0, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeLonglong, 20, mysql.UnsignedFlag, nil, nil}, - {mysql.TypeEnum, -1, 0, nil, []string{"TRANSACTION", "STATEMENT", "STAGE"}}, -} - -func setColumnID(meta *model.TableInfo, store kv.Storage) error { - var err error - for _, c := range meta.Columns { - c.ID, err = genGlobalID(store) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -func genGlobalID(store kv.Storage) (int64, error) { - var globalID int64 - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - var err error - globalID, err = meta.NewMeta(txn).GenGlobalID() - return errors.Trace(err) - }) - return globalID, errors.Trace(err) -} - -func createMemoryTable(meta *model.TableInfo, alloc autoid.Allocator) (table.Table, error) { - tbl, _ := tables.MemoryTableFromMeta(alloc, meta) - return tbl, nil -} - -func (ps *perfSchema) buildTables() error { - tbls := make([]*model.TableInfo, 0, len(ps.tables)) - ps.mTables = make(map[string]table.Table, len(ps.tables)) - dbID, err := genGlobalID(ps.store) - if err != nil { - return errors.Trace(err) - } - // Set PKIsHandle - // TableStmtsCurrent use THREAD_ID as PK and handle - tb := ps.tables[TableStmtsHistory] - tb.PKIsHandle = true - tb.Columns[0].Flag = tb.Columns[0].Flag | mysql.PriKeyFlag - - var tbl table.Table - for name, meta := range ps.tables { - tbls = append(tbls, meta) - meta.ID, err = genGlobalID(ps.store) - if err != nil { - return errors.Trace(err) - } - err = setColumnID(meta, ps.store) - if err != nil { - return errors.Trace(err) - } - alloc := autoid.NewMemoryAllocator(dbID) - tbl, err = createMemoryTable(meta, alloc) - if err != nil { - return errors.Trace(err) - } - ps.mTables[name] = tbl - } - ps.dbInfo = &model.DBInfo{ - ID: dbID, - Name: model.NewCIStr(Name), - Charset: mysql.DefaultCharset, - Collate: mysql.DefaultCollationName, - Tables: tbls, - } - return nil -} - -func (ps *perfSchema) buildModel(tbName string, colNames []string, cols []columnInfo) { - rcols := make([]*model.ColumnInfo, len(cols)) - for i, col := range cols { - var ci *model.ColumnInfo - if col.elems == nil { - ci = buildUsualColumnInfo(i, colNames[i], col.tp, col.size, col.flag, col.deflt) - } else { - ci = buildEnumColumnInfo(i, colNames[i], col.elems, col.flag, col.deflt) - } - rcols[i] = ci - } - - ps.tables[tbName] = &model.TableInfo{ - Name: model.NewCIStr(tbName), - Charset: "utf8", - Collate: "utf8", - Columns: rcols, - } -} - -func buildUsualColumnInfo(offset int, name string, tp byte, size int, flag uint, def interface{}) *model.ColumnInfo { - mCharset := charset.CharsetBin - mCollation := charset.CharsetBin - if tp == mysql.TypeString || tp == mysql.TypeVarchar || tp == mysql.TypeBlob || tp == mysql.TypeLongBlob { - mCharset = mysql.DefaultCharset - mCollation = mysql.DefaultCollationName - } - if def == nil { - flag |= mysql.NoDefaultValueFlag - } - // TODO: does TypeLongBlob need size? - fieldType := types.FieldType{ - Charset: mCharset, - Collate: mCollation, - Tp: tp, - Flen: size, - Flag: uint(flag), - } - colInfo := &model.ColumnInfo{ - Name: model.NewCIStr(name), - Offset: offset, - FieldType: fieldType, - DefaultValue: def, - State: model.StatePublic, - } - return colInfo -} - -func buildEnumColumnInfo(offset int, name string, elems []string, flag uint, def interface{}) *model.ColumnInfo { - mCharset := charset.CharsetBin - mCollation := charset.CharsetBin - if def == nil { - flag |= mysql.NoDefaultValueFlag - } - fieldType := types.FieldType{ - Charset: mCharset, - Collate: mCollation, - Tp: mysql.TypeEnum, - Flag: uint(flag), - Elems: elems, - } - colInfo := &model.ColumnInfo{ - Name: model.NewCIStr(name), - Offset: offset, - FieldType: fieldType, - DefaultValue: def, - State: model.StatePublic, - } - return colInfo -} - -func (ps *perfSchema) initRecords(tbName string, records [][]types.Datum) error { - tbl, ok := ps.mTables[tbName] - if !ok { - return errors.Errorf("Unknown PerformanceSchema table: %s", tbName) - } - for _, rec := range records { - _, err := tbl.AddRecord(nil, rec) - if err != nil { - return errors.Trace(err) - } - } - return nil -} - -var setupTimersRecords [][]types.Datum - -func (ps *perfSchema) initialize() (err error) { - ps.tables = make(map[string]*model.TableInfo) - - allColDefs := [][]columnInfo{ - setupActorsCols, - setupObjectsCols, - setupInstrumentsCols, - setupConsumersCols, - setupTimersCols, - stmtsCurrentCols, - stmtsCurrentCols, // same as above - stmtsCurrentCols, // same as above - preparedStmtsInstancesCols, - transCurrentCols, - transCurrentCols, // same as above - transCurrentCols, // same as above - stagesCurrentCols, - stagesCurrentCols, // same as above - stagesCurrentCols, // same as above - } - - allColNames := [][]string{ - ColumnSetupActors, - ColumnSetupObjects, - ColumnSetupInstruments, - ColumnSetupConsumers, - ColumnSetupTimers, - ColumnStmtsCurrent, - ColumnStmtsHistory, - ColumnStmtsHistoryLong, - ColumnPreparedStmtsInstances, - ColumnStmtsCurrent, - ColumnStmtsHistory, - ColumnStmtsHistoryLong, - ColumnStagesCurrent, - ColumnStagesHistory, - ColumnStagesHistoryLong, - } - - // initialize all table, column and result field definitions - for i, def := range allColDefs { - ps.buildModel(PerfSchemaTables[i], allColNames[i], def) - } - err = ps.buildTables() - if err != nil { - return errors.Trace(err) - } - - setupActorsRecords := [][]types.Datum{ - types.MakeDatums(`%`, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}), - } - err = ps.initRecords(TableSetupActors, setupActorsRecords) - if err != nil { - return errors.Trace(err) - } - - setupObjectsRecords := [][]types.Datum{ - types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "EVENT", Value: 1}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "FUNCTION", Value: 2}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "mysql", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "performance_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, "information_schema", `%`, mysql.Enum{Name: "NO", Value: 2}, mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums(mysql.Enum{Name: "TABLE", Value: 3}, `%`, `%`, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}), - } - err = ps.initRecords(TableSetupObjects, setupObjectsRecords) - if err != nil { - return errors.Trace(err) - } - - setupConsumersRecords := [][]types.Datum{ - types.MakeDatums("events_stages_current", mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums("events_stages_history", mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums("events_stages_history_long", mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums("events_statements_current", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("events_statements_history", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("events_statements_history_long", mysql.Enum{Name: "NO", Value: 2}), - types.MakeDatums("events_transactions_current", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("events_transactions_history", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("events_transactions_history_long", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("global_instrumentation", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("thread_instrumentation", mysql.Enum{Name: "YES", Value: 1}), - types.MakeDatums("statements_digest", mysql.Enum{Name: "YES", Value: 1}), - } - err = ps.initRecords(TableSetupConsumers, setupConsumersRecords) - if err != nil { - return errors.Trace(err) - } - - setupTimersRecords = [][]types.Datum{ - types.MakeDatums("stage", mysql.Enum{Name: "NANOSECOND", Value: 1}), - types.MakeDatums("statement", mysql.Enum{Name: "NANOSECOND", Value: 1}), - types.MakeDatums("transaction", mysql.Enum{Name: "NANOSECOND", Value: 1}), - } - err = ps.initRecords(TableSetupTimers, setupTimersRecords) - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func (ps *perfSchema) GetDBMeta() *model.DBInfo { - return ps.dbInfo -} - -func (ps *perfSchema) GetTable(name string) (table.Table, bool) { - tbl, ok := ps.mTables[name] - return tbl, ok -} diff --git a/vendor/github.com/pingcap/tidb/perfschema/instrument.go b/vendor/github.com/pingcap/tidb/perfschema/instrument.go deleted file mode 100644 index 43014225e3f5..000000000000 --- a/vendor/github.com/pingcap/tidb/perfschema/instrument.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package perfschema - -import ( - "fmt" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/types" -) - -// EnumCallerName is used as a parameter to avoid calling runtime.Caller(1) since -// it is too expensive (500ns+ per call), we don't want to invoke it repeatedly for -// each instrument. -type EnumCallerName int - -const ( - // CallerNameSessionExecute is for session.go:Execute() method. - CallerNameSessionExecute EnumCallerName = iota + 1 -) - -const ( - stageInstrumentPrefix = "stage/" - statementInstrumentPrefix = "statement/" - transactionInstrumentPrefix = "transaction" -) - -// Flag indicators for table setup_timers. -const ( - flagStage = iota + 1 - flagStatement - flagTransaction -) - -type enumTimerName int - -// Enum values for the TIMER_NAME columns. -// This enum is found in the following tables: -// - performance_schema.setup_timer (TIMER_NAME) -const ( - timerNameNone enumTimerName = iota - timerNameNanosec - timerNameMicrosec - timerNameMillisec -) - -var ( - callerNames = make(map[EnumCallerName]string) -) - -// addInstrument is used to add an item to setup_instruments table. -func (ps *perfSchema) addInstrument(name string) (uint64, error) { - record := types.MakeDatums(name, mysql.Enum{Name: "YES", Value: 1}, mysql.Enum{Name: "YES", Value: 1}) - tbl := ps.mTables[TableSetupInstruments] - handle, err := tbl.AddRecord(nil, record) - return uint64(handle), errors.Trace(err) -} - -func (ps *perfSchema) getTimerName(flag int) (enumTimerName, error) { - if flag < 0 || flag >= len(setupTimersRecords) { - return timerNameNone, errors.Errorf("Unknown timerName flag %d", flag) - } - timerName := fmt.Sprintf("%s", setupTimersRecords[flag][1].GetString()) - switch timerName { - case "NANOSECOND": - return timerNameNanosec, nil - case "MICROSECOND": - return timerNameMicrosec, nil - case "MILLISECOND": - return timerNameMillisec, nil - } - return timerNameNone, nil -} diff --git a/vendor/github.com/pingcap/tidb/perfschema/perfschema.go b/vendor/github.com/pingcap/tidb/perfschema/perfschema.go deleted file mode 100644 index 91915a54857e..000000000000 --- a/vendor/github.com/pingcap/tidb/perfschema/perfschema.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package perfschema - -import ( - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/table" -) - -// StatementInstrument defines the methods for statement instrumentation points -type StatementInstrument interface { - RegisterStatement(category, name string, elem interface{}) - - StartStatement(sql string, connID uint64, callerName EnumCallerName, elem interface{}) *StatementState - - EndStatement(state *StatementState) -} - -// PerfSchema defines the methods to be invoked by the executor -type PerfSchema interface { - - // For statement instrumentation only. - StatementInstrument - - // GetDBMeta returns db info for PerformanceSchema. - GetDBMeta() *model.DBInfo - // GetTable returns table instance for name. - GetTable(name string) (table.Table, bool) -} - -type perfSchema struct { - store kv.Storage - dbInfo *model.DBInfo - tables map[string]*model.TableInfo - mTables map[string]table.Table // MemoryTables for perfSchema - - // Used for TableStmtsHistory - historyHandles []int64 - historyCursor int -} - -var _ PerfSchema = (*perfSchema)(nil) - -// PerfHandle is the only access point for the in-memory performance schema information -var ( - PerfHandle PerfSchema -) - -// NewPerfHandle creates a new perfSchema on store. -func NewPerfHandle(store kv.Storage) PerfSchema { - schema := PerfHandle.(*perfSchema) - schema.store = store - schema.historyHandles = make([]int64, 0, stmtsHistoryElemMax) - _ = schema.initialize() - registerStatements() - return PerfHandle -} - -func init() { - schema := &perfSchema{} - PerfHandle = schema -} diff --git a/vendor/github.com/pingcap/tidb/perfschema/statement.go b/vendor/github.com/pingcap/tidb/perfschema/statement.go deleted file mode 100644 index 0e2717c3d1d5..000000000000 --- a/vendor/github.com/pingcap/tidb/perfschema/statement.go +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package perfschema - -import ( - "fmt" - "reflect" - "runtime" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/types" -) - -// statementInfo defines statement instrument information. -type statementInfo struct { - // The registered statement key - key uint64 - // The name of the statement instrument to register - name string -} - -// StatementState provides temporary storage to a statement runtime statistics. -// TODO: -// 1. support statement digest. -// 2. support prepared statement. -type StatementState struct { - // Connection identifier - connID uint64 - // Statement information - info *statementInfo - // Statement type - stmtType reflect.Type - // Source file and line number - source string - // Timer name - timerName enumTimerName - // Timer start - timerStart int64 - // Timer end - timerEnd int64 - // Locked time - lockTime int64 - // SQL statement string - sqlText string - // Current schema name - schemaName string - // Number of errors - errNum uint32 - // Number of warnings - warnNum uint32 - // Rows affected - rowsAffected uint64 - // Rows sent - rowsSent uint64 - // Rows examined - rowsExamined uint64 - // Metric, temporary tables created on disk - createdTmpDiskTables uint32 - // Metric, temproray tables created - createdTmpTables uint32 - // Metric, number of select full join - selectFullJoin uint32 - // Metric, number of select full range join - selectFullRangeJoin uint32 - // Metric, number of select range - selectRange uint32 - // Metric, number of select range check - selectRangeCheck uint32 - // Metric, number of select scan - selectScan uint32 - // Metric, number of sort merge passes - sortMergePasses uint32 - // Metric, number of sort merge - sortRange uint32 - // Metric, number of sort rows - sortRows uint32 - // Metric, number of sort scans - sortScan uint32 - // Metric, no index used flag - noIndexUsed uint8 - // Metric, no good index used flag - noGoodIndexUsed uint8 -} - -const ( - // Maximum allowed number of elements in table events_statements_history. - // TODO: make it configurable? - stmtsHistoryElemMax int = 1024 -) - -var ( - stmtInfos = make(map[reflect.Type]*statementInfo) -) - -func (ps *perfSchema) RegisterStatement(category, name string, elem interface{}) { - instrumentName := fmt.Sprintf("%s%s/%s", statementInstrumentPrefix, category, name) - key, err := ps.addInstrument(instrumentName) - if err != nil { - // just ignore, do nothing else. - log.Errorf("Unable to register instrument %s", instrumentName) - return - } - - stmtInfos[reflect.TypeOf(elem)] = &statementInfo{ - key: key, - name: instrumentName, - } -} - -func (ps *perfSchema) StartStatement(sql string, connID uint64, callerName EnumCallerName, elem interface{}) *StatementState { - stmtType := reflect.TypeOf(elem) - info, ok := stmtInfos[stmtType] - if !ok { - // just ignore, do nothing else. - log.Errorf("No instrument registered for statement %s", stmtType) - return nil - } - - // check and apply the configuration parameter in table setup_timers. - timerName, err := ps.getTimerName(flagStatement) - if err != nil { - // just ignore, do nothing else. - log.Error("Unable to check setup_timers table") - return nil - } - var timerStart int64 - switch timerName { - case timerNameNanosec: - timerStart = time.Now().UnixNano() - case timerNameMicrosec: - timerStart = time.Now().UnixNano() / int64(time.Microsecond) - case timerNameMillisec: - timerStart = time.Now().UnixNano() / int64(time.Millisecond) - default: - return nil - } - - // TODO: check and apply the additional configuration parameters in: - // - table setup_actors - // - table setup_setup_consumers - // - table setup_instruments - // - table setup_objects - - var source string - source, ok = callerNames[callerName] - if !ok { - _, fileName, fileLine, ok := runtime.Caller(1) - if !ok { - // just ignore, do nothing else. - log.Error("Unable to get runtime.Caller(1)") - return nil - } - source = fmt.Sprintf("%s:%d", fileName, fileLine) - callerNames[callerName] = source - } - - return &StatementState{ - connID: connID, - info: info, - stmtType: stmtType, - source: source, - timerName: timerName, - timerStart: timerStart, - sqlText: sql, - } -} - -func (ps *perfSchema) EndStatement(state *StatementState) { - if state == nil { - return - } - - switch state.timerName { - case timerNameNanosec: - state.timerEnd = time.Now().UnixNano() - case timerNameMicrosec: - state.timerEnd = time.Now().UnixNano() / int64(time.Microsecond) - case timerNameMillisec: - state.timerEnd = time.Now().UnixNano() / int64(time.Millisecond) - default: - return - } - - log.Debugf("EndStatement: sql %s, connection id %d, type %s", state.sqlText, state.connID, state.stmtType) - - record := state2Record(state) - err := ps.updateEventsStmtsCurrent(state.connID, record) - if err != nil { - log.Error("Unable to update events_statements_current table") - } - err = ps.appendEventsStmtsHistory(record) - if err != nil { - log.Errorf("Unable to append to events_statements_history table %v", errors.ErrorStack(err)) - } -} - -func state2Record(state *StatementState) []types.Datum { - return types.MakeDatums( - state.connID, // THREAD_ID - state.info.key, // EVENT_ID - nil, // END_EVENT_ID - state.info.name, // EVENT_NAME - state.source, // SOURCE - uint64(state.timerStart), // TIMER_START - uint64(state.timerEnd), // TIMER_END - nil, // TIMER_WAIT - uint64(state.lockTime), // LOCK_TIME - state.sqlText, // SQL_TEXT - nil, // DIGEST - nil, // DIGEST_TEXT - state.schemaName, // CURRENT_SCHEMA - nil, // OBJECT_TYPE - nil, // OBJECT_SCHEMA - nil, // OBJECT_NAME - nil, // OBJECT_INSTANCE_BEGIN - nil, // MYSQL_ERRNO, - nil, // RETURNED_SQLSTATE - nil, // MESSAGE_TEXT - uint64(state.errNum), // ERRORS - uint64(state.warnNum), // WARNINGS - state.rowsAffected, // ROWS_AFFECTED - state.rowsSent, // ROWS_SENT - state.rowsExamined, // ROWS_EXAMINED - uint64(state.createdTmpDiskTables), // CREATED_TMP_DISK_TABLES - uint64(state.createdTmpTables), // CREATED_TMP_TABLES - uint64(state.selectFullJoin), // SELECT_FULL_JOIN - uint64(state.selectFullRangeJoin), // SELECT_FULL_RANGE_JOIN - uint64(state.selectRange), // SELECT_RANGE - uint64(state.selectRangeCheck), // SELECT_RANGE_CHECK - uint64(state.selectScan), // SELECT_SCAN - uint64(state.sortMergePasses), // SORT_MERGE_PASSES - uint64(state.sortRange), // SORT_RANGE - uint64(state.sortRows), // SORT_ROWS - uint64(state.sortScan), // SORT_SCAN - uint64(state.noIndexUsed), // NO_INDEX_USED - uint64(state.noGoodIndexUsed), // NO_GOOD_INDEX_USED - nil, // NESTING_EVENT_ID - nil, // NESTING_EVENT_TYPE - nil, // NESTING_EVENT_LEVEL - ) -} - -func (ps *perfSchema) updateEventsStmtsCurrent(connID uint64, record []types.Datum) error { - // Try AddRecord - tbl := ps.mTables[TableStmtsCurrent] - _, err := tbl.AddRecord(nil, record) - if err == nil { - return nil - } - if terror.ErrorNotEqual(err, kv.ErrKeyExists) { - return errors.Trace(err) - } - // Update it - handle := int64(connID) - err = tbl.UpdateRecord(nil, handle, nil, record, nil) - return errors.Trace(err) -} - -func (ps *perfSchema) appendEventsStmtsHistory(record []types.Datum) error { - tbl := ps.mTables[TableStmtsHistory] - if len(ps.historyHandles) < stmtsHistoryElemMax { - h, err := tbl.AddRecord(nil, record) - if err == nil { - ps.historyHandles = append(ps.historyHandles, h) - return nil - } - if terror.ErrorNotEqual(err, kv.ErrKeyExists) { - return errors.Trace(err) - } - // THREAD_ID is PK - handle := int64(record[0].GetUint64()) - err = tbl.UpdateRecord(nil, handle, nil, record, nil) - return errors.Trace(err) - - } - // If histroy is full, replace old data - if ps.historyCursor >= len(ps.historyHandles) { - ps.historyCursor = 0 - } - h := ps.historyHandles[ps.historyCursor] - ps.historyCursor++ - err := tbl.UpdateRecord(nil, h, nil, record, nil) - return errors.Trace(err) -} - -func registerStatements() { - // Existing instrument names are the same as MySQL 5.7 - PerfHandle.RegisterStatement("sql", "alter_table", (*ast.AlterTableStmt)(nil)) - PerfHandle.RegisterStatement("sql", "begin", (*ast.BeginStmt)(nil)) - PerfHandle.RegisterStatement("sql", "commit", (*ast.CommitStmt)(nil)) - PerfHandle.RegisterStatement("sql", "create_db", (*ast.CreateDatabaseStmt)(nil)) - PerfHandle.RegisterStatement("sql", "create_index", (*ast.CreateIndexStmt)(nil)) - PerfHandle.RegisterStatement("sql", "create_table", (*ast.CreateTableStmt)(nil)) - PerfHandle.RegisterStatement("sql", "deallocate", (*ast.DeallocateStmt)(nil)) - PerfHandle.RegisterStatement("sql", "delete", (*ast.DeleteStmt)(nil)) - PerfHandle.RegisterStatement("sql", "do", (*ast.DoStmt)(nil)) - PerfHandle.RegisterStatement("sql", "drop_db", (*ast.DropDatabaseStmt)(nil)) - PerfHandle.RegisterStatement("sql", "drop_table", (*ast.DropTableStmt)(nil)) - PerfHandle.RegisterStatement("sql", "drop_index", (*ast.DropIndexStmt)(nil)) - PerfHandle.RegisterStatement("sql", "execute", (*ast.ExecuteStmt)(nil)) - PerfHandle.RegisterStatement("sql", "explain", (*ast.ExplainStmt)(nil)) - PerfHandle.RegisterStatement("sql", "insert", (*ast.InsertStmt)(nil)) - PerfHandle.RegisterStatement("sql", "prepare", (*ast.PrepareStmt)(nil)) - PerfHandle.RegisterStatement("sql", "rollback", (*ast.RollbackStmt)(nil)) - PerfHandle.RegisterStatement("sql", "select", (*ast.SelectStmt)(nil)) - PerfHandle.RegisterStatement("sql", "set", (*ast.SetStmt)(nil)) - PerfHandle.RegisterStatement("sql", "show", (*ast.ShowStmt)(nil)) - PerfHandle.RegisterStatement("sql", "truncate", (*ast.TruncateTableStmt)(nil)) - PerfHandle.RegisterStatement("sql", "union", (*ast.UnionStmt)(nil)) - PerfHandle.RegisterStatement("sql", "update", (*ast.UpdateStmt)(nil)) - PerfHandle.RegisterStatement("sql", "use", (*ast.UseStmt)(nil)) -} diff --git a/vendor/github.com/pingcap/tidb/privilege/privilege.go b/vendor/github.com/pingcap/tidb/privilege/privilege.go deleted file mode 100644 index 653baedc8ae5..000000000000 --- a/vendor/github.com/pingcap/tidb/privilege/privilege.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package privilege - -import ( - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" -) - -type keyType int - -func (k keyType) String() string { - return "privilege-key" -} - -// Checker is the interface for check privileges. -type Checker interface { - // Check checks privilege. - // If tbl is nil, only check global/db scope privileges. - // If tbl is not nil, check global/db/table scope privileges. - Check(ctx context.Context, db *model.DBInfo, tbl *model.TableInfo, privilege mysql.PrivilegeType) (bool, error) - // Show granted privileges for user. - ShowGrants(ctx context.Context, user string) ([]string, error) -} - -const key keyType = 0 - -// BindPrivilegeChecker binds Checker to context. -func BindPrivilegeChecker(ctx context.Context, pc Checker) { - ctx.SetValue(key, pc) -} - -// GetPrivilegeChecker gets Checker from context. -func GetPrivilegeChecker(ctx context.Context) Checker { - if v, ok := ctx.Value(key).(Checker); ok { - return v - } - return nil -} diff --git a/vendor/github.com/pingcap/tidb/privilege/privileges/privileges.go b/vendor/github.com/pingcap/tidb/privilege/privileges/privileges.go deleted file mode 100644 index 7ff658806275..000000000000 --- a/vendor/github.com/pingcap/tidb/privilege/privileges/privileges.go +++ /dev/null @@ -1,381 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package privileges - -import ( - "fmt" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/privilege" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util/sqlexec" - "github.com/pingcap/tidb/util/types" -) - -var _ privilege.Checker = (*UserPrivileges)(nil) - -type privileges struct { - Level ast.GrantLevelType - privs map[mysql.PrivilegeType]bool -} - -func (ps *privileges) contain(p mysql.PrivilegeType) bool { - if ps.privs == nil { - return false - } - _, ok := ps.privs[p] - return ok -} - -func (ps *privileges) add(p mysql.PrivilegeType) { - if ps.privs == nil { - ps.privs = make(map[mysql.PrivilegeType]bool) - } - ps.privs[p] = true -} - -func (ps *privileges) String() string { - switch ps.Level { - case ast.GrantLevelGlobal: - return ps.globalPrivToString() - case ast.GrantLevelDB: - return ps.dbPrivToString() - case ast.GrantLevelTable: - return ps.tablePrivToString() - } - return "" -} - -func (ps *privileges) globalPrivToString() string { - if len(ps.privs) == len(mysql.AllGlobalPrivs) { - return mysql.AllPrivilegeLiteral - } - pstrs := make([]string, 0, len(ps.privs)) - // Iterate AllGlobalPrivs to get stable order result. - for _, p := range mysql.AllGlobalPrivs { - _, ok := ps.privs[p] - if !ok { - continue - } - s, _ := mysql.Priv2Str[p] - pstrs = append(pstrs, s) - } - return strings.Join(pstrs, ",") -} - -func (ps *privileges) dbPrivToString() string { - if len(ps.privs) == len(mysql.AllDBPrivs) { - return mysql.AllPrivilegeLiteral - } - pstrs := make([]string, 0, len(ps.privs)) - // Iterate AllDBPrivs to get stable order result. - for _, p := range mysql.AllDBPrivs { - _, ok := ps.privs[p] - if !ok { - continue - } - s, _ := mysql.Priv2SetStr[p] - pstrs = append(pstrs, s) - } - return strings.Join(pstrs, ",") -} - -func (ps *privileges) tablePrivToString() string { - if len(ps.privs) == len(mysql.AllTablePrivs) { - return mysql.AllPrivilegeLiteral - } - pstrs := make([]string, 0, len(ps.privs)) - // Iterate AllTablePrivs to get stable order result. - for _, p := range mysql.AllTablePrivs { - _, ok := ps.privs[p] - if !ok { - continue - } - s, _ := mysql.Priv2Str[p] - pstrs = append(pstrs, s) - } - return strings.Join(pstrs, ",") -} - -type userPrivileges struct { - User string - Host string - // Global privileges - GlobalPrivs *privileges - // DBName-privileges - DBPrivs map[string]*privileges - // DBName-TableName-privileges - TablePrivs map[string]map[string]*privileges -} - -func (ps *userPrivileges) ShowGrants() []string { - gs := []string{} - // Show global grants - g := ps.GlobalPrivs.String() - if len(g) > 0 { - s := fmt.Sprintf(`GRANT %s ON *.* TO '%s'@'%s'`, g, ps.User, ps.Host) - gs = append(gs, s) - } - // Show db scope grants - for d, p := range ps.DBPrivs { - g := p.String() - if len(g) > 0 { - s := fmt.Sprintf(`GRANT %s ON %s.* TO '%s'@'%s'`, g, d, ps.User, ps.Host) - gs = append(gs, s) - } - } - // Show table scope grants - for d, dps := range ps.TablePrivs { - for t, p := range dps { - g := p.String() - if len(g) > 0 { - s := fmt.Sprintf(`GRANT %s ON %s.%s TO '%s'@'%s'`, g, d, t, ps.User, ps.Host) - gs = append(gs, s) - } - } - } - return gs -} - -// UserPrivileges implements privilege.Checker interface. -// This is used to check privilege for the current user. -type UserPrivileges struct { - User string - privs *userPrivileges -} - -// Check implements Checker.Check interface. -func (p *UserPrivileges) Check(ctx context.Context, db *model.DBInfo, tbl *model.TableInfo, privilege mysql.PrivilegeType) (bool, error) { - if p.privs == nil { - // Lazy load - if len(p.User) == 0 { - // User current user - p.User = variable.GetSessionVars(ctx).User - if len(p.User) == 0 { - // In embedded db mode, user does not need to login. So we do not have username. - // TODO: remove this check latter. - return true, nil - } - } - err := p.loadPrivileges(ctx) - if err != nil { - return false, errors.Trace(err) - } - } - // Check global scope privileges. - ok := p.privs.GlobalPrivs.contain(privilege) - if ok { - return true, nil - } - // Check db scope privileges. - dbp, ok := p.privs.DBPrivs[db.Name.O] - if ok { - ok = dbp.contain(privilege) - if ok { - return true, nil - } - } - if tbl == nil { - return false, nil - } - // Check table scope privileges. - dbTbl, ok := p.privs.TablePrivs[db.Name.O] - if !ok { - return false, nil - } - tblp, ok := dbTbl[tbl.Name.O] - if !ok { - return false, nil - } - return tblp.contain(privilege), nil -} - -func (p *UserPrivileges) loadPrivileges(ctx context.Context) error { - strs := strings.Split(p.User, "@") - if len(strs) != 2 { - return errors.Errorf("Wrong username format: %s", p.User) - } - username, host := strs[0], strs[1] - p.privs = &userPrivileges{ - User: username, - Host: host, - } - // Load privileges from mysql.User/DB/Table_privs/Column_privs table - err := p.loadGlobalPrivileges(ctx) - if err != nil { - return errors.Trace(err) - } - err = p.loadDBScopePrivileges(ctx) - if err != nil { - return errors.Trace(err) - } - err = p.loadTableScopePrivileges(ctx) - if err != nil { - return errors.Trace(err) - } - // TODO: consider column scope privilege latter. - return nil -} - -// mysql.User/mysql.DB table privilege columns start from index 3. -// See: booststrap.go CreateUserTable/CreateDBPrivTable -const userTablePrivColumnStartIndex = 3 -const dbTablePrivColumnStartIndex = 3 - -func (p *UserPrivileges) loadGlobalPrivileges(ctx context.Context) error { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND (Host="%s" OR Host="%%");`, - mysql.SystemDB, mysql.UserTable, p.privs.User, p.privs.Host) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return errors.Trace(err) - } - defer rs.Close() - ps := &privileges{Level: ast.GrantLevelGlobal} - fs, err := rs.Fields() - if err != nil { - return errors.Trace(err) - } - for { - row, err := rs.Next() - if err != nil { - return errors.Trace(err) - } - if row == nil { - break - } - for i := userTablePrivColumnStartIndex; i < len(fs); i++ { - d := row.Data[i] - if d.Kind() != types.KindMysqlEnum { - return errors.Errorf("Privilege should be mysql.Enum: %v(%T)", d, d) - } - ed := d.GetMysqlEnum() - if ed.String() != "Y" { - continue - } - f := fs[i] - p, ok := mysql.Col2PrivType[f.ColumnAsName.O] - if !ok { - return errors.New("Unknown Privilege Type!") - } - ps.add(p) - } - } - p.privs.GlobalPrivs = ps - return nil -} - -func (p *UserPrivileges) loadDBScopePrivileges(ctx context.Context) error { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND (Host="%s" OR Host="%%");`, - mysql.SystemDB, mysql.DBTable, p.privs.User, p.privs.Host) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return errors.Trace(err) - } - defer rs.Close() - ps := make(map[string]*privileges) - fs, err := rs.Fields() - if err != nil { - return errors.Trace(err) - } - for { - row, err := rs.Next() - if err != nil { - return errors.Trace(err) - } - if row == nil { - break - } - // DB - dbStr := row.Data[1].GetString() - ps[dbStr] = &privileges{Level: ast.GrantLevelDB} - for i := dbTablePrivColumnStartIndex; i < len(fs); i++ { - d := row.Data[i] - if d.Kind() != types.KindMysqlEnum { - return errors.Errorf("Privilege should be mysql.Enum: %v(%T)", d, d) - } - ed := d.GetMysqlEnum() - if ed.String() != "Y" { - continue - } - f := fs[i] - p, ok := mysql.Col2PrivType[f.ColumnAsName.O] - if !ok { - return errors.New("Unknown Privilege Type!") - } - ps[dbStr].add(p) - } - } - p.privs.DBPrivs = ps - return nil -} - -func (p *UserPrivileges) loadTableScopePrivileges(ctx context.Context) error { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User="%s" AND (Host="%s" OR Host="%%");`, - mysql.SystemDB, mysql.TablePrivTable, p.privs.User, p.privs.Host) - rs, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(ctx, sql) - if err != nil { - return errors.Trace(err) - } - defer rs.Close() - ps := make(map[string]map[string]*privileges) - for { - row, err := rs.Next() - if err != nil { - return errors.Trace(err) - } - if row == nil { - break - } - // DB - dbStr := row.Data[1].GetString() - // Table_name - tblStr := row.Data[3].GetString() - _, ok := ps[dbStr] - if !ok { - ps[dbStr] = make(map[string]*privileges) - } - ps[dbStr][tblStr] = &privileges{Level: ast.GrantLevelTable} - // Table_priv - tblPrivs := row.Data[6].GetMysqlSet() - pvs := strings.Split(tblPrivs.Name, ",") - for _, d := range pvs { - p, ok := mysql.SetStr2Priv[d] - if !ok { - return errors.New("Unknown Privilege Type!") - } - ps[dbStr][tblStr].add(p) - } - } - p.privs.TablePrivs = ps - return nil -} - -// ShowGrants implements privilege.Checker ShowGrants interface. -func (p *UserPrivileges) ShowGrants(ctx context.Context, user string) ([]string, error) { - // If user is current user - if user == p.User { - return p.privs.ShowGrants(), nil - } - userp := &UserPrivileges{User: user} - err := userp.loadPrivileges(ctx) - if err != nil { - return nil, errors.Trace(err) - } - return userp.privs.ShowGrants(), nil -} diff --git a/vendor/github.com/pingcap/tidb/session.go b/vendor/github.com/pingcap/tidb/session.go deleted file mode 100644 index 691558ff3f74..000000000000 --- a/vendor/github.com/pingcap/tidb/session.go +++ /dev/null @@ -1,660 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package tidb - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/perfschema" - "github.com/pingcap/tidb/privilege" - "github.com/pingcap/tidb/privilege/privileges" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/sessionctx/autocommit" - "github.com/pingcap/tidb/sessionctx/db" - "github.com/pingcap/tidb/sessionctx/forupdate" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/localstore" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/types" -) - -// Session context -type Session interface { - Status() uint16 // Flag of current status, such as autocommit - LastInsertID() uint64 // Last inserted auto_increment id - AffectedRows() uint64 // Affected rows by lastest executed stmt - Execute(sql string) ([]ast.RecordSet, error) // Execute a sql statement - String() string // For debug - FinishTxn(rollback bool) error - // For execute prepare statement in binary protocol - PrepareStmt(sql string) (stmtID uint32, paramCount int, fields []*ast.ResultField, err error) - // Execute a prepared statement - ExecutePreparedStmt(stmtID uint32, param ...interface{}) (ast.RecordSet, error) - DropPreparedStmt(stmtID uint32) error - SetClientCapability(uint32) // Set client capability flags - SetConnectionID(uint64) - Close() error - Retry() error - Auth(user string, auth []byte, salt []byte) bool -} - -var ( - _ Session = (*session)(nil) - sessionID int64 - sessionMu sync.Mutex -) - -type stmtRecord struct { - stmtID uint32 - st ast.Statement - params []interface{} -} - -type stmtHistory struct { - history []*stmtRecord -} - -func (h *stmtHistory) add(stmtID uint32, st ast.Statement, params ...interface{}) { - s := &stmtRecord{ - stmtID: stmtID, - st: st, - params: append(([]interface{})(nil), params...), - } - h.history = append(h.history, s) -} - -func (h *stmtHistory) reset() { - if len(h.history) > 0 { - h.history = h.history[:0] - } -} - -func (h *stmtHistory) clone() *stmtHistory { - nh := *h - nh.history = make([]*stmtRecord, len(h.history)) - copy(nh.history, h.history) - return &nh -} - -const unlimitedRetryCnt = -1 - -type session struct { - txn kv.Transaction // Current transaction - args []interface{} // Statment execution args, this should be cleaned up after exec - values map[fmt.Stringer]interface{} - store kv.Storage - sid int64 - history stmtHistory - initing bool // Running bootstrap using this session. - retrying bool - maxRetryCnt int // Max retry times. If maxRetryCnt <=0, there is no limitation for retry times. - - debugInfos map[string]interface{} // Vars for debug and unit tests. - - // For performance_schema only. - stmtState *perfschema.StatementState -} - -func (s *session) Status() uint16 { - return variable.GetSessionVars(s).Status -} - -func (s *session) LastInsertID() uint64 { - return variable.GetSessionVars(s).LastInsertID -} - -func (s *session) AffectedRows() uint64 { - return variable.GetSessionVars(s).AffectedRows -} - -func (s *session) resetHistory() { - s.ClearValue(forupdate.ForUpdateKey) - s.history.reset() -} - -func (s *session) SetClientCapability(capability uint32) { - variable.GetSessionVars(s).ClientCapability = capability -} - -func (s *session) SetConnectionID(connectionID uint64) { - variable.GetSessionVars(s).ConnectionID = connectionID -} - -func (s *session) FinishTxn(rollback bool) error { - // transaction has already been committed or rolled back - if s.txn == nil { - return nil - } - defer func() { - s.txn = nil - variable.GetSessionVars(s).SetStatusFlag(mysql.ServerStatusInTrans, false) - }() - - if rollback { - s.resetHistory() - return s.txn.Rollback() - } - - err := s.txn.Commit() - if err != nil { - if !s.retrying && kv.IsRetryableError(err) { - err = s.Retry() - } - if err != nil { - log.Warnf("txn:%s, %v", s.txn, err) - return errors.Trace(err) - } - } - - s.resetHistory() - return nil -} - -func (s *session) String() string { - // TODO: how to print binded context in values appropriately? - data := map[string]interface{}{ - "currDBName": db.GetCurrentSchema(s), - "sid": s.sid, - } - - if s.txn != nil { - // if txn is committed or rolled back, txn is nil. - data["txn"] = s.txn.String() - } - - b, _ := json.MarshalIndent(data, "", " ") - return string(b) -} - -func (s *session) Retry() error { - s.retrying = true - nh := s.history.clone() - // Debug infos. - if len(nh.history) == 0 { - s.debugInfos[retryEmptyHistoryList] = true - } else { - s.debugInfos[retryEmptyHistoryList] = false - } - defer func() { - s.history.history = nh.history - s.retrying = false - }() - - if forUpdate := s.Value(forupdate.ForUpdateKey); forUpdate != nil { - return errors.Errorf("can not retry select for update statement") - } - var err error - retryCnt := 0 - for { - s.resetHistory() - s.FinishTxn(true) - success := true - for _, sr := range nh.history { - st := sr.st - log.Warnf("Retry %s", st.OriginText()) - _, err = runStmt(s, st) - if err != nil { - if kv.IsRetryableError(err) { - success = false - break - } - log.Warnf("session:%v, err:%v", s, err) - return errors.Trace(err) - } - } - if success { - err = s.FinishTxn(false) - if !kv.IsRetryableError(err) { - break - } - } - retryCnt++ - if (s.maxRetryCnt != unlimitedRetryCnt) && (retryCnt >= s.maxRetryCnt) { - return errors.Trace(err) - } - kv.BackOff(retryCnt) - } - return err -} - -// ExecRestrictedSQL implements SQLHelper interface. -// This is used for executing some restricted sql statements. -func (s *session) ExecRestrictedSQL(ctx context.Context, sql string) (ast.RecordSet, error) { - rawStmts, err := Parse(ctx, sql) - if err != nil { - return nil, errors.Trace(err) - } - if len(rawStmts) != 1 { - log.Errorf("ExecRestrictedSQL only executes one statement. Too many/few statement in %s", sql) - return nil, errors.New("Wrong number of statement.") - } - st, err := Compile(s, rawStmts[0]) - if err != nil { - log.Errorf("Compile %s with error: %v", sql, err) - return nil, errors.Trace(err) - } - // Check statement for some restriction - // For example only support DML on system meta table. - // TODO: Add more restrictions. - log.Debugf("Executing %s [%s]", st.OriginText(), sql) - rs, err := st.Exec(ctx) - return rs, errors.Trace(err) -} - -// getExecRet executes restricted sql and the result is one column. -// It returns a string value. -func (s *session) getExecRet(ctx context.Context, sql string) (string, error) { - cleanTxn := s.txn == nil - rs, err := s.ExecRestrictedSQL(ctx, sql) - if err != nil { - return "", errors.Trace(err) - } - defer rs.Close() - row, err := rs.Next() - if err != nil { - return "", errors.Trace(err) - } - if row == nil { - return "", terror.ExecResultIsEmpty - } - value, err := types.ToString(row.Data[0].GetValue()) - if err != nil { - return "", errors.Trace(err) - } - if cleanTxn { - // This function has some side effect. Run select may create new txn. - // We should make environment unchanged. - s.txn = nil - } - return value, nil -} - -// GetGlobalSysVar implements GlobalVarAccessor.GetGlobalSysVar interface. -func (s *session) GetGlobalSysVar(ctx context.Context, name string) (string, error) { - sql := fmt.Sprintf(`SELECT VARIABLE_VALUE FROM %s.%s WHERE VARIABLE_NAME="%s";`, - mysql.SystemDB, mysql.GlobalVariablesTable, name) - sysVar, err := s.getExecRet(ctx, sql) - if err != nil { - if terror.ExecResultIsEmpty.Equal(err) { - return "", variable.UnknownSystemVar.Gen("unknown sys variable:%s", name) - } - return "", errors.Trace(err) - } - return sysVar, nil -} - -// SetGlobalSysVar implements GlobalVarAccessor.SetGlobalSysVar interface. -func (s *session) SetGlobalSysVar(ctx context.Context, name string, value string) error { - sql := fmt.Sprintf(`UPDATE %s.%s SET VARIABLE_VALUE="%s" WHERE VARIABLE_NAME="%s";`, - mysql.SystemDB, mysql.GlobalVariablesTable, value, strings.ToLower(name)) - _, err := s.ExecRestrictedSQL(ctx, sql) - return errors.Trace(err) -} - -// IsAutocommit checks if it is in the auto-commit mode. -func (s *session) isAutocommit(ctx context.Context) bool { - autocommit, ok := variable.GetSessionVars(ctx).Systems["autocommit"] - if !ok { - if s.initing { - return false - } - var err error - autocommit, err = s.GetGlobalSysVar(ctx, "autocommit") - if err != nil { - log.Errorf("Get global sys var error: %v", err) - return false - } - variable.GetSessionVars(ctx).Systems["autocommit"] = autocommit - ok = true - } - if ok && (autocommit == "ON" || autocommit == "on" || autocommit == "1") { - variable.GetSessionVars(ctx).SetStatusFlag(mysql.ServerStatusAutocommit, true) - return true - } - variable.GetSessionVars(ctx).SetStatusFlag(mysql.ServerStatusAutocommit, false) - return false -} - -func (s *session) ShouldAutocommit(ctx context.Context) bool { - // With START TRANSACTION, autocommit remains disabled until you end - // the transaction with COMMIT or ROLLBACK. - if variable.GetSessionVars(ctx).Status&mysql.ServerStatusInTrans == 0 && s.isAutocommit(ctx) { - return true - } - return false -} - -func (s *session) Execute(sql string) ([]ast.RecordSet, error) { - rawStmts, err := Parse(s, sql) - if err != nil { - return nil, errors.Trace(err) - } - var rs []ast.RecordSet - for i, rst := range rawStmts { - st, err1 := Compile(s, rst) - if err1 != nil { - log.Errorf("Syntax error: %s", sql) - log.Errorf("Error occurs at %s.", err1) - return nil, errors.Trace(err1) - } - id := variable.GetSessionVars(s).ConnectionID - s.stmtState = perfschema.PerfHandle.StartStatement(sql, id, perfschema.CallerNameSessionExecute, rawStmts[i]) - r, err := runStmt(s, st) - perfschema.PerfHandle.EndStatement(s.stmtState) - if err != nil { - log.Warnf("session:%v, err:%v", s, err) - return nil, errors.Trace(err) - } - if r != nil { - rs = append(rs, r) - } - } - return rs, nil -} - -// For execute prepare statement in binary protocol -func (s *session) PrepareStmt(sql string) (stmtID uint32, paramCount int, fields []*ast.ResultField, err error) { - prepareExec := &executor.PrepareExec{ - IS: sessionctx.GetDomain(s).InfoSchema(), - Ctx: s, - SQLText: sql, - } - prepareExec.DoPrepare() - return prepareExec.ID, prepareExec.ParamCount, prepareExec.ResultFields, prepareExec.Err -} - -// checkArgs makes sure all the arguments' types are known and can be handled. -// integer types are converted to int64 and uint64, time.Time is converted to mysql.Time. -// time.Duration is converted to mysql.Duration, other known types are leaved as it is. -func checkArgs(args ...interface{}) error { - for i, v := range args { - switch x := v.(type) { - case bool: - if x { - args[i] = int64(1) - } else { - args[i] = int64(0) - } - case int8: - args[i] = int64(x) - case int16: - args[i] = int64(x) - case int32: - args[i] = int64(x) - case int: - args[i] = int64(x) - case uint8: - args[i] = uint64(x) - case uint16: - args[i] = uint64(x) - case uint32: - args[i] = uint64(x) - case uint: - args[i] = uint64(x) - case int64: - case uint64: - case float32: - case float64: - case string: - case []byte: - case time.Duration: - args[i] = mysql.Duration{Duration: x} - case time.Time: - args[i] = mysql.Time{Time: x, Type: mysql.TypeDatetime} - case nil: - default: - return errors.Errorf("cannot use arg[%d] (type %T):unsupported type", i, v) - } - } - return nil -} - -// Execute a prepared statement -func (s *session) ExecutePreparedStmt(stmtID uint32, args ...interface{}) (ast.RecordSet, error) { - err := checkArgs(args...) - if err != nil { - return nil, err - } - st := executor.CompileExecutePreparedStmt(s, stmtID, args...) - r, err := runStmt(s, st, args...) - return r, errors.Trace(err) -} - -func (s *session) DropPreparedStmt(stmtID uint32) error { - vars := variable.GetSessionVars(s) - if _, ok := vars.PreparedStmts[stmtID]; !ok { - return executor.ErrStmtNotFound - } - delete(vars.PreparedStmts, stmtID) - return nil -} - -// If forceNew is true, GetTxn() must return a new transaction. -// In this situation, if current transaction is still in progress, -// there will be an implicit commit and create a new transaction. -func (s *session) GetTxn(forceNew bool) (kv.Transaction, error) { - var err error - if s.txn == nil { - s.resetHistory() - s.txn, err = s.store.Begin() - if err != nil { - return nil, errors.Trace(err) - } - if !s.isAutocommit(s) { - variable.GetSessionVars(s).SetStatusFlag(mysql.ServerStatusInTrans, true) - } - log.Infof("New txn:%s in session:%d", s.txn, s.sid) - return s.txn, nil - } - if forceNew { - err = s.FinishTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - s.txn, err = s.store.Begin() - if err != nil { - return nil, errors.Trace(err) - } - if !s.isAutocommit(s) { - variable.GetSessionVars(s).SetStatusFlag(mysql.ServerStatusInTrans, true) - } - log.Warnf("Force new txn:%s in session:%d", s.txn, s.sid) - } - return s.txn, nil -} - -func (s *session) SetValue(key fmt.Stringer, value interface{}) { - s.values[key] = value -} - -func (s *session) Value(key fmt.Stringer) interface{} { - value := s.values[key] - return value -} - -func (s *session) ClearValue(key fmt.Stringer) { - delete(s.values, key) -} - -// Close function does some clean work when session end. -func (s *session) Close() error { - return s.FinishTxn(true) -} - -func (s *session) getPassword(name, host string) (string, error) { - // Get password for name and host. - authSQL := fmt.Sprintf("SELECT Password FROM %s.%s WHERE User='%s' and Host='%s';", mysql.SystemDB, mysql.UserTable, name, host) - pwd, err := s.getExecRet(s, authSQL) - if err == nil { - return pwd, nil - } else if !terror.ExecResultIsEmpty.Equal(err) { - return "", errors.Trace(err) - } - //Try to get user password for name with any host(%). - authSQL = fmt.Sprintf("SELECT Password FROM %s.%s WHERE User='%s' and Host='%%';", mysql.SystemDB, mysql.UserTable, name) - pwd, err = s.getExecRet(s, authSQL) - return pwd, errors.Trace(err) -} - -func (s *session) Auth(user string, auth []byte, salt []byte) bool { - strs := strings.Split(user, "@") - if len(strs) != 2 { - log.Warnf("Invalid format for user: %s", user) - return false - } - // Get user password. - name := strs[0] - host := strs[1] - pwd, err := s.getPassword(name, host) - if err != nil { - if terror.ExecResultIsEmpty.Equal(err) { - log.Errorf("User [%s] not exist %v", name, err) - } else { - log.Errorf("Get User [%s] password from SystemDB error %v", name, err) - } - return false - } - if len(pwd) != 0 && len(pwd) != 40 { - log.Errorf("User [%s] password from SystemDB not like a sha1sum", name) - return false - } - hpwd, err := util.DecodePassword(pwd) - if err != nil { - log.Errorf("Decode password string error %v", err) - return false - } - checkAuth := util.CalcPassword(salt, hpwd) - if !bytes.Equal(auth, checkAuth) { - return false - } - variable.GetSessionVars(s).SetCurrentUser(user) - return true -} - -// Some vars name for debug. -const ( - retryEmptyHistoryList = "RetryEmptyHistoryList" -) - -// CreateSession creates a new session environment. -func CreateSession(store kv.Storage) (Session, error) { - s := &session{ - values: make(map[fmt.Stringer]interface{}), - store: store, - sid: atomic.AddInt64(&sessionID, 1), - debugInfos: make(map[string]interface{}), - retrying: false, - maxRetryCnt: 10, - } - domain, err := domap.Get(store) - if err != nil { - return nil, err - } - sessionctx.BindDomain(s, domain) - - variable.BindSessionVars(s) - variable.GetSessionVars(s).SetStatusFlag(mysql.ServerStatusAutocommit, true) - - // session implements variable.GlobalVarAccessor. Bind it to ctx. - variable.BindGlobalVarAccessor(s, s) - - // session implements autocommit.Checker. Bind it to ctx - autocommit.BindAutocommitChecker(s, s) - sessionMu.Lock() - defer sessionMu.Unlock() - - ok := isBoostrapped(store) - if !ok { - // if no bootstrap and storage is remote, we must use a little lease time to - // bootstrap quickly, after bootstrapped, we will reset the lease time. - // TODO: Using a bootstap tool for doing this may be better later. - if !localstore.IsLocalStore(store) { - sessionctx.GetDomain(s).SetLease(100 * time.Millisecond) - } - - s.initing = true - bootstrap(s) - s.initing = false - - if !localstore.IsLocalStore(store) { - sessionctx.GetDomain(s).SetLease(schemaLease) - } - - finishBoostrap(store) - } - - // TODO: Add auth here - privChecker := &privileges.UserPrivileges{} - privilege.BindPrivilegeChecker(s, privChecker) - return s, nil -} - -func isBoostrapped(store kv.Storage) bool { - // check in memory - _, ok := storeBootstrapped[store.UUID()] - if ok { - return true - } - - // check in kv store - err := kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { - var err error - t := meta.NewMeta(txn) - ok, err = t.IsBootstrapped() - return errors.Trace(err) - }) - - if err != nil { - log.Fatalf("check bootstrapped err %v", err) - } - - if ok { - // here mean memory is not ok, but other server has already finished it - storeBootstrapped[store.UUID()] = true - } - - return ok -} - -func finishBoostrap(store kv.Storage) { - storeBootstrapped[store.UUID()] = true - - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - t := meta.NewMeta(txn) - err := t.FinishBootstrap() - return errors.Trace(err) - }) - if err != nil { - log.Fatalf("finish bootstrap err %v", err) - } -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/autocommit/autocommit.go b/vendor/github.com/pingcap/tidb/sessionctx/autocommit/autocommit.go deleted file mode 100644 index 089acbb04838..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/autocommit/autocommit.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package autocommit - -import ( - "github.com/pingcap/tidb/context" -) - -// Checker is the interface checks if it should autocommit in the context. -// TODO: Choose a better name. -type Checker interface { - // ShouldAutocommit returns true if it should autocommit in the context. - ShouldAutocommit(ctx context.Context) bool -} - -// keyType is a dummy type to avoid naming collision in context. -type keyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k keyType) String() string { - return "autocommit_checker" -} - -const key keyType = 0 - -// BindAutocommitChecker binds autocommit checker to context. -func BindAutocommitChecker(ctx context.Context, checker Checker) { - ctx.SetValue(key, checker) -} - -// ShouldAutocommit gets checker from ctx and checks if it should autocommit. -func ShouldAutocommit(ctx context.Context) bool { - v, ok := ctx.Value(key).(Checker) - if !ok { - panic("Miss autocommit checker") - } - return v.ShouldAutocommit(ctx) -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/db/db.go b/vendor/github.com/pingcap/tidb/sessionctx/db/db.go deleted file mode 100644 index 1917ce9a13cd..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/db/db.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package db - -import ( - "github.com/pingcap/tidb/context" -) - -// currentDBKeyType is a dummy type to avoid naming collision in context. -type currentDBKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k currentDBKeyType) String() string { - return "current_db" -} - -const currentDBKey currentDBKeyType = 0 - -// BindCurrentSchema saves parameter schema as current schema name value into context. -func BindCurrentSchema(ctx context.Context, schema string) { - ctx.SetValue(currentDBKey, schema) -} - -// GetCurrentSchema gets current schema name from context. -func GetCurrentSchema(ctx context.Context) string { - v, ok := ctx.Value(currentDBKey).(string) - if !ok { - return "" - } - return v -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/domainctx.go b/vendor/github.com/pingcap/tidb/sessionctx/domainctx.go deleted file mode 100644 index dfbbe5cb70dd..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/domainctx.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package sessionctx - -import ( - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/domain" -) - -// A dummy type to avoid naming collision in context. -type domainKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k domainKeyType) String() string { - return "domain" -} - -const domainKey domainKeyType = 0 - -// BindDomain binds domain to context. -func BindDomain(ctx context.Context, domain *domain.Domain) { - ctx.SetValue(domainKey, domain) -} - -// GetDomain gets domain from context. -func GetDomain(ctx context.Context) *domain.Domain { - v, ok := ctx.Value(domainKey).(*domain.Domain) - if !ok { - return nil - } - return v -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/forupdate/for_update_ctx.go b/vendor/github.com/pingcap/tidb/sessionctx/forupdate/for_update_ctx.go deleted file mode 100644 index f413bd1c50f5..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/forupdate/for_update_ctx.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package forupdate record information for "select ... for update" statement -package forupdate - -import "github.com/pingcap/tidb/context" - -// A dummy type to avoid naming collision in context. -type forupdateKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k forupdateKeyType) String() string { - return "for update" -} - -// ForUpdateKey is used to retrive "select for update" statement information -const ForUpdateKey forupdateKeyType = 0 - -// SetForUpdate set "select for update" flag. -func SetForUpdate(ctx context.Context) { - ctx.SetValue(ForUpdateKey, true) -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/variable/session.go b/vendor/github.com/pingcap/tidb/sessionctx/variable/session.go deleted file mode 100644 index 90873303221c..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/variable/session.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package variable - -import ( - "github.com/pingcap/tidb/context" -) - -// SessionVars is to handle user-defined or global variables in current session. -type SessionVars struct { - // user-defined variables - Users map[string]string - // system variables - Systems map[string]string - // prepared statement - PreparedStmts map[uint32]interface{} - - PreparedStmtNameToID map[string]uint32 - // prepared statement auto increment id - preparedStmtID uint32 - - // following variables are special for current session - Status uint16 - LastInsertID uint64 - AffectedRows uint64 - - // Client capability - ClientCapability uint32 - - // Connection ID - ConnectionID uint64 - - // Found rows - FoundRows uint64 - - // Current user - User string -} - -// sessionVarsKeyType is a dummy type to avoid naming collision in context. -type sessionVarsKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k sessionVarsKeyType) String() string { - return "session_vars" -} - -const sessionVarsKey sessionVarsKeyType = 0 - -// BindSessionVars creates a session vars object and binds it to context. -func BindSessionVars(ctx context.Context) { - v := &SessionVars{ - Users: make(map[string]string), - Systems: make(map[string]string), - PreparedStmts: make(map[uint32]interface{}), - PreparedStmtNameToID: make(map[string]uint32), - } - - ctx.SetValue(sessionVarsKey, v) -} - -// GetSessionVars gets the session vars from context. -func GetSessionVars(ctx context.Context) *SessionVars { - v, ok := ctx.Value(sessionVarsKey).(*SessionVars) - if !ok { - return nil - } - return v -} - -const ( - characterSetConnection = "character_set_connection" - collationConnection = "collation_connection" -) - -// GetCharsetInfo gets charset and collation for current context. -// What character set should the server translate a statement to after receiving it? -// For this, the server uses the character_set_connection and collation_connection system variables. -// It converts statements sent by the client from character_set_client to character_set_connection -// (except for string literals that have an introducer such as _latin1 or _utf8). -// collation_connection is important for comparisons of literal strings. -// For comparisons of strings with column values, collation_connection does not matter because columns -// have their own collation, which has a higher collation precedence. -// See: https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html -func GetCharsetInfo(ctx context.Context) (charset, collation string) { - sessionVars := GetSessionVars(ctx) - charset = sessionVars.Systems[characterSetConnection] - collation = sessionVars.Systems[collationConnection] - return -} - -// SetLastInsertID saves the last insert id to the session context. -// TODO: we may store the result for last_insert_id sys var later. -func (s *SessionVars) SetLastInsertID(insertID uint64) { - s.LastInsertID = insertID -} - -// SetAffectedRows saves the affected rows to the session context. -func (s *SessionVars) SetAffectedRows(affectedRows uint64) { - s.AffectedRows = affectedRows -} - -// AddAffectedRows adds affected rows with the argument rows. -func (s *SessionVars) AddAffectedRows(rows uint64) { - s.AffectedRows += rows -} - -// AddFoundRows adds found rows with the argument rows. -func (s *SessionVars) AddFoundRows(rows uint64) { - s.FoundRows += rows -} - -// SetStatusFlag sets the session server status variable. -// If on is ture sets the flag in session status, -// otherwise removes the flag. -func (s *SessionVars) SetStatusFlag(flag uint16, on bool) { - if on { - s.Status |= flag - return - } - s.Status &= (^flag) -} - -// GetNextPreparedStmtID generates and returns the next session scope prepared statement id. -func (s *SessionVars) GetNextPreparedStmtID() uint32 { - s.preparedStmtID++ - return s.preparedStmtID -} - -// SetCurrentUser saves the current user to the session context. -func (s *SessionVars) SetCurrentUser(user string) { - s.User = user -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/variable/statusvar.go b/vendor/github.com/pingcap/tidb/sessionctx/variable/statusvar.go deleted file mode 100644 index c2753e905c54..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/variable/statusvar.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package variable - -import ( - "github.com/juju/errors" -) - -var statisticsList []Statistics -var globalStatusScopes = make(map[string]ScopeFlag) - -// DefaultScopeFlag is the status default scope. -var DefaultScopeFlag = ScopeGlobal | ScopeSession - -// StatusVal is the value of the corresponding status variable. -type StatusVal struct { - Scope ScopeFlag - Value interface{} -} - -// Statistics is the interface of statistics. -type Statistics interface { - // GetScope gets the status variables scope. - GetScope(status string) ScopeFlag - // Stats returns the statistics status variables. - Stats() (map[string]interface{}, error) -} - -// RegisterStatistics registers statistics. -func RegisterStatistics(s Statistics) { - statisticsList = append(statisticsList, s) -} - -// GetStatusVars gets registered statistics status variables. -func GetStatusVars() (map[string]*StatusVal, error) { - statusVars := make(map[string]*StatusVal) - - for _, statistics := range statisticsList { - vals, err := statistics.Stats() - if err != nil { - return nil, errors.Trace(err) - } - - for name, val := range vals { - scope := statistics.GetScope(name) - statusVars[name] = &StatusVal{Value: val, Scope: scope} - } - } - - return statusVars, nil -} diff --git a/vendor/github.com/pingcap/tidb/sessionctx/variable/sysvar.go b/vendor/github.com/pingcap/tidb/sessionctx/variable/sysvar.go deleted file mode 100644 index 1f281ce19cb2..000000000000 --- a/vendor/github.com/pingcap/tidb/sessionctx/variable/sysvar.go +++ /dev/null @@ -1,631 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package variable - -import ( - "strings" - - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/terror" -) - -// ScopeFlag is for system variable whether can be changed in global/session dynamically or not. -type ScopeFlag uint8 - -const ( - // ScopeNone means the system variable can not be changed dynamically. - ScopeNone ScopeFlag = iota << 0 - // ScopeGlobal means the system variable can be changed globally. - ScopeGlobal - // ScopeSession means the system variable can only be changed in current session. - ScopeSession -) - -// SysVar is for system variable. -type SysVar struct { - // Scope is for whether can be changed or not - Scope ScopeFlag - - // Variable name - Name string - - // Variable value - Value string -} - -// SysVars is global sys vars map. -var SysVars map[string]*SysVar - -// GetSysVar returns sys var info for name as key. -func GetSysVar(name string) *SysVar { - name = strings.ToLower(name) - return SysVars[name] -} - -// Variable error codes. -const ( - CodeUnknownStatusVar terror.ErrCode = 1 - CodeUnknownSystemVar terror.ErrCode = 1193 -) - -// Variable errors -var ( - UnknownStatusVar = terror.ClassVariable.New(CodeUnknownStatusVar, "unknown status variable") - UnknownSystemVar = terror.ClassVariable.New(CodeUnknownSystemVar, "unknown system variable") -) - -func init() { - SysVars = make(map[string]*SysVar) - for _, v := range defaultSysVars { - SysVars[v.Name] = v - } - - // Register terror to mysql error map. - mySQLErrCodes := map[terror.ErrCode]uint16{ - CodeUnknownSystemVar: mysql.ErrUnknownSystemVariable, - } - terror.ErrClassToMySQLCodes[terror.ClassVariable] = mySQLErrCodes -} - -// we only support MySQL now -var defaultSysVars = []*SysVar{ - {ScopeGlobal, "gtid_mode", "OFF"}, - {ScopeGlobal, "flush_time", "0"}, - {ScopeSession, "pseudo_slave_mode", ""}, - {ScopeNone, "performance_schema_max_mutex_classes", "200"}, - {ScopeGlobal | ScopeSession, "low_priority_updates", "OFF"}, - {ScopeGlobal | ScopeSession, "session_track_gtids", ""}, - {ScopeGlobal | ScopeSession, "ndbinfo_max_rows", ""}, - {ScopeGlobal | ScopeSession, "ndb_index_stat_option", ""}, - {ScopeGlobal | ScopeSession, "old_passwords", "0"}, - {ScopeNone, "innodb_version", "5.6.25"}, - {ScopeGlobal, "max_connections", "151"}, - {ScopeGlobal | ScopeSession, "big_tables", "OFF"}, - {ScopeNone, "skip_external_locking", "ON"}, - {ScopeGlobal, "slave_pending_jobs_size_max", "16777216"}, - {ScopeNone, "innodb_sync_array_size", "1"}, - {ScopeSession, "rand_seed2", ""}, - {ScopeGlobal, "validate_password_number_count", ""}, - {ScopeSession, "gtid_next", ""}, - {ScopeGlobal | ScopeSession, "sql_select_limit", "18446744073709551615"}, - {ScopeGlobal, "ndb_show_foreign_key_mock_tables", ""}, - {ScopeNone, "multi_range_count", "256"}, - {ScopeGlobal | ScopeSession, "default_week_format", "0"}, - {ScopeGlobal | ScopeSession, "binlog_error_action", "IGNORE_ERROR"}, - {ScopeGlobal, "slave_transaction_retries", "10"}, - {ScopeGlobal | ScopeSession, "default_storage_engine", "InnoDB"}, - {ScopeNone, "ft_query_expansion_limit", "20"}, - {ScopeGlobal, "max_connect_errors", "100"}, - {ScopeGlobal, "sync_binlog", "0"}, - {ScopeNone, "max_digest_length", "1024"}, - {ScopeNone, "innodb_force_load_corrupted", "OFF"}, - {ScopeNone, "performance_schema_max_table_handles", "4000"}, - {ScopeGlobal, "innodb_fast_shutdown", "1"}, - {ScopeNone, "ft_max_word_len", "84"}, - {ScopeGlobal, "log_backward_compatible_user_definitions", ""}, - {ScopeNone, "lc_messages_dir", "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/"}, - {ScopeGlobal, "ft_boolean_syntax", "+ -><()~*:\"\"&|"}, - {ScopeGlobal, "table_definition_cache", "1400"}, - {ScopeNone, "skip_name_resolve", "OFF"}, - {ScopeNone, "performance_schema_max_file_handles", "32768"}, - {ScopeSession, "transaction_allow_batching", ""}, - {ScopeGlobal | ScopeSession, "sql_mode", "NO_ENGINE_SUBSTITUTION"}, - {ScopeNone, "performance_schema_max_statement_classes", "168"}, - {ScopeGlobal, "server_id", "0"}, - {ScopeGlobal, "innodb_flushing_avg_loops", "30"}, - {ScopeGlobal | ScopeSession, "tmp_table_size", "16777216"}, - {ScopeGlobal, "innodb_max_purge_lag", "0"}, - {ScopeGlobal | ScopeSession, "preload_buffer_size", "32768"}, - {ScopeGlobal, "slave_checkpoint_period", "300"}, - {ScopeGlobal, "check_proxy_users", ""}, - {ScopeNone, "have_query_cache", "YES"}, - {ScopeGlobal, "innodb_flush_log_at_timeout", "1"}, - {ScopeGlobal, "innodb_max_undo_log_size", ""}, - {ScopeGlobal | ScopeSession, "range_alloc_block_size", "4096"}, - {ScopeGlobal, "connect_timeout", "10"}, - {ScopeGlobal | ScopeSession, "collation_server", "latin1_swedish_ci"}, - {ScopeNone, "have_rtree_keys", "YES"}, - {ScopeGlobal, "innodb_old_blocks_pct", "37"}, - {ScopeGlobal, "innodb_file_format", "Antelope"}, - {ScopeGlobal, "innodb_compression_failure_threshold_pct", "5"}, - {ScopeNone, "performance_schema_events_waits_history_long_size", "10000"}, - {ScopeGlobal, "innodb_checksum_algorithm", "innodb"}, - {ScopeNone, "innodb_ft_sort_pll_degree", "2"}, - {ScopeNone, "thread_stack", "262144"}, - {ScopeGlobal, "relay_log_info_repository", "FILE"}, - {ScopeGlobal | ScopeSession, "sql_log_bin", "ON"}, - {ScopeGlobal, "super_read_only", ""}, - {ScopeGlobal | ScopeSession, "max_delayed_threads", "20"}, - {ScopeNone, "protocol_version", "10"}, - {ScopeGlobal | ScopeSession, "new", "OFF"}, - {ScopeGlobal | ScopeSession, "myisam_sort_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_offset", "-1"}, - {ScopeGlobal, "innodb_buffer_pool_dump_at_shutdown", "OFF"}, - {ScopeGlobal | ScopeSession, "sql_notes", "ON"}, - {ScopeGlobal, "innodb_cmp_per_index_enabled", "OFF"}, - {ScopeGlobal, "innodb_ft_server_stopword_table", ""}, - {ScopeNone, "performance_schema_max_file_instances", "7693"}, - {ScopeNone, "log_output", "FILE"}, - {ScopeGlobal, "binlog_group_commit_sync_delay", ""}, - {ScopeGlobal, "binlog_group_commit_sync_no_delay_count", ""}, - {ScopeNone, "have_crypt", "YES"}, - {ScopeGlobal, "innodb_log_write_ahead_size", ""}, - {ScopeNone, "innodb_log_group_home_dir", "./"}, - {ScopeNone, "performance_schema_events_statements_history_size", "10"}, - {ScopeGlobal, "general_log", "OFF"}, - {ScopeGlobal, "validate_password_dictionary_file", ""}, - {ScopeGlobal, "binlog_order_commits", "ON"}, - {ScopeGlobal, "master_verify_checksum", "OFF"}, - {ScopeGlobal, "key_cache_division_limit", "100"}, - {ScopeGlobal, "rpl_semi_sync_master_trace_level", ""}, - {ScopeGlobal | ScopeSession, "max_insert_delayed_threads", "20"}, - {ScopeNone, "performance_schema_session_connect_attrs_size", "512"}, - {ScopeGlobal | ScopeSession, "time_zone", "SYSTEM"}, - {ScopeGlobal, "innodb_max_dirty_pages_pct", "75"}, - {ScopeGlobal, "innodb_file_per_table", "ON"}, - {ScopeGlobal, "innodb_log_compressed_pages", "ON"}, - {ScopeGlobal, "master_info_repository", "FILE"}, - {ScopeGlobal, "rpl_stop_slave_timeout", "31536000"}, - {ScopeNone, "skip_networking", "OFF"}, - {ScopeGlobal, "innodb_monitor_reset", ""}, - {ScopeNone, "have_ssl", "DISABLED"}, - {ScopeNone, "system_time_zone", "CST"}, - {ScopeGlobal, "innodb_print_all_deadlocks", "OFF"}, - {ScopeNone, "innodb_autoinc_lock_mode", "1"}, - {ScopeGlobal, "slave_net_timeout", "3600"}, - {ScopeGlobal, "key_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, "foreign_key_checks", "ON"}, - {ScopeGlobal, "host_cache_size", "279"}, - {ScopeGlobal, "delay_key_write", "ON"}, - {ScopeNone, "metadata_locks_cache_size", "1024"}, - {ScopeNone, "innodb_force_recovery", "0"}, - {ScopeGlobal, "innodb_file_format_max", "Antelope"}, - {ScopeGlobal | ScopeSession, "debug", ""}, - {ScopeGlobal, "log_warnings", "1"}, - {ScopeGlobal, "offline_mode", ""}, - {ScopeGlobal | ScopeSession, "innodb_strict_mode", "OFF"}, - {ScopeGlobal, "innodb_rollback_segments", "128"}, - {ScopeGlobal | ScopeSession, "join_buffer_size", "262144"}, - {ScopeNone, "innodb_mirrored_log_groups", "1"}, - {ScopeGlobal, "max_binlog_size", "1073741824"}, - {ScopeGlobal, "sync_master_info", "10000"}, - {ScopeGlobal, "concurrent_insert", "AUTO"}, - {ScopeGlobal, "innodb_adaptive_hash_index", "ON"}, - {ScopeGlobal, "innodb_ft_enable_stopword", "ON"}, - {ScopeGlobal, "general_log_file", "/usr/local/mysql/data/localhost.log"}, - {ScopeGlobal | ScopeSession, "innodb_support_xa", "ON"}, - {ScopeGlobal, "innodb_compression_level", "6"}, - {ScopeNone, "innodb_file_format_check", "ON"}, - {ScopeNone, "myisam_mmap_size", "18446744073709551615"}, - {ScopeGlobal, "init_slave", ""}, - {ScopeNone, "innodb_buffer_pool_instances", "8"}, - {ScopeGlobal | ScopeSession, "block_encryption_mode", "aes-128-ecb"}, - {ScopeGlobal | ScopeSession, "max_length_for_sort_data", "1024"}, - {ScopeNone, "character_set_system", "utf8"}, - {ScopeGlobal | ScopeSession, "interactive_timeout", "28800"}, - {ScopeGlobal, "innodb_optimize_fulltext_only", "OFF"}, - {ScopeNone, "character_sets_dir", "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/"}, - {ScopeGlobal | ScopeSession, "query_cache_type", "OFF"}, - {ScopeNone, "innodb_rollback_on_timeout", "OFF"}, - {ScopeGlobal | ScopeSession, "query_alloc_block_size", "8192"}, - {ScopeGlobal, "slave_compressed_protocol", "OFF"}, - {ScopeGlobal, "init_connect", ""}, - {ScopeGlobal, "rpl_semi_sync_slave_trace_level", ""}, - {ScopeNone, "have_compress", "YES"}, - {ScopeNone, "thread_concurrency", "10"}, - {ScopeGlobal | ScopeSession, "query_prealloc_size", "8192"}, - {ScopeNone, "relay_log_space_limit", "0"}, - {ScopeGlobal | ScopeSession, "max_user_connections", "0"}, - {ScopeNone, "performance_schema_max_thread_classes", "50"}, - {ScopeGlobal, "innodb_api_trx_level", "0"}, - {ScopeNone, "disconnect_on_expired_password", "ON"}, - {ScopeNone, "performance_schema_max_file_classes", "50"}, - {ScopeGlobal, "expire_logs_days", "0"}, - {ScopeGlobal | ScopeSession, "binlog_rows_query_log_events", "OFF"}, - {ScopeGlobal, "validate_password_policy", ""}, - {ScopeGlobal, "default_password_lifetime", ""}, - {ScopeNone, "pid_file", "/usr/local/mysql/data/localhost.pid"}, - {ScopeNone, "innodb_undo_tablespaces", "0"}, - {ScopeGlobal, "innodb_status_output_locks", "OFF"}, - {ScopeNone, "performance_schema_accounts_size", "100"}, - {ScopeGlobal | ScopeSession, "max_error_count", "64"}, - {ScopeGlobal, "max_write_lock_count", "18446744073709551615"}, - {ScopeNone, "performance_schema_max_socket_instances", "322"}, - {ScopeNone, "performance_schema_max_table_instances", "12500"}, - {ScopeGlobal, "innodb_stats_persistent_sample_pages", "20"}, - {ScopeGlobal, "show_compatibility_56", ""}, - {ScopeGlobal, "log_slow_slave_statements", "OFF"}, - {ScopeNone, "innodb_open_files", "2000"}, - {ScopeGlobal, "innodb_spin_wait_delay", "6"}, - {ScopeGlobal, "thread_cache_size", "9"}, - {ScopeGlobal, "log_slow_admin_statements", "OFF"}, - {ScopeNone, "innodb_checksums", "ON"}, - {ScopeNone, "hostname", "localhost"}, - {ScopeGlobal | ScopeSession, "auto_increment_offset", "1"}, - {ScopeNone, "ft_stopword_file", "(built-in)"}, - {ScopeGlobal, "innodb_max_dirty_pages_pct_lwm", "0"}, - {ScopeGlobal, "log_queries_not_using_indexes", "OFF"}, - {ScopeSession, "timestamp", ""}, - {ScopeGlobal | ScopeSession, "query_cache_wlock_invalidate", "OFF"}, - {ScopeGlobal | ScopeSession, "sql_buffer_result", "OFF"}, - {ScopeGlobal | ScopeSession, "character_set_filesystem", "binary"}, - {ScopeGlobal | ScopeSession, "collation_database", "latin1_swedish_ci"}, - {ScopeGlobal | ScopeSession, "auto_increment_increment", "1"}, - {ScopeGlobal | ScopeSession, "max_heap_table_size", "16777216"}, - {ScopeGlobal | ScopeSession, "div_precision_increment", "4"}, - {ScopeGlobal, "innodb_lru_scan_depth", "1024"}, - {ScopeGlobal, "innodb_purge_rseg_truncate_frequency", ""}, - {ScopeGlobal | ScopeSession, "sql_auto_is_null", "OFF"}, - {ScopeNone, "innodb_api_enable_binlog", "OFF"}, - {ScopeGlobal | ScopeSession, "innodb_ft_user_stopword_table", ""}, - {ScopeNone, "server_id_bits", "32"}, - {ScopeGlobal, "innodb_log_checksum_algorithm", ""}, - {ScopeNone, "innodb_buffer_pool_load_at_startup", "OFF"}, - {ScopeGlobal | ScopeSession, "sort_buffer_size", "262144"}, - {ScopeGlobal, "innodb_flush_neighbors", "1"}, - {ScopeNone, "innodb_use_sys_malloc", "ON"}, - {ScopeNone, "plugin_dir", "/usr/local/mysql/lib/plugin/"}, - {ScopeNone, "performance_schema_max_socket_classes", "10"}, - {ScopeNone, "performance_schema_max_stage_classes", "150"}, - {ScopeGlobal, "innodb_purge_batch_size", "300"}, - {ScopeNone, "have_profiling", "YES"}, - {ScopeGlobal, "slave_checkpoint_group", "512"}, - {ScopeGlobal | ScopeSession, "character_set_client", "latin1"}, - {ScopeNone, "slave_load_tmpdir", "/var/tmp/"}, - {ScopeGlobal, "innodb_buffer_pool_dump_now", "OFF"}, - {ScopeGlobal, "relay_log_purge", "ON"}, - {ScopeGlobal, "ndb_distribution", ""}, - {ScopeGlobal, "myisam_data_pointer_size", "6"}, - {ScopeGlobal, "ndb_optimization_delay", ""}, - {ScopeGlobal, "innodb_ft_num_word_optimize", "2000"}, - {ScopeGlobal | ScopeSession, "max_join_size", "18446744073709551615"}, - {ScopeNone, "core_file", "OFF"}, - {ScopeGlobal | ScopeSession, "max_seeks_for_key", "18446744073709551615"}, - {ScopeNone, "innodb_log_buffer_size", "8388608"}, - {ScopeGlobal, "delayed_insert_timeout", "300"}, - {ScopeGlobal, "max_relay_log_size", "0"}, - {ScopeGlobal | ScopeSession, "max_sort_length", "1024"}, - {ScopeNone, "metadata_locks_hash_instances", "8"}, - {ScopeGlobal, "ndb_eventbuffer_free_percent", ""}, - {ScopeNone, "large_files_support", "ON"}, - {ScopeGlobal, "binlog_max_flush_queue_time", "0"}, - {ScopeGlobal, "innodb_fill_factor", ""}, - {ScopeGlobal, "log_syslog_facility", ""}, - {ScopeNone, "innodb_ft_min_token_size", "3"}, - {ScopeGlobal | ScopeSession, "transaction_write_set_extraction", ""}, - {ScopeGlobal | ScopeSession, "ndb_blob_write_batch_bytes", ""}, - {ScopeGlobal, "automatic_sp_privileges", "ON"}, - {ScopeGlobal, "innodb_flush_sync", ""}, - {ScopeNone, "performance_schema_events_statements_history_long_size", "10000"}, - {ScopeGlobal, "innodb_monitor_disable", ""}, - {ScopeNone, "innodb_doublewrite", "ON"}, - {ScopeGlobal, "slave_parallel_type", ""}, - {ScopeNone, "log_bin_use_v1_row_events", "OFF"}, - {ScopeSession, "innodb_optimize_point_storage", ""}, - {ScopeNone, "innodb_api_disable_rowlock", "OFF"}, - {ScopeGlobal, "innodb_adaptive_flushing_lwm", "10"}, - {ScopeNone, "innodb_log_files_in_group", "2"}, - {ScopeGlobal, "innodb_buffer_pool_load_now", "OFF"}, - {ScopeNone, "performance_schema_max_rwlock_classes", "40"}, - {ScopeNone, "binlog_gtid_simple_recovery", "OFF"}, - {ScopeNone, "port", "3306"}, - {ScopeNone, "performance_schema_digests_size", "10000"}, - {ScopeGlobal | ScopeSession, "profiling", "OFF"}, - {ScopeNone, "lower_case_table_names", "2"}, - {ScopeSession, "rand_seed1", ""}, - {ScopeGlobal, "sha256_password_proxy_users", ""}, - {ScopeGlobal | ScopeSession, "sql_quote_show_create", "ON"}, - {ScopeGlobal | ScopeSession, "binlogging_impossible_mode", "IGNORE_ERROR"}, - {ScopeGlobal, "query_cache_size", "1048576"}, - {ScopeGlobal, "innodb_stats_transient_sample_pages", "8"}, - {ScopeGlobal, "innodb_stats_on_metadata", "OFF"}, - {ScopeNone, "server_uuid", "d530594e-1c86-11e5-878b-6b36ce6799ca"}, - {ScopeNone, "open_files_limit", "5000"}, - {ScopeGlobal | ScopeSession, "ndb_force_send", ""}, - {ScopeNone, "skip_show_database", "OFF"}, - {ScopeGlobal, "log_timestamps", ""}, - {ScopeNone, "version_compile_machine", "x86_64"}, - {ScopeGlobal, "slave_parallel_workers", "0"}, - {ScopeGlobal, "event_scheduler", "OFF"}, - {ScopeGlobal | ScopeSession, "ndb_deferred_constraints", ""}, - {ScopeGlobal, "log_syslog_include_pid", ""}, - {ScopeSession, "last_insert_id", ""}, - {ScopeNone, "innodb_ft_cache_size", "8000000"}, - {ScopeNone, "log_bin", "OFF"}, - {ScopeGlobal, "innodb_disable_sort_file_cache", "OFF"}, - {ScopeGlobal, "log_error_verbosity", ""}, - {ScopeNone, "performance_schema_hosts_size", "100"}, - {ScopeGlobal, "innodb_replication_delay", "0"}, - {ScopeGlobal, "slow_query_log", "OFF"}, - {ScopeSession, "debug_sync", ""}, - {ScopeGlobal, "innodb_stats_auto_recalc", "ON"}, - {ScopeGlobal, "timed_mutexes", "OFF"}, - {ScopeGlobal | ScopeSession, "lc_messages", "en_US"}, - {ScopeGlobal | ScopeSession, "bulk_insert_buffer_size", "8388608"}, - {ScopeGlobal | ScopeSession, "binlog_direct_non_transactional_updates", "OFF"}, - {ScopeGlobal, "innodb_change_buffering", "all"}, - {ScopeGlobal | ScopeSession, "sql_big_selects", "ON"}, - {ScopeGlobal | ScopeSession, "character_set_results", "latin1"}, - {ScopeGlobal, "innodb_max_purge_lag_delay", "0"}, - {ScopeGlobal | ScopeSession, "session_track_schema", ""}, - {ScopeGlobal, "innodb_io_capacity_max", "2000"}, - {ScopeGlobal, "innodb_autoextend_increment", "64"}, - {ScopeGlobal | ScopeSession, "binlog_format", "STATEMENT"}, - {ScopeGlobal | ScopeSession, "optimizer_trace", "enabled=off,one_line=off"}, - {ScopeGlobal | ScopeSession, "read_rnd_buffer_size", "262144"}, - {ScopeNone, "version_comment", "MySQL Community Server (GPL)"}, - {ScopeGlobal | ScopeSession, "net_write_timeout", "60"}, - {ScopeGlobal, "innodb_buffer_pool_load_abort", "OFF"}, - {ScopeGlobal | ScopeSession, "tx_isolation", "REPEATABLE-READ"}, - {ScopeGlobal | ScopeSession, "collation_connection", "latin1_swedish_ci"}, - {ScopeGlobal, "rpl_semi_sync_master_timeout", ""}, - {ScopeGlobal | ScopeSession, "transaction_prealloc_size", "4096"}, - {ScopeNone, "slave_skip_errors", "OFF"}, - {ScopeNone, "performance_schema_setup_objects_size", "100"}, - {ScopeGlobal, "sync_relay_log", "10000"}, - {ScopeGlobal, "innodb_ft_result_cache_limit", "2000000000"}, - {ScopeNone, "innodb_sort_buffer_size", "1048576"}, - {ScopeGlobal, "innodb_ft_enable_diag_print", "OFF"}, - {ScopeNone, "thread_handling", "one-thread-per-connection"}, - {ScopeGlobal, "stored_program_cache", "256"}, - {ScopeNone, "performance_schema_max_mutex_instances", "15906"}, - {ScopeGlobal, "innodb_adaptive_max_sleep_delay", "150000"}, - {ScopeNone, "large_pages", "OFF"}, - {ScopeGlobal | ScopeSession, "session_track_system_variables", ""}, - {ScopeGlobal, "innodb_change_buffer_max_size", "25"}, - {ScopeGlobal, "log_bin_trust_function_creators", "OFF"}, - {ScopeNone, "innodb_write_io_threads", "4"}, - {ScopeGlobal, "mysql_native_password_proxy_users", ""}, - {ScopeGlobal, "read_only", "OFF"}, - {ScopeNone, "large_page_size", "0"}, - {ScopeNone, "table_open_cache_instances", "1"}, - {ScopeGlobal, "innodb_stats_persistent", "ON"}, - {ScopeGlobal | ScopeSession, "session_track_state_change", ""}, - {ScopeNone, "optimizer_switch", "index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on"}, - {ScopeGlobal, "delayed_queue_size", "1000"}, - {ScopeNone, "innodb_read_only", "OFF"}, - {ScopeNone, "datetime_format", "%Y-%m-%d %H:%i:%s"}, - {ScopeGlobal, "log_syslog", ""}, - {ScopeNone, "version", "5.6.25"}, - {ScopeGlobal | ScopeSession, "transaction_alloc_block_size", "8192"}, - {ScopeGlobal, "sql_slave_skip_counter", "0"}, - {ScopeNone, "have_openssl", "DISABLED"}, - {ScopeGlobal, "innodb_large_prefix", "OFF"}, - {ScopeNone, "performance_schema_max_cond_classes", "80"}, - {ScopeGlobal, "innodb_io_capacity", "200"}, - {ScopeGlobal, "max_binlog_cache_size", "18446744073709547520"}, - {ScopeGlobal | ScopeSession, "ndb_index_stat_enable", ""}, - {ScopeGlobal, "executed_gtids_compression_period", ""}, - {ScopeNone, "time_format", "%H:%i:%s"}, - {ScopeGlobal | ScopeSession, "old_alter_table", "OFF"}, - {ScopeGlobal | ScopeSession, "long_query_time", "10.000000"}, - {ScopeNone, "innodb_use_native_aio", "OFF"}, - {ScopeGlobal, "log_throttle_queries_not_using_indexes", "0"}, - {ScopeNone, "locked_in_memory", "OFF"}, - {ScopeNone, "innodb_api_enable_mdl", "OFF"}, - {ScopeGlobal, "binlog_cache_size", "32768"}, - {ScopeGlobal, "innodb_compression_pad_pct_max", "50"}, - {ScopeGlobal, "innodb_commit_concurrency", "0"}, - {ScopeNone, "ft_min_word_len", "4"}, - {ScopeGlobal, "enforce_gtid_consistency", "OFF"}, - {ScopeGlobal, "secure_auth", "ON"}, - {ScopeNone, "max_tmp_tables", "32"}, - {ScopeGlobal, "innodb_random_read_ahead", "OFF"}, - {ScopeGlobal | ScopeSession, "unique_checks", "ON"}, - {ScopeGlobal, "internal_tmp_disk_storage_engine", ""}, - {ScopeGlobal | ScopeSession, "myisam_repair_threads", "1"}, - {ScopeGlobal, "ndb_eventbuffer_max_alloc", ""}, - {ScopeGlobal, "innodb_read_ahead_threshold", "56"}, - {ScopeGlobal, "key_cache_block_size", "1024"}, - {ScopeGlobal, "rpl_semi_sync_slave_enabled", ""}, - {ScopeNone, "ndb_recv_thread_cpu_mask", ""}, - {ScopeGlobal, "gtid_purged", ""}, - {ScopeGlobal, "max_binlog_stmt_cache_size", "18446744073709547520"}, - {ScopeGlobal | ScopeSession, "lock_wait_timeout", "31536000"}, - {ScopeGlobal | ScopeSession, "read_buffer_size", "131072"}, - {ScopeNone, "innodb_read_io_threads", "4"}, - {ScopeGlobal | ScopeSession, "max_sp_recursion_depth", "0"}, - {ScopeNone, "ignore_builtin_innodb", "OFF"}, - {ScopeGlobal, "rpl_semi_sync_master_enabled", ""}, - {ScopeGlobal, "slow_query_log_file", "/usr/local/mysql/data/localhost-slow.log"}, - {ScopeGlobal, "innodb_thread_sleep_delay", "10000"}, - {ScopeNone, "license", "GPL"}, - {ScopeGlobal, "innodb_ft_aux_table", ""}, - {ScopeGlobal | ScopeSession, "sql_warnings", "OFF"}, - {ScopeGlobal | ScopeSession, "keep_files_on_create", "OFF"}, - {ScopeGlobal, "slave_preserve_commit_order", ""}, - {ScopeNone, "innodb_data_file_path", "ibdata1:12M:autoextend"}, - {ScopeNone, "performance_schema_setup_actors_size", "100"}, - {ScopeNone, "innodb_additional_mem_pool_size", "8388608"}, - {ScopeNone, "log_error", "/usr/local/mysql/data/localhost.err"}, - {ScopeGlobal, "slave_exec_mode", "STRICT"}, - {ScopeGlobal, "binlog_stmt_cache_size", "32768"}, - {ScopeNone, "relay_log_info_file", "relay-log.info"}, - {ScopeNone, "innodb_ft_total_cache_size", "640000000"}, - {ScopeNone, "performance_schema_max_rwlock_instances", "9102"}, - {ScopeGlobal, "table_open_cache", "2000"}, - {ScopeNone, "log_slave_updates", "OFF"}, - {ScopeNone, "performance_schema_events_stages_history_long_size", "10000"}, - {ScopeGlobal | ScopeSession, "autocommit", "ON"}, - {ScopeSession, "insert_id", ""}, - {ScopeGlobal | ScopeSession, "default_tmp_storage_engine", "InnoDB"}, - {ScopeGlobal | ScopeSession, "optimizer_search_depth", "62"}, - {ScopeGlobal, "max_points_in_geometry", ""}, - {ScopeGlobal, "innodb_stats_sample_pages", "8"}, - {ScopeGlobal | ScopeSession, "profiling_history_size", "15"}, - {ScopeGlobal | ScopeSession, "character_set_database", "latin1"}, - {ScopeNone, "have_symlink", "YES"}, - {ScopeGlobal | ScopeSession, "storage_engine", "InnoDB"}, - {ScopeGlobal | ScopeSession, "sql_log_off", "OFF"}, - {ScopeNone, "explicit_defaults_for_timestamp", "OFF"}, - {ScopeNone, "performance_schema_events_waits_history_size", "10"}, - {ScopeGlobal, "log_syslog_tag", ""}, - {ScopeGlobal | ScopeSession, "tx_read_only", "OFF"}, - {ScopeGlobal, "rpl_semi_sync_master_wait_point", ""}, - {ScopeGlobal, "innodb_undo_log_truncate", ""}, - {ScopeNone, "simplified_binlog_gtid_recovery", "OFF"}, - {ScopeSession, "innodb_create_intrinsic", ""}, - {ScopeGlobal, "gtid_executed_compression_period", ""}, - {ScopeGlobal, "ndb_log_empty_epochs", ""}, - {ScopeGlobal, "max_prepared_stmt_count", "16382"}, - {ScopeNone, "have_geometry", "YES"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_max_mem_size", "16384"}, - {ScopeGlobal | ScopeSession, "net_retry_count", "10"}, - {ScopeSession, "ndb_table_no_logging", ""}, - {ScopeGlobal | ScopeSession, "optimizer_trace_features", "greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on"}, - {ScopeGlobal, "innodb_flush_log_at_trx_commit", "1"}, - {ScopeGlobal, "rewriter_enabled", ""}, - {ScopeGlobal, "query_cache_min_res_unit", "4096"}, - {ScopeGlobal | ScopeSession, "updatable_views_with_limit", "YES"}, - {ScopeGlobal | ScopeSession, "optimizer_prune_level", "1"}, - {ScopeGlobal, "slave_sql_verify_checksum", "ON"}, - {ScopeGlobal | ScopeSession, "completion_type", "NO_CHAIN"}, - {ScopeGlobal, "binlog_checksum", "CRC32"}, - {ScopeNone, "report_port", "3306"}, - {ScopeGlobal | ScopeSession, "show_old_temporals", "OFF"}, - {ScopeGlobal, "query_cache_limit", "1048576"}, - {ScopeGlobal, "innodb_buffer_pool_size", "134217728"}, - {ScopeGlobal, "innodb_adaptive_flushing", "ON"}, - {ScopeNone, "datadir", "/usr/local/mysql/data/"}, - {ScopeGlobal | ScopeSession, "wait_timeout", "28800"}, - {ScopeGlobal, "innodb_monitor_enable", ""}, - {ScopeNone, "date_format", "%Y-%m-%d"}, - {ScopeGlobal, "innodb_buffer_pool_filename", "ib_buffer_pool"}, - {ScopeGlobal, "slow_launch_time", "2"}, - {ScopeGlobal, "slave_max_allowed_packet", "1073741824"}, - {ScopeGlobal | ScopeSession, "ndb_use_transactions", ""}, - {ScopeNone, "innodb_purge_threads", "1"}, - {ScopeGlobal, "innodb_concurrency_tickets", "5000"}, - {ScopeGlobal, "innodb_monitor_reset_all", ""}, - {ScopeNone, "performance_schema_users_size", "100"}, - {ScopeGlobal, "ndb_log_updated_only", ""}, - {ScopeNone, "basedir", "/usr/local/mysql"}, - {ScopeGlobal, "innodb_old_blocks_time", "1000"}, - {ScopeGlobal, "innodb_stats_method", "nulls_equal"}, - {ScopeGlobal | ScopeSession, "innodb_lock_wait_timeout", "50"}, - {ScopeGlobal, "local_infile", "ON"}, - {ScopeGlobal | ScopeSession, "myisam_stats_method", "nulls_unequal"}, - {ScopeNone, "version_compile_os", "osx10.8"}, - {ScopeNone, "relay_log_recovery", "OFF"}, - {ScopeNone, "old", "OFF"}, - {ScopeGlobal | ScopeSession, "innodb_table_locks", "ON"}, - {ScopeNone, "performance_schema", "ON"}, - {ScopeNone, "myisam_recover_options", "OFF"}, - {ScopeGlobal | ScopeSession, "net_buffer_length", "16384"}, - {ScopeGlobal, "rpl_semi_sync_master_wait_for_slave_count", ""}, - {ScopeGlobal | ScopeSession, "binlog_row_image", "FULL"}, - {ScopeNone, "innodb_locks_unsafe_for_binlog", "OFF"}, - {ScopeSession, "rbr_exec_mode", ""}, - {ScopeGlobal, "myisam_max_sort_file_size", "9223372036853727232"}, - {ScopeNone, "back_log", "80"}, - {ScopeNone, "lower_case_file_system", "ON"}, - {ScopeGlobal, "rpl_semi_sync_master_wait_no_slave", ""}, - {ScopeGlobal | ScopeSession, "group_concat_max_len", "1024"}, - {ScopeSession, "pseudo_thread_id", ""}, - {ScopeNone, "socket", "/tmp/myssock"}, - {ScopeNone, "have_dynamic_loading", "YES"}, - {ScopeGlobal, "rewriter_verbose", ""}, - {ScopeGlobal, "innodb_undo_logs", "128"}, - {ScopeNone, "performance_schema_max_cond_instances", "3504"}, - {ScopeGlobal, "delayed_insert_limit", "100"}, - {ScopeGlobal, "flush", "OFF"}, - {ScopeGlobal | ScopeSession, "eq_range_index_dive_limit", "10"}, - {ScopeNone, "performance_schema_events_stages_history_size", "10"}, - {ScopeGlobal | ScopeSession, "character_set_connection", "latin1"}, - {ScopeGlobal, "myisam_use_mmap", "OFF"}, - {ScopeGlobal | ScopeSession, "ndb_join_pushdown", ""}, - {ScopeGlobal | ScopeSession, "character_set_server", "latin1"}, - {ScopeGlobal, "validate_password_special_char_count", ""}, - {ScopeNone, "performance_schema_max_thread_instances", "402"}, - {ScopeGlobal, "slave_rows_search_algorithms", "TABLE_SCAN,INDEX_SCAN"}, - {ScopeGlobal | ScopeSession, "ndbinfo_show_hidden", ""}, - {ScopeGlobal | ScopeSession, "net_read_timeout", "30"}, - {ScopeNone, "innodb_page_size", "16384"}, - {ScopeGlobal, "max_allowed_packet", "4194304"}, - {ScopeNone, "innodb_log_file_size", "50331648"}, - {ScopeGlobal, "sync_relay_log_info", "10000"}, - {ScopeGlobal | ScopeSession, "optimizer_trace_limit", "1"}, - {ScopeNone, "innodb_ft_max_token_size", "84"}, - {ScopeGlobal, "validate_password_length", ""}, - {ScopeGlobal, "ndb_log_binlog_index", ""}, - {ScopeGlobal, "validate_password_mixed_case_count", ""}, - {ScopeGlobal, "innodb_api_bk_commit_interval", "5"}, - {ScopeNone, "innodb_undo_directory", "."}, - {ScopeNone, "bind_address", "*"}, - {ScopeGlobal, "innodb_sync_spin_loops", "30"}, - {ScopeGlobal | ScopeSession, "sql_safe_updates", "OFF"}, - {ScopeNone, "tmpdir", "/var/tmp/"}, - {ScopeGlobal, "innodb_thread_concurrency", "0"}, - {ScopeGlobal, "slave_allow_batching", "OFF"}, - {ScopeGlobal, "innodb_buffer_pool_dump_pct", ""}, - {ScopeGlobal | ScopeSession, "lc_time_names", "en_US"}, - {ScopeGlobal | ScopeSession, "max_statement_time", ""}, - {ScopeGlobal | ScopeSession, "end_markers_in_json", "OFF"}, - {ScopeGlobal, "avoid_temporal_upgrade", "OFF"}, - {ScopeGlobal, "key_cache_age_threshold", "300"}, - {ScopeGlobal, "innodb_status_output", "OFF"}, - {ScopeSession, "identity", ""}, - {ScopeGlobal | ScopeSession, "min_examined_row_limit", "0"}, - {ScopeGlobal, "sync_frm", "ON"}, - {ScopeGlobal, "innodb_online_alter_log_max_size", "134217728"}, -} - -// SetNamesVariables is the system variable names related to set names statements. -var SetNamesVariables = []string{ - "character_set_client", - "character_set_connection", - "character_set_results", -} - -const ( - // CollationConnection is the name for collation_connection system variable. - CollationConnection = "collation_connection" - // CharsetDatabase is the name for charactor_set_database system variable. - CharsetDatabase = "character_set_database" - // CollationDatabase is the name for collation_database system variable. - CollationDatabase = "collation_database" -) - -// GlobalVarAccessor is the interface for accessing global scope system and status variables. -type GlobalVarAccessor interface { - // GetGlobalSysVar gets the global system variable value for name. - GetGlobalSysVar(ctx context.Context, name string) (string, error) - // SetGlobalSysVar sets the global system variable name to value. - SetGlobalSysVar(ctx context.Context, name string, value string) error -} - -// globalSysVarAccessorKeyType is a dummy type to avoid naming collision in context. -type globalSysVarAccessorKeyType int - -// String defines a Stringer function for debugging and pretty printing. -func (k globalSysVarAccessorKeyType) String() string { - return "global_sysvar_accessor" -} - -const accessorKey globalSysVarAccessorKeyType = 0 - -// BindGlobalVarAccessor binds global var accessor to context. -func BindGlobalVarAccessor(ctx context.Context, accessor GlobalVarAccessor) { - ctx.SetValue(accessorKey, accessor) -} - -// GetGlobalVarAccessor gets accessor from ctx. -func GetGlobalVarAccessor(ctx context.Context) GlobalVarAccessor { - v, ok := ctx.Value(accessorKey).(GlobalVarAccessor) - if !ok { - panic("Miss global sysvar accessor") - } - return v -} diff --git a/vendor/github.com/pingcap/tidb/store/hbase/kv.go b/vendor/github.com/pingcap/tidb/store/hbase/kv.go deleted file mode 100644 index 6ceaff30500b..000000000000 --- a/vendor/github.com/pingcap/tidb/store/hbase/kv.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package hbasekv - -import ( - "fmt" - "math/rand" - "net/url" - "path/filepath" - "strings" - "sync" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/go-hbase" - "github.com/pingcap/go-themis" - "github.com/pingcap/go-themis/oracle" - "github.com/pingcap/go-themis/oracle/oracles" - "github.com/pingcap/tidb/kv" -) - -const ( - // hbaseColFamily is the hbase column family name. - hbaseColFamily = "f" - // hbaseQualifier is the hbase column name. - hbaseQualifier = "q" - // hbaseFmlAndQual is a shortcut. - hbaseFmlAndQual = hbaseColFamily + ":" + hbaseQualifier - // fix length conn pool - hbaseConnPoolSize = 10 -) - -var ( - hbaseColFamilyBytes = []byte(hbaseColFamily) - hbaseQualifierBytes = []byte(hbaseQualifier) -) - -var ( - _ kv.Storage = (*hbaseStore)(nil) -) - -var ( - // ErrInvalidDSN is returned when store dsn is invalid. - ErrInvalidDSN = errors.New("invalid dsn") -) - -type storeCache struct { - mu sync.Mutex - cache map[string]*hbaseStore -} - -var mc storeCache - -func init() { - mc.cache = make(map[string]*hbaseStore) - rand.Seed(time.Now().UnixNano()) -} - -type hbaseStore struct { - mu sync.Mutex - uuid string - storeName string - oracle oracle.Oracle - conns []hbase.HBaseClient -} - -func (s *hbaseStore) getHBaseClient() hbase.HBaseClient { - // return hbase connection randomly - return s.conns[rand.Intn(hbaseConnPoolSize)] -} - -func (s *hbaseStore) Begin() (kv.Transaction, error) { - s.mu.Lock() - defer s.mu.Unlock() - hbaseCli := s.getHBaseClient() - t, err := themis.NewTxn(hbaseCli, s.oracle) - if err != nil { - return nil, errors.Trace(err) - } - txn := newHbaseTxn(t, s.storeName) - return txn, nil -} - -func (s *hbaseStore) GetSnapshot(ver kv.Version) (kv.Snapshot, error) { - hbaseCli := s.getHBaseClient() - t, err := themis.NewTxn(hbaseCli, s.oracle) - if err != nil { - return nil, errors.Trace(err) - } - return newHbaseSnapshot(t, s.storeName), nil -} - -func (s *hbaseStore) Close() error { - mc.mu.Lock() - defer mc.mu.Unlock() - - delete(mc.cache, s.uuid) - - var err error - for _, conn := range s.conns { - err = conn.Close() - if err != nil { - log.Error(err) - } - } - // return last error - return err -} - -func (s *hbaseStore) UUID() string { - return s.uuid -} - -func (s *hbaseStore) CurrentVersion() (kv.Version, error) { - hbaseCli := s.getHBaseClient() - t, err := themis.NewTxn(hbaseCli, s.oracle) - if err != nil { - return kv.Version{Ver: 0}, errors.Trace(err) - } - defer t.Release() - - return kv.Version{Ver: t.GetStartTS()}, nil -} - -// Driver implements engine Driver. -type Driver struct { -} - -const ( - tsoTypeLocal = "local" - tsoTypeZK = "zk" - - tsoZKPath = "/zk/tso" -) - -// Open opens or creates an HBase storage with given path. -// -// The format of path should be 'hbase://zk1,zk2,zk3/table[?tso=local|zk]'. -// If tso is not provided, it will use a local oracle instead. (for test only) -func (d Driver) Open(path string) (kv.Storage, error) { - mc.mu.Lock() - defer mc.mu.Unlock() - - zks, tso, tableName, err := parsePath(path) - if err != nil { - return nil, errors.Trace(err) - } - if tso != tsoTypeLocal && tso != tsoTypeZK { - return nil, errors.Trace(ErrInvalidDSN) - } - - uuid := fmt.Sprintf("hbase-%v-%v", zks, tableName) - if tso == tsoTypeLocal { - log.Warnf("hbase: store(%s) is using local oracle(for test only)", uuid) - } - if store, ok := mc.cache[uuid]; ok { - return store, nil - } - - // create buffered HBase connections, HBaseClient is goroutine-safe, so - // it's OK to redistribute to transactions. - conns := make([]hbase.HBaseClient, 0, hbaseConnPoolSize) - for i := 0; i < hbaseConnPoolSize; i++ { - var c hbase.HBaseClient - c, err = hbase.NewClient(strings.Split(zks, ","), "/hbase") - if err != nil { - return nil, errors.Trace(err) - } - conns = append(conns, c) - } - - c := conns[0] - var b bool - b, err = c.TableExists(tableName) - if err != nil { - return nil, errors.Trace(err) - } - if !b { - // Create new hbase table for store. - t := hbase.NewTableDesciptor(tableName) - cf := hbase.NewColumnFamilyDescriptor(hbaseColFamily) - cf.AddAttr("THEMIS_ENABLE", "true") - t.AddColumnDesc(cf) - //TODO: specify split? - if err := c.CreateTable(t, nil); err != nil { - return nil, errors.Trace(err) - } - } - - var ora oracle.Oracle - switch tso { - case tsoTypeLocal: - ora = oracles.NewLocalOracle() - case tsoTypeZK: - ora = oracles.NewRemoteOracle(zks, tsoZKPath) - } - - s := &hbaseStore{ - uuid: uuid, - storeName: tableName, - oracle: ora, - conns: conns, - } - mc.cache[uuid] = s - return s, nil -} - -func parsePath(path string) (zks, tso, tableName string, err error) { - u, err := url.Parse(path) - if err != nil { - return "", "", "", errors.Trace(err) - } - if strings.ToLower(u.Scheme) != "hbase" { - return "", "", "", errors.Trace(ErrInvalidDSN) - } - p, tableName := filepath.Split(u.Path) - if p != "/" { - return "", "", "", errors.Trace(ErrInvalidDSN) - } - zks = u.Host - tso = u.Query().Get("tso") - if tso == "" { - tso = tsoTypeLocal - } - return zks, tso, tableName, nil -} diff --git a/vendor/github.com/pingcap/tidb/store/hbase/snapshot.go b/vendor/github.com/pingcap/tidb/store/hbase/snapshot.go deleted file mode 100644 index 8efe2a06b57f..000000000000 --- a/vendor/github.com/pingcap/tidb/store/hbase/snapshot.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package hbasekv - -import ( - "github.com/juju/errors" - "github.com/pingcap/go-hbase" - "github.com/pingcap/go-themis" - "github.com/pingcap/tidb/kv" -) - -var ( - _ kv.Snapshot = (*hbaseSnapshot)(nil) - _ kv.Iterator = (*hbaseIter)(nil) -) - -// hbaseBatchSize is used for go-themis Scanner. -const hbaseBatchSize = 1000 - -// hbaseSnapshot implements MvccSnapshot interface. -type hbaseSnapshot struct { - txn themis.Txn - storeName string -} - -// newHBaseSnapshot creates a snapshot of an HBase store. -func newHbaseSnapshot(txn themis.Txn, storeName string) *hbaseSnapshot { - return &hbaseSnapshot{ - txn: txn, - storeName: storeName, - } -} - -// Get gets the value for key k from snapshot. -func (s *hbaseSnapshot) Get(k kv.Key) ([]byte, error) { - g := hbase.NewGet([]byte(k)) - g.AddColumn(hbaseColFamilyBytes, hbaseQualifierBytes) - v, err := internalGet(s, g) - if err != nil { - return nil, errors.Trace(err) - } - return v, nil -} - -// BatchGet implements kv.Snapshot.BatchGet interface. -func (s *hbaseSnapshot) BatchGet(keys []kv.Key) (map[string][]byte, error) { - gets := make([]*hbase.Get, len(keys)) - for i, key := range keys { - g := hbase.NewGet(key) - g.AddColumn(hbaseColFamilyBytes, hbaseQualifierBytes) - gets[i] = g - } - rows, err := s.txn.Gets(s.storeName, gets) - if err != nil { - return nil, errors.Trace(err) - } - - m := make(map[string][]byte, len(rows)) - for _, r := range rows { - k := string(r.Row) - v := r.Columns[hbaseFmlAndQual].Value - m[k] = v - } - return m, nil -} - -func internalGet(s *hbaseSnapshot, g *hbase.Get) ([]byte, error) { - r, err := s.txn.Get(s.storeName, g) - if err != nil { - return nil, errors.Trace(err) - } - if r == nil || len(r.Columns) == 0 { - return nil, errors.Trace(kv.ErrNotExist) - } - return r.Columns[hbaseFmlAndQual].Value, nil -} - -func (s *hbaseSnapshot) Seek(k kv.Key) (kv.Iterator, error) { - scanner := s.txn.GetScanner([]byte(s.storeName), []byte(k), nil, hbaseBatchSize) - return newInnerScanner(scanner), nil -} - -func newInnerScanner(scanner *themis.ThemisScanner) kv.Iterator { - it := &hbaseIter{ - ThemisScanner: scanner, - } - it.Next() - return it -} - -func (s *hbaseSnapshot) Release() { - if s.txn != nil { - s.txn.Release() - s.txn = nil - } -} - -type hbaseIter struct { - *themis.ThemisScanner - rs *hbase.ResultRow -} - -func (it *hbaseIter) Next() error { - it.rs = it.ThemisScanner.Next() - return nil -} - -func (it *hbaseIter) Valid() bool { - if it.rs == nil || len(it.rs.Columns) == 0 { - return false - } - if it.ThemisScanner.Closed() { - return false - } - return true -} - -func (it *hbaseIter) Key() kv.Key { - return it.rs.Row -} - -func (it *hbaseIter) Value() []byte { - return it.rs.Columns[hbaseFmlAndQual].Value -} - -func (it *hbaseIter) Close() { - if it.ThemisScanner != nil { - it.ThemisScanner.Close() - it.ThemisScanner = nil - } - it.rs = nil -} diff --git a/vendor/github.com/pingcap/tidb/store/hbase/txn.go b/vendor/github.com/pingcap/tidb/store/hbase/txn.go deleted file mode 100644 index 0fa4262e80b8..000000000000 --- a/vendor/github.com/pingcap/tidb/store/hbase/txn.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package hbasekv - -import ( - "fmt" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/go-hbase" - "github.com/pingcap/go-themis" - "github.com/pingcap/tidb/kv" -) - -var ( - _ kv.Transaction = (*hbaseTxn)(nil) -) - -// dbTxn implements kv.Transacton. It is not thread safe. -type hbaseTxn struct { - us kv.UnionStore - txn themis.Txn - store *hbaseStore // for commit - storeName string - tid uint64 - valid bool - version kv.Version // commit version - dirty bool -} - -func newHbaseTxn(t themis.Txn, storeName string) *hbaseTxn { - return &hbaseTxn{ - txn: t, - valid: true, - storeName: storeName, - tid: t.GetStartTS(), - us: kv.NewUnionStore(newHbaseSnapshot(t, storeName)), - } -} - -// Implement transaction interface - -func (txn *hbaseTxn) Get(k kv.Key) ([]byte, error) { - log.Debugf("[kv] get key:%q, txn:%d", k, txn.tid) - return txn.us.Get(k) -} - -func (txn *hbaseTxn) Set(k kv.Key, v []byte) error { - log.Debugf("[kv] set %q txn:%d", k, txn.tid) - txn.dirty = true - return txn.us.Set(k, v) -} - -func (txn *hbaseTxn) String() string { - return fmt.Sprintf("%d", txn.tid) -} - -func (txn *hbaseTxn) Seek(k kv.Key) (kv.Iterator, error) { - log.Debugf("[kv] seek %q txn:%d", k, txn.tid) - return txn.us.Seek(k) -} - -func (txn *hbaseTxn) Delete(k kv.Key) error { - log.Debugf("[kv] delete %q txn:%d", k, txn.tid) - txn.dirty = true - return txn.us.Delete(k) -} - -func (txn *hbaseTxn) SetOption(opt kv.Option, val interface{}) { - txn.us.SetOption(opt, val) -} - -func (txn *hbaseTxn) DelOption(opt kv.Option) { - txn.us.DelOption(opt) -} - -func (txn *hbaseTxn) doCommit() error { - if err := txn.us.CheckLazyConditionPairs(); err != nil { - return errors.Trace(err) - } - - err := txn.us.WalkBuffer(func(k kv.Key, v []byte) error { - row := append([]byte(nil), k...) - if len(v) == 0 { // Deleted marker - d := hbase.NewDelete(row) - d.AddStringColumn(hbaseColFamily, hbaseQualifier) - err := txn.txn.Delete(txn.storeName, d) - if err != nil { - return errors.Trace(err) - } - } else { - val := append([]byte(nil), v...) - p := hbase.NewPut(row) - p.AddValue(hbaseColFamilyBytes, hbaseQualifierBytes, val) - txn.txn.Put(txn.storeName, p) - } - return nil - }) - - if err != nil { - return errors.Trace(err) - } - - err = txn.txn.Commit() - if err != nil { - log.Error(err) - return errors.Trace(err) - } - - txn.version = kv.NewVersion(txn.txn.GetCommitTS()) - log.Debugf("[kv] commit successfully, txn.version:%d", txn.version.Ver) - return nil -} - -func (txn *hbaseTxn) Commit() error { - if !txn.valid { - return kv.ErrInvalidTxn - } - log.Debugf("[kv] start to commit txn %d", txn.tid) - defer func() { - txn.close() - }() - return txn.doCommit() -} - -func (txn *hbaseTxn) close() error { - txn.us.Release() - txn.valid = false - return nil -} - -//if fail, themis auto rollback -func (txn *hbaseTxn) Rollback() error { - if !txn.valid { - return kv.ErrInvalidTxn - } - log.Warnf("[kv] Rollback txn %d", txn.tid) - return txn.close() -} - -func (txn *hbaseTxn) LockKeys(keys ...kv.Key) error { - for _, key := range keys { - if err := txn.txn.LockRow(txn.storeName, key); err != nil { - return errors.Trace(err) - } - } - return nil -} - -func (txn *hbaseTxn) IsReadOnly() bool { - return !txn.dirty -} - -func (txn *hbaseTxn) StartTS() int64 { - return int64(txn.tid) -} - -func (txn *hbaseTxn) GetClient() kv.Client { - return nil -} - -type hbaseClient struct { -} - -func (c *hbaseClient) SupportRequestType(reqType, subType int64) bool { - return false -} - -func (c *hbaseClient) Send(req *kv.Request) kv.Response { - return nil -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/boltdb/boltdb.go b/vendor/github.com/pingcap/tidb/store/localstore/boltdb/boltdb.go deleted file mode 100644 index 4095f9c2fe35..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/boltdb/boltdb.go +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package boltdb - -import ( - "os" - "path" - - "github.com/boltdb/bolt" - "github.com/juju/errors" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/pingcap/tidb/util/bytes" -) - -var ( - _ engine.DB = (*db)(nil) -) - -var ( - bucketName = []byte("tidb") -) - -type db struct { - *bolt.DB -} - -func (d *db) Get(key []byte) ([]byte, error) { - var value []byte - - err := d.DB.View(func(tx *bolt.Tx) error { - b := tx.Bucket(bucketName) - v := b.Get(key) - if v == nil { - return errors.Trace(engine.ErrNotFound) - } - value = bytes.CloneBytes(v) - return nil - }) - - return value, errors.Trace(err) -} - -func (d *db) MultiSeek(keys [][]byte) []*engine.MSeekResult { - res := make([]*engine.MSeekResult, 0, len(keys)) - d.DB.View(func(tx *bolt.Tx) error { - b := tx.Bucket(bucketName) - c := b.Cursor() - for _, key := range keys { - var k, v []byte - if key == nil { - k, v = c.First() - } else { - k, v = c.Seek(key) - } - - r := &engine.MSeekResult{} - if k == nil { - r.Err = engine.ErrNotFound - } else { - r.Key, r.Value, r.Err = bytes.CloneBytes(k), bytes.CloneBytes(v), nil - } - - res = append(res, r) - } - return nil - }) - - return res -} - -func (d *db) Seek(startKey []byte) ([]byte, []byte, error) { - var key, value []byte - err := d.DB.View(func(tx *bolt.Tx) error { - b := tx.Bucket(bucketName) - c := b.Cursor() - var k, v []byte - if startKey == nil { - k, v = c.First() - } else { - k, v = c.Seek(startKey) - } - if k != nil { - key, value = bytes.CloneBytes(k), bytes.CloneBytes(v) - } - return nil - }) - - if err != nil { - return nil, nil, errors.Trace(err) - } - if key == nil { - return nil, nil, errors.Trace(engine.ErrNotFound) - } - return key, value, nil -} - -func (d *db) NewBatch() engine.Batch { - return &batch{} -} - -func (d *db) Commit(b engine.Batch) error { - bt, ok := b.(*batch) - if !ok { - return errors.Errorf("invalid batch type %T", b) - } - err := d.DB.Update(func(tx *bolt.Tx) error { - b := tx.Bucket(bucketName) - // err1 is used for passing `go tool vet --shadow` check. - var err1 error - for _, w := range bt.writes { - if !w.isDelete { - err1 = b.Put(w.key, w.value) - } else { - err1 = b.Delete(w.key) - } - - if err1 != nil { - return errors.Trace(err1) - } - } - - return nil - }) - return errors.Trace(err) -} - -func (d *db) Close() error { - return d.DB.Close() -} - -type write struct { - key []byte - value []byte - isDelete bool -} - -type batch struct { - writes []write -} - -func (b *batch) Put(key []byte, value []byte) { - w := write{ - key: append([]byte(nil), key...), - value: append([]byte(nil), value...), - } - b.writes = append(b.writes, w) -} - -func (b *batch) Delete(key []byte) { - w := write{ - key: append([]byte(nil), key...), - value: nil, - isDelete: true, - } - b.writes = append(b.writes, w) -} - -func (b *batch) Len() int { - return len(b.writes) -} - -// Driver implements engine Driver. -type Driver struct { -} - -// Open opens or creates a local storage database with given path. -func (driver Driver) Open(dbPath string) (engine.DB, error) { - base := path.Dir(dbPath) - os.MkdirAll(base, 0755) - - d, err := bolt.Open(dbPath, 0600, nil) - if err != nil { - return nil, err - } - - tx, err := d.Begin(true) - if err != nil { - return nil, err - } - - if _, err = tx.CreateBucketIfNotExists(bucketName); err != nil { - tx.Rollback() - return nil, err - } - - if err = tx.Commit(); err != nil { - return nil, err - } - - return &db{d}, nil -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/compactor.go b/vendor/github.com/pingcap/tidb/store/localstore/compactor.go deleted file mode 100644 index 29e21910ef86..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/compactor.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package localstore - -import ( - "sync" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/bytes" -) - -const ( - deleteWorkerCnt = 3 -) - -// compactPolicy defines gc policy of MVCC storage. -type compactPolicy struct { - // SafePoint specifies - SafePoint int - // TriggerInterval specifies how often should the compactor - // scans outdated data. - TriggerInterval time.Duration - // BatchDeleteCnt specifies the batch size for - // deleting outdated data transaction. - BatchDeleteCnt int -} - -var localCompactDefaultPolicy = compactPolicy{ - SafePoint: 20 * 1000, // in ms - TriggerInterval: 10 * time.Second, - BatchDeleteCnt: 100, -} - -type localstoreCompactor struct { - mu sync.Mutex - recentKeys map[string]struct{} - stopCh chan struct{} - delCh chan kv.EncodedKey - workerWaitGroup *sync.WaitGroup - ticker *time.Ticker - db engine.DB - policy compactPolicy -} - -func (gc *localstoreCompactor) OnSet(k kv.Key) { - gc.mu.Lock() - defer gc.mu.Unlock() - gc.recentKeys[string(k)] = struct{}{} -} - -func (gc *localstoreCompactor) OnDelete(k kv.Key) { - gc.mu.Lock() - defer gc.mu.Unlock() - gc.recentKeys[string(k)] = struct{}{} -} - -func (gc *localstoreCompactor) getAllVersions(key kv.Key) ([]kv.EncodedKey, error) { - var keys []kv.EncodedKey - k := key - for ver := kv.MaxVersion; ver.Ver > 0; ver.Ver-- { - mvccK, _, err := gc.db.Seek(MvccEncodeVersionKey(key, ver)) - if terror.ErrorEqual(err, engine.ErrNotFound) { - break - } - if err != nil { - return nil, errors.Trace(err) - } - k, ver, err = MvccDecode(mvccK) - if k.Cmp(key) != 0 { - break - } - if err != nil { - return nil, errors.Trace(err) - } - keys = append(keys, bytes.CloneBytes(mvccK)) - } - return keys, nil -} - -func (gc *localstoreCompactor) deleteWorker() { - defer gc.workerWaitGroup.Done() - cnt := 0 - batch := gc.db.NewBatch() - for { - select { - case <-gc.stopCh: - return - case key := <-gc.delCh: - cnt++ - batch.Delete(key) - // Batch delete. - if cnt == gc.policy.BatchDeleteCnt { - log.Debugf("[kv] GC delete commit %d keys", batch.Len()) - err := gc.db.Commit(batch) - if err != nil { - log.Error(err) - } - batch = gc.db.NewBatch() - cnt = 0 - } - } - } -} - -func (gc *localstoreCompactor) checkExpiredKeysWorker() { - defer gc.workerWaitGroup.Done() - for { - select { - case <-gc.stopCh: - log.Debug("[kv] GC stopped") - return - case <-gc.ticker.C: - gc.mu.Lock() - m := gc.recentKeys - if len(m) == 0 { - gc.mu.Unlock() - continue - } - gc.recentKeys = make(map[string]struct{}) - gc.mu.Unlock() - for k := range m { - err := gc.Compact([]byte(k)) - if err != nil { - log.Error(err) - } - } - } - } -} - -func (gc *localstoreCompactor) filterExpiredKeys(keys []kv.EncodedKey) []kv.EncodedKey { - var ret []kv.EncodedKey - first := true - currentTS := time.Now().UnixNano() / int64(time.Millisecond) - // keys are always in descending order. - for _, k := range keys { - _, ver, err := MvccDecode(k) - if err != nil { - // Should not happen. - panic(err) - } - ts := localVersionToTimestamp(ver) - // Check timeout keys. - if currentTS-int64(ts) >= int64(gc.policy.SafePoint) { - // Skip first version. - if first { - first = false - continue - } - ret = append(ret, k) - } - } - return ret -} - -func (gc *localstoreCompactor) Compact(k kv.Key) error { - keys, err := gc.getAllVersions(k) - if err != nil { - return errors.Trace(err) - } - filteredKeys := gc.filterExpiredKeys(keys) - if len(filteredKeys) > 0 { - log.Debugf("[kv] GC send %d keys to delete worker", len(filteredKeys)) - } - for _, key := range filteredKeys { - gc.delCh <- key - } - return nil -} - -func (gc *localstoreCompactor) Start() { - // Start workers. - gc.workerWaitGroup.Add(deleteWorkerCnt) - for i := 0; i < deleteWorkerCnt; i++ { - go gc.deleteWorker() - } - - gc.workerWaitGroup.Add(1) - go gc.checkExpiredKeysWorker() -} - -func (gc *localstoreCompactor) Stop() { - gc.ticker.Stop() - close(gc.stopCh) - // Wait for all workers to finish. - gc.workerWaitGroup.Wait() -} - -func newLocalCompactor(policy compactPolicy, db engine.DB) *localstoreCompactor { - return &localstoreCompactor{ - recentKeys: make(map[string]struct{}), - stopCh: make(chan struct{}), - delCh: make(chan kv.EncodedKey, 100), - ticker: time.NewTicker(policy.TriggerInterval), - policy: policy, - db: db, - workerWaitGroup: &sync.WaitGroup{}, - } -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/engine/engine.go b/vendor/github.com/pingcap/tidb/store/localstore/engine/engine.go deleted file mode 100644 index 5628f4a05127..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/engine/engine.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package engine - -import "github.com/juju/errors" - -// ErrNotFound indicates no key is found when trying Get or Seek an entry from DB. -var ErrNotFound = errors.New("local engine: key not found") - -// Driver is the interface that must be implemented by a local storage db engine. -type Driver interface { - // Open opens or creates a local storage DB. - // The schema is a string for a local storage DB specific format. - Open(schema string) (DB, error) -} - -// MSeekResult is used to get multiple seek results. -type MSeekResult struct { - Key []byte - Value []byte - Err error -} - -// DB is the interface for local storage. -type DB interface { - // Get gets the associated value with key, returns (nil, ErrNotFound) if no value found. - Get(key []byte) ([]byte, error) - // Seek searches for the first key in the engine which is >= key in byte order, returns (nil, nil, ErrNotFound) - // if such key is not found. - Seek(key []byte) ([]byte, []byte, error) - // MultiSeek seeks multiple keys from the engine. - MultiSeek(keys [][]byte) []*MSeekResult - // NewBatch creates a Batch for writing. - NewBatch() Batch - // Commit writes the changed data in Batch. - Commit(b Batch) error - // Close closes database. - Close() error -} - -// Batch is the interface for local storage. -type Batch interface { - // Put appends 'put operation' of the key/value to the batch. - Put(key []byte, value []byte) - // Delete appends 'delete operation' of the key/value to the batch. - Delete(key []byte) - // Len return length of the batch - Len() int -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/goleveldb/goleveldb.go b/vendor/github.com/pingcap/tidb/store/localstore/goleveldb/goleveldb.go deleted file mode 100644 index 26f3dfc8124f..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/goleveldb/goleveldb.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package goleveldb - -import ( - "sync" - - "github.com/juju/errors" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - _ engine.DB = (*db)(nil) - _ engine.Batch = (*leveldb.Batch)(nil) -) - -var ( - p = sync.Pool{ - New: func() interface{} { - return &leveldb.Batch{} - }, - } -) - -type db struct { - *leveldb.DB -} - -func (d *db) Get(key []byte) ([]byte, error) { - v, err := d.DB.Get(key, nil) - if err == leveldb.ErrNotFound { - return nil, errors.Trace(engine.ErrNotFound) - } - return v, err -} - -func (d *db) NewBatch() engine.Batch { - b := p.Get().(*leveldb.Batch) - return b -} - -func (d *db) Seek(startKey []byte) ([]byte, []byte, error) { - iter := d.DB.NewIterator(&util.Range{Start: startKey}, nil) - defer iter.Release() - if ok := iter.First(); !ok { - return nil, nil, errors.Trace(engine.ErrNotFound) - } - return iter.Key(), iter.Value(), nil -} - -func (d *db) MultiSeek(keys [][]byte) []*engine.MSeekResult { - iter := d.DB.NewIterator(&util.Range{Start: []byte{0x0}}, nil) - defer iter.Release() - - res := make([]*engine.MSeekResult, 0, len(keys)) - for _, k := range keys { - if ok := iter.Seek(k); !ok { - res = append(res, &engine.MSeekResult{Err: engine.ErrNotFound}) - } else { - res = append(res, &engine.MSeekResult{ - Key: append([]byte(nil), iter.Key()...), - Value: append([]byte(nil), iter.Value()...), - }) - } - } - return res -} - -func (d *db) Commit(b engine.Batch) error { - batch, ok := b.(*leveldb.Batch) - if !ok { - return errors.Errorf("invalid batch type %T", b) - } - err := d.DB.Write(batch, nil) - batch.Reset() - p.Put(batch) - return err -} - -func (d *db) Close() error { - return d.DB.Close() -} - -// Driver implements engine Driver. -type Driver struct { -} - -// Open opens or creates a local storage database for the given path. -func (driver Driver) Open(path string) (engine.DB, error) { - d, err := leveldb.OpenFile(path, &opt.Options{BlockCacheCapacity: 600 * 1024 * 1024}) - - return &db{d}, err -} - -// MemoryDriver implements engine Driver -type MemoryDriver struct { -} - -// Open opens a memory storage database. -func (driver MemoryDriver) Open(path string) (engine.DB, error) { - d, err := leveldb.Open(storage.NewMemStorage(), nil) - return &db{d}, err -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/kv.go b/vendor/github.com/pingcap/tidb/store/localstore/kv.go deleted file mode 100644 index 88979bc5aa84..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/kv.go +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package localstore - -import ( - "net/url" - "path/filepath" - "runtime/debug" - "sync" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/pingcap/tidb/util/segmentmap" - "github.com/twinj/uuid" -) - -var ( - _ kv.Storage = (*dbStore)(nil) -) - -type op int - -const ( - opSeek = iota + 1 - opCommit -) - -const ( - maxSeekWorkers = 3 - - lowerWaterMark = 10 // second -) - -type command struct { - op op - txn *dbTxn - args interface{} - reply interface{} - done chan error -} - -type seekReply struct { - key []byte - value []byte -} - -type commitReply struct { - err error -} - -type seekArgs struct { - key []byte -} - -type commitArgs struct { -} - -// Seek searches for the first key in the engine which is >= key in byte order, returns (nil, nil, ErrNotFound) -// if such key is not found. -func (s *dbStore) Seek(key []byte) ([]byte, []byte, error) { - c := &command{ - op: opSeek, - args: &seekArgs{key: key}, - done: make(chan error, 1), - } - - s.commandCh <- c - err := <-c.done - if err != nil { - return nil, nil, errors.Trace(err) - } - - reply := c.reply.(*seekReply) - return reply.key, reply.value, nil -} - -// Commit writes the changed data in Batch. -func (s *dbStore) CommitTxn(txn *dbTxn) error { - if len(txn.lockedKeys) == 0 { - return nil - } - c := &command{ - op: opCommit, - txn: txn, - args: &commitArgs{}, - done: make(chan error, 1), - } - - s.commandCh <- c - err := <-c.done - return errors.Trace(err) -} - -func (s *dbStore) seekWorker(wg *sync.WaitGroup, seekCh chan *command) { - defer wg.Done() - for { - var pending []*command - select { - case cmd, ok := <-seekCh: - if !ok { - return - } - pending = append(pending, cmd) - L: - for { - select { - case cmd, ok := <-seekCh: - if !ok { - break L - } - pending = append(pending, cmd) - default: - break L - } - } - } - - s.doSeek(pending) - } -} - -func (s *dbStore) scheduler() { - closed := false - seekCh := make(chan *command, 1000) - wgSeekWorkers := &sync.WaitGroup{} - wgSeekWorkers.Add(maxSeekWorkers) - for i := 0; i < maxSeekWorkers; i++ { - go s.seekWorker(wgSeekWorkers, seekCh) - } - - segmentIndex := int64(0) - - tick := time.NewTicker(time.Second) - defer tick.Stop() - - for { - select { - case cmd := <-s.commandCh: - if closed { - cmd.done <- ErrDBClosed - continue - } - switch cmd.op { - case opSeek: - seekCh <- cmd - case opCommit: - s.doCommit(cmd) - } - case <-s.closeCh: - closed = true - // notify seek worker to exit - close(seekCh) - wgSeekWorkers.Wait() - s.wg.Done() - case <-tick.C: - segmentIndex = segmentIndex % s.recentUpdates.SegmentCount() - s.cleanRecentUpdates(segmentIndex) - segmentIndex++ - } - } -} - -func (s *dbStore) cleanRecentUpdates(segmentIndex int64) { - m, err := s.recentUpdates.GetSegment(segmentIndex) - if err != nil { - log.Error(err) - return - } - - now := time.Now().Unix() - for k, v := range m { - dis := now - version2Second(v.(kv.Version)) - if dis > lowerWaterMark { - delete(m, k) - } - } -} - -func (s *dbStore) tryLock(txn *dbTxn) (err error) { - // check conflict - for k := range txn.lockedKeys { - if _, ok := s.keysLocked[k]; ok { - return errors.Trace(kv.ErrLockConflict) - } - - lastVer, ok := s.recentUpdates.Get([]byte(k)) - if !ok { - continue - } - // If there's newer version of this key, returns error. - if lastVer.(kv.Version).Cmp(kv.Version{Ver: txn.tid}) > 0 { - return errors.Trace(kv.ErrConditionNotMatch) - } - } - - // record - for k := range txn.lockedKeys { - s.keysLocked[k] = txn.tid - } - - return nil -} - -func (s *dbStore) doCommit(cmd *command) { - txn := cmd.txn - curVer, err := globalVersionProvider.CurrentVersion() - if err != nil { - log.Fatal(err) - } - err = s.tryLock(txn) - if err != nil { - cmd.done <- errors.Trace(err) - return - } - // Update commit version. - txn.version = curVer - b := s.db.NewBatch() - txn.us.WalkBuffer(func(k kv.Key, value []byte) error { - mvccKey := MvccEncodeVersionKey(kv.Key(k), curVer) - if len(value) == 0 { // Deleted marker - b.Put(mvccKey, nil) - s.compactor.OnDelete(k) - } else { - b.Put(mvccKey, value) - s.compactor.OnSet(k) - } - return nil - }) - err = s.writeBatch(b) - s.unLockKeys(txn) - cmd.done <- errors.Trace(err) -} - -func (s *dbStore) doSeek(seekCmds []*command) { - keys := make([][]byte, 0, len(seekCmds)) - for _, cmd := range seekCmds { - keys = append(keys, cmd.args.(*seekArgs).key) - } - - results := s.db.MultiSeek(keys) - - for i, cmd := range seekCmds { - reply := &seekReply{} - var err error - reply.key, reply.value, err = results[i].Key, results[i].Value, results[i].Err - cmd.reply = reply - cmd.done <- errors.Trace(err) - } -} - -func (s *dbStore) NewBatch() engine.Batch { - return s.db.NewBatch() -} - -type dbStore struct { - db engine.DB - - txns map[uint64]*dbTxn - keysLocked map[string]uint64 - // TODO: clean up recentUpdates - recentUpdates *segmentmap.SegmentMap - uuid string - path string - compactor *localstoreCompactor - wg *sync.WaitGroup - - commandCh chan *command - closeCh chan struct{} - - mu sync.Mutex - closed bool -} - -type storeCache struct { - mu sync.Mutex - cache map[string]*dbStore -} - -var ( - globalVersionProvider kv.VersionProvider - mc storeCache - - // ErrDBClosed is the error meaning db is closed and we can use it anymore. - ErrDBClosed = errors.New("db is closed") -) - -func init() { - mc.cache = make(map[string]*dbStore) - globalVersionProvider = &LocalVersionProvider{} -} - -// Driver implements kv.Driver interface. -type Driver struct { - // engine.Driver is the engine driver for different local db engine. - engine.Driver -} - -// IsLocalStore checks whether a storage is local or not. -func IsLocalStore(s kv.Storage) bool { - _, ok := s.(*dbStore) - return ok -} - -// Open opens or creates a storage with specific format for a local engine Driver. -// The path should be a URL format which is described in tidb package. -func (d Driver) Open(path string) (kv.Storage, error) { - mc.mu.Lock() - defer mc.mu.Unlock() - - u, err := url.Parse(path) - if err != nil { - return nil, errors.Trace(err) - } - - engineSchema := filepath.Join(u.Host, u.Path) - if store, ok := mc.cache[engineSchema]; ok { - // TODO: check the cache store has the same engine with this Driver. - log.Info("[kv] cache store", engineSchema) - return store, nil - } - - db, err := d.Driver.Open(engineSchema) - if err != nil { - return nil, errors.Trace(err) - } - - log.Info("[kv] New store", engineSchema) - s := &dbStore{ - txns: make(map[uint64]*dbTxn), - keysLocked: make(map[string]uint64), - uuid: uuid.NewV4().String(), - path: engineSchema, - db: db, - compactor: newLocalCompactor(localCompactDefaultPolicy, db), - commandCh: make(chan *command, 1000), - closed: false, - closeCh: make(chan struct{}), - wg: &sync.WaitGroup{}, - } - s.recentUpdates, err = segmentmap.NewSegmentMap(100) - if err != nil { - return nil, errors.Trace(err) - - } - mc.cache[engineSchema] = s - s.compactor.Start() - s.wg.Add(1) - go s.scheduler() - return s, nil -} - -func (s *dbStore) UUID() string { - return s.uuid -} - -func (s *dbStore) GetSnapshot(ver kv.Version) (kv.Snapshot, error) { - s.mu.Lock() - if s.closed { - s.mu.Unlock() - return nil, ErrDBClosed - } - s.mu.Unlock() - - currentVer, err := globalVersionProvider.CurrentVersion() - if err != nil { - return nil, errors.Trace(err) - } - - if ver.Cmp(currentVer) > 0 { - ver = currentVer - } - - return &dbSnapshot{ - store: s, - version: ver, - }, nil -} - -func (s *dbStore) CurrentVersion() (kv.Version, error) { - return globalVersionProvider.CurrentVersion() -} - -// Begin transaction -func (s *dbStore) Begin() (kv.Transaction, error) { - s.mu.Lock() - if s.closed { - s.mu.Unlock() - return nil, ErrDBClosed - } - s.mu.Unlock() - - beginVer, err := globalVersionProvider.CurrentVersion() - if err != nil { - return nil, errors.Trace(err) - } - - return newTxn(s, beginVer), nil -} - -func (s *dbStore) Close() error { - s.mu.Lock() - if s.closed { - s.mu.Unlock() - return ErrDBClosed - } - - s.closed = true - s.mu.Unlock() - - mc.mu.Lock() - defer mc.mu.Unlock() - s.compactor.Stop() - s.closeCh <- struct{}{} - s.wg.Wait() - delete(mc.cache, s.path) - return s.db.Close() -} - -func (s *dbStore) writeBatch(b engine.Batch) error { - if b.Len() == 0 { - return nil - } - - if s.closed { - return errors.Trace(ErrDBClosed) - } - - err := s.db.Commit(b) - if err != nil { - log.Error(err) - return errors.Trace(err) - } - - return nil -} - -func (s *dbStore) newBatch() engine.Batch { - return s.db.NewBatch() -} -func (s *dbStore) unLockKeys(txn *dbTxn) error { - for k := range txn.lockedKeys { - if tid, ok := s.keysLocked[k]; !ok || tid != txn.tid { - debug.PrintStack() - log.Fatalf("should never happend:%v, %v", tid, txn.tid) - } - - delete(s.keysLocked, k) - s.recentUpdates.Set([]byte(k), txn.version, true) - } - - return nil -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/local_version_provider.go b/vendor/github.com/pingcap/tidb/store/localstore/local_version_provider.go deleted file mode 100644 index 6a2cdb8cd4d2..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/local_version_provider.go +++ /dev/null @@ -1,67 +0,0 @@ -package localstore - -import ( - "errors" - "sync" - "time" - - "github.com/ngaut/log" - "github.com/pingcap/tidb/kv" -) - -// ErrOverflow is the error returned by CurrentVersion, it describes if -// there're too many versions allocations in a very short period of time, ID -// may conflict. -var ErrOverflow = errors.New("overflow when allocating new version") - -// LocalVersionProvider uses local timestamp for version. -type LocalVersionProvider struct { - mu sync.Mutex - lastTimestamp uint64 - // logical guaranteed version's monotonic increasing for calls when lastTimestamp - // are equal. - logical uint64 -} - -const ( - timePrecisionOffset = 18 -) - -func time2TsPhysical(t time.Time) uint64 { - return uint64((t.UnixNano() / int64(time.Millisecond)) << timePrecisionOffset) -} - -func version2Second(v kv.Version) int64 { - return int64(v.Ver>>timePrecisionOffset) / 1000 -} - -// CurrentVersion implements the VersionProvider's GetCurrentVer interface. -func (l *LocalVersionProvider) CurrentVersion() (kv.Version, error) { - l.mu.Lock() - defer l.mu.Unlock() - - for { - var ts uint64 - ts = time2TsPhysical(time.Now()) - - if l.lastTimestamp > ts { - log.Error("[kv] invalid physical time stamp") - continue - } - - if l.lastTimestamp == uint64(ts) { - l.logical++ - if l.logical >= 1<> timePrecisionOffset -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/mvcc.go b/vendor/github.com/pingcap/tidb/store/localstore/mvcc.go deleted file mode 100644 index f61296eee20e..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/mvcc.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package localstore - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/util/codec" -) - -// ErrInvalidEncodedKey describes parsing an invalid format of EncodedKey. -var ErrInvalidEncodedKey = errors.New("invalid encoded key") - -func isTombstone(v []byte) bool { - return len(v) == 0 -} - -// MvccEncodeVersionKey returns the encoded key. -func MvccEncodeVersionKey(key kv.Key, ver kv.Version) kv.EncodedKey { - b := codec.EncodeBytes(nil, key) - ret := codec.EncodeUintDesc(b, ver.Ver) - return ret -} - -// MvccDecode parses the origin key and version of an encoded key, if the encoded key is a meta key, -// just returns the origin key. -func MvccDecode(encodedKey kv.EncodedKey) (kv.Key, kv.Version, error) { - // Skip DataPrefix - remainBytes, key, err := codec.DecodeBytes([]byte(encodedKey)) - if err != nil { - // should never happen - return nil, kv.Version{}, errors.Trace(err) - } - // if it's meta key - if len(remainBytes) == 0 { - return key, kv.Version{}, nil - } - var ver uint64 - remainBytes, ver, err = codec.DecodeUintDesc(remainBytes) - if err != nil { - // should never happen - return nil, kv.Version{}, errors.Trace(err) - } - if len(remainBytes) != 0 { - return nil, kv.Version{}, ErrInvalidEncodedKey - } - return key, kv.Version{Ver: ver}, nil -} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/snapshot.go b/vendor/github.com/pingcap/tidb/store/localstore/snapshot.go deleted file mode 100644 index ac436a6cfc4e..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/snapshot.go +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package localstore - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/pingcap/tidb/terror" -) - -var ( - _ kv.Snapshot = (*dbSnapshot)(nil) - _ kv.Iterator = (*dbIter)(nil) -) - -// dbSnapshot implements MvccSnapshot interface. -type dbSnapshot struct { - store *dbStore - version kv.Version // transaction begin version -} - -func newSnapshot(store *dbStore, ver kv.Version) *dbSnapshot { - ss := &dbSnapshot{ - store: store, - version: ver, - } - - return ss -} - -// mvccSeek seeks for the first key in db which has a k >= key and a version <= -// snapshot's version, returns kv.ErrNotExist if such key is not found. If exact -// is true, only k == key can be returned. -func (s *dbSnapshot) mvccSeek(key kv.Key, exact bool) (kv.Key, []byte, error) { - // Key layout: - // ... - // Key_verMax -- (1) - // ... - // Key_ver+1 -- (2) - // Key_ver -- (3) - // Key_ver-1 -- (4) - // ... - // Key_0 -- (5) - // NextKey_verMax -- (6) - // ... - // NextKey_ver+1 -- (7) - // NextKey_ver -- (8) - // NextKey_ver-1 -- (9) - // ... - // NextKey_0 -- (10) - // ... - // EOF - for { - mvccKey := MvccEncodeVersionKey(key, s.version) - mvccK, v, err := s.store.Seek([]byte(mvccKey)) // search for [3...EOF) - if err != nil { - if terror.ErrorEqual(err, engine.ErrNotFound) { // EOF - return nil, nil, errors.Trace(kv.ErrNotExist) - } - return nil, nil, errors.Trace(err) - } - k, ver, err := MvccDecode(mvccK) - if err != nil { - return nil, nil, errors.Trace(err) - } - // quick test for exact mode - if exact { - if key.Cmp(k) != 0 || isTombstone(v) { - return nil, nil, errors.Trace(kv.ErrNotExist) - } - return k, v, nil - } - if ver.Ver > s.version.Ver { - // currently on [6...7] - key = k // search for [8...EOF) next loop - continue - } - // currently on [3...5] or [8...10] - if isTombstone(v) { - key = k.Next() // search for (5...EOF) or (10..EOF) next loop - continue - } - // target found - return k, v, nil - } -} - -func (s *dbSnapshot) Get(key kv.Key) ([]byte, error) { - _, v, err := s.mvccSeek(key, true) - if err != nil { - return nil, errors.Trace(err) - } - return v, nil -} - -func (s *dbSnapshot) BatchGet(keys []kv.Key) (map[string][]byte, error) { - m := make(map[string][]byte) - for _, k := range keys { - v, err := s.Get(k) - if err != nil && !kv.IsErrNotFound(err) { - return nil, errors.Trace(err) - } - if len(v) > 0 { - m[string(k)] = v - } - } - return m, nil -} - -func (s *dbSnapshot) Seek(k kv.Key) (kv.Iterator, error) { - it, err := newDBIter(s, k) - return it, errors.Trace(err) -} - -func (s *dbSnapshot) Release() { -} - -type dbIter struct { - s *dbSnapshot - valid bool - k kv.Key - v []byte -} - -func newDBIter(s *dbSnapshot, startKey kv.Key) (*dbIter, error) { - k, v, err := s.mvccSeek(startKey, false) - if err != nil { - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } - return &dbIter{valid: false}, errors.Trace(err) - } - - return &dbIter{ - s: s, - valid: true, - k: k, - v: v, - }, nil -} - -func (it *dbIter) Next() error { - k, v, err := it.s.mvccSeek(it.k.Next(), false) - if err != nil { - it.valid = false - if !terror.ErrorEqual(err, kv.ErrNotExist) { - return errors.Trace(err) - } - } - it.k, it.v = k, v - return nil -} - -func (it *dbIter) Valid() bool { - return it.valid -} - -func (it *dbIter) Key() kv.Key { - return it.k -} - -func (it *dbIter) Value() []byte { - return it.v -} - -func (it *dbIter) Close() {} diff --git a/vendor/github.com/pingcap/tidb/store/localstore/txn.go b/vendor/github.com/pingcap/tidb/store/localstore/txn.go deleted file mode 100644 index 2b7d696dde58..000000000000 --- a/vendor/github.com/pingcap/tidb/store/localstore/txn.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package localstore - -import ( - "fmt" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/kv" -) - -var ( - _ kv.Transaction = (*dbTxn)(nil) -) - -// dbTxn is not thread safe -type dbTxn struct { - us kv.UnionStore - store *dbStore // for commit - tid uint64 - valid bool - version kv.Version // commit version - lockedKeys map[string]struct{} // origin version in snapshot - dirty bool -} - -func newTxn(s *dbStore, ver kv.Version) *dbTxn { - txn := &dbTxn{ - us: kv.NewUnionStore(newSnapshot(s, ver)), - store: s, - tid: ver.Ver, - valid: true, - version: kv.MinVersion, - lockedKeys: make(map[string]struct{}), - } - log.Debugf("[kv] Begin txn:%d", txn.tid) - return txn -} - -// Implement transaction interface - -func (txn *dbTxn) Get(k kv.Key) ([]byte, error) { - log.Debugf("[kv] get key:%q, txn:%d", k, txn.tid) - return txn.us.Get(k) -} - -func (txn *dbTxn) Set(k kv.Key, data []byte) error { - log.Debugf("[kv] set key:%q, txn:%d", k, txn.tid) - txn.dirty = true - return txn.us.Set(k, data) -} - -func (txn *dbTxn) String() string { - return fmt.Sprintf("%d", txn.tid) -} - -func (txn *dbTxn) Seek(k kv.Key) (kv.Iterator, error) { - log.Debugf("[kv] seek key:%q, txn:%d", k, txn.tid) - return txn.us.Seek(k) -} - -func (txn *dbTxn) Delete(k kv.Key) error { - log.Debugf("[kv] delete key:%q, txn:%d", k, txn.tid) - txn.dirty = true - return txn.us.Delete(k) -} - -func (txn *dbTxn) SetOption(opt kv.Option, val interface{}) { - txn.us.SetOption(opt, val) -} - -func (txn *dbTxn) DelOption(opt kv.Option) { - txn.us.DelOption(opt) -} - -func (txn *dbTxn) doCommit() error { - // check lazy condition pairs - if err := txn.us.CheckLazyConditionPairs(); err != nil { - return errors.Trace(err) - } - - err := txn.us.WalkBuffer(func(k kv.Key, v []byte) error { - e := txn.LockKeys(k) - return errors.Trace(e) - }) - if err != nil { - return errors.Trace(err) - } - - return txn.store.CommitTxn(txn) -} - -func (txn *dbTxn) Commit() error { - if !txn.valid { - return errors.Trace(kv.ErrInvalidTxn) - } - log.Debugf("[kv] commit txn %d", txn.tid) - defer func() { - txn.close() - }() - - return errors.Trace(txn.doCommit()) -} - -func (txn *dbTxn) close() error { - txn.us.Release() - txn.lockedKeys = nil - txn.valid = false - return nil -} - -func (txn *dbTxn) Rollback() error { - if !txn.valid { - return errors.Trace(kv.ErrInvalidTxn) - } - log.Warnf("[kv] Rollback txn %d", txn.tid) - return txn.close() -} - -func (txn *dbTxn) LockKeys(keys ...kv.Key) error { - for _, key := range keys { - txn.lockedKeys[string(key)] = struct{}{} - } - return nil -} - -func (txn *dbTxn) IsReadOnly() bool { - return !txn.dirty -} - -func (txn *dbTxn) StartTS() int64 { - return int64(txn.tid) -} - -func (txn *dbTxn) GetClient() kv.Client { - return nil -} - -type dbClient struct { -} - -func (c *dbClient) SupportRequestType(reqType, subType int64) bool { - return false -} - -func (c *dbClient) Send(req *kv.Request) kv.Response { - return nil -} diff --git a/vendor/github.com/pingcap/tidb/structure/hash.go b/vendor/github.com/pingcap/tidb/structure/hash.go deleted file mode 100644 index 9c0f80aedbbd..000000000000 --- a/vendor/github.com/pingcap/tidb/structure/hash.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package structure - -import ( - "bytes" - "encoding/binary" - "strconv" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" -) - -// HashPair is the pair for (field, value) in a hash. -type HashPair struct { - Field []byte - Value []byte -} - -type hashMeta struct { - FieldCount int64 -} - -func (meta hashMeta) Value() []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf[0:8], uint64(meta.FieldCount)) - return buf -} - -func (meta hashMeta) IsEmpty() bool { - return meta.FieldCount <= 0 -} - -// HSet sets the string value of a hash field. -func (t *TxStructure) HSet(key []byte, field []byte, value []byte) error { - return t.updateHash(key, field, func([]byte) ([]byte, error) { - return value, nil - }) -} - -// HGet gets the value of a hash field. -func (t *TxStructure) HGet(key []byte, field []byte) ([]byte, error) { - dataKey := t.encodeHashDataKey(key, field) - value, err := t.txn.Get(dataKey) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } - return value, errors.Trace(err) -} - -// HInc increments the integer value of a hash field, by step, returns -// the value after the increment. -func (t *TxStructure) HInc(key []byte, field []byte, step int64) (int64, error) { - base := int64(0) - err := t.updateHash(key, field, func(oldValue []byte) ([]byte, error) { - if oldValue != nil { - var err error - base, err = strconv.ParseInt(string(oldValue), 10, 64) - if err != nil { - return nil, errors.Trace(err) - } - } - base += step - return []byte(strconv.FormatInt(base, 10)), nil - }) - - return base, errors.Trace(err) -} - -// HGetInt64 gets int64 value of a hash field. -func (t *TxStructure) HGetInt64(key []byte, field []byte) (int64, error) { - value, err := t.HGet(key, field) - if err != nil || value == nil { - return 0, errors.Trace(err) - } - - var n int64 - n, err = strconv.ParseInt(string(value), 10, 64) - return n, errors.Trace(err) -} - -func (t *TxStructure) updateHash(key []byte, field []byte, fn func(oldValue []byte) ([]byte, error)) error { - dataKey := t.encodeHashDataKey(key, field) - oldValue, err := t.loadHashValue(dataKey) - if err != nil { - return errors.Trace(err) - } - - newValue, err := fn(oldValue) - if err != nil { - return errors.Trace(err) - } - - // Check if new value is equal to old value. - if bytes.Equal(oldValue, newValue) { - return nil - } - - if err = t.txn.Set(dataKey, newValue); err != nil { - return errors.Trace(err) - } - - metaKey := t.encodeHashMetaKey(key) - meta, err := t.loadHashMeta(metaKey) - if err != nil { - return errors.Trace(err) - } - - if oldValue == nil { - meta.FieldCount++ - if err = t.txn.Set(metaKey, meta.Value()); err != nil { - return errors.Trace(err) - } - } - - return nil -} - -// HLen gets the number of fields in a hash. -func (t *TxStructure) HLen(key []byte) (int64, error) { - metaKey := t.encodeHashMetaKey(key) - meta, err := t.loadHashMeta(metaKey) - if err != nil { - return 0, errors.Trace(err) - } - return meta.FieldCount, nil -} - -// HDel deletes one or more hash fields. -func (t *TxStructure) HDel(key []byte, fields ...[]byte) error { - metaKey := t.encodeHashMetaKey(key) - meta, err := t.loadHashMeta(metaKey) - if err != nil || meta.IsEmpty() { - return errors.Trace(err) - } - - var value []byte - for _, field := range fields { - dataKey := t.encodeHashDataKey(key, field) - - value, err = t.loadHashValue(dataKey) - if err != nil { - return errors.Trace(err) - } - - if value != nil { - if err = t.txn.Delete(dataKey); err != nil { - return errors.Trace(err) - } - - meta.FieldCount-- - } - } - - if meta.IsEmpty() { - err = t.txn.Delete(metaKey) - } else { - err = t.txn.Set(metaKey, meta.Value()) - } - - return errors.Trace(err) -} - -// HKeys gets all the fields in a hash. -func (t *TxStructure) HKeys(key []byte) ([][]byte, error) { - var keys [][]byte - err := t.iterateHash(key, func(field []byte, value []byte) error { - keys = append(keys, append([]byte{}, field...)) - return nil - }) - - return keys, errors.Trace(err) -} - -// HGetAll gets all the fields and values in a hash. -func (t *TxStructure) HGetAll(key []byte) ([]HashPair, error) { - var res []HashPair - err := t.iterateHash(key, func(field []byte, value []byte) error { - pair := HashPair{ - Field: append([]byte{}, field...), - Value: append([]byte{}, value...), - } - res = append(res, pair) - return nil - }) - - return res, errors.Trace(err) -} - -// HClear removes the hash value of the key. -func (t *TxStructure) HClear(key []byte) error { - metaKey := t.encodeHashMetaKey(key) - meta, err := t.loadHashMeta(metaKey) - if err != nil || meta.IsEmpty() { - return errors.Trace(err) - } - - err = t.iterateHash(key, func(field []byte, value []byte) error { - k := t.encodeHashDataKey(key, field) - return errors.Trace(t.txn.Delete(k)) - }) - - if err != nil { - return errors.Trace(err) - } - - return errors.Trace(t.txn.Delete(metaKey)) -} - -func (t *TxStructure) iterateHash(key []byte, fn func(k []byte, v []byte) error) error { - dataPrefix := t.hashDataKeyPrefix(key) - it, err := t.txn.Seek(dataPrefix) - if err != nil { - return errors.Trace(err) - } - - var field []byte - - for it.Valid() { - if !it.Key().HasPrefix(dataPrefix) { - break - } - - _, field, err = t.decodeHashDataKey(it.Key()) - if err != nil { - return errors.Trace(err) - } - - if err = fn(field, it.Value()); err != nil { - return errors.Trace(err) - } - - err = it.Next() - if err != nil { - return errors.Trace(err) - } - } - - return nil -} - -func (t *TxStructure) loadHashMeta(metaKey []byte) (hashMeta, error) { - v, err := t.txn.Get(metaKey) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } else if err != nil { - return hashMeta{}, errors.Trace(err) - } - - meta := hashMeta{FieldCount: 0} - if v == nil { - return meta, nil - } - - if len(v) != 8 { - return meta, errors.New("invalid list meta data") - } - - meta.FieldCount = int64(binary.BigEndian.Uint64(v[0:8])) - return meta, nil -} - -func (t *TxStructure) loadHashValue(dataKey []byte) ([]byte, error) { - v, err := t.txn.Get(dataKey) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - v = nil - } else if err != nil { - return nil, errors.Trace(err) - } - - return v, nil -} diff --git a/vendor/github.com/pingcap/tidb/structure/list.go b/vendor/github.com/pingcap/tidb/structure/list.go deleted file mode 100644 index b6e01cefee23..000000000000 --- a/vendor/github.com/pingcap/tidb/structure/list.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package structure - -import ( - "encoding/binary" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" -) - -type listMeta struct { - LIndex int64 - RIndex int64 -} - -func (meta listMeta) Value() []byte { - buf := make([]byte, 16) - binary.BigEndian.PutUint64(buf[0:8], uint64(meta.LIndex)) - binary.BigEndian.PutUint64(buf[8:16], uint64(meta.RIndex)) - return buf -} - -func (meta listMeta) IsEmpty() bool { - return meta.LIndex >= meta.RIndex -} - -// LPush prepends one or multiple values to a list. -func (t *TxStructure) LPush(key []byte, values ...[]byte) error { - return t.listPush(key, true, values...) -} - -// RPush appends one or multiple values to a list. -func (t *TxStructure) RPush(key []byte, values ...[]byte) error { - return t.listPush(key, false, values...) -} - -func (t *TxStructure) listPush(key []byte, left bool, values ...[]byte) error { - if len(values) == 0 { - return nil - } - - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - if err != nil { - return errors.Trace(err) - } - - index := int64(0) - for _, v := range values { - if left { - meta.LIndex-- - index = meta.LIndex - } else { - index = meta.RIndex - meta.RIndex++ - } - - dataKey := t.encodeListDataKey(key, index) - if err = t.txn.Set(dataKey, v); err != nil { - return errors.Trace(err) - } - } - - return t.txn.Set(metaKey, meta.Value()) -} - -// LPop removes and gets the first element in a list. -func (t *TxStructure) LPop(key []byte) ([]byte, error) { - return t.listPop(key, true) -} - -// RPop removes and gets the last element in a list. -func (t *TxStructure) RPop(key []byte) ([]byte, error) { - return t.listPop(key, false) -} - -func (t *TxStructure) listPop(key []byte, left bool) ([]byte, error) { - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - if err != nil || meta.IsEmpty() { - return nil, errors.Trace(err) - } - - index := int64(0) - if left { - index = meta.LIndex - meta.LIndex++ - } else { - meta.RIndex-- - index = meta.RIndex - } - - dataKey := t.encodeListDataKey(key, index) - - var data []byte - data, err = t.txn.Get(dataKey) - if err != nil { - return nil, errors.Trace(err) - } - - if err = t.txn.Delete(dataKey); err != nil { - return nil, errors.Trace(err) - } - - if !meta.IsEmpty() { - err = t.txn.Set(metaKey, meta.Value()) - } else { - err = t.txn.Delete(metaKey) - } - - return data, errors.Trace(err) -} - -// LLen gets the length of a list. -func (t *TxStructure) LLen(key []byte) (int64, error) { - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - return meta.RIndex - meta.LIndex, errors.Trace(err) -} - -// LIndex gets an element from a list by its index. -func (t *TxStructure) LIndex(key []byte, index int64) ([]byte, error) { - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - if err != nil || meta.IsEmpty() { - return nil, errors.Trace(err) - } - - index = adjustIndex(index, meta.LIndex, meta.RIndex) - - if index >= meta.LIndex && index < meta.RIndex { - return t.txn.Get(t.encodeListDataKey(key, index)) - } - return nil, nil -} - -// LSet updates an element in the list by its index. -func (t *TxStructure) LSet(key []byte, index int64, value []byte) error { - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - if err != nil || meta.IsEmpty() { - return errors.Trace(err) - } - - index = adjustIndex(index, meta.LIndex, meta.RIndex) - - if index >= meta.LIndex && index < meta.RIndex { - return t.txn.Set(t.encodeListDataKey(key, index), value) - } - return errors.Errorf("invalid index %d", index) -} - -// LClear removes the list of the key. -func (t *TxStructure) LClear(key []byte) error { - metaKey := t.encodeListMetaKey(key) - meta, err := t.loadListMeta(metaKey) - if err != nil || meta.IsEmpty() { - return errors.Trace(err) - } - - for index := meta.LIndex; index < meta.RIndex; index++ { - dataKey := t.encodeListDataKey(key, index) - if err = t.txn.Delete(dataKey); err != nil { - return errors.Trace(err) - } - } - - return t.txn.Delete(metaKey) -} - -func (t *TxStructure) loadListMeta(metaKey []byte) (listMeta, error) { - v, err := t.txn.Get(metaKey) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } else if err != nil { - return listMeta{}, errors.Trace(err) - } - - meta := listMeta{0, 0} - if v == nil { - return meta, nil - } - - if len(v) != 16 { - return meta, errors.Errorf("invalid list meta data") - } - - meta.LIndex = int64(binary.BigEndian.Uint64(v[0:8])) - meta.RIndex = int64(binary.BigEndian.Uint64(v[8:16])) - return meta, nil -} - -func adjustIndex(index int64, min, max int64) int64 { - if index >= 0 { - return index + min - } - - return index + max -} diff --git a/vendor/github.com/pingcap/tidb/structure/string.go b/vendor/github.com/pingcap/tidb/structure/string.go deleted file mode 100644 index ecd730a2bec7..000000000000 --- a/vendor/github.com/pingcap/tidb/structure/string.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package structure - -import ( - "strconv" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/terror" -) - -// Set sets the string value of the key. -func (t *TxStructure) Set(key []byte, value []byte) error { - ek := t.encodeStringDataKey(key) - - return t.txn.Set(ek, value) -} - -// Get gets the string value of a key. -func (t *TxStructure) Get(key []byte) ([]byte, error) { - ek := t.encodeStringDataKey(key) - value, err := t.txn.Get(ek) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } - return value, errors.Trace(err) -} - -// GetInt64 gets the int64 value of a key. -func (t *TxStructure) GetInt64(key []byte) (int64, error) { - v, err := t.Get(key) - if err != nil || v == nil { - return 0, errors.Trace(err) - } - - n, err := strconv.ParseInt(string(v), 10, 64) - return n, errors.Trace(err) -} - -// Inc increments the integer value of a key by step, returns -// the value after the increment. -func (t *TxStructure) Inc(key []byte, step int64) (int64, error) { - ek := t.encodeStringDataKey(key) - // txn Inc will lock this key, so we don't lock it here. - n, err := kv.IncInt64(t.txn, ek, step) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } - return n, errors.Trace(err) -} - -// Clear removes the string value of the key. -func (t *TxStructure) Clear(key []byte) error { - ek := t.encodeStringDataKey(key) - err := t.txn.Delete(ek) - if terror.ErrorEqual(err, kv.ErrNotExist) { - err = nil - } - return errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/structure/structure.go b/vendor/github.com/pingcap/tidb/structure/structure.go deleted file mode 100644 index 61fe269f89fd..000000000000 --- a/vendor/github.com/pingcap/tidb/structure/structure.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package structure - -import "github.com/pingcap/tidb/kv" - -// NewStructure creates a TxStructure in transaction txn and with key prefix. -func NewStructure(txn kv.Transaction, prefix []byte) *TxStructure { - return &TxStructure{ - txn: txn, - prefix: prefix, - } -} - -// TxStructure supports some simple data structures like string, hash, list, etc... and -// you can use these in a transaction. -type TxStructure struct { - txn kv.Transaction - prefix []byte -} diff --git a/vendor/github.com/pingcap/tidb/structure/type.go b/vendor/github.com/pingcap/tidb/structure/type.go deleted file mode 100644 index 5e8c87cd1396..000000000000 --- a/vendor/github.com/pingcap/tidb/structure/type.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package structure - -import ( - "bytes" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/util/codec" -) - -// TypeFlag is for data structure meta/data flag. -type TypeFlag byte - -const ( - // StringMeta is the flag for string meta. - StringMeta TypeFlag = 'S' - // StringData is the flag for string data. - StringData TypeFlag = 's' - // HashMeta is the flag for hash meta. - HashMeta TypeFlag = 'H' - // HashData is the flag for hash data. - HashData TypeFlag = 'h' - // ListMeta is the flag for list meta. - ListMeta TypeFlag = 'L' - // ListData is the flag for list data. - ListData TypeFlag = 'l' -) - -func (t *TxStructure) encodeStringDataKey(key []byte) kv.Key { - // for codec Encode, we may add extra bytes data, so here and following encode - // we will use extra length like 4 for a little optimization. - ek := make([]byte, 0, len(t.prefix)+len(key)+24) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - return codec.EncodeUint(ek, uint64(StringData)) -} - -func (t *TxStructure) encodeHashMetaKey(key []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+24) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - return codec.EncodeUint(ek, uint64(HashMeta)) -} - -func (t *TxStructure) encodeHashDataKey(key []byte, field []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+len(field)+30) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - ek = codec.EncodeUint(ek, uint64(HashData)) - return codec.EncodeBytes(ek, field) -} - -func (t *TxStructure) decodeHashDataKey(ek kv.Key) ([]byte, []byte, error) { - var ( - key []byte - field []byte - err error - tp uint64 - ) - - if !bytes.HasPrefix(ek, t.prefix) { - return nil, nil, errors.New("invalid encoded hash data key prefix") - } - - ek = ek[len(t.prefix):] - - ek, key, err = codec.DecodeBytes(ek) - if err != nil { - return nil, nil, errors.Trace(err) - } - - ek, tp, err = codec.DecodeUint(ek) - if err != nil { - return nil, nil, errors.Trace(err) - } else if TypeFlag(tp) != HashData { - return nil, nil, errors.Errorf("invalid encoded hash data key flag %c", byte(tp)) - } - - _, field, err = codec.DecodeBytes(ek) - return key, field, errors.Trace(err) -} - -func (t *TxStructure) hashDataKeyPrefix(key []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+24) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - return codec.EncodeUint(ek, uint64(HashData)) -} - -func (t *TxStructure) encodeListMetaKey(key []byte) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+24) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - return codec.EncodeUint(ek, uint64(ListMeta)) -} - -func (t *TxStructure) encodeListDataKey(key []byte, index int64) kv.Key { - ek := make([]byte, 0, len(t.prefix)+len(key)+36) - ek = append(ek, t.prefix...) - ek = codec.EncodeBytes(ek, key) - ek = codec.EncodeUint(ek, uint64(ListData)) - return codec.EncodeInt(ek, index) -} diff --git a/vendor/github.com/pingcap/tidb/table/table.go b/vendor/github.com/pingcap/tidb/table/table.go deleted file mode 100644 index 7c547ed5326f..000000000000 --- a/vendor/github.com/pingcap/tidb/table/table.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package table - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/types" -) - -// RecordIterFunc is used for low-level record iteration. -type RecordIterFunc func(h int64, rec []types.Datum, cols []*column.Col) (more bool, err error) - -// Table is used to retrieve and modify rows in table. -type Table interface { - // IterRecords iterates records in the table and calls fn. - IterRecords(ctx context.Context, startKey kv.Key, cols []*column.Col, fn RecordIterFunc) error - - // RowWithCols returns a row that contains the given cols. - RowWithCols(ctx context.Context, h int64, cols []*column.Col) ([]types.Datum, error) - - // Row returns a row for all columns. - Row(ctx context.Context, h int64) ([]types.Datum, error) - - // Cols returns the columns of the table which is used in select. - Cols() []*column.Col - - // Indices returns the indices of the table. - Indices() []*column.IndexedCol - - // RecordPrefix returns the record key prefix. - RecordPrefix() kv.Key - - // IndexPrefix returns the index key prefix. - IndexPrefix() kv.Key - - // FirstKey returns the first key. - FirstKey() kv.Key - - // RecordKey returns the key in KV storage for the column. - RecordKey(h int64, col *column.Col) kv.Key - - // Truncate truncates the table. - Truncate(ctx context.Context) (err error) - - // AddRecord inserts a row into the table. - AddRecord(ctx context.Context, r []types.Datum) (recordID int64, err error) - - // UpdateRecord updates a row in the table. - UpdateRecord(ctx context.Context, h int64, currData []types.Datum, newData []types.Datum, touched map[int]bool) error - - // RemoveRecord removes a row in the table. - RemoveRecord(ctx context.Context, h int64, r []types.Datum) error - - // AllocAutoID allocates an auto_increment ID for a new row. - AllocAutoID() (int64, error) - - // RebaseAutoID rebases the auto_increment ID base. - // If allocIDs is true, it will allocate some IDs and save to the cache. - // If allocIDs is false, it will not allocate IDs. - RebaseAutoID(newBase int64, allocIDs bool) error - - // Meta returns TableInfo. - Meta() *model.TableInfo - - // LockRow locks a row. - LockRow(ctx context.Context, h int64, forRead bool) error - - // Seek returns the handle greater or equal to h. - Seek(ctx context.Context, h int64) (handle int64, found bool, err error) -} - -// TableFromMeta builds a table.Table from *model.TableInfo. -// Currently, it is assigned to tables.TableFromMeta in tidb package's init function. -var TableFromMeta func(alloc autoid.Allocator, tblInfo *model.TableInfo) (Table, error) - -// GetColDefaultValue gets default value of the column. -func GetColDefaultValue(ctx context.Context, col *model.ColumnInfo) (types.Datum, bool, error) { - // Check no default value flag. - if mysql.HasNoDefaultValueFlag(col.Flag) && col.Tp != mysql.TypeEnum { - return types.Datum{}, false, errors.Errorf("Field '%s' doesn't have a default value", col.Name) - } - - // Check and get timestamp/datetime default value. - if col.Tp == mysql.TypeTimestamp || col.Tp == mysql.TypeDatetime { - if col.DefaultValue == nil { - return types.Datum{}, true, nil - } - - value, err := evaluator.GetTimeValue(ctx, col.DefaultValue, col.Tp, col.Decimal) - if err != nil { - return types.Datum{}, true, errors.Errorf("Field '%s' get default value fail - %s", col.Name, errors.Trace(err)) - } - return types.NewDatum(value), true, nil - } else if col.Tp == mysql.TypeEnum { - // For enum type, if no default value and not null is set, - // the default value is the first element of the enum list - if col.DefaultValue == nil && mysql.HasNotNullFlag(col.Flag) { - return types.NewDatum(col.FieldType.Elems[0]), true, nil - } - } - - return types.NewDatum(col.DefaultValue), true, nil -} diff --git a/vendor/github.com/pingcap/tidb/table/tables/memory_tables.go b/vendor/github.com/pingcap/tidb/table/tables/memory_tables.go deleted file mode 100644 index 118781b35ae6..000000000000 --- a/vendor/github.com/pingcap/tidb/table/tables/memory_tables.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package tables - -import ( - "sync" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/petar/GoLLRB/llrb" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/util/types" -) - -var ( - errRowNotFound = errors.New("Can not find the row") -) - -type itemKey int64 - -type itemPair struct { - handle itemKey - data []types.Datum -} - -func (r *itemPair) Less(item llrb.Item) bool { - switch x := item.(type) { - case itemKey: - return r.handle < x - case *itemPair: - return r.handle < x.handle - } - log.Errorf("invalid type %T", item) - return true -} - -func (k itemKey) Less(item llrb.Item) bool { - switch x := item.(type) { - case itemKey: - return k < x - case *itemPair: - return k < x.handle - } - log.Errorf("invalid type %T", item) - return true -} - -// MemoryTable implements table.Table interface. -type MemoryTable struct { - ID int64 - Name model.CIStr - Columns []*column.Col - pkHandleCol *column.Col - - recordPrefix kv.Key - alloc autoid.Allocator - meta *model.TableInfo - - tree *llrb.LLRB - mu sync.RWMutex -} - -// MemoryTableFromMeta creates a Table instance from model.TableInfo. -func MemoryTableFromMeta(alloc autoid.Allocator, tblInfo *model.TableInfo) (table.Table, error) { - columns := make([]*column.Col, 0, len(tblInfo.Columns)) - var pkHandleColumn *column.Col - for _, colInfo := range tblInfo.Columns { - col := &column.Col{ColumnInfo: *colInfo} - columns = append(columns, col) - if col.IsPKHandleColumn(tblInfo) { - pkHandleColumn = col - } - } - t := newMemoryTable(tblInfo.ID, tblInfo.Name.O, columns, alloc) - t.pkHandleCol = pkHandleColumn - t.meta = tblInfo - return t, nil -} - -// newMemoryTable constructs a MemoryTable instance. -func newMemoryTable(tableID int64, tableName string, cols []*column.Col, alloc autoid.Allocator) *MemoryTable { - name := model.NewCIStr(tableName) - t := &MemoryTable{ - ID: tableID, - Name: name, - alloc: alloc, - Columns: cols, - recordPrefix: genTableRecordPrefix(tableID), - tree: llrb.New(), - } - return t -} - -// Seek seeks the handle -func (t *MemoryTable) Seek(ctx context.Context, handle int64) (int64, bool, error) { - var found bool - var result int64 - t.mu.RLock() - t.tree.AscendGreaterOrEqual(itemKey(handle), func(item llrb.Item) bool { - found = true - result = int64(item.(*itemPair).handle) - return false - }) - t.mu.RUnlock() - return result, found, nil -} - -// Indices implements table.Table Indices interface. -func (t *MemoryTable) Indices() []*column.IndexedCol { - return nil -} - -// Meta implements table.Table Meta interface. -func (t *MemoryTable) Meta() *model.TableInfo { - return t.meta -} - -// Cols implements table.Table Cols interface. -func (t *MemoryTable) Cols() []*column.Col { - return t.Columns -} - -// RecordPrefix implements table.Table RecordPrefix interface. -func (t *MemoryTable) RecordPrefix() kv.Key { - return t.recordPrefix -} - -// IndexPrefix implements table.Table IndexPrefix interface. -func (t *MemoryTable) IndexPrefix() kv.Key { - return nil -} - -// RecordKey implements table.Table RecordKey interface. -func (t *MemoryTable) RecordKey(h int64, col *column.Col) kv.Key { - colID := int64(0) - if col != nil { - colID = col.ID - } - return encodeRecordKey(t.recordPrefix, h, colID) -} - -// FirstKey implements table.Table FirstKey interface. -func (t *MemoryTable) FirstKey() kv.Key { - return t.RecordKey(0, nil) -} - -// Truncate implements table.Table Truncate interface. -func (t *MemoryTable) Truncate(ctx context.Context) error { - t.tree = llrb.New() - return nil -} - -// UpdateRecord implements table.Table UpdateRecord interface. -func (t *MemoryTable) UpdateRecord(ctx context.Context, h int64, oldData []types.Datum, newData []types.Datum, touched map[int]bool) error { - t.mu.Lock() - defer t.mu.Unlock() - item := t.tree.Get(itemKey(h)) - if item == nil { - return errRowNotFound - } - pair := item.(*itemPair) - pair.data = newData - return nil -} - -// AddRecord implements table.Table AddRecord interface. -func (t *MemoryTable) AddRecord(ctx context.Context, r []types.Datum) (recordID int64, err error) { - if t.pkHandleCol != nil { - recordID, err = types.ToInt64(r[t.pkHandleCol.Offset].GetValue()) - if err != nil { - return 0, errors.Trace(err) - } - } else { - recordID, err = t.alloc.Alloc(t.ID) - if err != nil { - return 0, errors.Trace(err) - } - } - item := &itemPair{ - handle: itemKey(recordID), - data: r, - } - t.mu.Lock() - defer t.mu.Unlock() - if t.tree.Get(itemKey(recordID)) != nil { - return 0, kv.ErrKeyExists - } - t.tree.ReplaceOrInsert(item) - return -} - -// RowWithCols implements table.Table RowWithCols interface. -func (t *MemoryTable) RowWithCols(ctx context.Context, h int64, cols []*column.Col) ([]types.Datum, error) { - t.mu.RLock() - defer t.mu.RUnlock() - item := t.tree.Get(itemKey(h)) - if item == nil { - return nil, errRowNotFound - } - row := item.(*itemPair).data - v := make([]types.Datum, len(cols)) - for i, col := range cols { - v[i] = row[col.Offset] - } - return v, nil -} - -// Row implements table.Table Row interface. -func (t *MemoryTable) Row(ctx context.Context, h int64) ([]types.Datum, error) { - r, err := t.RowWithCols(nil, h, t.Cols()) - if err != nil { - return nil, errors.Trace(err) - } - return r, nil -} - -// LockRow implements table.Table LockRow interface. -func (t *MemoryTable) LockRow(ctx context.Context, h int64, forRead bool) error { - return nil -} - -// RemoveRecord implements table.Table RemoveRecord interface. -func (t *MemoryTable) RemoveRecord(ctx context.Context, h int64, r []types.Datum) error { - t.mu.Lock() - t.tree.Delete(itemKey(h)) - t.mu.Unlock() - return nil -} - -// AllocAutoID implements table.Table AllocAutoID interface. -func (t *MemoryTable) AllocAutoID() (int64, error) { - return t.alloc.Alloc(t.ID) -} - -// RebaseAutoID implements table.Table RebaseAutoID interface. -func (t *MemoryTable) RebaseAutoID(newBase int64, isSetStep bool) error { - return t.alloc.Rebase(t.ID, newBase, isSetStep) -} - -// IterRecords implements table.Table IterRecords interface. -func (t *MemoryTable) IterRecords(ctx context.Context, startKey kv.Key, cols []*column.Col, - fn table.RecordIterFunc) error { - return nil -} diff --git a/vendor/github.com/pingcap/tidb/table/tables/tables.go b/vendor/github.com/pingcap/tidb/table/tables/tables.go deleted file mode 100644 index 9c038a91db23..000000000000 --- a/vendor/github.com/pingcap/tidb/table/tables/tables.go +++ /dev/null @@ -1,875 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package tables - -import ( - "strings" - "time" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/column" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/evaluator" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/meta/autoid" - "github.com/pingcap/tidb/model" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/types" -) - -// TablePrefix is the prefix for table record and index key. -var TablePrefix = []byte{'t'} - -// Table implements table.Table interface. -type Table struct { - ID int64 - Name model.CIStr - Columns []*column.Col - - publicColumns []*column.Col - writableColumns []*column.Col - indices []*column.IndexedCol - recordPrefix kv.Key - indexPrefix kv.Key - alloc autoid.Allocator - meta *model.TableInfo -} - -// TableFromMeta creates a Table instance from model.TableInfo. -func TableFromMeta(alloc autoid.Allocator, tblInfo *model.TableInfo) (table.Table, error) { - if tblInfo.State == model.StateNone { - return nil, errors.Errorf("table %s can't be in none state", tblInfo.Name) - } - - columns := make([]*column.Col, 0, len(tblInfo.Columns)) - for _, colInfo := range tblInfo.Columns { - if colInfo.State == model.StateNone { - return nil, errors.Errorf("column %s can't be in none state", colInfo.Name) - } - - col := &column.Col{ColumnInfo: *colInfo} - columns = append(columns, col) - } - - t := newTable(tblInfo.ID, columns, alloc) - - for _, idxInfo := range tblInfo.Indices { - if idxInfo.State == model.StateNone { - return nil, errors.Errorf("index %s can't be in none state", idxInfo.Name) - } - - idx := &column.IndexedCol{ - IndexInfo: *idxInfo, - } - - idx.X = kv.NewKVIndex(t.IndexPrefix(), idxInfo.Name.L, idxInfo.ID, idxInfo.Unique) - - t.indices = append(t.indices, idx) - } - t.meta = tblInfo - return t, nil -} - -// newTable constructs a Table instance. -func newTable(tableID int64, cols []*column.Col, alloc autoid.Allocator) *Table { - t := &Table{ - ID: tableID, - recordPrefix: genTableRecordPrefix(tableID), - indexPrefix: genTableIndexPrefix(tableID), - alloc: alloc, - Columns: cols, - } - - t.publicColumns = t.Cols() - t.writableColumns = t.writableCols() - return t -} - -// Indices implements table.Table Indices interface. -func (t *Table) Indices() []*column.IndexedCol { - return t.indices -} - -// Meta implements table.Table Meta interface. -func (t *Table) Meta() *model.TableInfo { - return t.meta -} - -// Cols implements table.Table Cols interface. -func (t *Table) Cols() []*column.Col { - if len(t.publicColumns) > 0 { - return t.publicColumns - } - - t.publicColumns = make([]*column.Col, 0, len(t.Columns)) - for _, col := range t.Columns { - if col.State == model.StatePublic { - t.publicColumns = append(t.publicColumns, col) - } - } - - return t.publicColumns -} - -func (t *Table) writableCols() []*column.Col { - if len(t.writableColumns) > 0 { - return t.writableColumns - } - - t.writableColumns = make([]*column.Col, 0, len(t.Columns)) - for _, col := range t.Columns { - if col.State == model.StateDeleteOnly || col.State == model.StateDeleteReorganization { - continue - } - - t.writableColumns = append(t.writableColumns, col) - } - - return t.writableColumns -} - -// RecordPrefix implements table.Table RecordPrefix interface. -func (t *Table) RecordPrefix() kv.Key { - return t.recordPrefix -} - -// IndexPrefix implements table.Table IndexPrefix interface. -func (t *Table) IndexPrefix() kv.Key { - return t.indexPrefix -} - -// RecordKey implements table.Table RecordKey interface. -func (t *Table) RecordKey(h int64, col *column.Col) kv.Key { - colID := int64(0) - if col != nil { - colID = col.ID - } - return encodeRecordKey(t.recordPrefix, h, colID) -} - -// FirstKey implements table.Table FirstKey interface. -func (t *Table) FirstKey() kv.Key { - return t.RecordKey(0, nil) -} - -// Truncate implements table.Table Truncate interface. -func (t *Table) Truncate(ctx context.Context) error { - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - err = util.DelKeyWithPrefix(txn, t.RecordPrefix()) - if err != nil { - return errors.Trace(err) - } - return util.DelKeyWithPrefix(txn, t.IndexPrefix()) -} - -// UpdateRecord implements table.Table UpdateRecord interface. -func (t *Table) UpdateRecord(ctx context.Context, h int64, oldData []types.Datum, newData []types.Datum, touched map[int]bool) error { - // We should check whether this table has on update column which state is write only. - currentData := make([]types.Datum, len(t.writableCols())) - copy(currentData, newData) - - // If they are not set, and other data are changed, they will be updated by current timestamp too. - err := t.setOnUpdateData(ctx, touched, currentData) - if err != nil { - return errors.Trace(err) - } - - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - - bs := kv.NewBufferStore(txn) - defer bs.Release() - - // set new value - if err = t.setNewData(bs, h, touched, currentData); err != nil { - return errors.Trace(err) - } - - // rebuild index - if err = t.rebuildIndices(bs, h, touched, oldData, currentData); err != nil { - return errors.Trace(err) - } - - err = bs.SaveTo(txn) - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func (t *Table) setOnUpdateData(ctx context.Context, touched map[int]bool, data []types.Datum) error { - ucols := column.FindOnUpdateCols(t.writableCols()) - for _, col := range ucols { - if !touched[col.Offset] { - value, err := evaluator.GetTimeValue(ctx, evaluator.CurrentTimestamp, col.Tp, col.Decimal) - if err != nil { - return errors.Trace(err) - } - - data[col.Offset] = types.NewDatum(value) - touched[col.Offset] = true - } - } - return nil -} -func (t *Table) setNewData(rm kv.RetrieverMutator, h int64, touched map[int]bool, data []types.Datum) error { - for _, col := range t.Cols() { - if !touched[col.Offset] { - continue - } - - k := t.RecordKey(h, col) - if err := SetColValue(rm, k, data[col.Offset]); err != nil { - return errors.Trace(err) - } - } - - return nil -} - -func (t *Table) rebuildIndices(rm kv.RetrieverMutator, h int64, touched map[int]bool, oldData []types.Datum, newData []types.Datum) error { - for _, idx := range t.Indices() { - idxTouched := false - for _, ic := range idx.Columns { - if touched[ic.Offset] { - idxTouched = true - break - } - } - if !idxTouched { - continue - } - - oldVs, err := idx.FetchValues(oldData) - if err != nil { - return errors.Trace(err) - } - - if t.removeRowIndex(rm, h, oldVs, idx); err != nil { - return errors.Trace(err) - } - - newVs, err := idx.FetchValues(newData) - if err != nil { - return errors.Trace(err) - } - - if err := t.buildIndexForRow(rm, h, newVs, idx); err != nil { - return errors.Trace(err) - } - } - return nil -} - -// AddRecord implements table.Table AddRecord interface. -func (t *Table) AddRecord(ctx context.Context, r []types.Datum) (recordID int64, err error) { - var hasRecordID bool - for _, col := range t.Cols() { - if col.IsPKHandleColumn(t.meta) { - recordID = r[col.Offset].GetInt64() - hasRecordID = true - break - } - } - if !hasRecordID { - recordID, err = t.alloc.Alloc(t.ID) - if err != nil { - return 0, errors.Trace(err) - } - } - txn, err := ctx.GetTxn(false) - if err != nil { - return 0, errors.Trace(err) - } - bs := kv.NewBufferStore(txn) - defer bs.Release() - // Insert new entries into indices. - h, err := t.addIndices(ctx, recordID, r, bs) - if err != nil { - return h, errors.Trace(err) - } - - if err = t.LockRow(ctx, recordID, false); err != nil { - return 0, errors.Trace(err) - } - // Set public and write only column value. - for _, col := range t.writableCols() { - if col.IsPKHandleColumn(t.meta) { - continue - } - var value types.Datum - if col.State == model.StateWriteOnly || col.State == model.StateWriteReorganization { - // if col is in write only or write reorganization state, we must add it with its default value. - value, _, err = table.GetColDefaultValue(ctx, &col.ColumnInfo) - if err != nil { - return 0, errors.Trace(err) - } - value, err = value.ConvertTo(&col.FieldType) - if err != nil { - return 0, errors.Trace(err) - } - } else { - value = r[col.Offset] - } - - key := t.RecordKey(recordID, col) - err = SetColValue(txn, key, value) - if err != nil { - return 0, errors.Trace(err) - } - } - if err = bs.SaveTo(txn); err != nil { - return 0, errors.Trace(err) - } - - variable.GetSessionVars(ctx).AddAffectedRows(1) - return recordID, nil -} - -// Generate index content string representation. -func (t *Table) genIndexKeyStr(colVals []types.Datum) (string, error) { - // Pass pre-composed error to txn. - strVals := make([]string, 0, len(colVals)) - for _, cv := range colVals { - cvs := "NULL" - var err error - if cv.Kind() != types.KindNull { - cvs, err = types.ToString(cv.GetValue()) - if err != nil { - return "", errors.Trace(err) - } - } - strVals = append(strVals, cvs) - } - return strings.Join(strVals, "-"), nil -} - -// Add data into indices. -func (t *Table) addIndices(ctx context.Context, recordID int64, r []types.Datum, bs *kv.BufferStore) (int64, error) { - txn, err := ctx.GetTxn(false) - if err != nil { - return 0, errors.Trace(err) - } - // Clean up lazy check error environment - defer txn.DelOption(kv.PresumeKeyNotExistsError) - if t.meta.PKIsHandle { - // Check key exists. - recordKey := t.RecordKey(recordID, nil) - e := kv.ErrKeyExists.Gen("Duplicate entry '%d' for key 'PRIMARY'", recordID) - txn.SetOption(kv.PresumeKeyNotExistsError, e) - _, err = txn.Get(recordKey) - if err == nil { - return recordID, errors.Trace(e) - } else if !terror.ErrorEqual(err, kv.ErrNotExist) { - return 0, errors.Trace(err) - } - txn.DelOption(kv.PresumeKeyNotExistsError) - } - - for _, v := range t.indices { - if v == nil || v.State == model.StateDeleteOnly || v.State == model.StateDeleteReorganization { - // if index is in delete only or delete reorganization state, we can't add it. - continue - } - colVals, _ := v.FetchValues(r) - var dupKeyErr error - if v.Unique || v.Primary { - entryKey, err1 := t.genIndexKeyStr(colVals) - if err1 != nil { - return 0, errors.Trace(err1) - } - dupKeyErr = kv.ErrKeyExists.Gen("Duplicate entry '%s' for key '%s'", entryKey, v.Name) - txn.SetOption(kv.PresumeKeyNotExistsError, dupKeyErr) - } - if err = v.X.Create(bs, colVals, recordID); err != nil { - if terror.ErrorEqual(err, kv.ErrKeyExists) { - // Get the duplicate row handle - // For insert on duplicate syntax, we should update the row - iter, _, err1 := v.X.Seek(bs, colVals) - if err1 != nil { - return 0, errors.Trace(err1) - } - _, h, err1 := iter.Next() - if err1 != nil { - return 0, errors.Trace(err1) - } - return h, errors.Trace(dupKeyErr) - } - return 0, errors.Trace(err) - } - txn.DelOption(kv.PresumeKeyNotExistsError) - } - return 0, nil -} - -// RowWithCols implements table.Table RowWithCols interface. -func (t *Table) RowWithCols(ctx context.Context, h int64, cols []*column.Col) ([]types.Datum, error) { - txn, err := ctx.GetTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - v := make([]types.Datum, len(cols)) - for i, col := range cols { - if col.State != model.StatePublic { - return nil, errors.Errorf("Cannot use none public column - %v", cols) - } - if col.IsPKHandleColumn(t.meta) { - v[i].SetInt64(h) - continue - } - - k := t.RecordKey(h, col) - data, err := txn.Get(k) - if err != nil { - return nil, errors.Trace(err) - } - - v[i], err = DecodeValue(data, &col.FieldType) - if err != nil { - return nil, errors.Trace(err) - } - } - return v, nil -} - -// Row implements table.Table Row interface. -func (t *Table) Row(ctx context.Context, h int64) ([]types.Datum, error) { - // TODO: we only interested in mentioned cols - r, err := t.RowWithCols(ctx, h, t.Cols()) - if err != nil { - return nil, errors.Trace(err) - } - return r, nil -} - -// LockRow implements table.Table LockRow interface. -func (t *Table) LockRow(ctx context.Context, h int64, forRead bool) error { - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - // Get row lock key - lockKey := t.RecordKey(h, nil) - if forRead { - err = txn.LockKeys(lockKey) - } else { - // set row lock key to current txn - err = txn.Set(lockKey, []byte(txn.String())) - } - return errors.Trace(err) -} - -// RemoveRecord implements table.Table RemoveRecord interface. -func (t *Table) RemoveRecord(ctx context.Context, h int64, r []types.Datum) error { - err := t.removeRowData(ctx, h) - if err != nil { - return errors.Trace(err) - } - - err = t.removeRowIndices(ctx, h, r) - if err != nil { - return errors.Trace(err) - } - - return nil -} - -func (t *Table) removeRowData(ctx context.Context, h int64) error { - if err := t.LockRow(ctx, h, false); err != nil { - return errors.Trace(err) - } - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - // Remove row's colume one by one - for _, col := range t.Columns { - k := t.RecordKey(h, col) - err = txn.Delete([]byte(k)) - if err != nil { - if col.State != model.StatePublic && terror.ErrorEqual(err, kv.ErrNotExist) { - // If the column is not in public state, we may have not added the column, - // or already deleted the column, so skip ErrNotExist error. - continue - } - - return errors.Trace(err) - } - } - // Remove row lock - err = txn.Delete([]byte(t.RecordKey(h, nil))) - if err != nil { - return errors.Trace(err) - } - return nil -} - -// removeRowAllIndex removes all the indices of a row. -func (t *Table) removeRowIndices(ctx context.Context, h int64, rec []types.Datum) error { - for _, v := range t.indices { - vals, err := v.FetchValues(rec) - if vals == nil { - // TODO: check this - continue - } - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - if err = v.X.Delete(txn, vals, h); err != nil { - if v.State != model.StatePublic && terror.ErrorEqual(err, kv.ErrNotExist) { - // If the index is not in public state, we may have not created the index, - // or already deleted the index, so skip ErrNotExist error. - continue - } - - return errors.Trace(err) - } - } - return nil -} - -// RemoveRowIndex implements table.Table RemoveRowIndex interface. -func (t *Table) removeRowIndex(rm kv.RetrieverMutator, h int64, vals []types.Datum, idx *column.IndexedCol) error { - if err := idx.X.Delete(rm, vals, h); err != nil { - return errors.Trace(err) - } - return nil -} - -// BuildIndexForRow implements table.Table BuildIndexForRow interface. -func (t *Table) buildIndexForRow(rm kv.RetrieverMutator, h int64, vals []types.Datum, idx *column.IndexedCol) error { - if idx.State == model.StateDeleteOnly || idx.State == model.StateDeleteReorganization { - // If the index is in delete only or write reorganization state, we can not add index. - return nil - } - - if err := idx.X.Create(rm, vals, h); err != nil { - return errors.Trace(err) - } - return nil -} - -// IterRecords implements table.Table IterRecords interface. -func (t *Table) IterRecords(ctx context.Context, startKey kv.Key, cols []*column.Col, - fn table.RecordIterFunc) error { - txn, err := ctx.GetTxn(false) - if err != nil { - return errors.Trace(err) - } - it, err := txn.Seek(startKey) - if err != nil { - return errors.Trace(err) - } - defer it.Close() - - if !it.Valid() { - return nil - } - - log.Debugf("startKey:%q, key:%q, value:%q", startKey, it.Key(), it.Value()) - - prefix := t.RecordPrefix() - for it.Valid() && it.Key().HasPrefix(prefix) { - // first kv pair is row lock information. - // TODO: check valid lock - // get row handle - handle, err := DecodeRecordKeyHandle(it.Key()) - if err != nil { - return errors.Trace(err) - } - - data, err := t.RowWithCols(ctx, handle, cols) - if err != nil { - return errors.Trace(err) - } - more, err := fn(handle, data, cols) - if !more || err != nil { - return errors.Trace(err) - } - - rk := t.RecordKey(handle, nil) - err = kv.NextUntil(it, util.RowKeyPrefixFilter(rk)) - if err != nil { - return errors.Trace(err) - } - } - - return nil -} - -// AllocAutoID implements table.Table AllocAutoID interface. -func (t *Table) AllocAutoID() (int64, error) { - return t.alloc.Alloc(t.ID) -} - -// RebaseAutoID implements table.Table RebaseAutoID interface. -func (t *Table) RebaseAutoID(newBase int64, isSetStep bool) error { - return t.alloc.Rebase(t.ID, newBase, isSetStep) -} - -// Seek implements table.Table Seek interface. -func (t *Table) Seek(ctx context.Context, h int64) (int64, bool, error) { - seekKey := EncodeRecordKey(t.ID, h, 0) - txn, err := ctx.GetTxn(false) - if err != nil { - return 0, false, errors.Trace(err) - } - iter, err := txn.Seek(seekKey) - if !iter.Valid() || !iter.Key().HasPrefix(t.RecordPrefix()) { - // No more records in the table, skip to the end. - return 0, false, nil - } - handle, err := DecodeRecordKeyHandle(iter.Key()) - if err != nil { - return 0, false, errors.Trace(err) - } - return handle, true, nil -} - -var ( - recordPrefixSep = []byte("_r") - indexPrefixSep = []byte("_i") -) - -// record prefix is "t[tableID]_r" -func genTableRecordPrefix(tableID int64) kv.Key { - buf := make([]byte, 0, len(TablePrefix)+8+len(recordPrefixSep)) - buf = append(buf, TablePrefix...) - buf = codec.EncodeInt(buf, tableID) - buf = append(buf, recordPrefixSep...) - return buf -} - -// index prefix is "t[tableID]_i" -func genTableIndexPrefix(tableID int64) kv.Key { - buf := make([]byte, 0, len(TablePrefix)+8+len(indexPrefixSep)) - buf = append(buf, TablePrefix...) - buf = codec.EncodeInt(buf, tableID) - buf = append(buf, indexPrefixSep...) - return buf -} - -func encodeRecordKey(recordPrefix kv.Key, h int64, columnID int64) kv.Key { - buf := make([]byte, 0, len(recordPrefix)+16) - buf = append(buf, recordPrefix...) - buf = codec.EncodeInt(buf, h) - - if columnID != 0 { - buf = codec.EncodeInt(buf, columnID) - } - return buf -} - -// EncodeRecordKey encodes the record key for a table column. -func EncodeRecordKey(tableID int64, h int64, columnID int64) kv.Key { - prefix := genTableRecordPrefix(tableID) - return encodeRecordKey(prefix, h, columnID) -} - -// DecodeRecordKey decodes the key and gets the tableID, handle and columnID. -func DecodeRecordKey(key kv.Key) (tableID int64, handle int64, columnID int64, err error) { - k := key - if !key.HasPrefix(TablePrefix) { - return 0, 0, 0, errors.Errorf("invalid record key - %q", k) - } - - key = key[len(TablePrefix):] - key, tableID, err = codec.DecodeInt(key) - if err != nil { - return 0, 0, 0, errors.Trace(err) - } - - if !key.HasPrefix(recordPrefixSep) { - return 0, 0, 0, errors.Errorf("invalid record key - %q", k) - } - - key = key[len(recordPrefixSep):] - - key, handle, err = codec.DecodeInt(key) - if err != nil { - return 0, 0, 0, errors.Trace(err) - } - if len(key) == 0 { - return - } - - key, columnID, err = codec.DecodeInt(key) - if err != nil { - return 0, 0, 0, errors.Trace(err) - } - - return -} - -// EncodeValue encodes a go value to bytes. -func EncodeValue(raw types.Datum) ([]byte, error) { - v, err := flatten(raw) - if err != nil { - return nil, errors.Trace(err) - } - b, err := codec.EncodeValue(nil, v) - return b, errors.Trace(err) -} - -// DecodeValue implements table.Table DecodeValue interface. -func DecodeValue(data []byte, tp *types.FieldType) (types.Datum, error) { - values, err := codec.Decode(data) - if err != nil { - return types.Datum{}, errors.Trace(err) - } - return unflatten(values[0], tp) -} - -func flatten(data types.Datum) (types.Datum, error) { - switch data.Kind() { - case types.KindMysqlTime: - // for mysql datetime, timestamp and date type - b, err := data.GetMysqlTime().Marshal() - if err != nil { - return types.NewDatum(nil), errors.Trace(err) - } - return types.NewDatum(b), nil - case types.KindMysqlDuration: - // for mysql time type - data.SetInt64(int64(data.GetMysqlDuration().Duration)) - return data, nil - case types.KindMysqlDecimal: - data.SetString(data.GetMysqlDecimal().String()) - return data, nil - case types.KindMysqlEnum: - data.SetUint64(data.GetMysqlEnum().Value) - return data, nil - case types.KindMysqlSet: - data.SetUint64(data.GetMysqlSet().Value) - return data, nil - case types.KindMysqlBit: - data.SetUint64(data.GetMysqlBit().Value) - return data, nil - case types.KindMysqlHex: - data.SetInt64(data.GetMysqlHex().Value) - return data, nil - default: - return data, nil - } -} - -func unflatten(datum types.Datum, tp *types.FieldType) (types.Datum, error) { - if datum.Kind() == types.KindNull { - return datum, nil - } - switch tp.Tp { - case mysql.TypeFloat: - datum.SetFloat32(float32(datum.GetFloat64())) - return datum, nil - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeYear, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, - mysql.TypeDouble, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob, - mysql.TypeVarchar, mysql.TypeString: - return datum, nil - case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: - var t mysql.Time - t.Type = tp.Tp - t.Fsp = tp.Decimal - err := t.Unmarshal(datum.GetBytes()) - if err != nil { - return datum, errors.Trace(err) - } - datum.SetValue(t) - return datum, nil - case mysql.TypeDuration: - dur := mysql.Duration{Duration: time.Duration(datum.GetInt64())} - datum.SetValue(dur) - return datum, nil - case mysql.TypeNewDecimal, mysql.TypeDecimal: - dec, err := mysql.ParseDecimal(datum.GetString()) - if err != nil { - return datum, errors.Trace(err) - } - datum.SetValue(dec) - return datum, nil - case mysql.TypeEnum: - enum, err := mysql.ParseEnumValue(tp.Elems, datum.GetUint64()) - if err != nil { - return datum, errors.Trace(err) - } - datum.SetValue(enum) - return datum, nil - case mysql.TypeSet: - set, err := mysql.ParseSetValue(tp.Elems, datum.GetUint64()) - if err != nil { - return datum, errors.Trace(err) - } - datum.SetValue(set) - return datum, nil - case mysql.TypeBit: - bit := mysql.Bit{Value: datum.GetUint64(), Width: tp.Flen} - datum.SetValue(bit) - return datum, nil - } - log.Error(tp.Tp, datum) - return datum, nil -} - -// SetColValue implements table.Table SetColValue interface. -func SetColValue(rm kv.RetrieverMutator, key []byte, data types.Datum) error { - v, err := EncodeValue(data) - if err != nil { - return errors.Trace(err) - } - if err := rm.Set(key, v); err != nil { - return errors.Trace(err) - } - return nil -} - -// DecodeRecordKeyHandle decodes the key and gets the record handle. -func DecodeRecordKeyHandle(key kv.Key) (int64, error) { - _, handle, _, err := DecodeRecordKey(key) - return handle, errors.Trace(err) -} - -// FindIndexByColName implements table.Table FindIndexByColName interface. -func FindIndexByColName(t table.Table, name string) *column.IndexedCol { - for _, idx := range t.Indices() { - // only public index can be read. - if idx.State != model.StatePublic { - continue - } - - if len(idx.Columns) == 1 && strings.EqualFold(idx.Columns[0].Name.L, name) { - return idx - } - } - return nil -} - -func init() { - table.TableFromMeta = TableFromMeta -} diff --git a/vendor/github.com/pingcap/tidb/terror/terror.go b/vendor/github.com/pingcap/tidb/terror/terror.go deleted file mode 100644 index 46ce78e5f13b..000000000000 --- a/vendor/github.com/pingcap/tidb/terror/terror.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package terror - -import ( - "fmt" - "runtime" - "strconv" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/mysql" -) - -// Common base error instances. -var ( - CommitNotInTransaction = ClassExecutor.New(CodeCommitNotInTransaction, "commit not in transaction") - RollbackNotInTransaction = ClassExecutor.New(CodeRollbackNotInTransaction, "rollback not in transaction") - ExecResultIsEmpty = ClassExecutor.New(CodeExecResultIsEmpty, "exec result is empty") - - MissConnectionID = ClassExpression.New(CodeMissConnectionID, "miss connection id information") -) - -// ErrCode represents a specific error type in a error class. -// Same error code can be used in different error classes. -type ErrCode int - -// Executor error codes. -const ( - CodeCommitNotInTransaction ErrCode = 1 - CodeRollbackNotInTransaction = 2 - CodeExecResultIsEmpty = 3 -) - -// Expression error codes. -const ( - CodeMissConnectionID ErrCode = iota + 1 -) - -// ErrClass represents a class of errors. -type ErrClass int - -// Error classes. -const ( - ClassParser ErrClass = iota + 1 - ClassSchema - ClassOptimizer - ClassOptimizerPlan - ClassExecutor - ClassEvaluator - ClassKV - ClassServer - ClassVariable - ClassExpression - // Add more as needed. -) - -// String implements fmt.Stringer interface. -func (ec ErrClass) String() string { - switch ec { - case ClassParser: - return "parser" - case ClassSchema: - return "schema" - case ClassOptimizer: - return "optimizer" - case ClassExecutor: - return "executor" - case ClassKV: - return "kv" - case ClassServer: - return "server" - case ClassVariable: - return "variable" - case ClassExpression: - return "expression" - } - return strconv.Itoa(int(ec)) -} - -// EqualClass returns true if err is *Error with the same class. -func (ec ErrClass) EqualClass(err error) bool { - e := errors.Cause(err) - if e == nil { - return false - } - if te, ok := e.(*Error); ok { - return te.class == ec - } - return false -} - -// NotEqualClass returns true if err is not *Error with the same class. -func (ec ErrClass) NotEqualClass(err error) bool { - return !ec.EqualClass(err) -} - -// New creates an *Error with an error code and an error message. -// Usually used to create base *Error. -func (ec ErrClass) New(code ErrCode, message string) *Error { - return &Error{ - class: ec, - code: code, - message: message, - } -} - -// Error implements error interface and adds integer Class and Code, so -// errors with different message can be compared. -type Error struct { - class ErrClass - code ErrCode - message string - file string - line int -} - -// Class returns ErrClass -func (e *Error) Class() ErrClass { - return e.class -} - -// Code returns ErrCode -func (e *Error) Code() ErrCode { - return e.code -} - -// Location returns the location where the error is created, -// implements juju/errors locationer interface. -func (e *Error) Location() (file string, line int) { - return e.file, e.line -} - -// Error implements error interface. -func (e *Error) Error() string { - return fmt.Sprintf("[%s:%d]%s", e.class, e.code, e.message) -} - -// Gen generates a new *Error with the same class and code, and a new formatted message. -func (e *Error) Gen(format string, args ...interface{}) *Error { - err := *e - err.message = fmt.Sprintf(format, args...) - _, err.file, err.line, _ = runtime.Caller(1) - return &err -} - -// Equal checks if err is equal to e. -func (e *Error) Equal(err error) bool { - originErr := errors.Cause(err) - if originErr == nil { - return false - } - inErr, ok := originErr.(*Error) - return ok && e.class == inErr.class && e.code == inErr.code -} - -// NotEqual checks if err is not equal to e. -func (e *Error) NotEqual(err error) bool { - return !e.Equal(err) -} - -// ToSQLError convert Error to mysql.SQLError. -func (e *Error) ToSQLError() *mysql.SQLError { - code := e.getMySQLErrorCode() - return mysql.NewErrf(code, e.message) -} - -var defaultMySQLErrorCode uint16 - -func (e *Error) getMySQLErrorCode() uint16 { - codeMap, ok := ErrClassToMySQLCodes[e.class] - if !ok { - log.Warnf("Unknown error class: %v", e.class) - return defaultMySQLErrorCode - } - code, ok := codeMap[e.code] - if !ok { - log.Warnf("Unknown error class: %v code: %v", e.class, e.code) - return defaultMySQLErrorCode - } - return code -} - -var ( - // ErrCode to mysql error code map. - parserMySQLErrCodes = map[ErrCode]uint16{} - executorMySQLErrCodes = map[ErrCode]uint16{} - serverMySQLErrCodes = map[ErrCode]uint16{} - expressionMySQLErrCodes = map[ErrCode]uint16{} - - // ErrClassToMySQLCodes is the map of ErrClass to code-map. - ErrClassToMySQLCodes map[ErrClass](map[ErrCode]uint16) -) - -func init() { - ErrClassToMySQLCodes = make(map[ErrClass](map[ErrCode]uint16)) - ErrClassToMySQLCodes[ClassParser] = parserMySQLErrCodes - ErrClassToMySQLCodes[ClassExecutor] = executorMySQLErrCodes - ErrClassToMySQLCodes[ClassServer] = serverMySQLErrCodes - ErrClassToMySQLCodes[ClassExpression] = expressionMySQLErrCodes - defaultMySQLErrorCode = mysql.ErrUnknown -} - -// ErrorEqual returns a boolean indicating whether err1 is equal to err2. -func ErrorEqual(err1, err2 error) bool { - e1 := errors.Cause(err1) - e2 := errors.Cause(err2) - - if e1 == e2 { - return true - } - - if e1 == nil || e2 == nil { - return e1 == e2 - } - - te1, ok1 := e1.(*Error) - te2, ok2 := e2.(*Error) - if ok1 && ok2 { - return te1.class == te2.class && te1.code == te2.code - } - - return e1.Error() == e2.Error() -} - -// ErrorNotEqual returns a boolean indicating whether err1 isn't equal to err2. -func ErrorNotEqual(err1, err2 error) bool { - return !ErrorEqual(err1, err2) -} diff --git a/vendor/github.com/pingcap/tidb/tidb.go b/vendor/github.com/pingcap/tidb/tidb.go deleted file mode 100644 index faa1a0b5a6ed..000000000000 --- a/vendor/github.com/pingcap/tidb/tidb.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2013 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package tidb - -import ( - "net/http" - "time" - // For pprof - _ "net/http/pprof" - "net/url" - "os" - "strings" - "sync" - - "github.com/juju/errors" - "github.com/ngaut/log" - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/executor" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/parser" - "github.com/pingcap/tidb/sessionctx/autocommit" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/hbase" - "github.com/pingcap/tidb/store/localstore" - "github.com/pingcap/tidb/store/localstore/boltdb" - "github.com/pingcap/tidb/store/localstore/engine" - "github.com/pingcap/tidb/store/localstore/goleveldb" - "github.com/pingcap/tidb/util/types" -) - -// Engine prefix name -const ( - EngineGoLevelDBMemory = "memory://" - EngineGoLevelDBPersistent = "goleveldb://" - EngineBoltDB = "boltdb://" - EngineHBase = "hbase://" - defaultMaxRetries = 30 - retrySleepInterval = 500 * time.Millisecond -) - -type domainMap struct { - domains map[string]*domain.Domain - mu sync.Mutex -} - -func (dm *domainMap) Get(store kv.Storage) (d *domain.Domain, err error) { - key := store.UUID() - dm.mu.Lock() - defer dm.mu.Unlock() - d = dm.domains[key] - if d != nil { - return - } - - lease := time.Duration(0) - if !localstore.IsLocalStore(store) { - lease = schemaLease - } - d, err = domain.NewDomain(store, lease) - if err != nil { - return nil, errors.Trace(err) - } - dm.domains[key] = d - return -} - -var ( - domap = &domainMap{ - domains: map[string]*domain.Domain{}, - } - stores = make(map[string]kv.Driver) - // EnablePprof indicates whether to enable HTTP Pprof or not. - EnablePprof = os.Getenv("TIDB_PPROF") != "0" - // PprofAddr is the pprof url. - PprofAddr = "localhost:8888" - // store.UUID()-> IfBootstrapped - storeBootstrapped = make(map[string]bool) - - // schemaLease is the time for re-updating remote schema. - // In online DDL, we must wait 2 * SchemaLease time to guarantee - // all servers get the neweset schema. - // Default schema lease time is 1 second, you can change it with a proper time, - // but you must know that too little may cause badly performance degradation. - // For production, you should set a big schema lease, like 300s+. - schemaLease = 1 * time.Second -) - -// SetSchemaLease changes the default schema lease time for DDL. -// This function is very dangerous, don't use it if you really know what you do. -// SetSchemaLease only affects not local storage after bootstrapped. -func SetSchemaLease(lease time.Duration) { - schemaLease = lease -} - -// What character set should the server translate a statement to after receiving it? -// For this, the server uses the character_set_connection and collation_connection system variables. -// It converts statements sent by the client from character_set_client to character_set_connection -// (except for string literals that have an introducer such as _latin1 or _utf8). -// collation_connection is important for comparisons of literal strings. -// For comparisons of strings with column values, collation_connection does not matter because columns -// have their own collation, which has a higher collation precedence. -// See: https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html -func getCtxCharsetInfo(ctx context.Context) (string, string) { - sessionVars := variable.GetSessionVars(ctx) - charset := sessionVars.Systems["character_set_connection"] - collation := sessionVars.Systems["collation_connection"] - return charset, collation -} - -// Parse parses a query string to raw ast.StmtNode. -func Parse(ctx context.Context, src string) ([]ast.StmtNode, error) { - log.Debug("compiling", src) - charset, collation := getCtxCharsetInfo(ctx) - stmts, err := parser.Parse(src, charset, collation) - if err != nil { - log.Warnf("compiling %s, error: %v", src, err) - return nil, errors.Trace(err) - } - return stmts, nil -} - -// Compile is safe for concurrent use by multiple goroutines. -func Compile(ctx context.Context, rawStmt ast.StmtNode) (ast.Statement, error) { - compiler := &executor.Compiler{} - st, err := compiler.Compile(ctx, rawStmt) - if err != nil { - return nil, errors.Trace(err) - } - return st, nil -} - -func runStmt(ctx context.Context, s ast.Statement, args ...interface{}) (ast.RecordSet, error) { - var err error - var rs ast.RecordSet - // before every execution, we must clear affectedrows. - variable.GetSessionVars(ctx).SetAffectedRows(0) - if s.IsDDL() { - err = ctx.FinishTxn(false) - if err != nil { - return nil, errors.Trace(err) - } - } - rs, err = s.Exec(ctx) - // All the history should be added here. - se := ctx.(*session) - se.history.add(0, s) - // MySQL DDL should be auto-commit - if s.IsDDL() || autocommit.ShouldAutocommit(ctx) { - if err != nil { - ctx.FinishTxn(true) - } else { - err = ctx.FinishTxn(false) - } - } - return rs, errors.Trace(err) -} - -// GetRows gets all the rows from a RecordSet. -func GetRows(rs ast.RecordSet) ([][]types.Datum, error) { - if rs == nil { - return nil, nil - } - var rows [][]types.Datum - defer rs.Close() - // Negative limit means no limit. - for { - row, err := rs.Next() - if err != nil { - return nil, errors.Trace(err) - } - if row == nil { - break - } - rows = append(rows, row.Data) - } - return rows, nil -} - -// RegisterStore registers a kv storage with unique name and its associated Driver. -func RegisterStore(name string, driver kv.Driver) error { - name = strings.ToLower(name) - - if _, ok := stores[name]; ok { - return errors.Errorf("%s is already registered", name) - } - - stores[name] = driver - return nil -} - -// RegisterLocalStore registers a local kv storage with unique name and its associated engine Driver. -func RegisterLocalStore(name string, driver engine.Driver) error { - d := localstore.Driver{Driver: driver} - return RegisterStore(name, d) -} - -// NewStore creates a kv Storage with path. -// -// The path must be a URL format 'engine://path?params' like the one for -// tidb.Open() but with the dbname cut off. -// Examples: -// goleveldb://relative/path -// boltdb:///absolute/path -// hbase://zk1,zk2,zk3/hbasetbl?tso=127.0.0.1:1234 -// -// The engine should be registered before creating storage. -func NewStore(path string) (kv.Storage, error) { - return newStoreWithRetry(path, defaultMaxRetries) -} - -func newStoreWithRetry(path string, maxRetries int) (kv.Storage, error) { - url, err := url.Parse(path) - if err != nil { - return nil, errors.Trace(err) - } - - name := strings.ToLower(url.Scheme) - d, ok := stores[name] - if !ok { - return nil, errors.Errorf("invalid uri format, storage %s is not registered", name) - } - - var s kv.Storage - for i := 1; i <= maxRetries; i++ { - s, err = d.Open(path) - if err == nil || !kv.IsRetryableError(err) { - break - } - sleepTime := time.Duration(uint64(retrySleepInterval) * uint64(i)) - log.Warnf("Waiting store to get ready, sleep %v and try again...", sleepTime) - time.Sleep(sleepTime) - } - return s, errors.Trace(err) -} - -var queryStmtTable = []string{"explain", "select", "show", "execute", "describe", "desc", "admin"} - -func trimSQL(sql string) string { - // Trim space. - sql = strings.TrimSpace(sql) - // Trim leading /*comment*/ - // There may be multiple comments - for strings.HasPrefix(sql, "/*") { - i := strings.Index(sql, "*/") - if i != -1 && i < len(sql)+1 { - sql = sql[i+2:] - sql = strings.TrimSpace(sql) - continue - } - break - } - // Trim leading '('. For `(select 1);` is also a query. - return strings.TrimLeft(sql, "( ") -} - -// IsQuery checks if a sql statement is a query statement. -func IsQuery(sql string) bool { - sqlText := strings.ToLower(trimSQL(sql)) - for _, key := range queryStmtTable { - if strings.HasPrefix(sqlText, key) { - return true - } - } - - return false -} - -func init() { - // Register default memory and goleveldb storage - RegisterLocalStore("memory", goleveldb.MemoryDriver{}) - RegisterLocalStore("goleveldb", goleveldb.Driver{}) - RegisterLocalStore("boltdb", boltdb.Driver{}) - RegisterStore("hbase", hbasekv.Driver{}) - - // start pprof handlers - if EnablePprof { - go http.ListenAndServe(PprofAddr, nil) - } -} diff --git a/vendor/github.com/pingcap/tidb/util/auth.go b/vendor/github.com/pingcap/tidb/util/auth.go deleted file mode 100644 index 7b6cf6baf551..000000000000 --- a/vendor/github.com/pingcap/tidb/util/auth.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package util - -import ( - "crypto/sha1" - "encoding/hex" - - "github.com/juju/errors" -) - -// CalcPassword is the algorithm convert hashed password to auth string. -// See: https://dev.mysql.com/doc/internals/en/secure-password-authentication.html -// SHA1( password ) XOR SHA1( "20-bytes random data from server" SHA1( SHA1( password ) ) ) -func CalcPassword(scramble, sha1pwd []byte) []byte { - if len(sha1pwd) == 0 { - return nil - } - // scrambleHash = SHA1(scramble + SHA1(sha1pwd)) - // inner Hash - hash := Sha1Hash(sha1pwd) - // outer Hash - crypt := sha1.New() - crypt.Write(scramble) - crypt.Write(hash) - scramble = crypt.Sum(nil) - // token = scrambleHash XOR stage1Hash - for i := range scramble { - scramble[i] ^= sha1pwd[i] - } - return scramble -} - -// Sha1Hash is an util function to calculate sha1 hash. -func Sha1Hash(bs []byte) []byte { - crypt := sha1.New() - crypt.Write(bs) - return crypt.Sum(nil) -} - -// EncodePassword converts plaintext password to hashed hex string. -func EncodePassword(pwd string) string { - if len(pwd) == 0 { - return "" - } - hash := Sha1Hash([]byte(pwd)) - return hex.EncodeToString(hash) -} - -// DecodePassword converts hex string password to byte array. -func DecodePassword(pwd string) ([]byte, error) { - x, err := hex.DecodeString(pwd) - if err != nil { - return nil, errors.Trace(err) - } - return x, nil -} diff --git a/vendor/github.com/pingcap/tidb/util/bytes/bytes.go b/vendor/github.com/pingcap/tidb/util/bytes/bytes.go deleted file mode 100644 index 6c3de37a901d..000000000000 --- a/vendor/github.com/pingcap/tidb/util/bytes/bytes.go +++ /dev/null @@ -1,6 +0,0 @@ -package bytes - -// CloneBytes returns a deep copy of slice b. -func CloneBytes(b []byte) []byte { - return append([]byte(nil), b...) -} diff --git a/vendor/github.com/pingcap/tidb/util/charset/charset.go b/vendor/github.com/pingcap/tidb/util/charset/charset.go deleted file mode 100644 index 719465b259ee..000000000000 --- a/vendor/github.com/pingcap/tidb/util/charset/charset.go +++ /dev/null @@ -1,369 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package charset - -import ( - "strings" - - "github.com/juju/errors" -) - -// Charset is a charset. -// Now we only support MySQL. -type Charset struct { - Name string - DefaultCollation *Collation - Collations map[string]*Collation - Desc string - Maxlen int -} - -// Collation is a collation. -// Now we only support MySQL. -type Collation struct { - ID int - CharsetName string - Name string - IsDefault bool -} - -var charsets = make(map[string]*Charset) - -// All the supported charsets should be in the following table. -var charsetInfos = []*Charset{ - {"utf8", nil, make(map[string]*Collation), "UTF-8 Unicode", 3}, - {"latin1", nil, make(map[string]*Collation), "cp1252 West European", 1}, - {"utf8mb4", nil, make(map[string]*Collation), "UTF-8 Unicode", 4}, - {"ascii", nil, make(map[string]*Collation), "US ASCII", 1}, -} - -func init() { - for _, c := range charsetInfos { - charsets[c.Name] = c - } - for _, c := range collations { - charset, ok := charsets[c.CharsetName] - if !ok { - continue - } - charset.Collations[c.Name] = c - if c.IsDefault { - charset.DefaultCollation = c - } - } -} - -// Desc is a charset description. -type Desc struct { - Name string - Desc string - DefaultCollation string - Maxlen int -} - -// GetAllCharsets gets all charset descriptions in the local charsets. -func GetAllCharsets() []*Desc { - descs := make([]*Desc, 0, len(charsets)) - // The charsetInfos is an array, so the iterate order will be stable. - for _, ci := range charsetInfos { - c, ok := charsets[ci.Name] - if !ok { - continue - } - desc := &Desc{ - Name: c.Name, - DefaultCollation: c.DefaultCollation.Name, - Desc: c.Desc, - Maxlen: c.Maxlen, - } - descs = append(descs, desc) - } - return descs -} - -// ValidCharsetAndCollation checks the charset and the collation validity -// and retuns a boolean. -func ValidCharsetAndCollation(cs string, co string) bool { - // We will use utf8 as a default charset. - if cs == "" { - cs = "utf8" - } - - c, ok := charsets[cs] - if !ok { - return false - } - - if co == "" { - return true - } - _, ok = c.Collations[co] - if !ok { - return false - } - - return true -} - -// GetDefaultCollation returns the default collation for charset -func GetDefaultCollation(charset string) (string, error) { - c, ok := charsets[charset] - if !ok { - return "", errors.Errorf("Unkown charset %s", charset) - } - return c.DefaultCollation.Name, nil -} - -// GetCharsetInfo returns charset and collation for cs as name. -func GetCharsetInfo(cs string) (string, string, error) { - c, ok := charsets[strings.ToLower(cs)] - if !ok { - return "", "", errors.Errorf("Unknown charset %s", cs) - } - return c.Name, c.DefaultCollation.Name, nil -} - -// GetCollations returns a list for all collations. -func GetCollations() []*Collation { - return collations -} - -const ( - // CharsetBin is used for marking binary charset. - CharsetBin = "binary" - // CollationBin is the default collation for CharsetBin. - CollationBin = "binary" -) - -var collations = []*Collation{ - {1, "big5", "big5_chinese_ci", true}, - {2, "latin2", "latin2_czech_cs", false}, - {3, "dec8", "dec8_swedish_ci", true}, - {4, "cp850", "cp850_general_ci", true}, - {5, "latin1", "latin1_german1_ci", false}, - {6, "hp8", "hp8_english_ci", true}, - {7, "koi8r", "koi8r_general_ci", true}, - {8, "latin1", "latin1_swedish_ci", true}, - {9, "latin2", "latin2_general_ci", true}, - {10, "swe7", "swe7_swedish_ci", true}, - {11, "ascii", "ascii_general_ci", true}, - {12, "ujis", "ujis_japanese_ci", true}, - {13, "sjis", "sjis_japanese_ci", true}, - {14, "cp1251", "cp1251_bulgarian_ci", false}, - {15, "latin1", "latin1_danish_ci", false}, - {16, "hebrew", "hebrew_general_ci", true}, - {18, "tis620", "tis620_thai_ci", true}, - {19, "euckr", "euckr_korean_ci", true}, - {20, "latin7", "latin7_estonian_cs", false}, - {21, "latin2", "latin2_hungarian_ci", false}, - {22, "koi8u", "koi8u_general_ci", true}, - {23, "cp1251", "cp1251_ukrainian_ci", false}, - {24, "gb2312", "gb2312_chinese_ci", true}, - {25, "greek", "greek_general_ci", true}, - {26, "cp1250", "cp1250_general_ci", true}, - {27, "latin2", "latin2_croatian_ci", false}, - {28, "gbk", "gbk_chinese_ci", true}, - {29, "cp1257", "cp1257_lithuanian_ci", false}, - {30, "latin5", "latin5_turkish_ci", true}, - {31, "latin1", "latin1_german2_ci", false}, - {32, "armscii8", "armscii8_general_ci", true}, - {33, "utf8", "utf8_general_ci", true}, - {34, "cp1250", "cp1250_czech_cs", false}, - {35, "ucs2", "ucs2_general_ci", true}, - {36, "cp866", "cp866_general_ci", true}, - {37, "keybcs2", "keybcs2_general_ci", true}, - {38, "macce", "macce_general_ci", true}, - {39, "macroman", "macroman_general_ci", true}, - {40, "cp852", "cp852_general_ci", true}, - {41, "latin7", "latin7_general_ci", true}, - {42, "latin7", "latin7_general_cs", false}, - {43, "macce", "macce_bin", false}, - {44, "cp1250", "cp1250_croatian_ci", false}, - {45, "utf8mb4", "utf8mb4_general_ci", true}, - {46, "utf8mb4", "utf8mb4_bin", false}, - {47, "latin1", "latin1_bin", false}, - {48, "latin1", "latin1_general_ci", false}, - {49, "latin1", "latin1_general_cs", false}, - {50, "cp1251", "cp1251_bin", false}, - {51, "cp1251", "cp1251_general_ci", true}, - {52, "cp1251", "cp1251_general_cs", false}, - {53, "macroman", "macroman_bin", false}, - {54, "utf16", "utf16_general_ci", true}, - {55, "utf16", "utf16_bin", false}, - {56, "utf16le", "utf16le_general_ci", true}, - {57, "cp1256", "cp1256_general_ci", true}, - {58, "cp1257", "cp1257_bin", false}, - {59, "cp1257", "cp1257_general_ci", true}, - {60, "utf32", "utf32_general_ci", true}, - {61, "utf32", "utf32_bin", false}, - {62, "utf16le", "utf16le_bin", false}, - {63, "binary", "binary", true}, - {64, "armscii8", "armscii8_bin", false}, - {65, "ascii", "ascii_bin", false}, - {66, "cp1250", "cp1250_bin", false}, - {67, "cp1256", "cp1256_bin", false}, - {68, "cp866", "cp866_bin", false}, - {69, "dec8", "dec8_bin", false}, - {70, "greek", "greek_bin", false}, - {71, "hebrew", "hebrew_bin", false}, - {72, "hp8", "hp8_bin", false}, - {73, "keybcs2", "keybcs2_bin", false}, - {74, "koi8r", "koi8r_bin", false}, - {75, "koi8u", "koi8u_bin", false}, - {77, "latin2", "latin2_bin", false}, - {78, "latin5", "latin5_bin", false}, - {79, "latin7", "latin7_bin", false}, - {80, "cp850", "cp850_bin", false}, - {81, "cp852", "cp852_bin", false}, - {82, "swe7", "swe7_bin", false}, - {83, "utf8", "utf8_bin", false}, - {84, "big5", "big5_bin", false}, - {85, "euckr", "euckr_bin", false}, - {86, "gb2312", "gb2312_bin", false}, - {87, "gbk", "gbk_bin", false}, - {88, "sjis", "sjis_bin", false}, - {89, "tis620", "tis620_bin", false}, - {90, "ucs2", "ucs2_bin", false}, - {91, "ujis", "ujis_bin", false}, - {92, "geostd8", "geostd8_general_ci", true}, - {93, "geostd8", "geostd8_bin", false}, - {94, "latin1", "latin1_spanish_ci", false}, - {95, "cp932", "cp932_japanese_ci", true}, - {96, "cp932", "cp932_bin", false}, - {97, "eucjpms", "eucjpms_japanese_ci", true}, - {98, "eucjpms", "eucjpms_bin", false}, - {99, "cp1250", "cp1250_polish_ci", false}, - {101, "utf16", "utf16_unicode_ci", false}, - {102, "utf16", "utf16_icelandic_ci", false}, - {103, "utf16", "utf16_latvian_ci", false}, - {104, "utf16", "utf16_romanian_ci", false}, - {105, "utf16", "utf16_slovenian_ci", false}, - {106, "utf16", "utf16_polish_ci", false}, - {107, "utf16", "utf16_estonian_ci", false}, - {108, "utf16", "utf16_spanish_ci", false}, - {109, "utf16", "utf16_swedish_ci", false}, - {110, "utf16", "utf16_turkish_ci", false}, - {111, "utf16", "utf16_czech_ci", false}, - {112, "utf16", "utf16_danish_ci", false}, - {113, "utf16", "utf16_lithuanian_ci", false}, - {114, "utf16", "utf16_slovak_ci", false}, - {115, "utf16", "utf16_spanish2_ci", false}, - {116, "utf16", "utf16_roman_ci", false}, - {117, "utf16", "utf16_persian_ci", false}, - {118, "utf16", "utf16_esperanto_ci", false}, - {119, "utf16", "utf16_hungarian_ci", false}, - {120, "utf16", "utf16_sinhala_ci", false}, - {121, "utf16", "utf16_german2_ci", false}, - {122, "utf16", "utf16_croatian_ci", false}, - {123, "utf16", "utf16_unicode_520_ci", false}, - {124, "utf16", "utf16_vietnamese_ci", false}, - {128, "ucs2", "ucs2_unicode_ci", false}, - {129, "ucs2", "ucs2_icelandic_ci", false}, - {130, "ucs2", "ucs2_latvian_ci", false}, - {131, "ucs2", "ucs2_romanian_ci", false}, - {132, "ucs2", "ucs2_slovenian_ci", false}, - {133, "ucs2", "ucs2_polish_ci", false}, - {134, "ucs2", "ucs2_estonian_ci", false}, - {135, "ucs2", "ucs2_spanish_ci", false}, - {136, "ucs2", "ucs2_swedish_ci", false}, - {137, "ucs2", "ucs2_turkish_ci", false}, - {138, "ucs2", "ucs2_czech_ci", false}, - {139, "ucs2", "ucs2_danish_ci", false}, - {140, "ucs2", "ucs2_lithuanian_ci", false}, - {141, "ucs2", "ucs2_slovak_ci", false}, - {142, "ucs2", "ucs2_spanish2_ci", false}, - {143, "ucs2", "ucs2_roman_ci", false}, - {144, "ucs2", "ucs2_persian_ci", false}, - {145, "ucs2", "ucs2_esperanto_ci", false}, - {146, "ucs2", "ucs2_hungarian_ci", false}, - {147, "ucs2", "ucs2_sinhala_ci", false}, - {148, "ucs2", "ucs2_german2_ci", false}, - {149, "ucs2", "ucs2_croatian_ci", false}, - {150, "ucs2", "ucs2_unicode_520_ci", false}, - {151, "ucs2", "ucs2_vietnamese_ci", false}, - {159, "ucs2", "ucs2_general_mysql500_ci", false}, - {160, "utf32", "utf32_unicode_ci", false}, - {161, "utf32", "utf32_icelandic_ci", false}, - {162, "utf32", "utf32_latvian_ci", false}, - {163, "utf32", "utf32_romanian_ci", false}, - {164, "utf32", "utf32_slovenian_ci", false}, - {165, "utf32", "utf32_polish_ci", false}, - {166, "utf32", "utf32_estonian_ci", false}, - {167, "utf32", "utf32_spanish_ci", false}, - {168, "utf32", "utf32_swedish_ci", false}, - {169, "utf32", "utf32_turkish_ci", false}, - {170, "utf32", "utf32_czech_ci", false}, - {171, "utf32", "utf32_danish_ci", false}, - {172, "utf32", "utf32_lithuanian_ci", false}, - {173, "utf32", "utf32_slovak_ci", false}, - {174, "utf32", "utf32_spanish2_ci", false}, - {175, "utf32", "utf32_roman_ci", false}, - {176, "utf32", "utf32_persian_ci", false}, - {177, "utf32", "utf32_esperanto_ci", false}, - {178, "utf32", "utf32_hungarian_ci", false}, - {179, "utf32", "utf32_sinhala_ci", false}, - {180, "utf32", "utf32_german2_ci", false}, - {181, "utf32", "utf32_croatian_ci", false}, - {182, "utf32", "utf32_unicode_520_ci", false}, - {183, "utf32", "utf32_vietnamese_ci", false}, - {192, "utf8", "utf8_unicode_ci", false}, - {193, "utf8", "utf8_icelandic_ci", false}, - {194, "utf8", "utf8_latvian_ci", false}, - {195, "utf8", "utf8_romanian_ci", false}, - {196, "utf8", "utf8_slovenian_ci", false}, - {197, "utf8", "utf8_polish_ci", false}, - {198, "utf8", "utf8_estonian_ci", false}, - {199, "utf8", "utf8_spanish_ci", false}, - {200, "utf8", "utf8_swedish_ci", false}, - {201, "utf8", "utf8_turkish_ci", false}, - {202, "utf8", "utf8_czech_ci", false}, - {203, "utf8", "utf8_danish_ci", false}, - {204, "utf8", "utf8_lithuanian_ci", false}, - {205, "utf8", "utf8_slovak_ci", false}, - {206, "utf8", "utf8_spanish2_ci", false}, - {207, "utf8", "utf8_roman_ci", false}, - {208, "utf8", "utf8_persian_ci", false}, - {209, "utf8", "utf8_esperanto_ci", false}, - {210, "utf8", "utf8_hungarian_ci", false}, - {211, "utf8", "utf8_sinhala_ci", false}, - {212, "utf8", "utf8_german2_ci", false}, - {213, "utf8", "utf8_croatian_ci", false}, - {214, "utf8", "utf8_unicode_520_ci", false}, - {215, "utf8", "utf8_vietnamese_ci", false}, - {223, "utf8", "utf8_general_mysql500_ci", false}, - {224, "utf8mb4", "utf8mb4_unicode_ci", false}, - {225, "utf8mb4", "utf8mb4_icelandic_ci", false}, - {226, "utf8mb4", "utf8mb4_latvian_ci", false}, - {227, "utf8mb4", "utf8mb4_romanian_ci", false}, - {228, "utf8mb4", "utf8mb4_slovenian_ci", false}, - {229, "utf8mb4", "utf8mb4_polish_ci", false}, - {230, "utf8mb4", "utf8mb4_estonian_ci", false}, - {231, "utf8mb4", "utf8mb4_spanish_ci", false}, - {232, "utf8mb4", "utf8mb4_swedish_ci", false}, - {233, "utf8mb4", "utf8mb4_turkish_ci", false}, - {234, "utf8mb4", "utf8mb4_czech_ci", false}, - {235, "utf8mb4", "utf8mb4_danish_ci", false}, - {236, "utf8mb4", "utf8mb4_lithuanian_ci", false}, - {237, "utf8mb4", "utf8mb4_slovak_ci", false}, - {238, "utf8mb4", "utf8mb4_spanish2_ci", false}, - {239, "utf8mb4", "utf8mb4_roman_ci", false}, - {240, "utf8mb4", "utf8mb4_persian_ci", false}, - {241, "utf8mb4", "utf8mb4_esperanto_ci", false}, - {242, "utf8mb4", "utf8mb4_hungarian_ci", false}, - {243, "utf8mb4", "utf8mb4_sinhala_ci", false}, - {244, "utf8mb4", "utf8mb4_german2_ci", false}, - {245, "utf8mb4", "utf8mb4_croatian_ci", false}, - {246, "utf8mb4", "utf8mb4_unicode_520_ci", false}, - {247, "utf8mb4", "utf8mb4_vietnamese_ci", false}, -} diff --git a/vendor/github.com/pingcap/tidb/util/charset/encoding_table.go b/vendor/github.com/pingcap/tidb/util/charset/encoding_table.go deleted file mode 100644 index 93c24d20c1b8..000000000000 --- a/vendor/github.com/pingcap/tidb/util/charset/encoding_table.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package charset - -import ( - "strings" - - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/japanese" - "golang.org/x/text/encoding/korean" - "golang.org/x/text/encoding/simplifiedchinese" - "golang.org/x/text/encoding/traditionalchinese" - "golang.org/x/text/encoding/unicode" -) - -// Lookup returns the encoding with the specified label, and its canonical -// name. It returns nil and the empty string if label is not one of the -// standard encodings for HTML. Matching is case-insensitive and ignores -// leading and trailing whitespace. -func Lookup(label string) (e encoding.Encoding, name string) { - label = strings.ToLower(strings.Trim(label, "\t\n\r\f ")) - enc := encodings[label] - return enc.e, enc.name -} - -var encodings = map[string]struct { - e encoding.Encoding - name string -}{ - "unicode-1-1-utf-8": {encoding.Nop, "utf-8"}, - "utf-8": {encoding.Nop, "utf-8"}, - "utf8": {encoding.Nop, "utf-8"}, - "866": {charmap.CodePage866, "ibm866"}, - "cp866": {charmap.CodePage866, "ibm866"}, - "csibm866": {charmap.CodePage866, "ibm866"}, - "ibm866": {charmap.CodePage866, "ibm866"}, - "csisolatin2": {charmap.ISO8859_2, "iso-8859-2"}, - "iso-8859-2": {charmap.ISO8859_2, "iso-8859-2"}, - "iso-ir-101": {charmap.ISO8859_2, "iso-8859-2"}, - "iso8859-2": {charmap.ISO8859_2, "iso-8859-2"}, - "iso88592": {charmap.ISO8859_2, "iso-8859-2"}, - "iso_8859-2": {charmap.ISO8859_2, "iso-8859-2"}, - "iso_8859-2:1987": {charmap.ISO8859_2, "iso-8859-2"}, - "l2": {charmap.ISO8859_2, "iso-8859-2"}, - "latin2": {charmap.ISO8859_2, "iso-8859-2"}, - "csisolatin3": {charmap.ISO8859_3, "iso-8859-3"}, - "iso-8859-3": {charmap.ISO8859_3, "iso-8859-3"}, - "iso-ir-109": {charmap.ISO8859_3, "iso-8859-3"}, - "iso8859-3": {charmap.ISO8859_3, "iso-8859-3"}, - "iso88593": {charmap.ISO8859_3, "iso-8859-3"}, - "iso_8859-3": {charmap.ISO8859_3, "iso-8859-3"}, - "iso_8859-3:1988": {charmap.ISO8859_3, "iso-8859-3"}, - "l3": {charmap.ISO8859_3, "iso-8859-3"}, - "latin3": {charmap.ISO8859_3, "iso-8859-3"}, - "csisolatin4": {charmap.ISO8859_4, "iso-8859-4"}, - "iso-8859-4": {charmap.ISO8859_4, "iso-8859-4"}, - "iso-ir-110": {charmap.ISO8859_4, "iso-8859-4"}, - "iso8859-4": {charmap.ISO8859_4, "iso-8859-4"}, - "iso88594": {charmap.ISO8859_4, "iso-8859-4"}, - "iso_8859-4": {charmap.ISO8859_4, "iso-8859-4"}, - "iso_8859-4:1988": {charmap.ISO8859_4, "iso-8859-4"}, - "l4": {charmap.ISO8859_4, "iso-8859-4"}, - "latin4": {charmap.ISO8859_4, "iso-8859-4"}, - "csisolatincyrillic": {charmap.ISO8859_5, "iso-8859-5"}, - "cyrillic": {charmap.ISO8859_5, "iso-8859-5"}, - "iso-8859-5": {charmap.ISO8859_5, "iso-8859-5"}, - "iso-ir-144": {charmap.ISO8859_5, "iso-8859-5"}, - "iso8859-5": {charmap.ISO8859_5, "iso-8859-5"}, - "iso88595": {charmap.ISO8859_5, "iso-8859-5"}, - "iso_8859-5": {charmap.ISO8859_5, "iso-8859-5"}, - "iso_8859-5:1988": {charmap.ISO8859_5, "iso-8859-5"}, - "arabic": {charmap.ISO8859_6, "iso-8859-6"}, - "asmo-708": {charmap.ISO8859_6, "iso-8859-6"}, - "csiso88596e": {charmap.ISO8859_6, "iso-8859-6"}, - "csiso88596i": {charmap.ISO8859_6, "iso-8859-6"}, - "csisolatinarabic": {charmap.ISO8859_6, "iso-8859-6"}, - "ecma-114": {charmap.ISO8859_6, "iso-8859-6"}, - "iso-8859-6": {charmap.ISO8859_6, "iso-8859-6"}, - "iso-8859-6-e": {charmap.ISO8859_6, "iso-8859-6"}, - "iso-8859-6-i": {charmap.ISO8859_6, "iso-8859-6"}, - "iso-ir-127": {charmap.ISO8859_6, "iso-8859-6"}, - "iso8859-6": {charmap.ISO8859_6, "iso-8859-6"}, - "iso88596": {charmap.ISO8859_6, "iso-8859-6"}, - "iso_8859-6": {charmap.ISO8859_6, "iso-8859-6"}, - "iso_8859-6:1987": {charmap.ISO8859_6, "iso-8859-6"}, - "csisolatingreek": {charmap.ISO8859_7, "iso-8859-7"}, - "ecma-118": {charmap.ISO8859_7, "iso-8859-7"}, - "elot_928": {charmap.ISO8859_7, "iso-8859-7"}, - "greek": {charmap.ISO8859_7, "iso-8859-7"}, - "greek8": {charmap.ISO8859_7, "iso-8859-7"}, - "iso-8859-7": {charmap.ISO8859_7, "iso-8859-7"}, - "iso-ir-126": {charmap.ISO8859_7, "iso-8859-7"}, - "iso8859-7": {charmap.ISO8859_7, "iso-8859-7"}, - "iso88597": {charmap.ISO8859_7, "iso-8859-7"}, - "iso_8859-7": {charmap.ISO8859_7, "iso-8859-7"}, - "iso_8859-7:1987": {charmap.ISO8859_7, "iso-8859-7"}, - "sun_eu_greek": {charmap.ISO8859_7, "iso-8859-7"}, - "csiso88598e": {charmap.ISO8859_8, "iso-8859-8"}, - "csisolatinhebrew": {charmap.ISO8859_8, "iso-8859-8"}, - "hebrew": {charmap.ISO8859_8, "iso-8859-8"}, - "iso-8859-8": {charmap.ISO8859_8, "iso-8859-8"}, - "iso-8859-8-e": {charmap.ISO8859_8, "iso-8859-8"}, - "iso-ir-138": {charmap.ISO8859_8, "iso-8859-8"}, - "iso8859-8": {charmap.ISO8859_8, "iso-8859-8"}, - "iso88598": {charmap.ISO8859_8, "iso-8859-8"}, - "iso_8859-8": {charmap.ISO8859_8, "iso-8859-8"}, - "iso_8859-8:1988": {charmap.ISO8859_8, "iso-8859-8"}, - "visual": {charmap.ISO8859_8, "iso-8859-8"}, - "csiso88598i": {charmap.ISO8859_8, "iso-8859-8-i"}, - "iso-8859-8-i": {charmap.ISO8859_8, "iso-8859-8-i"}, - "logical": {charmap.ISO8859_8, "iso-8859-8-i"}, - "csisolatin6": {charmap.ISO8859_10, "iso-8859-10"}, - "iso-8859-10": {charmap.ISO8859_10, "iso-8859-10"}, - "iso-ir-157": {charmap.ISO8859_10, "iso-8859-10"}, - "iso8859-10": {charmap.ISO8859_10, "iso-8859-10"}, - "iso885910": {charmap.ISO8859_10, "iso-8859-10"}, - "l6": {charmap.ISO8859_10, "iso-8859-10"}, - "latin6": {charmap.ISO8859_10, "iso-8859-10"}, - "iso-8859-13": {charmap.ISO8859_13, "iso-8859-13"}, - "iso8859-13": {charmap.ISO8859_13, "iso-8859-13"}, - "iso885913": {charmap.ISO8859_13, "iso-8859-13"}, - "iso-8859-14": {charmap.ISO8859_14, "iso-8859-14"}, - "iso8859-14": {charmap.ISO8859_14, "iso-8859-14"}, - "iso885914": {charmap.ISO8859_14, "iso-8859-14"}, - "csisolatin9": {charmap.ISO8859_15, "iso-8859-15"}, - "iso-8859-15": {charmap.ISO8859_15, "iso-8859-15"}, - "iso8859-15": {charmap.ISO8859_15, "iso-8859-15"}, - "iso885915": {charmap.ISO8859_15, "iso-8859-15"}, - "iso_8859-15": {charmap.ISO8859_15, "iso-8859-15"}, - "l9": {charmap.ISO8859_15, "iso-8859-15"}, - "iso-8859-16": {charmap.ISO8859_16, "iso-8859-16"}, - "cskoi8r": {charmap.KOI8R, "koi8-r"}, - "koi": {charmap.KOI8R, "koi8-r"}, - "koi8": {charmap.KOI8R, "koi8-r"}, - "koi8-r": {charmap.KOI8R, "koi8-r"}, - "koi8_r": {charmap.KOI8R, "koi8-r"}, - "koi8-u": {charmap.KOI8U, "koi8-u"}, - "csmacintosh": {charmap.Macintosh, "macintosh"}, - "mac": {charmap.Macintosh, "macintosh"}, - "macintosh": {charmap.Macintosh, "macintosh"}, - "x-mac-roman": {charmap.Macintosh, "macintosh"}, - "dos-874": {charmap.Windows874, "windows-874"}, - "iso-8859-11": {charmap.Windows874, "windows-874"}, - "iso8859-11": {charmap.Windows874, "windows-874"}, - "iso885911": {charmap.Windows874, "windows-874"}, - "tis-620": {charmap.Windows874, "windows-874"}, - "windows-874": {charmap.Windows874, "windows-874"}, - "cp1250": {charmap.Windows1250, "windows-1250"}, - "windows-1250": {charmap.Windows1250, "windows-1250"}, - "x-cp1250": {charmap.Windows1250, "windows-1250"}, - "cp1251": {charmap.Windows1251, "windows-1251"}, - "windows-1251": {charmap.Windows1251, "windows-1251"}, - "x-cp1251": {charmap.Windows1251, "windows-1251"}, - "ansi_x3.4-1968": {charmap.Windows1252, "windows-1252"}, - "ascii": {charmap.Windows1252, "windows-1252"}, - "cp1252": {charmap.Windows1252, "windows-1252"}, - "cp819": {charmap.Windows1252, "windows-1252"}, - "csisolatin1": {charmap.Windows1252, "windows-1252"}, - "ibm819": {charmap.Windows1252, "windows-1252"}, - "iso-8859-1": {charmap.Windows1252, "windows-1252"}, - "iso-ir-100": {charmap.Windows1252, "windows-1252"}, - "iso8859-1": {charmap.Windows1252, "windows-1252"}, - "iso88591": {charmap.Windows1252, "windows-1252"}, - "iso_8859-1": {charmap.Windows1252, "windows-1252"}, - "iso_8859-1:1987": {charmap.Windows1252, "windows-1252"}, - "l1": {charmap.Windows1252, "windows-1252"}, - "latin1": {charmap.Windows1252, "windows-1252"}, - "us-ascii": {charmap.Windows1252, "windows-1252"}, - "windows-1252": {charmap.Windows1252, "windows-1252"}, - "x-cp1252": {charmap.Windows1252, "windows-1252"}, - "cp1253": {charmap.Windows1253, "windows-1253"}, - "windows-1253": {charmap.Windows1253, "windows-1253"}, - "x-cp1253": {charmap.Windows1253, "windows-1253"}, - "cp1254": {charmap.Windows1254, "windows-1254"}, - "csisolatin5": {charmap.Windows1254, "windows-1254"}, - "iso-8859-9": {charmap.Windows1254, "windows-1254"}, - "iso-ir-148": {charmap.Windows1254, "windows-1254"}, - "iso8859-9": {charmap.Windows1254, "windows-1254"}, - "iso88599": {charmap.Windows1254, "windows-1254"}, - "iso_8859-9": {charmap.Windows1254, "windows-1254"}, - "iso_8859-9:1989": {charmap.Windows1254, "windows-1254"}, - "l5": {charmap.Windows1254, "windows-1254"}, - "latin5": {charmap.Windows1254, "windows-1254"}, - "windows-1254": {charmap.Windows1254, "windows-1254"}, - "x-cp1254": {charmap.Windows1254, "windows-1254"}, - "cp1255": {charmap.Windows1255, "windows-1255"}, - "windows-1255": {charmap.Windows1255, "windows-1255"}, - "x-cp1255": {charmap.Windows1255, "windows-1255"}, - "cp1256": {charmap.Windows1256, "windows-1256"}, - "windows-1256": {charmap.Windows1256, "windows-1256"}, - "x-cp1256": {charmap.Windows1256, "windows-1256"}, - "cp1257": {charmap.Windows1257, "windows-1257"}, - "windows-1257": {charmap.Windows1257, "windows-1257"}, - "x-cp1257": {charmap.Windows1257, "windows-1257"}, - "cp1258": {charmap.Windows1258, "windows-1258"}, - "windows-1258": {charmap.Windows1258, "windows-1258"}, - "x-cp1258": {charmap.Windows1258, "windows-1258"}, - "x-mac-cyrillic": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, - "x-mac-ukrainian": {charmap.MacintoshCyrillic, "x-mac-cyrillic"}, - "chinese": {simplifiedchinese.GBK, "gbk"}, - "csgb2312": {simplifiedchinese.GBK, "gbk"}, - "csiso58gb231280": {simplifiedchinese.GBK, "gbk"}, - "gb2312": {simplifiedchinese.GBK, "gbk"}, - "gb_2312": {simplifiedchinese.GBK, "gbk"}, - "gb_2312-80": {simplifiedchinese.GBK, "gbk"}, - "gbk": {simplifiedchinese.GBK, "gbk"}, - "iso-ir-58": {simplifiedchinese.GBK, "gbk"}, - "x-gbk": {simplifiedchinese.GBK, "gbk"}, - "gb18030": {simplifiedchinese.GB18030, "gb18030"}, - "hz-gb-2312": {simplifiedchinese.HZGB2312, "hz-gb-2312"}, - "big5": {traditionalchinese.Big5, "big5"}, - "big5-hkscs": {traditionalchinese.Big5, "big5"}, - "cn-big5": {traditionalchinese.Big5, "big5"}, - "csbig5": {traditionalchinese.Big5, "big5"}, - "x-x-big5": {traditionalchinese.Big5, "big5"}, - "cseucpkdfmtjapanese": {japanese.EUCJP, "euc-jp"}, - "euc-jp": {japanese.EUCJP, "euc-jp"}, - "x-euc-jp": {japanese.EUCJP, "euc-jp"}, - "csiso2022jp": {japanese.ISO2022JP, "iso-2022-jp"}, - "iso-2022-jp": {japanese.ISO2022JP, "iso-2022-jp"}, - "csshiftjis": {japanese.ShiftJIS, "shift_jis"}, - "ms_kanji": {japanese.ShiftJIS, "shift_jis"}, - "shift-jis": {japanese.ShiftJIS, "shift_jis"}, - "shift_jis": {japanese.ShiftJIS, "shift_jis"}, - "sjis": {japanese.ShiftJIS, "shift_jis"}, - "windows-31j": {japanese.ShiftJIS, "shift_jis"}, - "x-sjis": {japanese.ShiftJIS, "shift_jis"}, - "cseuckr": {korean.EUCKR, "euc-kr"}, - "csksc56011987": {korean.EUCKR, "euc-kr"}, - "euc-kr": {korean.EUCKR, "euc-kr"}, - "iso-ir-149": {korean.EUCKR, "euc-kr"}, - "korean": {korean.EUCKR, "euc-kr"}, - "ks_c_5601-1987": {korean.EUCKR, "euc-kr"}, - "ks_c_5601-1989": {korean.EUCKR, "euc-kr"}, - "ksc5601": {korean.EUCKR, "euc-kr"}, - "ksc_5601": {korean.EUCKR, "euc-kr"}, - "windows-949": {korean.EUCKR, "euc-kr"}, - "csiso2022kr": {encoding.Replacement, "replacement"}, - "iso-2022-kr": {encoding.Replacement, "replacement"}, - "iso-2022-cn": {encoding.Replacement, "replacement"}, - "iso-2022-cn-ext": {encoding.Replacement, "replacement"}, - "utf-16be": {unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM), "utf-16be"}, - "utf-16": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, - "utf-16le": {unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM), "utf-16le"}, - "x-user-defined": {charmap.XUserDefined, "x-user-defined"}, -} diff --git a/vendor/github.com/pingcap/tidb/util/codec/bytes.go b/vendor/github.com/pingcap/tidb/util/codec/bytes.go deleted file mode 100644 index 068614e8e034..000000000000 --- a/vendor/github.com/pingcap/tidb/util/codec/bytes.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package codec - -import ( - "bytes" - "encoding/binary" - "runtime" - "unsafe" - - "github.com/juju/errors" -) - -const ( - encGroupSize = 8 - encMarker = byte(0xFF) - encPad = byte(0x0) -) - -var ( - pads = make([]byte, encGroupSize) - encPads = []byte{encPad} -) - -// EncodeBytes guarantees the encoded value is in ascending order for comparison, -// encoding with the following rule: -// [group1][marker1]...[groupN][markerN] -// group is 8 bytes slice which is padding with 0. -// marker is `0xFF - padding 0 count` -// For example: -// [] -> [0, 0, 0, 0, 0, 0, 0, 0, 247] -// [1, 2, 3] -> [1, 2, 3, 0, 0, 0, 0, 0, 250] -// [1, 2, 3, 0] -> [1, 2, 3, 0, 0, 0, 0, 0, 251] -// [1, 2, 3, 4, 5, 6, 7, 8] -> [1, 2, 3, 4, 5, 6, 7, 8, 255, 0, 0, 0, 0, 0, 0, 0, 0, 247] -// Refer: https://github.com/facebook/mysql-5.6/wiki/MyRocks-record-format#memcomparable-format -func EncodeBytes(b []byte, data []byte) []byte { - // Allocate more space to avoid unnecessary slice growing. - // Assume that the byte slice size is about `(len(data) / encGroupSize + 1) * (encGroupSize + 1)` bytes, - // that is `(len(data) / 8 + 1) * 9` in our implement. - dLen := len(data) - reallocSize := (dLen/encGroupSize + 1) * (encGroupSize + 1) - result := reallocBytes(b, reallocSize) - for idx := 0; idx <= dLen; idx += encGroupSize { - remain := dLen - idx - padCount := 0 - if remain >= encGroupSize { - result = append(result, data[idx:idx+encGroupSize]...) - } else { - padCount = encGroupSize - remain - result = append(result, data[idx:]...) - result = append(result, pads[:padCount]...) - } - - marker := encMarker - byte(padCount) - result = append(result, marker) - } - - return result -} - -func decodeBytes(b []byte, reverse bool) ([]byte, []byte, error) { - data := make([]byte, 0, len(b)) - for { - if len(b) < encGroupSize+1 { - return nil, nil, errors.New("insufficient bytes to decode value") - } - - groupBytes := b[:encGroupSize+1] - if reverse { - reverseBytes(groupBytes) - } - - group := groupBytes[:encGroupSize] - marker := groupBytes[encGroupSize] - - // Check validity of marker. - padCount := encMarker - marker - realGroupSize := encGroupSize - padCount - if padCount > encGroupSize { - return nil, nil, errors.Errorf("invalid marker byte, group bytes %q", groupBytes) - } - - data = append(data, group[:realGroupSize]...) - b = b[encGroupSize+1:] - - if marker != encMarker { - // Check validity of padding bytes. - if bytes.Count(group[realGroupSize:], encPads) != int(padCount) { - return nil, nil, errors.Errorf("invalid padding byte, group bytes %q", groupBytes) - } - - break - } - } - - return b, data, nil -} - -// DecodeBytes decodes bytes which is encoded by EncodeBytes before, -// returns the leftover bytes and decoded value if no error. -func DecodeBytes(b []byte) ([]byte, []byte, error) { - return decodeBytes(b, false) -} - -// EncodeBytesDesc first encodes bytes using EncodeBytes, then bitwise reverses -// encoded value to guarantee the encoded value is in descending order for comparison. -func EncodeBytesDesc(b []byte, data []byte) []byte { - n := len(b) - b = EncodeBytes(b, data) - reverseBytes(b[n:]) - return b -} - -// DecodeBytesDesc decodes bytes which is encoded by EncodeBytesDesc before, -// returns the leftover bytes and decoded value if no error. -func DecodeBytesDesc(b []byte) ([]byte, []byte, error) { - return decodeBytes(b, true) -} - -// EncodeCompactBytes joins bytes with its length into a byte slice. It is more -// efficient in both space and time compare to EncodeBytes. Note that the encoded -// result is not memcomparable. -func EncodeCompactBytes(b []byte, data []byte) []byte { - b = reallocBytes(b, binary.MaxVarintLen64+len(data)) - b = EncodeVarint(b, int64(len(data))) - return append(b, data...) -} - -// DecodeCompactBytes decodes bytes which is encoded by EncodeCompactBytes before. -func DecodeCompactBytes(b []byte) ([]byte, []byte, error) { - b, n, err := DecodeVarint(b) - if err != nil { - return nil, nil, errors.Trace(err) - } - if int64(len(b)) < n { - return nil, nil, errors.Errorf("insufficient bytes to decode value, expected length: %v", n) - } - return b[n:], b[:n], nil -} - -// See https://golang.org/src/crypto/cipher/xor.go -const wordSize = int(unsafe.Sizeof(uintptr(0))) -const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" - -func fastReverseBytes(b []byte) { - n := len(b) - w := n / wordSize - if w > 0 { - bw := *(*[]uintptr)(unsafe.Pointer(&b)) - for i := 0; i < w; i++ { - bw[i] = ^bw[i] - } - } - - for i := w * wordSize; i < n; i++ { - b[i] = ^b[i] - } -} - -func safeReverseBytes(b []byte) { - for i := range b { - b[i] = ^b[i] - } -} - -func reverseBytes(b []byte) { - if supportsUnaligned { - fastReverseBytes(b) - return - } - - safeReverseBytes(b) -} - -// like realloc. -func reallocBytes(b []byte, n int) []byte { - newSize := len(b) + n - if cap(b) < newSize { - bs := make([]byte, len(b), newSize) - copy(bs, b) - return bs - } - - // slice b has capability to store n bytes - return b -} diff --git a/vendor/github.com/pingcap/tidb/util/codec/codec.go b/vendor/github.com/pingcap/tidb/util/codec/codec.go deleted file mode 100644 index bf100fc186d0..000000000000 --- a/vendor/github.com/pingcap/tidb/util/codec/codec.go +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package codec - -import ( - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/types" -) - -const ( - nilFlag byte = iota - bytesFlag - compactBytesFlag - intFlag - uintFlag - floatFlag - decimalFlag - durationFlag -) - -func encode(b []byte, vals []types.Datum, comparable bool) ([]byte, error) { - for _, val := range vals { - switch val.Kind() { - case types.KindInt64: - b = append(b, intFlag) - b = EncodeInt(b, val.GetInt64()) - case types.KindUint64: - b = append(b, uintFlag) - b = EncodeUint(b, val.GetUint64()) - case types.KindFloat32, types.KindFloat64: - b = append(b, floatFlag) - b = EncodeFloat(b, val.GetFloat64()) - case types.KindString, types.KindBytes: - b = encodeBytes(b, val.GetBytes(), comparable) - case types.KindMysqlTime: - b = encodeBytes(b, []byte(val.GetMysqlTime().String()), comparable) - case types.KindMysqlDuration: - // duration may have negative value, so we cannot use String to encode directly. - b = append(b, durationFlag) - b = EncodeInt(b, int64(val.GetMysqlDuration().Duration)) - case types.KindMysqlDecimal: - b = append(b, decimalFlag) - b = EncodeDecimal(b, val.GetMysqlDecimal()) - case types.KindMysqlHex: - b = append(b, intFlag) - b = EncodeInt(b, int64(val.GetMysqlHex().ToNumber())) - case types.KindMysqlBit: - b = append(b, uintFlag) - b = EncodeUint(b, uint64(val.GetMysqlBit().ToNumber())) - case types.KindMysqlEnum: - b = append(b, uintFlag) - b = EncodeUint(b, uint64(val.GetMysqlEnum().ToNumber())) - case types.KindMysqlSet: - b = append(b, uintFlag) - b = EncodeUint(b, uint64(val.GetMysqlSet().ToNumber())) - case types.KindNull: - b = append(b, nilFlag) - default: - return nil, errors.Errorf("unsupport encode type %d", val.Kind()) - } - } - - return b, nil -} - -func encodeBytes(b []byte, v []byte, comparable bool) []byte { - if comparable { - b = append(b, bytesFlag) - b = EncodeBytes(b, v) - } else { - b = append(b, compactBytesFlag) - b = EncodeCompactBytes(b, v) - } - return b -} - -// EncodeKey appends the encoded values to byte slice b, returns the appended -// slice. It guarantees the encoded value is in ascending order for comparison. -func EncodeKey(b []byte, v ...types.Datum) ([]byte, error) { - return encode(b, v, true) -} - -// EncodeValue appends the encoded values to byte slice b, returning the appended -// slice. It does not guarantee the order for comparison. -func EncodeValue(b []byte, v ...types.Datum) ([]byte, error) { - return encode(b, v, false) -} - -// Decode decodes values from a byte slice generated with EncodeKey or EncodeValue -// before. -func Decode(b []byte) ([]types.Datum, error) { - if len(b) < 1 { - return nil, errors.New("invalid encoded key") - } - - var ( - flag byte - err error - values = make([]types.Datum, 0, 1) - ) - - for len(b) > 0 { - flag = b[0] - b = b[1:] - var d types.Datum - switch flag { - case intFlag: - var v int64 - b, v, err = DecodeInt(b) - d.SetInt64(v) - case uintFlag: - var v uint64 - b, v, err = DecodeUint(b) - d.SetUint64(v) - case floatFlag: - var v float64 - b, v, err = DecodeFloat(b) - d.SetFloat64(v) - case bytesFlag: - var v []byte - b, v, err = DecodeBytes(b) - d.SetBytes(v) - case compactBytesFlag: - var v []byte - b, v, err = DecodeCompactBytes(b) - d.SetBytes(v) - case decimalFlag: - var v mysql.Decimal - b, v, err = DecodeDecimal(b) - d.SetValue(v) - case durationFlag: - var r int64 - b, r, err = DecodeInt(b) - if err == nil { - // use max fsp, let outer to do round manually. - v := mysql.Duration{Duration: time.Duration(r), Fsp: mysql.MaxFsp} - d.SetValue(v) - } - case nilFlag: - default: - return nil, errors.Errorf("invalid encoded key flag %v", flag) - } - if err != nil { - return nil, errors.Trace(err) - } - - values = append(values, d) - } - - return values, nil -} diff --git a/vendor/github.com/pingcap/tidb/util/codec/decimal.go b/vendor/github.com/pingcap/tidb/util/codec/decimal.go deleted file mode 100644 index fb0e2fd1fa2f..000000000000 --- a/vendor/github.com/pingcap/tidb/util/codec/decimal.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package codec - -import ( - "bytes" - "math/big" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" -) - -const ( - negativeSign int64 = 8 - zeroSign int64 = 16 - positiveSign int64 = 24 -) - -func codecSign(value int64) int64 { - if value < 0 { - return negativeSign - } - - return positiveSign -} - -func encodeExp(expValue int64, expSign int64, valSign int64) int64 { - if expSign == negativeSign { - expValue = -expValue - } - - if expSign != valSign { - expValue = ^expValue - } - - return expValue -} - -func decodeExp(expValue int64, expSign int64, valSign int64) int64 { - if expSign != valSign { - expValue = ^expValue - } - - if expSign == negativeSign { - expValue = -expValue - } - - return expValue -} - -func codecValue(value []byte, valSign int64) { - if valSign == negativeSign { - reverseBytes(value) - } -} - -// EncodeDecimal encodes a decimal d into a byte slice which can be sorted lexicographically later. -// EncodeDecimal guarantees that the encoded value is in ascending order for comparison. -// Decimal encoding: -// Byte -> value sign -// Byte -> exp sign -// EncodeInt -> exp value -// EncodeBytes -> abs value bytes -func EncodeDecimal(b []byte, d mysql.Decimal) []byte { - if d.Equals(mysql.ZeroDecimal) { - return append(b, byte(zeroSign)) - } - - v := d.BigIntValue() - valSign := codecSign(int64(v.Sign())) - - absVal := new(big.Int) - absVal.Abs(v) - - value := []byte(absVal.String()) - - // Trim right side "0", like "12.34000" -> "12.34" or "0.1234000" -> "0.1234". - if d.Exponent() != 0 { - value = bytes.TrimRight(value, "0") - } - - // Get exp and value, format is "value":"exp". - // like "12.34" -> "0.1234":"2". - // like "-0.01234" -> "-0.1234":"-1". - exp := int64(0) - div := big.NewInt(10) - for ; ; exp++ { - if absVal.Sign() == 0 { - break - } - absVal = absVal.Div(absVal, div) - } - - expVal := exp + int64(d.Exponent()) - expSign := codecSign(expVal) - - // For negtive exp, do bit reverse for exp. - // For negtive decimal, do bit reverse for exp and value. - expVal = encodeExp(expVal, expSign, valSign) - codecValue(value, valSign) - - b = append(b, byte(valSign)) - b = append(b, byte(expSign)) - b = EncodeInt(b, expVal) - b = EncodeBytes(b, value) - return b -} - -// DecodeDecimal decodes bytes to decimal. -// DecodeFloat decodes a float from a byte slice -// Decimal decoding: -// Byte -> value sign -// Byte -> exp sign -// DecodeInt -> exp value -// DecodeBytes -> abs value bytes -func DecodeDecimal(b []byte) ([]byte, mysql.Decimal, error) { - var ( - r = b - d mysql.Decimal - err error - ) - - // Decode value sign. - valSign := int64(r[0]) - r = r[1:] - if valSign == zeroSign { - d, err = mysql.ParseDecimal("0") - return r, d, errors.Trace(err) - } - - // Decode exp sign. - expSign := int64(r[0]) - r = r[1:] - - // Decode exp value. - expVal := int64(0) - r, expVal, err = DecodeInt(r) - if err != nil { - return r, d, errors.Trace(err) - } - expVal = decodeExp(expVal, expSign, valSign) - - // Decode abs value bytes. - value := []byte{} - r, value, err = DecodeBytes(r) - if err != nil { - return r, d, errors.Trace(err) - } - codecValue(value, valSign) - - // Generate decimal string value. - var decimalStr []byte - if valSign == negativeSign { - decimalStr = append(decimalStr, '-') - } - - if expVal <= 0 { - // Like decimal "0.1234" or "0.01234". - decimalStr = append(decimalStr, '0') - decimalStr = append(decimalStr, '.') - decimalStr = append(decimalStr, bytes.Repeat([]byte{'0'}, -int(expVal))...) - decimalStr = append(decimalStr, value...) - } else { - // Like decimal "12.34". - decimalStr = append(decimalStr, value[:expVal]...) - decimalStr = append(decimalStr, '.') - decimalStr = append(decimalStr, value[expVal:]...) - } - - d, err = mysql.ParseDecimal(string(decimalStr)) - return r, d, errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/util/codec/float.go b/vendor/github.com/pingcap/tidb/util/codec/float.go deleted file mode 100644 index c2107f166061..000000000000 --- a/vendor/github.com/pingcap/tidb/util/codec/float.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package codec - -import ( - "math" - - "github.com/juju/errors" -) - -func encodeFloatToCmpUint64(f float64) uint64 { - u := math.Float64bits(f) - if f >= 0 { - u |= signMask - } else { - u = ^u - } - return u -} - -func decodeCmpUintToFloat(u uint64) float64 { - if u&signMask > 0 { - u &= ^signMask - } else { - u = ^u - } - return math.Float64frombits(u) -} - -// EncodeFloat encodes a float v into a byte slice which can be sorted lexicographically later. -// EncodeFloat guarantees that the encoded value is in ascending order for comparison. -func EncodeFloat(b []byte, v float64) []byte { - u := encodeFloatToCmpUint64(v) - return EncodeUint(b, u) -} - -// DecodeFloat decodes a float from a byte slice generated with EncodeFloat before. -func DecodeFloat(b []byte) ([]byte, float64, error) { - b, u, err := DecodeUint(b) - return b, decodeCmpUintToFloat(u), errors.Trace(err) -} - -// EncodeFloatDesc encodes a float v into a byte slice which can be sorted lexicographically later. -// EncodeFloatDesc guarantees that the encoded value is in descending order for comparison. -func EncodeFloatDesc(b []byte, v float64) []byte { - u := encodeFloatToCmpUint64(v) - return EncodeUintDesc(b, u) -} - -// DecodeFloatDesc decodes a float from a byte slice generated with EncodeFloatDesc before. -func DecodeFloatDesc(b []byte) ([]byte, float64, error) { - b, u, err := DecodeUintDesc(b) - return b, decodeCmpUintToFloat(u), errors.Trace(err) -} diff --git a/vendor/github.com/pingcap/tidb/util/codec/number.go b/vendor/github.com/pingcap/tidb/util/codec/number.go deleted file mode 100644 index cad729c31c58..000000000000 --- a/vendor/github.com/pingcap/tidb/util/codec/number.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package codec - -import ( - "encoding/binary" - - "github.com/juju/errors" -) - -const signMask uint64 = 0x8000000000000000 - -func encodeIntToCmpUint(v int64) uint64 { - u := uint64(v) - if u&signMask > 0 { - u &= ^signMask - } else { - u |= signMask - } - - return u -} - -func decodeCmpUintToInt(u uint64) int64 { - if u&signMask > 0 { - u &= ^signMask - } else { - u |= signMask - } - - return int64(u) -} - -// EncodeInt appends the encoded value to slice b and returns the appended slice. -// EncodeInt guarantees that the encoded value is in ascending order for comparison. -func EncodeInt(b []byte, v int64) []byte { - var data [8]byte - u := encodeIntToCmpUint(v) - binary.BigEndian.PutUint64(data[:], u) - return append(b, data[:]...) -} - -// EncodeIntDesc appends the encoded value to slice b and returns the appended slice. -// EncodeIntDesc guarantees that the encoded value is in descending order for comparison. -func EncodeIntDesc(b []byte, v int64) []byte { - var data [8]byte - u := encodeIntToCmpUint(v) - binary.BigEndian.PutUint64(data[:], ^u) - return append(b, data[:]...) -} - -// DecodeInt decodes value encoded by EncodeInt before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeInt(b []byte) ([]byte, int64, error) { - if len(b) < 8 { - return nil, 0, errors.New("insufficient bytes to decode value") - } - - u := binary.BigEndian.Uint64(b[:8]) - v := decodeCmpUintToInt(u) - b = b[8:] - return b, v, nil -} - -// DecodeIntDesc decodes value encoded by EncodeInt before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeIntDesc(b []byte) ([]byte, int64, error) { - if len(b) < 8 { - return nil, 0, errors.New("insufficient bytes to decode value") - } - - u := binary.BigEndian.Uint64(b[:8]) - v := decodeCmpUintToInt(^u) - b = b[8:] - return b, v, nil -} - -// EncodeUint appends the encoded value to slice b and returns the appended slice. -// EncodeUint guarantees that the encoded value is in ascending order for comparison. -func EncodeUint(b []byte, v uint64) []byte { - var data [8]byte - binary.BigEndian.PutUint64(data[:], v) - return append(b, data[:]...) -} - -// EncodeUintDesc appends the encoded value to slice b and returns the appended slice. -// EncodeUintDesc guarantees that the encoded value is in descending order for comparison. -func EncodeUintDesc(b []byte, v uint64) []byte { - var data [8]byte - binary.BigEndian.PutUint64(data[:], ^v) - return append(b, data[:]...) -} - -// DecodeUint decodes value encoded by EncodeUint before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeUint(b []byte) ([]byte, uint64, error) { - if len(b) < 8 { - return nil, 0, errors.New("insufficient bytes to decode value") - } - - v := binary.BigEndian.Uint64(b[:8]) - b = b[8:] - return b, v, nil -} - -// DecodeUintDesc decodes value encoded by EncodeInt before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeUintDesc(b []byte) ([]byte, uint64, error) { - if len(b) < 8 { - return nil, 0, errors.New("insufficient bytes to decode value") - } - - data := b[:8] - v := binary.BigEndian.Uint64(data) - b = b[8:] - return b, ^v, nil -} - -// EncodeVarint appends the encoded value to slice b and returns the appended slice. -// Note that the encoded result is not memcomparable. -func EncodeVarint(b []byte, v int64) []byte { - var data [binary.MaxVarintLen64]byte - n := binary.PutVarint(data[:], v) - return append(b, data[:n]...) -} - -// DecodeVarint decodes value encoded by EncodeVarint before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeVarint(b []byte) ([]byte, int64, error) { - v, n := binary.Varint(b) - if n > 0 { - return b[n:], v, nil - } - if n < 0 { - return nil, 0, errors.New("value larger than 64 bits") - } - return nil, 0, errors.New("insufficient bytes to decode value") -} - -// EncodeUvarint appends the encoded value to slice b and returns the appended slice. -// Note that the encoded result is not memcomparable. -func EncodeUvarint(b []byte, v uint64) []byte { - var data [binary.MaxVarintLen64]byte - n := binary.PutUvarint(data[:], v) - return append(b, data[:n]...) -} - -// DecodeUvarint decodes value encoded by EncodeUvarint before. -// It returns the leftover un-decoded slice, decoded value if no error. -func DecodeUvarint(b []byte) ([]byte, uint64, error) { - v, n := binary.Uvarint(b) - if n > 0 { - return b[n:], v, nil - } - if n < 0 { - return nil, 0, errors.New("value larger than 64 bits") - } - return nil, 0, errors.New("insufficient bytes to decode value") -} diff --git a/vendor/github.com/pingcap/tidb/util/distinct/distinct.go b/vendor/github.com/pingcap/tidb/util/distinct/distinct.go deleted file mode 100644 index 84885b7530f2..000000000000 --- a/vendor/github.com/pingcap/tidb/util/distinct/distinct.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package distinct - -import ( - "github.com/juju/errors" - "github.com/pingcap/tidb/util/codec" - "github.com/pingcap/tidb/util/types" -) - -// CreateDistinctChecker creates a new distinct checker. -func CreateDistinctChecker() *Checker { - return &Checker{ - existingKeys: make(map[string]bool), - } -} - -// Checker stores existing keys and checks if given data is distinct. -type Checker struct { - existingKeys map[string]bool -} - -// Check checks if values is distinct. -func (d *Checker) Check(values []interface{}) (bool, error) { - bs, err := codec.EncodeValue([]byte{}, types.MakeDatums(values...)...) - if err != nil { - return false, errors.Trace(err) - } - key := string(bs) - _, ok := d.existingKeys[key] - if ok { - return false, nil - } - d.existingKeys[key] = true - return true, nil -} diff --git a/vendor/github.com/pingcap/tidb/util/hack/hack.go b/vendor/github.com/pingcap/tidb/util/hack/hack.go deleted file mode 100644 index d792c9e5b368..000000000000 --- a/vendor/github.com/pingcap/tidb/util/hack/hack.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package hack - -import ( - "reflect" - "unsafe" -) - -// String converts slice to string without copy. -// Use at your own risk. -func String(b []byte) (s string) { - if len(b) == 0 { - return "" - } - pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) - pstring.Data = pbytes.Data - pstring.Len = pbytes.Len - return -} - -// Slice converts string to slice without copy. -// Use at your own risk. -func Slice(s string) (b []byte) { - pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) - pbytes.Data = pstring.Data - pbytes.Len = pstring.Len - pbytes.Cap = pstring.Len - return -} diff --git a/vendor/github.com/pingcap/tidb/util/prefix_helper.go b/vendor/github.com/pingcap/tidb/util/prefix_helper.go deleted file mode 100644 index da91c87362fa..000000000000 --- a/vendor/github.com/pingcap/tidb/util/prefix_helper.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2014 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package util - -import ( - "bytes" - - "github.com/juju/errors" - "github.com/pingcap/tidb/kv" -) - -// ScanMetaWithPrefix scans metadata with the prefix. -func ScanMetaWithPrefix(retriever kv.Retriever, prefix kv.Key, filter func(kv.Key, []byte) bool) error { - iter, err := retriever.Seek(prefix) - if err != nil { - return errors.Trace(err) - } - defer iter.Close() - - for { - if err != nil { - return errors.Trace(err) - } - - if iter.Valid() && iter.Key().HasPrefix(prefix) { - if !filter(iter.Key(), iter.Value()) { - break - } - err = iter.Next() - if err != nil { - return errors.Trace(err) - } - } else { - break - } - } - - return nil -} - -// DelKeyWithPrefix deletes keys with prefix. -func DelKeyWithPrefix(rm kv.RetrieverMutator, prefix kv.Key) error { - var keys []kv.Key - iter, err := rm.Seek(prefix) - if err != nil { - return errors.Trace(err) - } - - defer iter.Close() - for { - if err != nil { - return errors.Trace(err) - } - - if iter.Valid() && iter.Key().HasPrefix(prefix) { - keys = append(keys, iter.Key().Clone()) - err = iter.Next() - if err != nil { - return errors.Trace(err) - } - } else { - break - } - } - - for _, key := range keys { - err := rm.Delete(key) - if err != nil { - return errors.Trace(err) - } - } - - return nil -} - -// RowKeyPrefixFilter returns a function which checks whether currentKey has decoded rowKeyPrefix as prefix. -func RowKeyPrefixFilter(rowKeyPrefix kv.Key) kv.FnKeyCmp { - return func(currentKey kv.Key) bool { - // Next until key without prefix of this record. - return !bytes.HasPrefix(currentKey, rowKeyPrefix) - } -} diff --git a/vendor/github.com/pingcap/tidb/util/segmentmap/segmentmap.go b/vendor/github.com/pingcap/tidb/util/segmentmap/segmentmap.go deleted file mode 100644 index 030372f27a4d..000000000000 --- a/vendor/github.com/pingcap/tidb/util/segmentmap/segmentmap.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package segmentmap - -import ( - "hash/crc32" - - "github.com/juju/errors" -) - -// SegmentMap is used for handle a big map slice by slice. -// It's not thread safe. -type SegmentMap struct { - size int64 - maps []map[string]interface{} - - crcTable *crc32.Table -} - -// NewSegmentMap create a new SegmentMap. -func NewSegmentMap(size int64) (*SegmentMap, error) { - if size <= 0 { - return nil, errors.Errorf("Invalid size: %d", size) - } - - sm := &SegmentMap{ - maps: make([]map[string]interface{}, size), - size: size, - } - for i := int64(0); i < size; i++ { - sm.maps[i] = make(map[string]interface{}) - } - - sm.crcTable = crc32.MakeTable(crc32.Castagnoli) - return sm, nil -} - -// Get is the same as map[k]. -func (sm *SegmentMap) Get(key []byte) (interface{}, bool) { - idx := int64(crc32.Checksum(key, sm.crcTable)) % sm.size - val, ok := sm.maps[idx][string(key)] - return val, ok -} - -// GetSegment gets the map specific by index. -func (sm *SegmentMap) GetSegment(index int64) (map[string]interface{}, error) { - if index >= sm.size || index < 0 { - return nil, errors.Errorf("index out of bound: %d", index) - } - - return sm.maps[index], nil -} - -// Set if key not exists, returns whether already exists. -func (sm *SegmentMap) Set(key []byte, value interface{}, force bool) bool { - idx := int64(crc32.Checksum(key, sm.crcTable)) % sm.size - k := string(key) - _, exist := sm.maps[idx][k] - if exist && !force { - return exist - } - - sm.maps[idx][k] = value - return exist -} - -// SegmentCount returns how many inner segments. -func (sm *SegmentMap) SegmentCount() int64 { - return sm.size -} diff --git a/vendor/github.com/pingcap/tidb/util/sqlexec/restricted_sql_executor.go b/vendor/github.com/pingcap/tidb/util/sqlexec/restricted_sql_executor.go deleted file mode 100644 index 93d47a96321b..000000000000 --- a/vendor/github.com/pingcap/tidb/util/sqlexec/restricted_sql_executor.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package sqlexec - -import ( - "github.com/pingcap/tidb/ast" - "github.com/pingcap/tidb/context" -) - -// RestrictedSQLExecutor is an interface provides executing restricted sql statement. -// Why we need this interface? -// When we execute some management statements, we need to operate system tables. -// For example when executing create user statement, we need to check if the user already -// exists in the mysql.User table and insert a new row if not exists. In this case, we need -// a convenience way to manipulate system tables. The most simple way is executing sql statement. -// In order to execute sql statement in stmts package, we add this interface to solve dependence problem. -// And in the same time, we do not want this interface becomes a general way to run sql statement. -// We hope this could be used with some restrictions such as only allowing system tables as target, -// do not allowing recursion call. -// For more infomation please refer to the comments in session.ExecRestrictedSQL(). -// This is implemented in session.go. -type RestrictedSQLExecutor interface { - // ExecRestrictedSQL run sql statement in ctx with some restriction. - ExecRestrictedSQL(ctx context.Context, sql string) (ast.RecordSet, error) -} diff --git a/vendor/github.com/pingcap/tidb/util/stringutil/string_util.go b/vendor/github.com/pingcap/tidb/util/stringutil/string_util.go deleted file mode 100644 index f4005e7e112e..000000000000 --- a/vendor/github.com/pingcap/tidb/util/stringutil/string_util.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package stringutil - -import ( - "bytes" - "strings" -) - -// See: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html#character-escape-sequences -const validEscapeChars = `0'"bntrz\\%_` - -// RemoveUselessBackslash removes backslashs which could be ignored in the string literal. -// See: https://dev.mysql.com/doc/refman/5.7/en/string-literals.html -// " Each of these sequences begins with a backslash (“\”), known as the escape character. -// MySQL recognizes the escape sequences shown in Table 9.1, “Special Character Escape Sequences”. -// For all other escape sequences, backslash is ignored. That is, the escaped character is -// interpreted as if it was not escaped. For example, “\x” is just “x”. These sequences are case sensitive. -// For example, “\b” is interpreted as a backspace, but “\B” is interpreted as “B”." -func RemoveUselessBackslash(s string) string { - var ( - buf bytes.Buffer - i = 0 - ) - for i < len(s)-1 { - if s[i] != '\\' { - buf.WriteByte(s[i]) - i++ - continue - } - next := s[i+1] - if strings.IndexByte(validEscapeChars, next) != -1 { - buf.WriteByte(s[i]) - } - buf.WriteByte(next) - i += 2 - } - if i == len(s)-1 { - buf.WriteByte(s[i]) - } - return buf.String() -} diff --git a/vendor/github.com/pingcap/tidb/util/types/compare.go b/vendor/github.com/pingcap/tidb/util/types/compare.go deleted file mode 100644 index 611fa72d3a4a..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/compare.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -// CompareInt64 returns an integer comparing the int64 x to y. -func CompareInt64(x, y int64) int { - if x < y { - return -1 - } else if x == y { - return 0 - } - - return 1 -} - -// CompareUint64 returns an integer comparing the uint64 x to y. -func CompareUint64(x, y uint64) int { - if x < y { - return -1 - } else if x == y { - return 0 - } - - return 1 -} - -// CompareFloat64 returns an integer comparing the float64 x to y. -func CompareFloat64(x, y float64) int { - if x < y { - return -1 - } else if x == y { - return 0 - } - - return 1 -} - -// CompareString returns an integer comparing the string x to y. -func CompareString(x, y string) int { - if x < y { - return -1 - } else if x == y { - return 0 - } - - return 1 -} - -// Compare returns an integer comparing the interface a with b. -// a > b -> 1 -// a = b -> 0 -// a < b -> -1 -func Compare(a, b interface{}) (int, error) { - aDatum := NewDatum(a) - bDatum := NewDatum(b) - return aDatum.CompareDatum(bDatum) -} diff --git a/vendor/github.com/pingcap/tidb/util/types/convert.go b/vendor/github.com/pingcap/tidb/util/types/convert.go deleted file mode 100644 index 9ea9a7e063c9..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/convert.go +++ /dev/null @@ -1,437 +0,0 @@ -// Copyright 2014 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "math" - "strconv" - "strings" - "unicode" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" -) - -// InvConv returns a failed convertion error. -func invConv(val interface{}, tp byte) (interface{}, error) { - return nil, errors.Errorf("cannot convert %v (type %T) to type %s", val, val, TypeStr(tp)) -} - -func truncateStr(str string, flen int) string { - if flen != UnspecifiedLength && len(str) > flen { - str = str[:flen] - } - return str -} - -var unsignedUpperBound = map[byte]uint64{ - mysql.TypeTiny: math.MaxUint8, - mysql.TypeShort: math.MaxUint16, - mysql.TypeInt24: mysql.MaxUint24, - mysql.TypeLong: math.MaxUint32, - mysql.TypeLonglong: math.MaxUint64, - mysql.TypeBit: math.MaxUint64, - mysql.TypeEnum: math.MaxUint64, - mysql.TypeSet: math.MaxUint64, -} - -var signedUpperBound = map[byte]int64{ - mysql.TypeTiny: math.MaxInt8, - mysql.TypeShort: math.MaxInt16, - mysql.TypeInt24: mysql.MaxInt24, - mysql.TypeLong: math.MaxInt32, - mysql.TypeLonglong: math.MaxInt64, -} - -var signedLowerBound = map[byte]int64{ - mysql.TypeTiny: math.MinInt8, - mysql.TypeShort: math.MinInt16, - mysql.TypeInt24: mysql.MinInt24, - mysql.TypeLong: math.MinInt32, - mysql.TypeLonglong: math.MinInt64, -} - -func convertFloatToInt(val float64, lowerBound int64, upperBound int64, tp byte) (int64, error) { - val = RoundFloat(val) - if val < float64(lowerBound) { - return lowerBound, overflow(val, tp) - } - - if val > float64(upperBound) { - return upperBound, overflow(val, tp) - } - - return int64(val), nil -} - -func convertIntToInt(val int64, lowerBound int64, upperBound int64, tp byte) (int64, error) { - if val < lowerBound { - return lowerBound, overflow(val, tp) - } - - if val > upperBound { - return upperBound, overflow(val, tp) - } - - return val, nil -} - -func convertUintToInt(val uint64, upperBound int64, tp byte) (int64, error) { - if val > uint64(upperBound) { - return upperBound, overflow(val, tp) - } - - return int64(val), nil -} - -func convertToInt(val interface{}, target *FieldType) (int64, error) { - tp := target.Tp - lowerBound := signedLowerBound[tp] - upperBound := signedUpperBound[tp] - - switch v := val.(type) { - case bool: - if v { - return 1, nil - } - return 0, nil - case uint64: - return convertUintToInt(v, upperBound, tp) - case int: - return convertIntToInt(int64(v), lowerBound, upperBound, tp) - case int64: - return convertIntToInt(int64(v), lowerBound, upperBound, tp) - case float32: - return convertFloatToInt(float64(v), lowerBound, upperBound, tp) - case float64: - return convertFloatToInt(float64(v), lowerBound, upperBound, tp) - case string: - fval, err := StrToFloat(v) - if err != nil { - return 0, errors.Trace(err) - } - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case []byte: - fval, err := StrToFloat(string(v)) - if err != nil { - return 0, errors.Trace(err) - } - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case mysql.Time: - // 2011-11-10 11:11:11.999999 -> 20111110111112 - ival := v.ToNumber().Round(0).IntPart() - return convertIntToInt(ival, lowerBound, upperBound, tp) - case mysql.Duration: - // 11:11:11.999999 -> 111112 - ival := v.ToNumber().Round(0).IntPart() - return convertIntToInt(ival, lowerBound, upperBound, tp) - case mysql.Decimal: - fval, _ := v.Float64() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case mysql.Hex: - return convertFloatToInt(v.ToNumber(), lowerBound, upperBound, tp) - case mysql.Bit: - return convertFloatToInt(v.ToNumber(), lowerBound, upperBound, tp) - case mysql.Enum: - return convertFloatToInt(v.ToNumber(), lowerBound, upperBound, tp) - case mysql.Set: - return convertFloatToInt(v.ToNumber(), lowerBound, upperBound, tp) - } - return 0, typeError(val, target) -} - -func convertIntToUint(val int64, upperBound uint64, tp byte) (uint64, error) { - if val < 0 { - return 0, overflow(val, tp) - } - - if uint64(val) > upperBound { - return upperBound, overflow(val, tp) - } - - return uint64(val), nil -} - -func convertUintToUint(val uint64, upperBound uint64, tp byte) (uint64, error) { - if val > upperBound { - return upperBound, overflow(val, tp) - } - - return val, nil -} - -func convertFloatToUint(val float64, upperBound uint64, tp byte) (uint64, error) { - val = RoundFloat(val) - if val < 0 { - return uint64(int64(val)), overflow(val, tp) - } - - if val > float64(upperBound) { - return upperBound, overflow(val, tp) - } - - return uint64(val), nil -} - -// typeError returns error for invalid value type. -func typeError(v interface{}, target *FieldType) error { - return errors.Errorf("cannot use %v (type %T) in assignment to, or comparison with, column type %s)", - v, v, target.String()) -} - -func isCastType(tp byte) bool { - switch tp { - case mysql.TypeString, mysql.TypeDuration, mysql.TypeDatetime, - mysql.TypeDate, mysql.TypeLonglong, mysql.TypeNewDecimal: - return true - } - return false -} - -// Cast casts val to certain types and does not return error. -func Cast(val interface{}, target *FieldType) (interface{}, error) { - if !isCastType(target.Tp) { - return nil, errors.Errorf("unknown cast type - %v", target) - } - - return Convert(val, target) -} - -// Convert converts the val with type tp. -func Convert(val interface{}, target *FieldType) (v interface{}, err error) { - d := NewDatum(val) - ret, err := d.ConvertTo(target) - if err != nil { - return ret.GetValue(), errors.Trace(err) - } - return ret.GetValue(), nil -} - -// StrToInt converts a string to an integer in best effort. -// TODO: handle overflow and add unittest. -func StrToInt(str string) (int64, error) { - str = strings.TrimSpace(str) - if len(str) == 0 { - return 0, nil - } - negative := false - i := 0 - if str[i] == '-' { - negative = true - i++ - } else if str[i] == '+' { - i++ - } - r := int64(0) - for ; i < len(str); i++ { - if !unicode.IsDigit(rune(str[i])) { - break - } - r = r*10 + int64(str[i]-'0') - } - if negative { - r = -r - } - // TODO: if i < len(str), we should return an error. - return r, nil -} - -// StrToFloat converts a string to a float64 in best effort. -func StrToFloat(str string) (float64, error) { - str = strings.TrimSpace(str) - if len(str) == 0 { - return 0, nil - } - - // MySQL uses a very loose conversation, e.g, 123.abc -> 123 - // We should do a trade off whether supporting this feature or using a strict mode. - // Now we use a strict mode. - return strconv.ParseFloat(str, 64) -} - -// ToInt64 converts an interface to an int64. -func ToInt64(value interface{}) (int64, error) { - return convertToInt(value, NewFieldType(mysql.TypeLonglong)) -} - -// ToFloat64 converts an interface to a float64. -func ToFloat64(value interface{}) (float64, error) { - switch v := value.(type) { - case bool: - if v { - return 1, nil - } - return 0, nil - case int: - return float64(v), nil - case int64: - return float64(v), nil - case uint64: - return float64(v), nil - case float32: - return float64(v), nil - case float64: - return float64(v), nil - case string: - return StrToFloat(v) - case []byte: - return StrToFloat(string(v)) - case mysql.Time: - f, _ := v.ToNumber().Float64() - return f, nil - case mysql.Duration: - f, _ := v.ToNumber().Float64() - return f, nil - case mysql.Decimal: - vv, _ := v.Float64() - return vv, nil - case mysql.Hex: - return v.ToNumber(), nil - case mysql.Bit: - return v.ToNumber(), nil - case mysql.Enum: - return v.ToNumber(), nil - case mysql.Set: - return v.ToNumber(), nil - default: - return 0, errors.Errorf("cannot convert %v(type %T) to float64", value, value) - } -} - -// ToDecimal converts an interface to a Decimal. -func ToDecimal(value interface{}) (mysql.Decimal, error) { - switch v := value.(type) { - case bool: - if v { - return mysql.ConvertToDecimal(1) - } - return mysql.ConvertToDecimal(0) - case []byte: - return mysql.ConvertToDecimal(string(v)) - case mysql.Time: - return v.ToNumber(), nil - case mysql.Duration: - return v.ToNumber(), nil - default: - return mysql.ConvertToDecimal(value) - } -} - -// ToString converts an interface to a string. -func ToString(value interface{}) (string, error) { - switch v := value.(type) { - case bool: - if v { - return "1", nil - } - return "0", nil - case int: - return strconv.FormatInt(int64(v), 10), nil - case int64: - return strconv.FormatInt(int64(v), 10), nil - case uint64: - return strconv.FormatUint(uint64(v), 10), nil - case float32: - return strconv.FormatFloat(float64(v), 'f', -1, 32), nil - case float64: - return strconv.FormatFloat(float64(v), 'f', -1, 64), nil - case string: - return v, nil - case []byte: - return string(v), nil - case mysql.Time: - return v.String(), nil - case mysql.Duration: - return v.String(), nil - case mysql.Decimal: - return v.String(), nil - case mysql.Hex: - return v.ToString(), nil - case mysql.Bit: - return v.ToString(), nil - case mysql.Enum: - return v.String(), nil - case mysql.Set: - return v.String(), nil - default: - return "", errors.Errorf("cannot convert %v(type %T) to string", value, value) - } -} - -// ToBool converts an interface to a bool. -// We will use 1 for true, and 0 for false. -func ToBool(value interface{}) (int64, error) { - isZero := false - switch v := value.(type) { - case bool: - isZero = (v == false) - case int: - isZero = (v == 0) - case int64: - isZero = (v == 0) - case uint64: - isZero = (v == 0) - case float32: - isZero = (v == 0) - case float64: - isZero = (v == 0) - case string: - if len(v) == 0 { - isZero = true - } else { - n, err := StrToInt(v) - if err != nil { - return 0, err - } - isZero = (n == 0) - } - case []byte: - if len(v) == 0 { - isZero = true - } else { - n, err := StrToInt(string(v)) - if err != nil { - return 0, err - } - isZero = (n == 0) - } - case mysql.Time: - isZero = v.IsZero() - case mysql.Duration: - isZero = (v.Duration == 0) - case mysql.Decimal: - vv, _ := v.Float64() - isZero = (vv == 0) - case mysql.Hex: - isZero = (v.ToNumber() == 0) - case mysql.Bit: - isZero = (v.ToNumber() == 0) - case mysql.Enum: - isZero = (v.ToNumber() == 0) - case mysql.Set: - isZero = (v.ToNumber() == 0) - default: - return 0, errors.Errorf("cannot convert %v(type %T) to bool", value, value) - } - - if isZero { - return 0, nil - } - - return 1, nil -} diff --git a/vendor/github.com/pingcap/tidb/util/types/datum.go b/vendor/github.com/pingcap/tidb/util/types/datum.go deleted file mode 100644 index ddb8a4325309..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/datum.go +++ /dev/null @@ -1,1249 +0,0 @@ -// Copyright 2016 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "math" - "strconv" - "time" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/charset" - "github.com/pingcap/tidb/util/hack" -) - -// Kind constants. -const ( - KindNull int = 0 - KindInt64 int = iota + 1 - KindUint64 - KindFloat32 - KindFloat64 - KindString - KindBytes - KindMysqlBit - KindMysqlDecimal - KindMysqlDuration - KindMysqlEnum - KindMysqlHex - KindMysqlSet - KindMysqlTime - KindRow - KindInterface - KindMinNotNull - KindMaxValue -) - -// Datum is a data box holds different kind of data. -// It has better performance and is easier to use than `interface{}`. -type Datum struct { - k int // datum kind. - i int64 // i can hold int64 uint64 float64 values. - b []byte // b can hold string or []byte values. - x interface{} // f hold all other types. -} - -// Kind gets the kind of the datum. -func (d *Datum) Kind() int { - return d.k -} - -// GetInt64 gets int64 value. -func (d *Datum) GetInt64() int64 { - return d.i -} - -// SetInt64 sets int64 value. -func (d *Datum) SetInt64(i int64) { - d.k = KindInt64 - d.i = i -} - -// GetUint64 gets uint64 value. -func (d *Datum) GetUint64() uint64 { - return uint64(d.i) -} - -// SetUint64 sets uint64 value. -func (d *Datum) SetUint64(i uint64) { - d.k = KindUint64 - d.i = int64(i) -} - -// GetFloat64 gets float64 value. -func (d *Datum) GetFloat64() float64 { - return math.Float64frombits(uint64(d.i)) -} - -// SetFloat64 sets float64 value. -func (d *Datum) SetFloat64(f float64) { - d.k = KindFloat64 - d.i = int64(math.Float64bits(f)) -} - -// GetFloat32 gets float32 value. -func (d *Datum) GetFloat32() float32 { - return float32(math.Float64frombits(uint64(d.i))) -} - -// SetFloat32 sets float32 value. -func (d *Datum) SetFloat32(f float32) { - d.k = KindFloat32 - d.i = int64(math.Float64bits(float64(f))) -} - -// GetString gets string value. -func (d *Datum) GetString() string { - return hack.String(d.b) -} - -// SetString sets string value. -func (d *Datum) SetString(s string) { - d.k = KindString - sink(s) - d.b = hack.Slice(s) -} - -// sink prevents s from being allocated on the stack. -var sink = func(s string) { -} - -// GetBytes gets bytes value. -func (d *Datum) GetBytes() []byte { - return d.b -} - -// SetBytes sets bytes value to datum. -func (d *Datum) SetBytes(b []byte) { - d.k = KindBytes - d.b = b -} - -// SetBytesAsString sets bytes value to datum as string type. -func (d *Datum) SetBytesAsString(b []byte) { - d.k = KindString - d.b = b -} - -// GetInterface gets interface value. -func (d *Datum) GetInterface() interface{} { - return d.x -} - -// SetInterface sets interface to datum. -func (d *Datum) SetInterface(x interface{}) { - d.k = KindInterface - d.x = x -} - -// GetRow gets row value. -func (d *Datum) GetRow() []Datum { - return d.x.([]Datum) -} - -// SetNull sets datum to nil. -func (d *Datum) SetNull() { - d.k = KindNull - d.x = nil -} - -// GetMysqlBit gets mysql.Bit value -func (d *Datum) GetMysqlBit() mysql.Bit { - return d.x.(mysql.Bit) -} - -// SetMysqlBit sets mysql.Bit value -func (d *Datum) SetMysqlBit(b mysql.Bit) { - d.k = KindMysqlBit - d.x = b -} - -// GetMysqlDecimal gets mysql.Decimal value -func (d *Datum) GetMysqlDecimal() mysql.Decimal { - return d.x.(mysql.Decimal) -} - -// SetMysqlDecimal sets mysql.Decimal value -func (d *Datum) SetMysqlDecimal(b mysql.Decimal) { - d.k = KindMysqlDecimal - d.x = b -} - -// GetMysqlDuration gets mysql.Duration value -func (d *Datum) GetMysqlDuration() mysql.Duration { - return d.x.(mysql.Duration) -} - -// SetMysqlDuration sets mysql.Duration value -func (d *Datum) SetMysqlDuration(b mysql.Duration) { - d.k = KindMysqlDuration - d.x = b -} - -// GetMysqlEnum gets mysql.Enum value -func (d *Datum) GetMysqlEnum() mysql.Enum { - return d.x.(mysql.Enum) -} - -// SetMysqlEnum sets mysql.Enum value -func (d *Datum) SetMysqlEnum(b mysql.Enum) { - d.k = KindMysqlEnum - d.x = b -} - -// GetMysqlHex gets mysql.Hex value -func (d *Datum) GetMysqlHex() mysql.Hex { - return d.x.(mysql.Hex) -} - -// SetMysqlHex sets mysql.Hex value -func (d *Datum) SetMysqlHex(b mysql.Hex) { - d.k = KindMysqlHex - d.x = b -} - -// GetMysqlSet gets mysql.Set value -func (d *Datum) GetMysqlSet() mysql.Set { - return d.x.(mysql.Set) -} - -// SetMysqlSet sets mysql.Set value -func (d *Datum) SetMysqlSet(b mysql.Set) { - d.k = KindMysqlSet - d.x = b -} - -// GetMysqlTime gets mysql.Time value -func (d *Datum) GetMysqlTime() mysql.Time { - return d.x.(mysql.Time) -} - -// SetMysqlTime sets mysql.Time value -func (d *Datum) SetMysqlTime(b mysql.Time) { - d.k = KindMysqlTime - d.x = b -} - -// GetValue gets the value of the datum of any kind. -func (d *Datum) GetValue() interface{} { - switch d.k { - case KindInt64: - return d.GetInt64() - case KindUint64: - return d.GetUint64() - case KindFloat32: - return d.GetFloat32() - case KindFloat64: - return d.GetFloat64() - case KindString: - return d.GetString() - case KindBytes: - return d.GetBytes() - default: - return d.x - } -} - -// SetValue sets any kind of value. -func (d *Datum) SetValue(val interface{}) { - switch x := val.(type) { - case nil: - d.SetNull() - case bool: - if x { - d.SetInt64(1) - } else { - d.SetInt64(0) - } - case int: - d.SetInt64(int64(x)) - case int64: - d.SetInt64(x) - case uint64: - d.SetUint64(x) - case float32: - d.SetFloat32(x) - case float64: - d.SetFloat64(x) - case string: - d.SetString(x) - case []byte: - d.SetBytes(x) - case mysql.Bit: - d.x = x - d.k = KindMysqlBit - case mysql.Decimal: - d.x = x - d.k = KindMysqlDecimal - case mysql.Duration: - d.x = x - d.k = KindMysqlDuration - case mysql.Enum: - d.x = x - d.k = KindMysqlEnum - case mysql.Hex: - d.x = x - d.k = KindMysqlHex - case mysql.Set: - d.x = x - d.k = KindMysqlSet - case mysql.Time: - d.x = x - d.k = KindMysqlTime - case []Datum: - d.x = x - d.k = KindRow - default: - d.SetInterface(x) - } -} - -// CompareDatum compares datum to another datum. -// TODO: return error properly. -func (d *Datum) CompareDatum(ad Datum) (int, error) { - switch ad.k { - case KindNull: - if d.k == KindNull { - return 0, nil - } - return 1, nil - case KindMinNotNull: - if d.k == KindNull { - return -1, nil - } else if d.k == KindMinNotNull { - return 0, nil - } - return 1, nil - case KindMaxValue: - if d.k == KindMaxValue { - return 0, nil - } - return -1, nil - case KindInt64: - return d.compareInt64(ad.GetInt64()) - case KindUint64: - return d.compareUint64(ad.GetUint64()) - case KindFloat32, KindFloat64: - return d.compareFloat64(ad.GetFloat64()) - case KindString: - return d.compareString(ad.GetString()) - case KindBytes: - return d.compareBytes(ad.GetBytes()) - case KindMysqlBit: - return d.compareMysqlBit(ad.GetMysqlBit()) - case KindMysqlDecimal: - return d.compareMysqlDecimal(ad.GetMysqlDecimal()) - case KindMysqlDuration: - return d.compareMysqlDuration(ad.GetMysqlDuration()) - case KindMysqlEnum: - return d.compareMysqlEnum(ad.GetMysqlEnum()) - case KindMysqlHex: - return d.compareMysqlHex(ad.GetMysqlHex()) - case KindMysqlSet: - return d.compareMysqlSet(ad.GetMysqlSet()) - case KindMysqlTime: - return d.compareMysqlTime(ad.GetMysqlTime()) - case KindRow: - return d.compareRow(ad.GetRow()) - default: - return 0, nil - } -} - -func (d *Datum) compareInt64(i int64) (int, error) { - switch d.k { - case KindMaxValue: - return 1, nil - case KindInt64: - return CompareInt64(d.i, i), nil - case KindUint64: - if i < 0 || d.GetUint64() > math.MaxInt64 { - return 1, nil - } - return CompareInt64(d.i, i), nil - default: - return d.compareFloat64(float64(i)) - } -} - -func (d *Datum) compareUint64(u uint64) (int, error) { - switch d.k { - case KindMaxValue: - return 1, nil - case KindInt64: - if d.i < 0 || u > math.MaxInt64 { - return -1, nil - } - return CompareInt64(d.i, int64(u)), nil - case KindUint64: - return CompareUint64(d.GetUint64(), u), nil - default: - return d.compareFloat64(float64(u)) - } -} - -func (d *Datum) compareFloat64(f float64) (int, error) { - switch d.k { - case KindNull, KindMinNotNull: - return -1, nil - case KindMaxValue: - return 1, nil - case KindInt64: - return CompareFloat64(float64(d.i), f), nil - case KindUint64: - return CompareFloat64(float64(d.GetUint64()), f), nil - case KindFloat32, KindFloat64: - return CompareFloat64(d.GetFloat64(), f), nil - case KindString, KindBytes: - fVal, err := StrToFloat(d.GetString()) - return CompareFloat64(fVal, f), err - case KindMysqlBit: - fVal := d.GetMysqlBit().ToNumber() - return CompareFloat64(fVal, f), nil - case KindMysqlDecimal: - fVal, _ := d.GetMysqlDecimal().Float64() - return CompareFloat64(fVal, f), nil - case KindMysqlDuration: - fVal := d.GetMysqlDuration().Seconds() - return CompareFloat64(fVal, f), nil - case KindMysqlEnum: - fVal := d.GetMysqlEnum().ToNumber() - return CompareFloat64(fVal, f), nil - case KindMysqlHex: - fVal := d.GetMysqlHex().ToNumber() - return CompareFloat64(fVal, f), nil - case KindMysqlSet: - fVal := d.GetMysqlSet().ToNumber() - return CompareFloat64(fVal, f), nil - case KindMysqlTime: - fVal, _ := d.GetMysqlTime().ToNumber().Float64() - return CompareFloat64(fVal, f), nil - default: - return -1, nil - } -} - -func (d *Datum) compareString(s string) (int, error) { - switch d.k { - case KindNull, KindMinNotNull: - return -1, nil - case KindMaxValue: - return 1, nil - case KindString, KindBytes: - return CompareString(d.GetString(), s), nil - case KindMysqlDecimal: - dec, err := mysql.ParseDecimal(s) - return d.GetMysqlDecimal().Cmp(dec), err - case KindMysqlTime: - dt, err := mysql.ParseDatetime(s) - return d.GetMysqlTime().Compare(dt), err - case KindMysqlDuration: - dur, err := mysql.ParseDuration(s, mysql.MaxFsp) - return d.GetMysqlDuration().Compare(dur), err - case KindMysqlBit: - return CompareString(d.GetMysqlBit().ToString(), s), nil - case KindMysqlHex: - return CompareString(d.GetMysqlHex().ToString(), s), nil - case KindMysqlSet: - return CompareString(d.GetMysqlSet().String(), s), nil - case KindMysqlEnum: - return CompareString(d.GetMysqlEnum().String(), s), nil - default: - fVal, err := StrToFloat(s) - if err != nil { - return 0, err - } - return d.compareFloat64(fVal) - } -} - -func (d *Datum) compareBytes(b []byte) (int, error) { - return d.compareString(hack.String(b)) -} - -func (d *Datum) compareMysqlBit(bit mysql.Bit) (int, error) { - switch d.k { - case KindString, KindBytes: - return CompareString(d.GetString(), bit.ToString()), nil - default: - return d.compareFloat64(bit.ToNumber()) - } -} - -func (d *Datum) compareMysqlDecimal(dec mysql.Decimal) (int, error) { - switch d.k { - case KindMysqlDecimal: - return d.GetMysqlDecimal().Cmp(dec), nil - case KindString, KindBytes: - dDec, err := mysql.ParseDecimal(d.GetString()) - return dDec.Cmp(dec), err - default: - fVal, _ := dec.Float64() - return d.compareFloat64(fVal) - } -} - -func (d *Datum) compareMysqlDuration(dur mysql.Duration) (int, error) { - switch d.k { - case KindMysqlDuration: - return d.GetMysqlDuration().Compare(dur), nil - case KindString, KindBytes: - dDur, err := mysql.ParseDuration(d.GetString(), mysql.MaxFsp) - return dDur.Compare(dur), err - default: - return d.compareFloat64(dur.Seconds()) - } -} - -func (d *Datum) compareMysqlEnum(enum mysql.Enum) (int, error) { - switch d.k { - case KindString, KindBytes: - return CompareString(d.GetString(), enum.String()), nil - default: - return d.compareFloat64(enum.ToNumber()) - } -} - -func (d *Datum) compareMysqlHex(e mysql.Hex) (int, error) { - switch d.k { - case KindString, KindBytes: - return CompareString(d.GetString(), e.ToString()), nil - default: - return d.compareFloat64(e.ToNumber()) - } -} - -func (d *Datum) compareMysqlSet(set mysql.Set) (int, error) { - switch d.k { - case KindString, KindBytes: - return CompareString(d.GetString(), set.String()), nil - default: - return d.compareFloat64(set.ToNumber()) - } -} - -func (d *Datum) compareMysqlTime(time mysql.Time) (int, error) { - switch d.k { - case KindString, KindBytes: - dt, err := mysql.ParseDatetime(d.GetString()) - return dt.Compare(time), err - case KindMysqlTime: - return d.GetMysqlTime().Compare(time), nil - default: - fVal, _ := time.ToNumber().Float64() - return d.compareFloat64(fVal) - } -} - -func (d *Datum) compareRow(row []Datum) (int, error) { - var dRow []Datum - if d.k == KindRow { - dRow = d.GetRow() - } else { - dRow = []Datum{*d} - } - for i := 0; i < len(row) && i < len(dRow); i++ { - cmp, err := dRow[i].CompareDatum(row[i]) - if err != nil { - return 0, err - } - if cmp != 0 { - return cmp, nil - } - } - return CompareInt64(int64(len(dRow)), int64(len(row))), nil -} - -// ConvertTo converts datum to the target field type. -func (d *Datum) ConvertTo(target *FieldType) (Datum, error) { - if d.k == KindNull { - return Datum{}, nil - } - switch target.Tp { // TODO: implement mysql types convert when "CAST() AS" syntax are supported. - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: - unsigned := mysql.HasUnsignedFlag(target.Flag) - if unsigned { - return d.convertToUint(target) - } - return d.convertToInt(target) - case mysql.TypeFloat, mysql.TypeDouble: - return d.convertToFloat(target) - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob, - mysql.TypeString, mysql.TypeVarchar, mysql.TypeVarString: - return d.convertToString(target) - case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDate: - return d.convertToMysqlTime(target) - case mysql.TypeDuration: - return d.convertToMysqlDuration(target) - case mysql.TypeBit: - return d.convertToMysqlBit(target) - case mysql.TypeDecimal, mysql.TypeNewDecimal: - return d.convertToMysqlDecimal(target) - case mysql.TypeYear: - return d.convertToMysqlYear(target) - case mysql.TypeEnum: - return d.convertToMysqlEnum(target) - case mysql.TypeSet: - return d.convertToMysqlSet(target) - case mysql.TypeNull: - return Datum{}, nil - default: - panic("should never happen") - } -} - -func (d *Datum) convertToFloat(target *FieldType) (Datum, error) { - var ret Datum - switch d.k { - case KindNull: - return ret, nil - case KindInt64: - ret.SetFloat64(float64(d.GetInt64())) - case KindUint64: - ret.SetFloat64(float64(d.GetUint64())) - case KindFloat32, KindFloat64: - ret.SetFloat64(d.GetFloat64()) - case KindString, KindBytes: - f, err := StrToFloat(d.GetString()) - if err != nil { - return ret, errors.Trace(err) - } - ret.SetFloat64(f) - case KindMysqlTime: - f, _ := d.GetMysqlTime().ToNumber().Float64() - ret.SetFloat64(f) - case KindMysqlDuration: - f, _ := d.GetMysqlDuration().ToNumber().Float64() - ret.SetFloat64(f) - case KindMysqlDecimal: - f, _ := d.GetMysqlDecimal().Float64() - ret.SetFloat64(f) - case KindMysqlHex: - ret.SetFloat64(d.GetMysqlHex().ToNumber()) - case KindMysqlBit: - ret.SetFloat64(d.GetMysqlBit().ToNumber()) - case KindMysqlSet: - ret.SetFloat64(d.GetMysqlSet().ToNumber()) - case KindMysqlEnum: - ret.SetFloat64(d.GetMysqlEnum().ToNumber()) - default: - return invalidConv(d, target.Tp) - } - // For float and following double type, we will only truncate it for float(M, D) format. - // If no D is set, we will handle it like origin float whether M is set or not. - if target.Flen != UnspecifiedLength && target.Decimal != UnspecifiedLength { - x, err := TruncateFloat(ret.GetFloat64(), target.Flen, target.Decimal) - if err != nil { - return ret, errors.Trace(err) - } - if target.Tp == mysql.TypeFloat { - ret.SetFloat32(float32(x)) - } else { - ret.SetFloat64(x) - } - } - return ret, nil -} - -func (d *Datum) convertToString(target *FieldType) (Datum, error) { - var ret Datum - var s string - switch d.k { - case KindInt64: - s = strconv.FormatInt(d.GetInt64(), 10) - case KindUint64: - s = strconv.FormatUint(d.GetUint64(), 10) - case KindFloat32: - s = strconv.FormatFloat(d.GetFloat64(), 'f', -1, 32) - case KindFloat64: - s = strconv.FormatFloat(d.GetFloat64(), 'f', -1, 64) - case KindString, KindBytes: - s = d.GetString() - case KindMysqlTime: - s = d.GetMysqlTime().String() - case KindMysqlDuration: - s = d.GetMysqlDuration().String() - case KindMysqlDecimal: - s = d.GetMysqlDecimal().String() - case KindMysqlHex: - s = d.GetMysqlHex().ToString() - case KindMysqlBit: - s = d.GetMysqlBit().ToString() - case KindMysqlEnum: - s = d.GetMysqlEnum().String() - case KindMysqlSet: - s = d.GetMysqlSet().String() - default: - return invalidConv(d, target.Tp) - } - // TODO: consider target.Charset/Collate - s = truncateStr(s, target.Flen) - ret.SetString(s) - if target.Charset == charset.CharsetBin { - ret.k = KindBytes - } - return ret, nil -} - -func (d *Datum) convertToInt(target *FieldType) (Datum, error) { - tp := target.Tp - lowerBound := signedLowerBound[tp] - upperBound := signedUpperBound[tp] - var ( - val int64 - err error - ret Datum - ) - switch d.k { - case KindInt64: - val, err = convertIntToInt(d.GetInt64(), lowerBound, upperBound, tp) - case KindUint64: - val, err = convertUintToInt(d.GetUint64(), upperBound, tp) - case KindFloat32, KindFloat64: - val, err = convertFloatToInt(d.GetFloat64(), lowerBound, upperBound, tp) - case KindString, KindBytes: - fval, err1 := StrToFloat(d.GetString()) - if err1 != nil { - return ret, errors.Trace(err1) - } - val, err = convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlTime: - val = d.GetMysqlTime().ToNumber().Round(0).IntPart() - val, err = convertIntToInt(val, lowerBound, upperBound, tp) - case KindMysqlDuration: - val = d.GetMysqlDuration().ToNumber().Round(0).IntPart() - val, err = convertIntToInt(val, lowerBound, upperBound, tp) - case KindMysqlDecimal: - fval, _ := d.GetMysqlDecimal().Float64() - val, err = convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlHex: - val, err = convertFloatToInt(d.GetMysqlHex().ToNumber(), lowerBound, upperBound, tp) - case KindMysqlBit: - val, err = convertFloatToInt(d.GetMysqlBit().ToNumber(), lowerBound, upperBound, tp) - case KindMysqlEnum: - val, err = convertFloatToInt(d.GetMysqlEnum().ToNumber(), lowerBound, upperBound, tp) - case KindMysqlSet: - val, err = convertFloatToInt(d.GetMysqlSet().ToNumber(), lowerBound, upperBound, tp) - default: - return invalidConv(d, target.Tp) - } - ret.SetInt64(val) - if err != nil { - return ret, errors.Trace(err) - } - return ret, nil -} - -func (d *Datum) convertToUint(target *FieldType) (Datum, error) { - tp := target.Tp - upperBound := unsignedUpperBound[tp] - var ( - val uint64 - err error - ret Datum - ) - switch d.k { - case KindInt64: - val, err = convertIntToUint(d.GetInt64(), upperBound, tp) - case KindUint64: - val, err = convertUintToUint(d.GetUint64(), upperBound, tp) - case KindFloat32, KindFloat64: - val, err = convertFloatToUint(d.GetFloat64(), upperBound, tp) - case KindString, KindBytes: - fval, err1 := StrToFloat(d.GetString()) - if err1 != nil { - val, _ = convertFloatToUint(fval, upperBound, tp) - ret.SetUint64(val) - return ret, errors.Trace(err1) - } - val, err = convertFloatToUint(fval, upperBound, tp) - case KindMysqlTime: - ival := d.GetMysqlTime().ToNumber().Round(0).IntPart() - val, err = convertIntToUint(ival, upperBound, tp) - case KindMysqlDuration: - ival := d.GetMysqlDuration().ToNumber().Round(0).IntPart() - val, err = convertIntToUint(ival, upperBound, tp) - case KindMysqlDecimal: - fval, _ := d.GetMysqlDecimal().Float64() - val, err = convertFloatToUint(fval, upperBound, tp) - case KindMysqlHex: - val, err = convertFloatToUint(d.GetMysqlHex().ToNumber(), upperBound, tp) - case KindMysqlBit: - val, err = convertFloatToUint(d.GetMysqlBit().ToNumber(), upperBound, tp) - case KindMysqlEnum: - val, err = convertFloatToUint(d.GetMysqlEnum().ToNumber(), upperBound, tp) - case KindMysqlSet: - val, err = convertFloatToUint(d.GetMysqlSet().ToNumber(), upperBound, tp) - default: - return invalidConv(d, target.Tp) - } - ret.SetUint64(val) - if err != nil { - return ret, errors.Trace(err) - } - return ret, nil -} - -func (d *Datum) convertToMysqlTime(target *FieldType) (Datum, error) { - tp := target.Tp - fsp := mysql.DefaultFsp - if target.Decimal != UnspecifiedLength { - fsp = target.Decimal - } - var ret Datum - switch d.k { - case KindMysqlTime: - t, err := d.GetMysqlTime().Convert(tp) - if err != nil { - ret.SetValue(t) - return ret, errors.Trace(err) - } - t, err = t.RoundFrac(fsp) - ret.SetValue(t) - if err != nil { - return ret, errors.Trace(err) - } - case KindMysqlDuration: - t, err := d.GetMysqlDuration().ConvertToTime(tp) - if err != nil { - ret.SetValue(t) - return ret, errors.Trace(err) - } - t, err = t.RoundFrac(fsp) - ret.SetValue(t) - if err != nil { - return ret, errors.Trace(err) - } - case KindString, KindBytes: - t, err := mysql.ParseTime(d.GetString(), tp, fsp) - ret.SetValue(t) - if err != nil { - return ret, errors.Trace(err) - } - case KindInt64: - t, err := mysql.ParseTimeFromNum(d.GetInt64(), tp, fsp) - ret.SetValue(t) - if err != nil { - return ret, errors.Trace(err) - } - default: - return invalidConv(d, tp) - } - return ret, nil -} - -func (d *Datum) convertToMysqlDuration(target *FieldType) (Datum, error) { - tp := target.Tp - fsp := mysql.DefaultFsp - if target.Decimal != UnspecifiedLength { - fsp = target.Decimal - } - var ret Datum - switch d.k { - case KindMysqlTime: - dur, err := d.GetMysqlTime().ConvertToDuration() - if err != nil { - ret.SetValue(dur) - return ret, errors.Trace(err) - } - dur, err = dur.RoundFrac(fsp) - ret.SetValue(dur) - if err != nil { - return ret, errors.Trace(err) - } - case KindMysqlDuration: - dur, err := d.GetMysqlDuration().RoundFrac(fsp) - ret.SetValue(dur) - if err != nil { - return ret, errors.Trace(err) - } - case KindString, KindBytes: - t, err := mysql.ParseDuration(d.GetString(), fsp) - ret.SetValue(t) - if err != nil { - return ret, errors.Trace(err) - } - default: - return invalidConv(d, tp) - } - return ret, nil -} - -func (d *Datum) convertToMysqlDecimal(target *FieldType) (Datum, error) { - var ret Datum - var dec mysql.Decimal - switch d.k { - case KindInt64: - dec = mysql.NewDecimalFromInt(d.GetInt64(), 0) - case KindUint64: - dec = mysql.NewDecimalFromUint(d.GetUint64(), 0) - case KindFloat32, KindFloat64: - dec = mysql.NewDecimalFromFloat(d.GetFloat64()) - case KindString, KindBytes: - var err error - dec, err = mysql.ParseDecimal(d.GetString()) - if err != nil { - return ret, errors.Trace(err) - } - case KindMysqlDecimal: - dec = d.GetMysqlDecimal() - case KindMysqlTime: - dec = d.GetMysqlTime().ToNumber() - case KindMysqlDuration: - dec = d.GetMysqlDuration().ToNumber() - case KindMysqlBit: - dec = mysql.NewDecimalFromFloat(d.GetMysqlBit().ToNumber()) - case KindMysqlEnum: - dec = mysql.NewDecimalFromFloat(d.GetMysqlEnum().ToNumber()) - case KindMysqlHex: - dec = mysql.NewDecimalFromFloat(d.GetMysqlHex().ToNumber()) - case KindMysqlSet: - dec = mysql.NewDecimalFromFloat(d.GetMysqlSet().ToNumber()) - default: - return invalidConv(d, target.Tp) - } - if target.Decimal != UnspecifiedLength { - dec = dec.Round(int32(target.Decimal)) - } - ret.SetValue(dec) - return ret, nil -} - -func (d *Datum) convertToMysqlYear(target *FieldType) (Datum, error) { - var ( - ret Datum - y int64 - err error - ) - switch d.k { - case KindString, KindBytes: - y, err = StrToInt(d.GetString()) - case KindMysqlTime: - y = int64(d.GetMysqlTime().Year()) - case KindMysqlDuration: - y = int64(time.Now().Year()) - default: - ret, err = d.convertToInt(NewFieldType(mysql.TypeLonglong)) - if err != nil { - return invalidConv(d, target.Tp) - } - y = ret.GetInt64() - } - y, err = mysql.AdjustYear(y) - if err != nil { - return invalidConv(d, target.Tp) - } - ret.SetInt64(y) - return ret, nil -} - -func (d *Datum) convertToMysqlBit(target *FieldType) (Datum, error) { - x, err := d.convertToUint(target) - if err != nil { - return x, errors.Trace(err) - } - // check bit boundary, if bit has n width, the boundary is - // in [0, (1 << n) - 1] - width := target.Flen - if width == 0 || width == mysql.UnspecifiedBitWidth { - width = mysql.MinBitWidth - } - maxValue := uint64(1)< maxValue { - x.SetUint64(maxValue) - return x, overflow(val, target.Tp) - } - var ret Datum - ret.SetValue(mysql.Bit{Value: val, Width: width}) - return ret, nil -} - -func (d *Datum) convertToMysqlEnum(target *FieldType) (Datum, error) { - var ( - ret Datum - e mysql.Enum - err error - ) - switch d.k { - case KindString, KindBytes: - e, err = mysql.ParseEnumName(target.Elems, d.GetString()) - default: - var uintDatum Datum - uintDatum, err = d.convertToUint(target) - if err != nil { - return ret, errors.Trace(err) - } - e, err = mysql.ParseEnumValue(target.Elems, uintDatum.GetUint64()) - } - if err != nil { - return invalidConv(d, target.Tp) - } - ret.SetValue(e) - return ret, nil -} - -func (d *Datum) convertToMysqlSet(target *FieldType) (Datum, error) { - var ( - ret Datum - s mysql.Set - err error - ) - switch d.k { - case KindString, KindBytes: - s, err = mysql.ParseSetName(target.Elems, d.GetString()) - default: - var uintDatum Datum - uintDatum, err = d.convertToUint(target) - if err != nil { - return ret, errors.Trace(err) - } - s, err = mysql.ParseSetValue(target.Elems, uintDatum.GetUint64()) - } - - if err != nil { - return invalidConv(d, target.Tp) - } - ret.SetValue(s) - return ret, nil -} - -// ToBool converts to a bool. -// We will use 1 for true, and 0 for false. -func (d *Datum) ToBool() (int64, error) { - isZero := false - switch d.Kind() { - case KindInt64: - isZero = (d.GetInt64() == 0) - case KindUint64: - isZero = (d.GetUint64() == 0) - case KindFloat32: - isZero = (d.GetFloat32() == 0) - case KindFloat64: - isZero = (d.GetFloat64() == 0) - case KindString: - s := d.GetString() - if len(s) == 0 { - isZero = true - } - n, err := StrToInt(s) - if err != nil { - return 0, err - } - isZero = (n == 0) - case KindBytes: - bs := d.GetBytes() - if len(bs) == 0 { - isZero = true - } else { - n, err := StrToInt(string(bs)) - if err != nil { - return 0, err - } - isZero = (n == 0) - } - case KindMysqlTime: - isZero = d.GetMysqlTime().IsZero() - case KindMysqlDuration: - isZero = (d.GetMysqlDuration().Duration == 0) - case KindMysqlDecimal: - v, _ := d.GetMysqlDecimal().Float64() - isZero = (v == 0) - case KindMysqlHex: - isZero = (d.GetMysqlHex().ToNumber() == 0) - case KindMysqlBit: - isZero = (d.GetMysqlBit().ToNumber() == 0) - case KindMysqlEnum: - isZero = (d.GetMysqlEnum().ToNumber() == 0) - case KindMysqlSet: - isZero = (d.GetMysqlSet().ToNumber() == 0) - default: - return 0, errors.Errorf("cannot convert %v(type %T) to bool", d.GetValue(), d.GetValue()) - } - if isZero { - return 0, nil - } - return 1, nil -} - -// ToInt64 converts to a int64. -func (d *Datum) ToInt64() (int64, error) { - tp := mysql.TypeLonglong - lowerBound := signedLowerBound[tp] - upperBound := signedUpperBound[tp] - switch d.Kind() { - case KindInt64: - return convertIntToInt(d.GetInt64(), lowerBound, upperBound, tp) - case KindUint64: - return convertUintToInt(d.GetUint64(), upperBound, tp) - case KindFloat32: - return convertFloatToInt(float64(d.GetFloat32()), lowerBound, upperBound, tp) - case KindFloat64: - return convertFloatToInt(d.GetFloat64(), lowerBound, upperBound, tp) - case KindString: - s := d.GetString() - fval, err := StrToFloat(s) - if err != nil { - return 0, errors.Trace(err) - } - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindBytes: - s := string(d.GetBytes()) - fval, err := StrToFloat(s) - if err != nil { - return 0, errors.Trace(err) - } - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlTime: - // 2011-11-10 11:11:11.999999 -> 20111110111112 - ival := d.GetMysqlTime().ToNumber().Round(0).IntPart() - return convertIntToInt(ival, lowerBound, upperBound, tp) - case KindMysqlDuration: - // 11:11:11.999999 -> 111112 - ival := d.GetMysqlDuration().ToNumber().Round(0).IntPart() - return convertIntToInt(ival, lowerBound, upperBound, tp) - case KindMysqlDecimal: - fval, _ := d.GetMysqlDecimal().Float64() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlHex: - fval := d.GetMysqlHex().ToNumber() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlBit: - fval := d.GetMysqlBit().ToNumber() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlEnum: - fval := d.GetMysqlEnum().ToNumber() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - case KindMysqlSet: - fval := d.GetMysqlSet().ToNumber() - return convertFloatToInt(fval, lowerBound, upperBound, tp) - default: - return 0, errors.Errorf("cannot convert %v(type %T) to int64", d.GetValue(), d.GetValue()) - } -} - -// ToFloat64 converts to a float64 -func (d *Datum) ToFloat64() (float64, error) { - switch d.Kind() { - case KindInt64: - return float64(d.GetInt64()), nil - case KindUint64: - return float64(d.GetUint64()), nil - case KindFloat32: - return float64(d.GetFloat32()), nil - case KindFloat64: - return d.GetFloat64(), nil - case KindString: - return StrToFloat(d.GetString()) - case KindBytes: - return StrToFloat(string(d.GetBytes())) - case KindMysqlTime: - f, _ := d.GetMysqlTime().ToNumber().Float64() - return f, nil - case KindMysqlDuration: - f, _ := d.GetMysqlDuration().ToNumber().Float64() - return f, nil - case KindMysqlDecimal: - f, _ := d.GetMysqlDecimal().Float64() - return f, nil - case KindMysqlHex: - return d.GetMysqlHex().ToNumber(), nil - case KindMysqlBit: - return d.GetMysqlBit().ToNumber(), nil - case KindMysqlEnum: - return d.GetMysqlEnum().ToNumber(), nil - case KindMysqlSet: - return d.GetMysqlSet().ToNumber(), nil - default: - return 0, errors.Errorf("cannot convert %v(type %T) to float64", d.GetValue(), d.GetValue()) - } -} - -// ToString gets the string representation of the datum. -func (d *Datum) ToString() (string, error) { - switch d.Kind() { - case KindInt64: - return strconv.FormatInt(d.GetInt64(), 10), nil - case KindUint64: - return strconv.FormatUint(d.GetUint64(), 10), nil - case KindFloat32: - return strconv.FormatFloat(float64(d.GetFloat32()), 'f', -1, 32), nil - case KindFloat64: - return strconv.FormatFloat(float64(d.GetFloat64()), 'f', -1, 64), nil - case KindString: - return d.GetString(), nil - case KindBytes: - return d.GetString(), nil - case KindMysqlTime: - return d.GetMysqlTime().String(), nil - case KindMysqlDuration: - return d.GetMysqlDuration().String(), nil - case KindMysqlDecimal: - return d.GetMysqlDecimal().String(), nil - case KindMysqlHex: - return d.GetMysqlHex().ToString(), nil - case KindMysqlBit: - return d.GetMysqlBit().ToString(), nil - case KindMysqlEnum: - return d.GetMysqlEnum().String(), nil - case KindMysqlSet: - return d.GetMysqlSet().String(), nil - default: - return "", errors.Errorf("cannot convert %v(type %T) to string", d.GetValue(), d.GetValue()) - } -} - -func invalidConv(d *Datum, tp byte) (Datum, error) { - return Datum{}, errors.Errorf("cannot convert %v to type %s", d, TypeStr(tp)) -} - -// NewDatum creates a new Datum from an interface{}. -func NewDatum(in interface{}) (d Datum) { - switch x := in.(type) { - case []interface{}: - d.SetValue(MakeDatums(x...)) - default: - d.SetValue(in) - } - return d -} - -// MakeDatums creates datum slice from interfaces. -func MakeDatums(args ...interface{}) []Datum { - datums := make([]Datum, len(args)) - for i, v := range args { - datums[i] = NewDatum(v) - } - return datums -} - -// DatumsToInterfaces converts a datum slice to interface slice. -func DatumsToInterfaces(datums []Datum) []interface{} { - ins := make([]interface{}, len(datums)) - for i, v := range datums { - ins[i] = v.GetValue() - } - return ins -} - -// MinNotNullDatum returns a datum represents minimum not null value. -func MinNotNullDatum() Datum { - return Datum{k: KindMinNotNull} -} - -// MaxValueDatum returns a datum represents max value. -func MaxValueDatum() Datum { - return Datum{k: KindMaxValue} -} diff --git a/vendor/github.com/pingcap/tidb/util/types/etc.go b/vendor/github.com/pingcap/tidb/util/types/etc.go deleted file mode 100644 index c4b7772289ac..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/etc.go +++ /dev/null @@ -1,310 +0,0 @@ -// Copyright 2014 The ql Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSES/QL-LICENSE file. - -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "fmt" - "io" - "strings" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/parser/opcode" - "github.com/pingcap/tidb/terror" - "github.com/pingcap/tidb/util/charset" -) - -// IsTypeBlob returns a boolean indicating whether the tp is a blob type. -func IsTypeBlob(tp byte) bool { - switch tp { - case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob: - return true - default: - return false - } -} - -// IsTypeChar returns a boolean indicating -// whether the tp is the char type like a string type or a varchar type. -func IsTypeChar(tp byte) bool { - switch tp { - case mysql.TypeString, mysql.TypeVarchar: - return true - default: - return false - } -} - -var type2Str = map[byte]string{ - mysql.TypeBit: "bit", - mysql.TypeBlob: "text", - mysql.TypeDate: "date", - mysql.TypeDatetime: "datetime", - mysql.TypeDecimal: "decimal", - mysql.TypeNewDecimal: "decimal", - mysql.TypeDouble: "double", - mysql.TypeEnum: "enum", - mysql.TypeFloat: "float", - mysql.TypeGeometry: "geometry", - mysql.TypeInt24: "mediumint", - mysql.TypeLong: "int", - mysql.TypeLonglong: "bigint", - mysql.TypeLongBlob: "longtext", - mysql.TypeMediumBlob: "mediumtext", - mysql.TypeNull: "null", - mysql.TypeSet: "set", - mysql.TypeShort: "smallint", - mysql.TypeString: "char", - mysql.TypeDuration: "time", - mysql.TypeTimestamp: "timestamp", - mysql.TypeTiny: "tinyint", - mysql.TypeTinyBlob: "tinytext", - mysql.TypeVarchar: "varchar", - mysql.TypeVarString: "var_string", - mysql.TypeYear: "year", -} - -// TypeStr converts tp to a string. -func TypeStr(tp byte) (r string) { - return type2Str[tp] -} - -// TypeToStr converts a field to a string. -// It is used for converting Text to Blob, -// or converting Char to Binary. -// Args: -// tp: type enum -// cs: charset -func TypeToStr(tp byte, cs string) (r string) { - ts := type2Str[tp] - if cs != charset.CharsetBin { - return ts - } - if IsTypeBlob(tp) { - ts = strings.Replace(ts, "text", "blob", 1) - } else if IsTypeChar(tp) { - ts = strings.Replace(ts, "char", "binary", 1) - } - return ts -} - -// EOFAsNil filtrates errors, -// If err is equal to io.EOF returns nil. -func EOFAsNil(err error) error { - if terror.ErrorEqual(err, io.EOF) { - return nil - } - return errors.Trace(err) -} - -// InvOp2 returns an invalid operation error. -func InvOp2(x, y interface{}, o opcode.Op) (interface{}, error) { - return nil, errors.Errorf("Invalid operation: %v %v %v (mismatched types %T and %T)", x, o, y, x, y) -} - -// UndOp returns an undefined error. -func UndOp(x interface{}, o opcode.Op) (interface{}, error) { - return nil, errors.Errorf("Invalid operation: %v%v (operator %v not defined on %T)", o, x, o, x) -} - -// Overflow returns an overflowed error. -func overflow(v interface{}, tp byte) error { - return errors.Errorf("constant %v overflows %s", v, TypeStr(tp)) -} - -// TODO: collate should return errors from Compare. -func collate(x, y []interface{}) (r int) { - nx, ny := len(x), len(y) - - switch { - case nx == 0 && ny != 0: - return -1 - case nx == 0 && ny == 0: - return 0 - case nx != 0 && ny == 0: - return 1 - } - - r = 1 - if nx > ny { - x, y, r = y, x, -r - } - - for i, xi := range x { - // TODO: we may remove collate later, so here just panic error. - c, err := Compare(xi, y[i]) - if err != nil { - panic(fmt.Sprintf("should never happend %v", err)) - } - - if c != 0 { - return c * r - } - } - - if nx == ny { - return 0 - } - - return -r -} - -// Collators maps a boolean value to a collated function. -var Collators = map[bool]func(a, b []interface{}) int{false: collateDesc, true: collate} - -func collateDesc(a, b []interface{}) int { - return -collate(a, b) -} - -// IsOrderedType returns a boolean -// whether the type of y can be used by order by. -func IsOrderedType(v interface{}) (r bool) { - switch v.(type) { - case int, int8, int16, int32, int64, - uint, uint8, uint16, uint32, uint64, - float32, float64, string, []byte, - mysql.Decimal, mysql.Time, mysql.Duration, - mysql.Hex, mysql.Bit, mysql.Enum, mysql.Set: - return true - } - return false -} - -// Clone copies an interface to another interface. -// It does a deep copy. -func Clone(from interface{}) (interface{}, error) { - if from == nil { - return nil, nil - } - switch x := from.(type) { - case uint8, uint16, uint32, uint64, float32, float64, - int16, int8, bool, string, int, int64, int32, - mysql.Time, mysql.Duration, mysql.Decimal, - mysql.Hex, mysql.Bit, mysql.Enum, mysql.Set: - return x, nil - case []byte: - target := make([]byte, len(from.([]byte))) - copy(target, from.([]byte)) - return target, nil - case []interface{}: - var r []interface{} - for _, v := range from.([]interface{}) { - vv, err := Clone(v) - if err != nil { - return nil, err - } - r = append(r, vv) - } - return r, nil - default: - return nil, errors.Errorf("Clone invalid type %T", from) - } -} - -func convergeType(a interface{}, hasDecimal, hasFloat *bool) (x interface{}) { - x = a - switch v := a.(type) { - case bool: - // treat bool as 1 and 0 - if v { - x = int64(1) - } else { - x = int64(0) - } - case int: - x = int64(v) - case int8: - x = int64(v) - case int16: - x = int64(v) - case int32: - x = int64(v) - case int64: - x = int64(v) - case uint: - x = uint64(v) - case uint8: - x = uint64(v) - case uint16: - x = uint64(v) - case uint32: - x = uint64(v) - case uint64: - x = uint64(v) - case float32: - x = float64(v) - *hasFloat = true - case float64: - x = float64(v) - *hasFloat = true - case mysql.Decimal: - x = v - *hasDecimal = true - } - return -} - -// Coerce changes type. -// If a or b is Decimal, changes the both to Decimal. -// Else if a or b is Float, changes the both to Float. -func Coerce(a, b interface{}) (x, y interface{}) { - var hasDecimal bool - var hasFloat bool - x = convergeType(a, &hasDecimal, &hasFloat) - y = convergeType(b, &hasDecimal, &hasFloat) - if hasDecimal { - d, err := mysql.ConvertToDecimal(x) - if err == nil { - x = d - } - d, err = mysql.ConvertToDecimal(y) - if err == nil { - y = d - } - } else if hasFloat { - switch v := x.(type) { - case int64: - x = float64(v) - case uint64: - x = float64(v) - case mysql.Hex: - x = v.ToNumber() - case mysql.Bit: - x = v.ToNumber() - case mysql.Enum: - x = v.ToNumber() - case mysql.Set: - x = v.ToNumber() - } - switch v := y.(type) { - case int64: - y = float64(v) - case uint64: - y = float64(v) - case mysql.Hex: - y = v.ToNumber() - case mysql.Bit: - y = v.ToNumber() - case mysql.Enum: - y = v.ToNumber() - case mysql.Set: - y = v.ToNumber() - } - } - return -} diff --git a/vendor/github.com/pingcap/tidb/util/types/field_type.go b/vendor/github.com/pingcap/tidb/util/types/field_type.go deleted file mode 100644 index 38da5f628025..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/field_type.go +++ /dev/null @@ -1,1045 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "fmt" - "strings" - - "github.com/pingcap/tidb/mysql" - "github.com/pingcap/tidb/util/charset" -) - -// UnspecifiedLength is unspecified length. -const ( - UnspecifiedLength int = -1 -) - -// FieldType records field type information. -type FieldType struct { - Tp byte - Flag uint - Flen int - Decimal int - Charset string - Collate string - // Elems is the element list for enum and set type. - Elems []string -} - -// NewFieldType returns a FieldType, -// with a type and other information about field type. -func NewFieldType(tp byte) *FieldType { - return &FieldType{ - Tp: tp, - Flen: UnspecifiedLength, - Decimal: UnspecifiedLength, - } -} - -// CompactStr only considers Tp/CharsetBin/Flen/Deimal. -// This is used for showing column type in infoschema. -func (ft *FieldType) CompactStr() string { - ts := TypeToStr(ft.Tp, ft.Charset) - suffix := "" - switch ft.Tp { - case mysql.TypeEnum, mysql.TypeSet: - // Format is ENUM ('e1', 'e2') or SET ('e1', 'e2') - es := make([]string, 0, len(ft.Elems)) - for _, e := range ft.Elems { - e = strings.Replace(e, "'", "''", -1) - es = append(es, e) - } - suffix = fmt.Sprintf("('%s')", strings.Join(es, "','")) - case mysql.TypeTimestamp, mysql.TypeDatetime, mysql.TypeDate: - if ft.Decimal != UnspecifiedLength && ft.Decimal != 0 { - suffix = fmt.Sprintf("(%d)", ft.Decimal) - } - default: - if ft.Flen != UnspecifiedLength { - if ft.Decimal == UnspecifiedLength { - if ft.Tp != mysql.TypeFloat && ft.Tp != mysql.TypeDouble { - suffix = fmt.Sprintf("(%d)", ft.Flen) - } - } else { - suffix = fmt.Sprintf("(%d,%d)", ft.Flen, ft.Decimal) - } - } else if ft.Decimal != UnspecifiedLength { - suffix = fmt.Sprintf("(%d)", ft.Decimal) - } - } - return ts + suffix -} - -// String joins the information of FieldType and -// returns a string. -func (ft *FieldType) String() string { - strs := []string{ft.CompactStr()} - if mysql.HasUnsignedFlag(ft.Flag) { - strs = append(strs, "UNSIGNED") - } - if mysql.HasZerofillFlag(ft.Flag) { - strs = append(strs, "ZEROFILL") - } - if mysql.HasBinaryFlag(ft.Flag) { - strs = append(strs, "BINARY") - } - - if IsTypeChar(ft.Tp) || IsTypeBlob(ft.Tp) { - if ft.Charset != "" && ft.Charset != charset.CharsetBin { - strs = append(strs, fmt.Sprintf("CHARACTER SET %s", ft.Charset)) - } - if ft.Collate != "" && ft.Collate != charset.CharsetBin { - strs = append(strs, fmt.Sprintf("COLLATE %s", ft.Collate)) - } - } - - return strings.Join(strs, " ") -} - -// DefaultTypeForValue returns the default FieldType for the value. -func DefaultTypeForValue(value interface{}) *FieldType { - var tp *FieldType - switch x := value.(type) { - case nil: - tp = NewFieldType(mysql.TypeNull) - case bool, int64, int: - tp = NewFieldType(mysql.TypeLonglong) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case uint64: - tp = NewFieldType(mysql.TypeLonglong) - tp.Flag |= mysql.UnsignedFlag - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case string: - tp = NewFieldType(mysql.TypeVarString) - tp.Charset = mysql.DefaultCharset - tp.Collate = mysql.DefaultCollationName - case float64: - tp = NewFieldType(mysql.TypeNewDecimal) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case []byte: - tp = NewFieldType(mysql.TypeBlob) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Bit: - tp = NewFieldType(mysql.TypeBit) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Hex: - tp = NewFieldType(mysql.TypeVarchar) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Time: - tp = NewFieldType(x.Type) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Duration: - tp = NewFieldType(mysql.TypeDuration) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Decimal: - tp = NewFieldType(mysql.TypeNewDecimal) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Enum: - tp = NewFieldType(mysql.TypeEnum) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - case mysql.Set: - tp = NewFieldType(mysql.TypeSet) - tp.Charset = charset.CharsetBin - tp.Collate = charset.CharsetBin - default: - tp = NewFieldType(mysql.TypeDecimal) - } - return tp -} - -// DefaultCharsetForType returns the default charset/collation for mysql type. -func DefaultCharsetForType(tp byte) (string, string) { - switch tp { - case mysql.TypeVarString, mysql.TypeString, mysql.TypeVarchar: - // Default charset for string types is utf8. - return mysql.DefaultCharset, mysql.DefaultCollationName - } - return charset.CharsetBin, charset.CollationBin -} - -// MergeFieldType merges two MySQL type to a new type. -// This is used in hybrid field type expression. -// For example "select case c when 1 then 2 when 2 then 'tidb' from t;" -// The resule field type of the case expression is the merged type of the two when clause. -// See: https://github.com/mysql/mysql-server/blob/5.7/sql/field.cc#L1042 -func MergeFieldType(a byte, b byte) byte { - ia := getFieldTypeIndex(a) - ib := getFieldTypeIndex(b) - return fieldTypeMergeRules[ia][ib] -} - -func getFieldTypeIndex(tp byte) int { - itp := int(tp) - if itp < fieldTypeTearFrom { - return itp - } - return fieldTypeTearFrom + itp - fieldTypeTearTo - 1 -} - -const ( - fieldTypeTearFrom = int(mysql.TypeBit) + 1 - fieldTypeTearTo = int(mysql.TypeNewDecimal) - 1 - fieldTypeNum = fieldTypeTearFrom + (255 - fieldTypeTearTo) -) - -var fieldTypeMergeRules = [fieldTypeNum][fieldTypeNum]byte{ - /* mysql.TypeDecimal -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeShort mysql.TypeLong - mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeDecimal, mysql.TypeDecimal, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeTiny -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong - mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeTiny, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeTiny, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeShort -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeShort, - //mysql.TypeShort mysql.TypeLong - mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeShort, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeShort, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeLong -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeLong, - //mysql.TypeShort mysql.TypeLong - mysql.TypeLong, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeLong, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeLong, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeLong, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeFloat -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeDouble, mysql.TypeFloat, - //mysql.TypeShort mysql.TypeLong - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeFloat, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeFloat, mysql.TypeFloat, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeFloat, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeDouble -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeShort mysql.TypeLong - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeDouble, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeNull -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong - mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeNull, mysql.TypeTimestamp, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeLonglong, - //mysql.TypeDate mysql.TypeTime - mysql.TypeNewDate, mysql.TypeDuration, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeYear, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeBit, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeEnum, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeSet, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeGeometry, - }, - /* mysql.TypeTimestamp -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeTimestamp, mysql.TypeTimestamp, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeLonglong -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeLonglong, - //mysql.TypeShort mysql.TypeLong - mysql.TypeLonglong, mysql.TypeLonglong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeLonglong, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeLong, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeLonglong, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeInt24 -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeInt24, - //mysql.TypeShort mysql.TypeLong - mysql.TypeInt24, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeInt24, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeInt24, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeDate -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeTime -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeDuration, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeDatetime, mysql.TypeDuration, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeDatetime -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeYear -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeDecimal, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong - mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeYear, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeYear, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeNewDate -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeVarchar -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeVarchar, mysql.TypeVarchar, - }, - /* mysql.TypeBit -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeBit, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeBit, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeNewDecimal -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeShort mysql.TypeLong - mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeNewDecimal, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeEnum -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeEnum, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeSet -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeSet, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeVarchar, - }, - /* mysql.TypeTinyBlob -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeShort mysql.TypeLong - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeDate mysql.TypeTime - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeBit <16>-<245> - mysql.TypeTinyBlob, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeTinyBlob, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeTinyBlob, mysql.TypeTinyBlob, - }, - /* mysql.TypeMediumBlob -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeShort mysql.TypeLong - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeDate mysql.TypeTime - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeBit <16>-<245> - mysql.TypeMediumBlob, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeMediumBlob, mysql.TypeMediumBlob, - }, - /* mysql.TypeLongBlob -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeShort mysql.TypeLong - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeDate mysql.TypeTime - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeBit <16>-<245> - mysql.TypeLongBlob, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeLongBlob, mysql.TypeLongBlob, - }, - /* mysql.TypeBlob -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeShort mysql.TypeLong - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeDate mysql.TypeTime - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeBit <16>-<245> - mysql.TypeBlob, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeBlob, mysql.TypeBlob, - }, - /* mysql.TypeVarString -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeVarchar, mysql.TypeVarchar, - }, - /* mysql.TypeString -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeString, mysql.TypeString, - //mysql.TypeShort mysql.TypeLong - mysql.TypeString, mysql.TypeString, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeString, mysql.TypeString, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeString, mysql.TypeString, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeString, mysql.TypeString, - //mysql.TypeDate mysql.TypeTime - mysql.TypeString, mysql.TypeString, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeString, mysql.TypeString, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeString, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeString, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeString, mysql.TypeString, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeString, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeString, - }, - /* mysql.TypeGeometry -> */ - { - //mysql.TypeDecimal mysql.TypeTiny - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp - mysql.TypeGeometry, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<245> - mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum - mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob - mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob - mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString - mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry - mysql.TypeString, mysql.TypeGeometry, - }, -} diff --git a/vendor/github.com/pingcap/tidb/util/types/helper.go b/vendor/github.com/pingcap/tidb/util/types/helper.go deleted file mode 100644 index 182cffcb73c4..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/helper.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "math" - - "github.com/juju/errors" - "github.com/pingcap/tidb/mysql" -) - -// RoundFloat rounds float val to the nearest integer value with float64 format, like GNU rint function. -// RoundFloat uses default rounding mode, see http://www.gnu.org/software/libc/manual/html_node/Rounding.html -// so we will choose the even number if the result is midway between two representable value. -// e.g, 1.5 -> 2, 2.5 -> 2. -func RoundFloat(f float64) float64 { - if math.Remainder(f, 1.0) < 0 { - return math.Ceil(f) - } - return math.Floor(f) -} - -func getMaxFloat(flen int, decimal int) float64 { - intPartLen := flen - decimal - f := math.Pow10(intPartLen) - f -= math.Pow10(-decimal) - return f -} - -func truncateFloat(f float64, decimal int) float64 { - pow := math.Pow10(decimal) - t := (f - math.Floor(f)) * pow - - round := RoundFloat(t) - - f = math.Floor(f) + round/pow - return f -} - -// TruncateFloat tries to truncate f. -// If the result exceeds the max/min float that flen/decimal allowed, returns the max/min float allowed. -func TruncateFloat(f float64, flen int, decimal int) (float64, error) { - if math.IsNaN(f) { - // nan returns 0 - return 0, nil - } - - maxF := getMaxFloat(flen, decimal) - - if !math.IsInf(f, 0) { - f = truncateFloat(f, decimal) - } - - if f > maxF { - f = maxF - } else if f < -maxF { - f = -maxF - } - - return f, nil -} - -// CalculateSum adds v to sum. -func CalculateSum(sum interface{}, v interface{}) (interface{}, error) { - // for avg and sum calculation - // avg and sum use decimal for integer and decimal type, use float for others - // see https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html - var ( - data interface{} - err error - ) - - switch y := v.(type) { - case int, uint, int8, uint8, int16, uint16, int32, uint32, int64, uint64: - data, err = mysql.ConvertToDecimal(v) - case mysql.Decimal: - data = y - case nil: - data = nil - default: - data, err = ToFloat64(v) - } - - if err != nil { - return nil, errors.Trace(err) - } - if data == nil { - return sum, nil - } - switch x := sum.(type) { - case nil: - return data, nil - case float64: - return x + data.(float64), nil - case mysql.Decimal: - return x.Add(data.(mysql.Decimal)), nil - default: - return nil, errors.Errorf("invalid value %v(%T) for aggregate", x, x) - } -} diff --git a/vendor/github.com/pingcap/tidb/util/types/overflow.go b/vendor/github.com/pingcap/tidb/util/types/overflow.go deleted file mode 100644 index 9a56e71664c0..000000000000 --- a/vendor/github.com/pingcap/tidb/util/types/overflow.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2015 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package types - -import ( - "math" - - "github.com/juju/errors" -) - -// ErrArithOverflow is the error for arthimetic operation overflow. -var ErrArithOverflow = errors.New("operation overflow") - -// AddUint64 adds uint64 a and b if no overflow, else returns error. -func AddUint64(a uint64, b uint64) (uint64, error) { - if math.MaxUint64-a < b { - return 0, errors.Trace(ErrArithOverflow) - } - return a + b, nil -} - -// AddInt64 adds int64 a and b if no overflow, otherwise returns error. -func AddInt64(a int64, b int64) (int64, error) { - if (a > 0 && b > 0 && math.MaxInt64-a < b) || - (a < 0 && b < 0 && math.MinInt64-a > b) { - return 0, errors.Trace(ErrArithOverflow) - } - - return a + b, nil -} - -// AddInteger adds uint64 a and int64 b and returns uint64 if no overflow error. -func AddInteger(a uint64, b int64) (uint64, error) { - if b >= 0 { - return AddUint64(a, uint64(b)) - } - - if uint64(-b) > a { - return 0, errors.Trace(ErrArithOverflow) - } - return a - uint64(-b), nil -} - -// SubUint64 substracts uint64 a with b and returns uint64 if no overflow error. -func SubUint64(a uint64, b uint64) (uint64, error) { - if a < b { - return 0, errors.Trace(ErrArithOverflow) - } - return a - b, nil -} - -// SubInt64 substracts int64 a with b and returns int64 if no overflow error. -func SubInt64(a int64, b int64) (int64, error) { - if (a > 0 && b < 0 && math.MaxInt64-a < -b) || - (a < 0 && b > 0 && math.MinInt64-a > -b) || - (a == 0 && b == math.MinInt64) { - return 0, errors.Trace(ErrArithOverflow) - } - return a - b, nil -} - -// SubUintWithInt substracts uint64 a with int64 b and returns uint64 if no overflow error. -func SubUintWithInt(a uint64, b int64) (uint64, error) { - if b < 0 { - return AddUint64(a, uint64(-b)) - } - return SubUint64(a, uint64(b)) -} - -// SubIntWithUint substracts int64 a with uint64 b and returns uint64 if no overflow error. -func SubIntWithUint(a int64, b uint64) (uint64, error) { - if a < 0 || uint64(a) < b { - return 0, errors.Trace(ErrArithOverflow) - } - return uint64(a) - b, nil -} - -// MulUint64 multiplies uint64 a and b and returns uint64 if no overflow error. -func MulUint64(a uint64, b uint64) (uint64, error) { - if b > 0 && a > math.MaxUint64/b { - return 0, errors.Trace(ErrArithOverflow) - } - return a * b, nil -} - -// MulInt64 multiplies int64 a and b and returns int64 if no overflow error. -func MulInt64(a int64, b int64) (int64, error) { - if a == 0 || b == 0 { - return 0, nil - } - - var ( - res uint64 - err error - negative = false - ) - - if a > 0 && b > 0 { - res, err = MulUint64(uint64(a), uint64(b)) - } else if a < 0 && b < 0 { - res, err = MulUint64(uint64(-a), uint64(-b)) - } else if a < 0 && b > 0 { - negative = true - res, err = MulUint64(uint64(-a), uint64(b)) - } else { - negative = true - res, err = MulUint64(uint64(a), uint64(-b)) - } - - if err != nil { - return 0, errors.Trace(err) - } - - if negative { - // negative result - if res > math.MaxInt64+1 { - return 0, errors.Trace(ErrArithOverflow) - } - - return -int64(res), nil - } - - // positive result - if res > math.MaxInt64 { - return 0, errors.Trace(ErrArithOverflow) - } - - return int64(res), nil -} - -// MulInteger multiplies uint64 a and int64 b, and returns uint64 if no overflow error. -func MulInteger(a uint64, b int64) (uint64, error) { - if a == 0 || b == 0 { - return 0, nil - } - - if b < 0 { - return 0, errors.Trace(ErrArithOverflow) - } - - return MulUint64(a, uint64(b)) -} - -// DivInt64 divides int64 a with b, returns int64 if no overflow error. -// It just checks overflow, if b is zero, a "divide by zero" panic throws. -func DivInt64(a int64, b int64) (int64, error) { - if a == math.MinInt64 && b == -1 { - return 0, errors.Trace(ErrArithOverflow) - } - - return a / b, nil -} - -// DivUintWithInt divides uint64 a with int64 b, returns uint64 if no overflow error. -// It just checks overflow, if b is zero, a "divide by zero" panic throws. -func DivUintWithInt(a uint64, b int64) (uint64, error) { - if b < 0 { - if a != 0 && uint64(-b) <= a { - return 0, errors.Trace(ErrArithOverflow) - } - - return 0, nil - } - - return a / uint64(b), nil -} - -// DivIntWithUint divides int64 a with uint64 b, returns uint64 if no overflow error. -// It just checks overflow, if b is zero, a "divide by zero" panic throws. -func DivIntWithUint(a int64, b uint64) (uint64, error) { - if a < 0 { - if uint64(-a) >= b { - return 0, errors.Trace(ErrArithOverflow) - } - - return 0, nil - } - - return uint64(a) / b, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/LICENSE b/vendor/github.com/syndtr/goleveldb/LICENSE deleted file mode 100644 index 4a772d1ab369..000000000000 --- a/vendor/github.com/syndtr/goleveldb/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright 2012 Suryandaru Triandana -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/batch.go b/vendor/github.com/syndtr/goleveldb/leveldb/batch.go deleted file mode 100644 index 652fa41248ce..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/batch.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "encoding/binary" - "fmt" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrBatchCorrupted records reason of batch corruption. -type ErrBatchCorrupted struct { - Reason string -} - -func (e *ErrBatchCorrupted) Error() string { - return fmt.Sprintf("leveldb: batch corrupted: %s", e.Reason) -} - -func newErrBatchCorrupted(reason string) error { - return errors.NewErrCorrupted(storage.FileDesc{}, &ErrBatchCorrupted{reason}) -} - -const ( - batchHdrLen = 8 + 4 - batchGrowRec = 3000 -) - -// BatchReplay wraps basic batch operations. -type BatchReplay interface { - Put(key, value []byte) - Delete(key []byte) -} - -// Batch is a write batch. -type Batch struct { - data []byte - rLen, bLen int - seq uint64 - sync bool -} - -func (b *Batch) grow(n int) { - off := len(b.data) - if off == 0 { - off = batchHdrLen - if b.data != nil { - b.data = b.data[:off] - } - } - if cap(b.data)-off < n { - if b.data == nil { - b.data = make([]byte, off, off+n) - } else { - odata := b.data - div := 1 - if b.rLen > batchGrowRec { - div = b.rLen / batchGrowRec - } - b.data = make([]byte, off, off+n+(off-batchHdrLen)/div) - copy(b.data, odata) - } - } -} - -func (b *Batch) appendRec(kt keyType, key, value []byte) { - n := 1 + binary.MaxVarintLen32 + len(key) - if kt == keyTypeVal { - n += binary.MaxVarintLen32 + len(value) - } - b.grow(n) - off := len(b.data) - data := b.data[:off+n] - data[off] = byte(kt) - off++ - off += binary.PutUvarint(data[off:], uint64(len(key))) - copy(data[off:], key) - off += len(key) - if kt == keyTypeVal { - off += binary.PutUvarint(data[off:], uint64(len(value))) - copy(data[off:], value) - off += len(value) - } - b.data = data[:off] - b.rLen++ - // Include 8-byte ikey header - b.bLen += len(key) + len(value) + 8 -} - -// Put appends 'put operation' of the given key/value pair to the batch. -// It is safe to modify the contents of the argument after Put returns. -func (b *Batch) Put(key, value []byte) { - b.appendRec(keyTypeVal, key, value) -} - -// Delete appends 'delete operation' of the given key to the batch. -// It is safe to modify the contents of the argument after Delete returns. -func (b *Batch) Delete(key []byte) { - b.appendRec(keyTypeDel, key, nil) -} - -// Dump dumps batch contents. The returned slice can be loaded into the -// batch using Load method. -// The returned slice is not its own copy, so the contents should not be -// modified. -func (b *Batch) Dump() []byte { - return b.encode() -} - -// Load loads given slice into the batch. Previous contents of the batch -// will be discarded. -// The given slice will not be copied and will be used as batch buffer, so -// it is not safe to modify the contents of the slice. -func (b *Batch) Load(data []byte) error { - return b.decode(0, data) -} - -// Replay replays batch contents. -func (b *Batch) Replay(r BatchReplay) error { - return b.decodeRec(func(i int, kt keyType, key, value []byte) error { - switch kt { - case keyTypeVal: - r.Put(key, value) - case keyTypeDel: - r.Delete(key) - } - return nil - }) -} - -// Len returns number of records in the batch. -func (b *Batch) Len() int { - return b.rLen -} - -// Reset resets the batch. -func (b *Batch) Reset() { - b.data = b.data[:0] - b.seq = 0 - b.rLen = 0 - b.bLen = 0 - b.sync = false -} - -func (b *Batch) init(sync bool) { - b.sync = sync -} - -func (b *Batch) append(p *Batch) { - if p.rLen > 0 { - b.grow(len(p.data) - batchHdrLen) - b.data = append(b.data, p.data[batchHdrLen:]...) - b.rLen += p.rLen - } - if p.sync { - b.sync = true - } -} - -// size returns sums of key/value pair length plus 8-bytes ikey. -func (b *Batch) size() int { - return b.bLen -} - -func (b *Batch) encode() []byte { - b.grow(0) - binary.LittleEndian.PutUint64(b.data, b.seq) - binary.LittleEndian.PutUint32(b.data[8:], uint32(b.rLen)) - - return b.data -} - -func (b *Batch) decode(prevSeq uint64, data []byte) error { - if len(data) < batchHdrLen { - return newErrBatchCorrupted("too short") - } - - b.seq = binary.LittleEndian.Uint64(data) - if b.seq < prevSeq { - return newErrBatchCorrupted("invalid sequence number") - } - b.rLen = int(binary.LittleEndian.Uint32(data[8:])) - if b.rLen < 0 { - return newErrBatchCorrupted("invalid records length") - } - // No need to be precise at this point, it won't be used anyway - b.bLen = len(data) - batchHdrLen - b.data = data - - return nil -} - -func (b *Batch) decodeRec(f func(i int, kt keyType, key, value []byte) error) error { - off := batchHdrLen - for i := 0; i < b.rLen; i++ { - if off >= len(b.data) { - return newErrBatchCorrupted("invalid records length") - } - - kt := keyType(b.data[off]) - if kt > keyTypeVal { - panic(kt) - return newErrBatchCorrupted("bad record: invalid type") - } - off++ - - x, n := binary.Uvarint(b.data[off:]) - off += n - if n <= 0 || off+int(x) > len(b.data) { - return newErrBatchCorrupted("bad record: invalid key length") - } - key := b.data[off : off+int(x)] - off += int(x) - var value []byte - if kt == keyTypeVal { - x, n := binary.Uvarint(b.data[off:]) - off += n - if n <= 0 || off+int(x) > len(b.data) { - return newErrBatchCorrupted("bad record: invalid value length") - } - value = b.data[off : off+int(x)] - off += int(x) - } - - if err := f(i, kt, key, value); err != nil { - return err - } - } - - return nil -} - -func (b *Batch) memReplay(to *memdb.DB) error { - var ikScratch []byte - return b.decodeRec(func(i int, kt keyType, key, value []byte) error { - ikScratch = makeInternalKey(ikScratch, key, b.seq+uint64(i), kt) - return to.Put(ikScratch, value) - }) -} - -func (b *Batch) memDecodeAndReplay(prevSeq uint64, data []byte, to *memdb.DB) error { - if err := b.decode(prevSeq, data); err != nil { - return err - } - return b.memReplay(to) -} - -func (b *Batch) revertMemReplay(to *memdb.DB) error { - var ikScratch []byte - return b.decodeRec(func(i int, kt keyType, key, value []byte) error { - ikScratch := makeInternalKey(ikScratch, key, b.seq+uint64(i), kt) - return to.Delete(ikScratch) - }) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go b/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go deleted file mode 100644 index a287d0e5e7e4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go +++ /dev/null @@ -1,684 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package cache provides interface and implementation of a cache algorithms. -package cache - -import ( - "sync" - "sync/atomic" - "unsafe" - - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Cacher provides interface to implements a caching functionality. -// An implementation must be goroutine-safe. -type Cacher interface { - // Capacity returns cache capacity. - Capacity() int - - // SetCapacity sets cache capacity. - SetCapacity(capacity int) - - // Promote promotes the 'cache node'. - Promote(n *Node) - - // Ban evicts the 'cache node' and prevent subsequent 'promote'. - Ban(n *Node) - - // Evict evicts the 'cache node'. - Evict(n *Node) - - // EvictNS evicts 'cache node' with the given namespace. - EvictNS(ns uint64) - - // EvictAll evicts all 'cache node'. - EvictAll() - - // Close closes the 'cache tree' - Close() error -} - -// Value is a 'cacheable object'. It may implements util.Releaser, if -// so the the Release method will be called once object is released. -type Value interface{} - -// NamespaceGetter provides convenient wrapper for namespace. -type NamespaceGetter struct { - Cache *Cache - NS uint64 -} - -// Get simply calls Cache.Get() method. -func (g *NamespaceGetter) Get(key uint64, setFunc func() (size int, value Value)) *Handle { - return g.Cache.Get(g.NS, key, setFunc) -} - -// The hash tables implementation is based on: -// "Dynamic-Sized Nonblocking Hash Tables", by Yujie Liu, -// Kunlong Zhang, and Michael Spear. -// ACM Symposium on Principles of Distributed Computing, Jul 2014. - -const ( - mInitialSize = 1 << 4 - mOverflowThreshold = 1 << 5 - mOverflowGrowThreshold = 1 << 7 -) - -type mBucket struct { - mu sync.Mutex - node []*Node - frozen bool -} - -func (b *mBucket) freeze() []*Node { - b.mu.Lock() - defer b.mu.Unlock() - if !b.frozen { - b.frozen = true - } - return b.node -} - -func (b *mBucket) get(r *Cache, h *mNode, hash uint32, ns, key uint64, noset bool) (done, added bool, n *Node) { - b.mu.Lock() - - if b.frozen { - b.mu.Unlock() - return - } - - // Scan the node. - for _, n := range b.node { - if n.hash == hash && n.ns == ns && n.key == key { - atomic.AddInt32(&n.ref, 1) - b.mu.Unlock() - return true, false, n - } - } - - // Get only. - if noset { - b.mu.Unlock() - return true, false, nil - } - - // Create node. - n = &Node{ - r: r, - hash: hash, - ns: ns, - key: key, - ref: 1, - } - // Add node to bucket. - b.node = append(b.node, n) - bLen := len(b.node) - b.mu.Unlock() - - // Update counter. - grow := atomic.AddInt32(&r.nodes, 1) >= h.growThreshold - if bLen > mOverflowThreshold { - grow = grow || atomic.AddInt32(&h.overflow, 1) >= mOverflowGrowThreshold - } - - // Grow. - if grow && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) { - nhLen := len(h.buckets) << 1 - nh := &mNode{ - buckets: make([]unsafe.Pointer, nhLen), - mask: uint32(nhLen) - 1, - pred: unsafe.Pointer(h), - growThreshold: int32(nhLen * mOverflowThreshold), - shrinkThreshold: int32(nhLen >> 1), - } - ok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh)) - if !ok { - panic("BUG: failed swapping head") - } - go nh.initBuckets() - } - - return true, true, n -} - -func (b *mBucket) delete(r *Cache, h *mNode, hash uint32, ns, key uint64) (done, deleted bool) { - b.mu.Lock() - - if b.frozen { - b.mu.Unlock() - return - } - - // Scan the node. - var ( - n *Node - bLen int - ) - for i := range b.node { - n = b.node[i] - if n.ns == ns && n.key == key { - if atomic.LoadInt32(&n.ref) == 0 { - deleted = true - - // Call releaser. - if n.value != nil { - if r, ok := n.value.(util.Releaser); ok { - r.Release() - } - n.value = nil - } - - // Remove node from bucket. - b.node = append(b.node[:i], b.node[i+1:]...) - bLen = len(b.node) - } - break - } - } - b.mu.Unlock() - - if deleted { - // Call OnDel. - for _, f := range n.onDel { - f() - } - - // Update counter. - atomic.AddInt32(&r.size, int32(n.size)*-1) - shrink := atomic.AddInt32(&r.nodes, -1) < h.shrinkThreshold - if bLen >= mOverflowThreshold { - atomic.AddInt32(&h.overflow, -1) - } - - // Shrink. - if shrink && len(h.buckets) > mInitialSize && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) { - nhLen := len(h.buckets) >> 1 - nh := &mNode{ - buckets: make([]unsafe.Pointer, nhLen), - mask: uint32(nhLen) - 1, - pred: unsafe.Pointer(h), - growThreshold: int32(nhLen * mOverflowThreshold), - shrinkThreshold: int32(nhLen >> 1), - } - ok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh)) - if !ok { - panic("BUG: failed swapping head") - } - go nh.initBuckets() - } - } - - return true, deleted -} - -type mNode struct { - buckets []unsafe.Pointer // []*mBucket - mask uint32 - pred unsafe.Pointer // *mNode - resizeInProgess int32 - - overflow int32 - growThreshold int32 - shrinkThreshold int32 -} - -func (n *mNode) initBucket(i uint32) *mBucket { - if b := (*mBucket)(atomic.LoadPointer(&n.buckets[i])); b != nil { - return b - } - - p := (*mNode)(atomic.LoadPointer(&n.pred)) - if p != nil { - var node []*Node - if n.mask > p.mask { - // Grow. - pb := (*mBucket)(atomic.LoadPointer(&p.buckets[i&p.mask])) - if pb == nil { - pb = p.initBucket(i & p.mask) - } - m := pb.freeze() - // Split nodes. - for _, x := range m { - if x.hash&n.mask == i { - node = append(node, x) - } - } - } else { - // Shrink. - pb0 := (*mBucket)(atomic.LoadPointer(&p.buckets[i])) - if pb0 == nil { - pb0 = p.initBucket(i) - } - pb1 := (*mBucket)(atomic.LoadPointer(&p.buckets[i+uint32(len(n.buckets))])) - if pb1 == nil { - pb1 = p.initBucket(i + uint32(len(n.buckets))) - } - m0 := pb0.freeze() - m1 := pb1.freeze() - // Merge nodes. - node = make([]*Node, 0, len(m0)+len(m1)) - node = append(node, m0...) - node = append(node, m1...) - } - b := &mBucket{node: node} - if atomic.CompareAndSwapPointer(&n.buckets[i], nil, unsafe.Pointer(b)) { - if len(node) > mOverflowThreshold { - atomic.AddInt32(&n.overflow, int32(len(node)-mOverflowThreshold)) - } - return b - } - } - - return (*mBucket)(atomic.LoadPointer(&n.buckets[i])) -} - -func (n *mNode) initBuckets() { - for i := range n.buckets { - n.initBucket(uint32(i)) - } - atomic.StorePointer(&n.pred, nil) -} - -// Cache is a 'cache map'. -type Cache struct { - mu sync.RWMutex - mHead unsafe.Pointer // *mNode - nodes int32 - size int32 - cacher Cacher - closed bool -} - -// NewCache creates a new 'cache map'. The cacher is optional and -// may be nil. -func NewCache(cacher Cacher) *Cache { - h := &mNode{ - buckets: make([]unsafe.Pointer, mInitialSize), - mask: mInitialSize - 1, - growThreshold: int32(mInitialSize * mOverflowThreshold), - shrinkThreshold: 0, - } - for i := range h.buckets { - h.buckets[i] = unsafe.Pointer(&mBucket{}) - } - r := &Cache{ - mHead: unsafe.Pointer(h), - cacher: cacher, - } - return r -} - -func (r *Cache) getBucket(hash uint32) (*mNode, *mBucket) { - h := (*mNode)(atomic.LoadPointer(&r.mHead)) - i := hash & h.mask - b := (*mBucket)(atomic.LoadPointer(&h.buckets[i])) - if b == nil { - b = h.initBucket(i) - } - return h, b -} - -func (r *Cache) delete(n *Node) bool { - for { - h, b := r.getBucket(n.hash) - done, deleted := b.delete(r, h, n.hash, n.ns, n.key) - if done { - return deleted - } - } - return false -} - -// Nodes returns number of 'cache node' in the map. -func (r *Cache) Nodes() int { - return int(atomic.LoadInt32(&r.nodes)) -} - -// Size returns sums of 'cache node' size in the map. -func (r *Cache) Size() int { - return int(atomic.LoadInt32(&r.size)) -} - -// Capacity returns cache capacity. -func (r *Cache) Capacity() int { - if r.cacher == nil { - return 0 - } - return r.cacher.Capacity() -} - -// SetCapacity sets cache capacity. -func (r *Cache) SetCapacity(capacity int) { - if r.cacher != nil { - r.cacher.SetCapacity(capacity) - } -} - -// Get gets 'cache node' with the given namespace and key. -// If cache node is not found and setFunc is not nil, Get will atomically creates -// the 'cache node' by calling setFunc. Otherwise Get will returns nil. -// -// The returned 'cache handle' should be released after use by calling Release -// method. -func (r *Cache) Get(ns, key uint64, setFunc func() (size int, value Value)) *Handle { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return nil - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, setFunc == nil) - if done { - if n != nil { - n.mu.Lock() - if n.value == nil { - if setFunc == nil { - n.mu.Unlock() - n.unref() - return nil - } - - n.size, n.value = setFunc() - if n.value == nil { - n.size = 0 - n.mu.Unlock() - n.unref() - return nil - } - atomic.AddInt32(&r.size, int32(n.size)) - } - n.mu.Unlock() - if r.cacher != nil { - r.cacher.Promote(n) - } - return &Handle{unsafe.Pointer(n)} - } - - break - } - } - return nil -} - -// Delete removes and ban 'cache node' with the given namespace and key. -// A banned 'cache node' will never inserted into the 'cache tree'. Ban -// only attributed to the particular 'cache node', so when a 'cache node' -// is recreated it will not be banned. -// -// If onDel is not nil, then it will be executed if such 'cache node' -// doesn't exist or once the 'cache node' is released. -// -// Delete return true is such 'cache node' exist. -func (r *Cache) Delete(ns, key uint64, onDel func()) bool { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return false - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, true) - if done { - if n != nil { - if onDel != nil { - n.mu.Lock() - n.onDel = append(n.onDel, onDel) - n.mu.Unlock() - } - if r.cacher != nil { - r.cacher.Ban(n) - } - n.unref() - return true - } - - break - } - } - - if onDel != nil { - onDel() - } - - return false -} - -// Evict evicts 'cache node' with the given namespace and key. This will -// simply call Cacher.Evict. -// -// Evict return true is such 'cache node' exist. -func (r *Cache) Evict(ns, key uint64) bool { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return false - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, true) - if done { - if n != nil { - if r.cacher != nil { - r.cacher.Evict(n) - } - n.unref() - return true - } - - break - } - } - - return false -} - -// EvictNS evicts 'cache node' with the given namespace. This will -// simply call Cacher.EvictNS. -func (r *Cache) EvictNS(ns uint64) { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return - } - - if r.cacher != nil { - r.cacher.EvictNS(ns) - } -} - -// EvictAll evicts all 'cache node'. This will simply call Cacher.EvictAll. -func (r *Cache) EvictAll() { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return - } - - if r.cacher != nil { - r.cacher.EvictAll() - } -} - -// Close closes the 'cache map' and releases all 'cache node'. -func (r *Cache) Close() error { - r.mu.Lock() - if !r.closed { - r.closed = true - - if r.cacher != nil { - if err := r.cacher.Close(); err != nil { - return err - } - } - - h := (*mNode)(r.mHead) - h.initBuckets() - - for i := range h.buckets { - b := (*mBucket)(h.buckets[i]) - for _, n := range b.node { - // Call releaser. - if n.value != nil { - if r, ok := n.value.(util.Releaser); ok { - r.Release() - } - n.value = nil - } - - // Call OnDel. - for _, f := range n.onDel { - f() - } - } - } - } - r.mu.Unlock() - return nil -} - -// Node is a 'cache node'. -type Node struct { - r *Cache - - hash uint32 - ns, key uint64 - - mu sync.Mutex - size int - value Value - - ref int32 - onDel []func() - - CacheData unsafe.Pointer -} - -// NS returns this 'cache node' namespace. -func (n *Node) NS() uint64 { - return n.ns -} - -// Key returns this 'cache node' key. -func (n *Node) Key() uint64 { - return n.key -} - -// Size returns this 'cache node' size. -func (n *Node) Size() int { - return n.size -} - -// Value returns this 'cache node' value. -func (n *Node) Value() Value { - return n.value -} - -// Ref returns this 'cache node' ref counter. -func (n *Node) Ref() int32 { - return atomic.LoadInt32(&n.ref) -} - -// GetHandle returns an handle for this 'cache node'. -func (n *Node) GetHandle() *Handle { - if atomic.AddInt32(&n.ref, 1) <= 1 { - panic("BUG: Node.GetHandle on zero ref") - } - return &Handle{unsafe.Pointer(n)} -} - -func (n *Node) unref() { - if atomic.AddInt32(&n.ref, -1) == 0 { - n.r.delete(n) - } -} - -func (n *Node) unrefLocked() { - if atomic.AddInt32(&n.ref, -1) == 0 { - n.r.mu.RLock() - if !n.r.closed { - n.r.delete(n) - } - n.r.mu.RUnlock() - } -} - -// Handle is a 'cache handle' of a 'cache node'. -type Handle struct { - n unsafe.Pointer // *Node -} - -// Value returns the value of the 'cache node'. -func (h *Handle) Value() Value { - n := (*Node)(atomic.LoadPointer(&h.n)) - if n != nil { - return n.value - } - return nil -} - -// Release releases this 'cache handle'. -// It is safe to call release multiple times. -func (h *Handle) Release() { - nPtr := atomic.LoadPointer(&h.n) - if nPtr != nil && atomic.CompareAndSwapPointer(&h.n, nPtr, nil) { - n := (*Node)(nPtr) - n.unrefLocked() - } -} - -func murmur32(ns, key uint64, seed uint32) uint32 { - const ( - m = uint32(0x5bd1e995) - r = 24 - ) - - k1 := uint32(ns >> 32) - k2 := uint32(ns) - k3 := uint32(key >> 32) - k4 := uint32(key) - - k1 *= m - k1 ^= k1 >> r - k1 *= m - - k2 *= m - k2 ^= k2 >> r - k2 *= m - - k3 *= m - k3 ^= k3 >> r - k3 *= m - - k4 *= m - k4 ^= k4 >> r - k4 *= m - - h := seed - - h *= m - h ^= k1 - h *= m - h ^= k2 - h *= m - h ^= k3 - h *= m - h ^= k4 - - h ^= h >> 13 - h *= m - h ^= h >> 15 - - return h -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go b/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go deleted file mode 100644 index d9a84cde15e8..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package cache - -import ( - "sync" - "unsafe" -) - -type lruNode struct { - n *Node - h *Handle - ban bool - - next, prev *lruNode -} - -func (n *lruNode) insert(at *lruNode) { - x := at.next - at.next = n - n.prev = at - n.next = x - x.prev = n -} - -func (n *lruNode) remove() { - if n.prev != nil { - n.prev.next = n.next - n.next.prev = n.prev - n.prev = nil - n.next = nil - } else { - panic("BUG: removing removed node") - } -} - -type lru struct { - mu sync.Mutex - capacity int - used int - recent lruNode -} - -func (r *lru) reset() { - r.recent.next = &r.recent - r.recent.prev = &r.recent - r.used = 0 -} - -func (r *lru) Capacity() int { - r.mu.Lock() - defer r.mu.Unlock() - return r.capacity -} - -func (r *lru) SetCapacity(capacity int) { - var evicted []*lruNode - - r.mu.Lock() - r.capacity = capacity - for r.used > r.capacity { - rn := r.recent.prev - if rn == nil { - panic("BUG: invalid LRU used or capacity counter") - } - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) Promote(n *Node) { - var evicted []*lruNode - - r.mu.Lock() - if n.CacheData == nil { - if n.Size() <= r.capacity { - rn := &lruNode{n: n, h: n.GetHandle()} - rn.insert(&r.recent) - n.CacheData = unsafe.Pointer(rn) - r.used += n.Size() - - for r.used > r.capacity { - rn := r.recent.prev - if rn == nil { - panic("BUG: invalid LRU used or capacity counter") - } - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - } - } else { - rn := (*lruNode)(n.CacheData) - if !rn.ban { - rn.remove() - rn.insert(&r.recent) - } - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) Ban(n *Node) { - r.mu.Lock() - if n.CacheData == nil { - n.CacheData = unsafe.Pointer(&lruNode{n: n, ban: true}) - } else { - rn := (*lruNode)(n.CacheData) - if !rn.ban { - rn.remove() - rn.ban = true - r.used -= rn.n.Size() - r.mu.Unlock() - - rn.h.Release() - rn.h = nil - return - } - } - r.mu.Unlock() -} - -func (r *lru) Evict(n *Node) { - r.mu.Lock() - rn := (*lruNode)(n.CacheData) - if rn == nil || rn.ban { - r.mu.Unlock() - return - } - n.CacheData = nil - r.mu.Unlock() - - rn.h.Release() -} - -func (r *lru) EvictNS(ns uint64) { - var evicted []*lruNode - - r.mu.Lock() - for e := r.recent.prev; e != &r.recent; { - rn := e - e = e.prev - if rn.n.NS() == ns { - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) EvictAll() { - r.mu.Lock() - back := r.recent.prev - for rn := back; rn != &r.recent; rn = rn.prev { - rn.n.CacheData = nil - } - r.reset() - r.mu.Unlock() - - for rn := back; rn != &r.recent; rn = rn.prev { - rn.h.Release() - } -} - -func (r *lru) Close() error { - return nil -} - -// NewLRU create a new LRU-cache. -func NewLRU(capacity int) Cacher { - r := &lru{capacity: capacity} - r.reset() - return r -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go deleted file mode 100644 index 248bf7c213d2..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import "github.com/syndtr/goleveldb/leveldb/comparer" - -type iComparer struct { - ucmp comparer.Comparer -} - -func (icmp *iComparer) uName() string { - return icmp.ucmp.Name() -} - -func (icmp *iComparer) uCompare(a, b []byte) int { - return icmp.ucmp.Compare(a, b) -} - -func (icmp *iComparer) uSeparator(dst, a, b []byte) []byte { - return icmp.ucmp.Separator(dst, a, b) -} - -func (icmp *iComparer) uSuccessor(dst, b []byte) []byte { - return icmp.ucmp.Successor(dst, b) -} - -func (icmp *iComparer) Name() string { - return icmp.uName() -} - -func (icmp *iComparer) Compare(a, b []byte) int { - x := icmp.ucmp.Compare(internalKey(a).ukey(), internalKey(b).ukey()) - if x == 0 { - if m, n := internalKey(a).num(), internalKey(b).num(); m > n { - x = -1 - } else if m < n { - x = 1 - } - } - return x -} - -func (icmp *iComparer) Separator(dst, a, b []byte) []byte { - ua, ub := internalKey(a).ukey(), internalKey(b).ukey() - dst = icmp.ucmp.Separator(dst, ua, ub) - if dst == nil { - return nil - } - if len(dst) < len(ua) && icmp.uCompare(ua, dst) < 0 { - dst = append(dst, keyMaxNumBytes...) - } else { - // Did not close possibilities that n maybe longer than len(ub). - dst = append(dst, a[len(a)-8:]...) - } - return dst -} - -func (icmp *iComparer) Successor(dst, b []byte) []byte { - ub := internalKey(b).ukey() - dst = icmp.ucmp.Successor(dst, ub) - if dst == nil { - return nil - } - if len(dst) < len(ub) && icmp.uCompare(ub, dst) < 0 { - dst = append(dst, keyMaxNumBytes...) - } else { - // Did not close possibilities that n maybe longer than len(ub). - dst = append(dst, b[len(b)-8:]...) - } - return dst -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go deleted file mode 100644 index 14dddf88dd20..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package comparer - -import "bytes" - -type bytesComparer struct{} - -func (bytesComparer) Compare(a, b []byte) int { - return bytes.Compare(a, b) -} - -func (bytesComparer) Name() string { - return "leveldb.BytewiseComparator" -} - -func (bytesComparer) Separator(dst, a, b []byte) []byte { - i, n := 0, len(a) - if n > len(b) { - n = len(b) - } - for ; i < n && a[i] == b[i]; i++ { - } - if i >= n { - // Do not shorten if one string is a prefix of the other - } else if c := a[i]; c < 0xff && c+1 < b[i] { - dst = append(dst, a[:i+1]...) - dst[i]++ - return dst - } - return nil -} - -func (bytesComparer) Successor(dst, b []byte) []byte { - for i, c := range b { - if c != 0xff { - dst = append(dst, b[:i+1]...) - dst[i]++ - return dst - } - } - return nil -} - -// DefaultComparer are default implementation of the Comparer interface. -// It uses the natural ordering, consistent with bytes.Compare. -var DefaultComparer = bytesComparer{} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go deleted file mode 100644 index 14a28f16fcee..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package comparer provides interface and implementation for ordering -// sets of data. -package comparer - -// BasicComparer is the interface that wraps the basic Compare method. -type BasicComparer interface { - // Compare returns -1, 0, or +1 depending on whether a is 'less than', - // 'equal to' or 'greater than' b. The two arguments can only be 'equal' - // if their contents are exactly equal. Furthermore, the empty slice - // must be 'less than' any non-empty slice. - Compare(a, b []byte) int -} - -// Comparer defines a total ordering over the space of []byte keys: a 'less -// than' relationship. -type Comparer interface { - BasicComparer - - // Name returns name of the comparer. - // - // The Level-DB on-disk format stores the comparer name, and opening a - // database with a different comparer from the one it was created with - // will result in an error. - // - // An implementation to a new name whenever the comparer implementation - // changes in a way that will cause the relative ordering of any two keys - // to change. - // - // Names starting with "leveldb." are reserved and should not be used - // by any users of this package. - Name() string - - // Bellow are advanced functions used used to reduce the space requirements - // for internal data structures such as index blocks. - - // Separator appends a sequence of bytes x to dst such that a <= x && x < b, - // where 'less than' is consistent with Compare. An implementation should - // return nil if x equal to a. - // - // Either contents of a or b should not by any means modified. Doing so - // may cause corruption on the internal state. - Separator(dst, a, b []byte) []byte - - // Successor appends a sequence of bytes x to dst such that x >= b, where - // 'less than' is consistent with Compare. An implementation should return - // nil if x equal to b. - // - // Contents of b should not by any means modified. Doing so may cause - // corruption on the internal state. - Successor(dst, b []byte) []byte -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go deleted file mode 100644 index eb6abd0fb189..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ /dev/null @@ -1,1091 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "container/list" - "fmt" - "io" - "os" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/table" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// DB is a LevelDB database. -type DB struct { - // Need 64-bit alignment. - seq uint64 - - // Session. - s *session - - // MemDB. - memMu sync.RWMutex - memPool chan *memdb.DB - mem, frozenMem *memDB - journal *journal.Writer - journalWriter storage.Writer - journalFd storage.FileDesc - frozenJournalFd storage.FileDesc - frozenSeq uint64 - - // Snapshot. - snapsMu sync.Mutex - snapsList *list.List - - // Stats. - aliveSnaps, aliveIters int32 - - // Write. - writeC chan *Batch - writeMergedC chan bool - writeLockC chan struct{} - writeAckC chan error - writeDelay time.Duration - writeDelayN int - journalC chan *Batch - journalAckC chan error - tr *Transaction - - // Compaction. - compCommitLk sync.Mutex - tcompCmdC chan cCmd - tcompPauseC chan chan<- struct{} - mcompCmdC chan cCmd - compErrC chan error - compPerErrC chan error - compErrSetC chan error - compWriteLocking bool - compStats cStats - memdbMaxLevel int // For testing. - - // Close. - closeW sync.WaitGroup - closeC chan struct{} - closed uint32 - closer io.Closer -} - -func openDB(s *session) (*DB, error) { - s.log("db@open opening") - start := time.Now() - db := &DB{ - s: s, - // Initial sequence - seq: s.stSeqNum, - // MemDB - memPool: make(chan *memdb.DB, 1), - // Snapshot - snapsList: list.New(), - // Write - writeC: make(chan *Batch), - writeMergedC: make(chan bool), - writeLockC: make(chan struct{}, 1), - writeAckC: make(chan error), - journalC: make(chan *Batch), - journalAckC: make(chan error), - // Compaction - tcompCmdC: make(chan cCmd), - tcompPauseC: make(chan chan<- struct{}), - mcompCmdC: make(chan cCmd), - compErrC: make(chan error), - compPerErrC: make(chan error), - compErrSetC: make(chan error), - // Close - closeC: make(chan struct{}), - } - - // Read-only mode. - readOnly := s.o.GetReadOnly() - - if readOnly { - // Recover journals (read-only mode). - if err := db.recoverJournalRO(); err != nil { - return nil, err - } - } else { - // Recover journals. - if err := db.recoverJournal(); err != nil { - return nil, err - } - - // Remove any obsolete files. - if err := db.checkAndCleanFiles(); err != nil { - // Close journal. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - } - return nil, err - } - - } - - // Doesn't need to be included in the wait group. - go db.compactionError() - go db.mpoolDrain() - - if readOnly { - db.SetReadOnly() - } else { - db.closeW.Add(3) - go db.tCompaction() - go db.mCompaction() - go db.jWriter() - } - - s.logf("db@open done T·%v", time.Since(start)) - - runtime.SetFinalizer(db, (*DB).Close) - return db, nil -} - -// Open opens or creates a DB for the given storage. -// The DB will be created if not exist, unless ErrorIfMissing is true. -// Also, if ErrorIfExist is true and the DB exist Open will returns -// os.ErrExist error. -// -// Open will return an error with type of ErrCorrupted if corruption -// detected in the DB. Corrupted DB can be recovered with Recover -// function. -// -// The returned DB instance is goroutine-safe. -// The DB must be closed after use, by calling Close method. -func Open(stor storage.Storage, o *opt.Options) (db *DB, err error) { - s, err := newSession(stor, o) - if err != nil { - return - } - defer func() { - if err != nil { - s.close() - s.release() - } - }() - - err = s.recover() - if err != nil { - if !os.IsNotExist(err) || s.o.GetErrorIfMissing() { - return - } - err = s.create() - if err != nil { - return - } - } else if s.o.GetErrorIfExist() { - err = os.ErrExist - return - } - - return openDB(s) -} - -// OpenFile opens or creates a DB for the given path. -// The DB will be created if not exist, unless ErrorIfMissing is true. -// Also, if ErrorIfExist is true and the DB exist OpenFile will returns -// os.ErrExist error. -// -// OpenFile uses standard file-system backed storage implementation as -// desribed in the leveldb/storage package. -// -// OpenFile will return an error with type of ErrCorrupted if corruption -// detected in the DB. Corrupted DB can be recovered with Recover -// function. -// -// The returned DB instance is goroutine-safe. -// The DB must be closed after use, by calling Close method. -func OpenFile(path string, o *opt.Options) (db *DB, err error) { - stor, err := storage.OpenFile(path, o.GetReadOnly()) - if err != nil { - return - } - db, err = Open(stor, o) - if err != nil { - stor.Close() - } else { - db.closer = stor - } - return -} - -// Recover recovers and opens a DB with missing or corrupted manifest files -// for the given storage. It will ignore any manifest files, valid or not. -// The DB must already exist or it will returns an error. -// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options. -// -// The returned DB instance is goroutine-safe. -// The DB must be closed after use, by calling Close method. -func Recover(stor storage.Storage, o *opt.Options) (db *DB, err error) { - s, err := newSession(stor, o) - if err != nil { - return - } - defer func() { - if err != nil { - s.close() - s.release() - } - }() - - err = recoverTable(s, o) - if err != nil { - return - } - return openDB(s) -} - -// RecoverFile recovers and opens a DB with missing or corrupted manifest files -// for the given path. It will ignore any manifest files, valid or not. -// The DB must already exist or it will returns an error. -// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options. -// -// RecoverFile uses standard file-system backed storage implementation as desribed -// in the leveldb/storage package. -// -// The returned DB instance is goroutine-safe. -// The DB must be closed after use, by calling Close method. -func RecoverFile(path string, o *opt.Options) (db *DB, err error) { - stor, err := storage.OpenFile(path, false) - if err != nil { - return - } - db, err = Recover(stor, o) - if err != nil { - stor.Close() - } else { - db.closer = stor - } - return -} - -func recoverTable(s *session, o *opt.Options) error { - o = dupOptions(o) - // Mask StrictReader, lets StrictRecovery doing its job. - o.Strict &= ^opt.StrictReader - - // Get all tables and sort it by file number. - fds, err := s.stor.List(storage.TypeTable) - if err != nil { - return err - } - sortFds(fds) - - var ( - maxSeq uint64 - recoveredKey, goodKey, corruptedKey, corruptedBlock, droppedTable int - - // We will drop corrupted table. - strict = o.GetStrict(opt.StrictRecovery) - noSync = o.GetNoSync() - - rec = &sessionRecord{} - bpool = util.NewBufferPool(o.GetBlockSize() + 5) - ) - buildTable := func(iter iterator.Iterator) (tmpFd storage.FileDesc, size int64, err error) { - tmpFd = s.newTemp() - writer, err := s.stor.Create(tmpFd) - if err != nil { - return - } - defer func() { - writer.Close() - if err != nil { - s.stor.Remove(tmpFd) - tmpFd = storage.FileDesc{} - } - }() - - // Copy entries. - tw := table.NewWriter(writer, o) - for iter.Next() { - key := iter.Key() - if validInternalKey(key) { - err = tw.Append(key, iter.Value()) - if err != nil { - return - } - } - } - err = iter.Error() - if err != nil { - return - } - err = tw.Close() - if err != nil { - return - } - if !noSync { - err = writer.Sync() - if err != nil { - return - } - } - size = int64(tw.BytesLen()) - return - } - recoverTable := func(fd storage.FileDesc) error { - s.logf("table@recovery recovering @%d", fd.Num) - reader, err := s.stor.Open(fd) - if err != nil { - return err - } - var closed bool - defer func() { - if !closed { - reader.Close() - } - }() - - // Get file size. - size, err := reader.Seek(0, 2) - if err != nil { - return err - } - - var ( - tSeq uint64 - tgoodKey, tcorruptedKey, tcorruptedBlock int - imin, imax []byte - ) - tr, err := table.NewReader(reader, size, fd, nil, bpool, o) - if err != nil { - return err - } - iter := tr.NewIterator(nil, nil) - if itererr, ok := iter.(iterator.ErrorCallbackSetter); ok { - itererr.SetErrorCallback(func(err error) { - if errors.IsCorrupted(err) { - s.logf("table@recovery block corruption @%d %q", fd.Num, err) - tcorruptedBlock++ - } - }) - } - - // Scan the table. - for iter.Next() { - key := iter.Key() - _, seq, _, kerr := parseInternalKey(key) - if kerr != nil { - tcorruptedKey++ - continue - } - tgoodKey++ - if seq > tSeq { - tSeq = seq - } - if imin == nil { - imin = append([]byte{}, key...) - } - imax = append(imax[:0], key...) - } - if err := iter.Error(); err != nil { - iter.Release() - return err - } - iter.Release() - - goodKey += tgoodKey - corruptedKey += tcorruptedKey - corruptedBlock += tcorruptedBlock - - if strict && (tcorruptedKey > 0 || tcorruptedBlock > 0) { - droppedTable++ - s.logf("table@recovery dropped @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq) - return nil - } - - if tgoodKey > 0 { - if tcorruptedKey > 0 || tcorruptedBlock > 0 { - // Rebuild the table. - s.logf("table@recovery rebuilding @%d", fd.Num) - iter := tr.NewIterator(nil, nil) - tmpFd, newSize, err := buildTable(iter) - iter.Release() - if err != nil { - return err - } - closed = true - reader.Close() - if err := s.stor.Rename(tmpFd, fd); err != nil { - return err - } - size = newSize - } - if tSeq > maxSeq { - maxSeq = tSeq - } - recoveredKey += tgoodKey - // Add table to level 0. - rec.addTable(0, fd.Num, size, imin, imax) - s.logf("table@recovery recovered @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq) - } else { - droppedTable++ - s.logf("table@recovery unrecoverable @%d Ck·%d Cb·%d S·%d", fd.Num, tcorruptedKey, tcorruptedBlock, size) - } - - return nil - } - - // Recover all tables. - if len(fds) > 0 { - s.logf("table@recovery F·%d", len(fds)) - - // Mark file number as used. - s.markFileNum(fds[len(fds)-1].Num) - - for _, fd := range fds { - if err := recoverTable(fd); err != nil { - return err - } - } - - s.logf("table@recovery recovered F·%d N·%d Gk·%d Ck·%d Q·%d", len(fds), recoveredKey, goodKey, corruptedKey, maxSeq) - } - - // Set sequence number. - rec.setSeqNum(maxSeq) - - // Create new manifest. - if err := s.create(); err != nil { - return err - } - - // Commit. - return s.commit(rec) -} - -func (db *DB) recoverJournal() error { - // Get all journals and sort it by file number. - rawFds, err := db.s.stor.List(storage.TypeJournal) - if err != nil { - return err - } - sortFds(rawFds) - - // Journals that will be recovered. - var fds []storage.FileDesc - for _, fd := range rawFds { - if fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum { - fds = append(fds, fd) - } - } - - var ( - ofd storage.FileDesc // Obsolete file. - rec = &sessionRecord{} - ) - - // Recover journals. - if len(fds) > 0 { - db.logf("journal@recovery F·%d", len(fds)) - - // Mark file number as used. - db.s.markFileNum(fds[len(fds)-1].Num) - - var ( - // Options. - strict = db.s.o.GetStrict(opt.StrictJournal) - checksum = db.s.o.GetStrict(opt.StrictJournalChecksum) - writeBuffer = db.s.o.GetWriteBuffer() - - jr *journal.Reader - mdb = memdb.New(db.s.icmp, writeBuffer) - buf = &util.Buffer{} - batch = &Batch{} - ) - - for _, fd := range fds { - db.logf("journal@recovery recovering @%d", fd.Num) - - fr, err := db.s.stor.Open(fd) - if err != nil { - return err - } - - // Create or reset journal reader instance. - if jr == nil { - jr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum) - } else { - jr.Reset(fr, dropper{db.s, fd}, strict, checksum) - } - - // Flush memdb and remove obsolete journal file. - if !ofd.Nil() { - if mdb.Len() > 0 { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - fr.Close() - return err - } - } - - rec.setJournalNum(fd.Num) - rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { - fr.Close() - return err - } - rec.resetAddedTables() - - db.s.stor.Remove(ofd) - ofd = storage.FileDesc{} - } - - // Replay journal to memdb. - mdb.Reset() - for { - r, err := jr.Next() - if err != nil { - if err == io.EOF { - break - } - - fr.Close() - return errors.SetFd(err, fd) - } - - buf.Reset() - if _, err := buf.ReadFrom(r); err != nil { - if err == io.ErrUnexpectedEOF { - // This is error returned due to corruption, with strict == false. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - if err := batch.memDecodeAndReplay(db.seq, buf.Bytes(), mdb); err != nil { - if !strict && errors.IsCorrupted(err) { - db.s.logf("journal error: %v (skipped)", err) - // We won't apply sequence number as it might be corrupted. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - - // Save sequence number. - db.seq = batch.seq + uint64(batch.Len()) - - // Flush it if large enough. - if mdb.Size() >= writeBuffer { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - fr.Close() - return err - } - - mdb.Reset() - } - } - - fr.Close() - ofd = fd - } - - // Flush the last memdb. - if mdb.Len() > 0 { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - return err - } - } - } - - // Create a new journal. - if _, err := db.newMem(0); err != nil { - return err - } - - // Commit. - rec.setJournalNum(db.journalFd.Num) - rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { - // Close journal on error. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - } - return err - } - - // Remove the last obsolete journal file. - if !ofd.Nil() { - db.s.stor.Remove(ofd) - } - - return nil -} - -func (db *DB) recoverJournalRO() error { - // Get all journals and sort it by file number. - rawFds, err := db.s.stor.List(storage.TypeJournal) - if err != nil { - return err - } - sortFds(rawFds) - - // Journals that will be recovered. - var fds []storage.FileDesc - for _, fd := range rawFds { - if fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum { - fds = append(fds, fd) - } - } - - var ( - // Options. - strict = db.s.o.GetStrict(opt.StrictJournal) - checksum = db.s.o.GetStrict(opt.StrictJournalChecksum) - writeBuffer = db.s.o.GetWriteBuffer() - - mdb = memdb.New(db.s.icmp, writeBuffer) - ) - - // Recover journals. - if len(fds) > 0 { - db.logf("journal@recovery RO·Mode F·%d", len(fds)) - - var ( - jr *journal.Reader - buf = &util.Buffer{} - batch = &Batch{} - ) - - for _, fd := range fds { - db.logf("journal@recovery recovering @%d", fd.Num) - - fr, err := db.s.stor.Open(fd) - if err != nil { - return err - } - - // Create or reset journal reader instance. - if jr == nil { - jr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum) - } else { - jr.Reset(fr, dropper{db.s, fd}, strict, checksum) - } - - // Replay journal to memdb. - for { - r, err := jr.Next() - if err != nil { - if err == io.EOF { - break - } - - fr.Close() - return errors.SetFd(err, fd) - } - - buf.Reset() - if _, err := buf.ReadFrom(r); err != nil { - if err == io.ErrUnexpectedEOF { - // This is error returned due to corruption, with strict == false. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - if err := batch.memDecodeAndReplay(db.seq, buf.Bytes(), mdb); err != nil { - if !strict && errors.IsCorrupted(err) { - db.s.logf("journal error: %v (skipped)", err) - // We won't apply sequence number as it might be corrupted. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - - // Save sequence number. - db.seq = batch.seq + uint64(batch.Len()) - } - - fr.Close() - } - } - - // Set memDB. - db.mem = &memDB{db: db, DB: mdb, ref: 1} - - return nil -} - -func memGet(mdb *memdb.DB, ikey internalKey, icmp *iComparer) (ok bool, mv []byte, err error) { - mk, mv, err := mdb.Find(ikey) - if err == nil { - ukey, _, kt, kerr := parseInternalKey(mk) - if kerr != nil { - // Shouldn't have had happen. - panic(kerr) - } - if icmp.uCompare(ukey, ikey.ukey()) == 0 { - if kt == keyTypeDel { - return true, nil, ErrNotFound - } - return true, mv, nil - - } - } else if err != ErrNotFound { - return true, nil, err - } - return -} - -func (db *DB) get(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err error) { - ikey := makeInternalKey(nil, key, seq, keyTypeSeek) - - if auxm != nil { - if ok, mv, me := memGet(auxm, ikey, db.s.icmp); ok { - return append([]byte{}, mv...), me - } - } - - em, fm := db.getMems() - for _, m := range [...]*memDB{em, fm} { - if m == nil { - continue - } - defer m.decref() - - if ok, mv, me := memGet(m.DB, ikey, db.s.icmp); ok { - return append([]byte{}, mv...), me - } - } - - v := db.s.version() - value, cSched, err := v.get(auxt, ikey, ro, false) - v.release() - if cSched { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - return -} - -func nilIfNotFound(err error) error { - if err == ErrNotFound { - return nil - } - return err -} - -func (db *DB) has(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (ret bool, err error) { - ikey := makeInternalKey(nil, key, seq, keyTypeSeek) - - if auxm != nil { - if ok, _, me := memGet(auxm, ikey, db.s.icmp); ok { - return me == nil, nilIfNotFound(me) - } - } - - em, fm := db.getMems() - for _, m := range [...]*memDB{em, fm} { - if m == nil { - continue - } - defer m.decref() - - if ok, _, me := memGet(m.DB, ikey, db.s.icmp); ok { - return me == nil, nilIfNotFound(me) - } - } - - v := db.s.version() - _, cSched, err := v.get(auxt, ikey, ro, true) - v.release() - if cSched { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - if err == nil { - ret = true - } else if err == ErrNotFound { - err = nil - } - return -} - -// Get gets the value for the given key. It returns ErrNotFound if the -// DB does not contains the key. -// -// The returned slice is its own copy, it is safe to modify the contents -// of the returned slice. -// It is safe to modify the contents of the argument after Get returns. -func (db *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - err = db.ok() - if err != nil { - return - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - return db.get(nil, nil, key, se.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Get returns. -func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { - err = db.ok() - if err != nil { - return - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - return db.has(nil, nil, key, se.seq, ro) -} - -// NewIterator returns an iterator for the latest snapshot of the -// underlying DB. -// The returned iterator is not goroutine-safe, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. The resultant key/value pairs are guaranteed to be -// consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (db *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - if err := db.ok(); err != nil { - return iterator.NewEmptyIterator(err) - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - // Iterator holds 'version' lock, 'version' is immutable so snapshot - // can be released after iterator created. - return db.newIterator(nil, nil, se.seq, slice, ro) -} - -// GetSnapshot returns a latest snapshot of the underlying DB. A snapshot -// is a frozen snapshot of a DB state at a particular point in time. The -// content of snapshot are guaranteed to be consistent. -// -// The snapshot must be released after use, by calling Release method. -func (db *DB) GetSnapshot() (*Snapshot, error) { - if err := db.ok(); err != nil { - return nil, err - } - - return db.newSnapshot(), nil -} - -// GetProperty returns value of the given property name. -// -// Property names: -// leveldb.num-files-at-level{n} -// Returns the number of files at level 'n'. -// leveldb.stats -// Returns statistics of the underlying DB. -// leveldb.sstables -// Returns sstables list for each level. -// leveldb.blockpool -// Returns block pool stats. -// leveldb.cachedblock -// Returns size of cached block. -// leveldb.openedtables -// Returns number of opened tables. -// leveldb.alivesnaps -// Returns number of alive snapshots. -// leveldb.aliveiters -// Returns number of alive iterators. -func (db *DB) GetProperty(name string) (value string, err error) { - err = db.ok() - if err != nil { - return - } - - const prefix = "leveldb." - if !strings.HasPrefix(name, prefix) { - return "", ErrNotFound - } - p := name[len(prefix):] - - v := db.s.version() - defer v.release() - - numFilesPrefix := "num-files-at-level" - switch { - case strings.HasPrefix(p, numFilesPrefix): - var level uint - var rest string - n, _ := fmt.Sscanf(p[len(numFilesPrefix):], "%d%s", &level, &rest) - if n != 1 { - err = ErrNotFound - } else { - value = fmt.Sprint(v.tLen(int(level))) - } - case p == "stats": - value = "Compactions\n" + - " Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" + - "-------+------------+---------------+---------------+---------------+---------------\n" - for level, tables := range v.levels { - duration, read, write := db.compStats.getStat(level) - if len(tables) == 0 && duration == 0 { - continue - } - value += fmt.Sprintf(" %3d | %10d | %13.5f | %13.5f | %13.5f | %13.5f\n", - level, len(tables), float64(tables.size())/1048576.0, duration.Seconds(), - float64(read)/1048576.0, float64(write)/1048576.0) - } - case p == "sstables": - for level, tables := range v.levels { - value += fmt.Sprintf("--- level %d ---\n", level) - for _, t := range tables { - value += fmt.Sprintf("%d:%d[%q .. %q]\n", t.fd.Num, t.size, t.imin, t.imax) - } - } - case p == "blockpool": - value = fmt.Sprintf("%v", db.s.tops.bpool) - case p == "cachedblock": - if db.s.tops.bcache != nil { - value = fmt.Sprintf("%d", db.s.tops.bcache.Size()) - } else { - value = "" - } - case p == "openedtables": - value = fmt.Sprintf("%d", db.s.tops.cache.Size()) - case p == "alivesnaps": - value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveSnaps)) - case p == "aliveiters": - value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveIters)) - default: - err = ErrNotFound - } - - return -} - -// SizeOf calculates approximate sizes of the given key ranges. -// The length of the returned sizes are equal with the length of the given -// ranges. The returned sizes measure storage space usage, so if the user -// data compresses by a factor of ten, the returned sizes will be one-tenth -// the size of the corresponding user data size. -// The results may not include the sizes of recently written data. -func (db *DB) SizeOf(ranges []util.Range) (Sizes, error) { - if err := db.ok(); err != nil { - return nil, err - } - - v := db.s.version() - defer v.release() - - sizes := make(Sizes, 0, len(ranges)) - for _, r := range ranges { - imin := makeInternalKey(nil, r.Start, keyMaxSeq, keyTypeSeek) - imax := makeInternalKey(nil, r.Limit, keyMaxSeq, keyTypeSeek) - start, err := v.offsetOf(imin) - if err != nil { - return nil, err - } - limit, err := v.offsetOf(imax) - if err != nil { - return nil, err - } - var size int64 - if limit >= start { - size = limit - start - } - sizes = append(sizes, size) - } - - return sizes, nil -} - -// Close closes the DB. This will also releases any outstanding snapshot, -// abort any in-flight compaction and discard open transaction. -// -// It is not safe to close a DB until all outstanding iterators are released. -// It is valid to call Close multiple times. Other methods should not be -// called after the DB has been closed. -func (db *DB) Close() error { - if !db.setClosed() { - return ErrClosed - } - - start := time.Now() - db.log("db@close closing") - - // Clear the finalizer. - runtime.SetFinalizer(db, nil) - - // Get compaction error. - var err error - select { - case err = <-db.compErrC: - if err == ErrReadOnly { - err = nil - } - default: - } - - // Signal all goroutines. - close(db.closeC) - - // Discard open transaction. - if db.tr != nil { - db.tr.Discard() - } - - // Acquire writer lock. - db.writeLockC <- struct{}{} - - // Wait for all gorotines to exit. - db.closeW.Wait() - - // Closes journal. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - } - - if db.writeDelayN > 0 { - db.logf("db@write was delayed N·%d T·%v", db.writeDelayN, db.writeDelay) - } - - // Close session. - db.s.close() - db.logf("db@close done T·%v", time.Since(start)) - db.s.release() - - if db.closer != nil { - if err1 := db.closer.Close(); err == nil { - err = err1 - } - } - - // NIL'ing pointers. - db.s = nil - db.mem = nil - db.frozenMem = nil - db.journal = nil - db.journalWriter = nil - db.closer = nil - - return err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go deleted file mode 100644 index 9664e64d0e45..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ /dev/null @@ -1,826 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync" - "time" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -var ( - errCompactionTransactExiting = errors.New("leveldb: compaction transact exiting") -) - -type cStat struct { - duration time.Duration - read int64 - write int64 -} - -func (p *cStat) add(n *cStatStaging) { - p.duration += n.duration - p.read += n.read - p.write += n.write -} - -func (p *cStat) get() (duration time.Duration, read, write int64) { - return p.duration, p.read, p.write -} - -type cStatStaging struct { - start time.Time - duration time.Duration - on bool - read int64 - write int64 -} - -func (p *cStatStaging) startTimer() { - if !p.on { - p.start = time.Now() - p.on = true - } -} - -func (p *cStatStaging) stopTimer() { - if p.on { - p.duration += time.Since(p.start) - p.on = false - } -} - -type cStats struct { - lk sync.Mutex - stats []cStat -} - -func (p *cStats) addStat(level int, n *cStatStaging) { - p.lk.Lock() - if level >= len(p.stats) { - newStats := make([]cStat, level+1) - copy(newStats, p.stats) - p.stats = newStats - } - p.stats[level].add(n) - p.lk.Unlock() -} - -func (p *cStats) getStat(level int) (duration time.Duration, read, write int64) { - p.lk.Lock() - defer p.lk.Unlock() - if level < len(p.stats) { - return p.stats[level].get() - } - return -} - -func (db *DB) compactionError() { - var err error -noerr: - // No error. - for { - select { - case err = <-db.compErrSetC: - switch { - case err == nil: - case err == ErrReadOnly, errors.IsCorrupted(err): - goto hasperr - default: - goto haserr - } - case _, _ = <-db.closeC: - return - } - } -haserr: - // Transient error. - for { - select { - case db.compErrC <- err: - case err = <-db.compErrSetC: - switch { - case err == nil: - goto noerr - case err == ErrReadOnly, errors.IsCorrupted(err): - goto hasperr - default: - } - case _, _ = <-db.closeC: - return - } - } -hasperr: - // Persistent error. - for { - select { - case db.compErrC <- err: - case db.compPerErrC <- err: - case db.writeLockC <- struct{}{}: - // Hold write lock, so that write won't pass-through. - db.compWriteLocking = true - case _, _ = <-db.closeC: - if db.compWriteLocking { - // We should release the lock or Close will hang. - <-db.writeLockC - } - return - } - } -} - -type compactionTransactCounter int - -func (cnt *compactionTransactCounter) incr() { - *cnt++ -} - -type compactionTransactInterface interface { - run(cnt *compactionTransactCounter) error - revert() error -} - -func (db *DB) compactionTransact(name string, t compactionTransactInterface) { - defer func() { - if x := recover(); x != nil { - if x == errCompactionTransactExiting { - if err := t.revert(); err != nil { - db.logf("%s revert error %q", name, err) - } - } - panic(x) - } - }() - - const ( - backoffMin = 1 * time.Second - backoffMax = 8 * time.Second - backoffMul = 2 * time.Second - ) - var ( - backoff = backoffMin - backoffT = time.NewTimer(backoff) - lastCnt = compactionTransactCounter(0) - - disableBackoff = db.s.o.GetDisableCompactionBackoff() - ) - for n := 0; ; n++ { - // Check wether the DB is closed. - if db.isClosed() { - db.logf("%s exiting", name) - db.compactionExitTransact() - } else if n > 0 { - db.logf("%s retrying N·%d", name, n) - } - - // Execute. - cnt := compactionTransactCounter(0) - err := t.run(&cnt) - if err != nil { - db.logf("%s error I·%d %q", name, cnt, err) - } - - // Set compaction error status. - select { - case db.compErrSetC <- err: - case perr := <-db.compPerErrC: - if err != nil { - db.logf("%s exiting (persistent error %q)", name, perr) - db.compactionExitTransact() - } - case _, _ = <-db.closeC: - db.logf("%s exiting", name) - db.compactionExitTransact() - } - if err == nil { - return - } - if errors.IsCorrupted(err) { - db.logf("%s exiting (corruption detected)", name) - db.compactionExitTransact() - } - - if !disableBackoff { - // Reset backoff duration if counter is advancing. - if cnt > lastCnt { - backoff = backoffMin - lastCnt = cnt - } - - // Backoff. - backoffT.Reset(backoff) - if backoff < backoffMax { - backoff *= backoffMul - if backoff > backoffMax { - backoff = backoffMax - } - } - select { - case <-backoffT.C: - case _, _ = <-db.closeC: - db.logf("%s exiting", name) - db.compactionExitTransact() - } - } - } -} - -type compactionTransactFunc struct { - runFunc func(cnt *compactionTransactCounter) error - revertFunc func() error -} - -func (t *compactionTransactFunc) run(cnt *compactionTransactCounter) error { - return t.runFunc(cnt) -} - -func (t *compactionTransactFunc) revert() error { - if t.revertFunc != nil { - return t.revertFunc() - } - return nil -} - -func (db *DB) compactionTransactFunc(name string, run func(cnt *compactionTransactCounter) error, revert func() error) { - db.compactionTransact(name, &compactionTransactFunc{run, revert}) -} - -func (db *DB) compactionExitTransact() { - panic(errCompactionTransactExiting) -} - -func (db *DB) compactionCommit(name string, rec *sessionRecord) { - db.compCommitLk.Lock() - defer db.compCommitLk.Unlock() // Defer is necessary. - db.compactionTransactFunc(name+"@commit", func(cnt *compactionTransactCounter) error { - return db.s.commit(rec) - }, nil) -} - -func (db *DB) memCompaction() { - mdb := db.getFrozenMem() - if mdb == nil { - return - } - defer mdb.decref() - - db.logf("memdb@flush N·%d S·%s", mdb.Len(), shortenb(mdb.Size())) - - // Don't compact empty memdb. - if mdb.Len() == 0 { - db.logf("memdb@flush skipping") - // drop frozen memdb - db.dropFrozenMem() - return - } - - // Pause table compaction. - resumeC := make(chan struct{}) - select { - case db.tcompPauseC <- (chan<- struct{})(resumeC): - case <-db.compPerErrC: - close(resumeC) - resumeC = nil - case _, _ = <-db.closeC: - return - } - - var ( - rec = &sessionRecord{} - stats = &cStatStaging{} - flushLevel int - ) - - // Generate tables. - db.compactionTransactFunc("memdb@flush", func(cnt *compactionTransactCounter) (err error) { - stats.startTimer() - flushLevel, err = db.s.flushMemdb(rec, mdb.DB, db.memdbMaxLevel) - stats.stopTimer() - return - }, func() error { - for _, r := range rec.addedTables { - db.logf("memdb@flush revert @%d", r.num) - if err := db.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: r.num}); err != nil { - return err - } - } - return nil - }) - - rec.setJournalNum(db.journalFd.Num) - rec.setSeqNum(db.frozenSeq) - - // Commit. - stats.startTimer() - db.compactionCommit("memdb", rec) - stats.stopTimer() - - db.logf("memdb@flush committed F·%d T·%v", len(rec.addedTables), stats.duration) - - for _, r := range rec.addedTables { - stats.write += r.size - } - db.compStats.addStat(flushLevel, stats) - - // Drop frozen memdb. - db.dropFrozenMem() - - // Resume table compaction. - if resumeC != nil { - select { - case <-resumeC: - close(resumeC) - case _, _ = <-db.closeC: - return - } - } - - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) -} - -type tableCompactionBuilder struct { - db *DB - s *session - c *compaction - rec *sessionRecord - stat0, stat1 *cStatStaging - - snapHasLastUkey bool - snapLastUkey []byte - snapLastSeq uint64 - snapIter int - snapKerrCnt int - snapDropCnt int - - kerrCnt int - dropCnt int - - minSeq uint64 - strict bool - tableSize int - - tw *tWriter -} - -func (b *tableCompactionBuilder) appendKV(key, value []byte) error { - // Create new table if not already. - if b.tw == nil { - // Check for pause event. - if b.db != nil { - select { - case ch := <-b.db.tcompPauseC: - b.db.pauseCompaction(ch) - case _, _ = <-b.db.closeC: - b.db.compactionExitTransact() - default: - } - } - - // Create new table. - var err error - b.tw, err = b.s.tops.create() - if err != nil { - return err - } - } - - // Write key/value into table. - return b.tw.append(key, value) -} - -func (b *tableCompactionBuilder) needFlush() bool { - return b.tw.tw.BytesLen() >= b.tableSize -} - -func (b *tableCompactionBuilder) flush() error { - t, err := b.tw.finish() - if err != nil { - return err - } - b.rec.addTableFile(b.c.sourceLevel+1, t) - b.stat1.write += t.size - b.s.logf("table@build created L%d@%d N·%d S·%s %q:%q", b.c.sourceLevel+1, t.fd.Num, b.tw.tw.EntriesLen(), shortenb(int(t.size)), t.imin, t.imax) - b.tw = nil - return nil -} - -func (b *tableCompactionBuilder) cleanup() { - if b.tw != nil { - b.tw.drop() - b.tw = nil - } -} - -func (b *tableCompactionBuilder) run(cnt *compactionTransactCounter) error { - snapResumed := b.snapIter > 0 - hasLastUkey := b.snapHasLastUkey // The key might has zero length, so this is necessary. - lastUkey := append([]byte{}, b.snapLastUkey...) - lastSeq := b.snapLastSeq - b.kerrCnt = b.snapKerrCnt - b.dropCnt = b.snapDropCnt - // Restore compaction state. - b.c.restore() - - defer b.cleanup() - - b.stat1.startTimer() - defer b.stat1.stopTimer() - - iter := b.c.newIterator() - defer iter.Release() - for i := 0; iter.Next(); i++ { - // Incr transact counter. - cnt.incr() - - // Skip until last state. - if i < b.snapIter { - continue - } - - resumed := false - if snapResumed { - resumed = true - snapResumed = false - } - - ikey := iter.Key() - ukey, seq, kt, kerr := parseInternalKey(ikey) - - if kerr == nil { - shouldStop := !resumed && b.c.shouldStopBefore(ikey) - - if !hasLastUkey || b.s.icmp.uCompare(lastUkey, ukey) != 0 { - // First occurrence of this user key. - - // Only rotate tables if ukey doesn't hop across. - if b.tw != nil && (shouldStop || b.needFlush()) { - if err := b.flush(); err != nil { - return err - } - - // Creates snapshot of the state. - b.c.save() - b.snapHasLastUkey = hasLastUkey - b.snapLastUkey = append(b.snapLastUkey[:0], lastUkey...) - b.snapLastSeq = lastSeq - b.snapIter = i - b.snapKerrCnt = b.kerrCnt - b.snapDropCnt = b.dropCnt - } - - hasLastUkey = true - lastUkey = append(lastUkey[:0], ukey...) - lastSeq = keyMaxSeq - } - - switch { - case lastSeq <= b.minSeq: - // Dropped because newer entry for same user key exist - fallthrough // (A) - case kt == keyTypeDel && seq <= b.minSeq && b.c.baseLevelForKey(lastUkey): - // For this user key: - // (1) there is no data in higher levels - // (2) data in lower levels will have larger seq numbers - // (3) data in layers that are being compacted here and have - // smaller seq numbers will be dropped in the next - // few iterations of this loop (by rule (A) above). - // Therefore this deletion marker is obsolete and can be dropped. - lastSeq = seq - b.dropCnt++ - continue - default: - lastSeq = seq - } - } else { - if b.strict { - return kerr - } - - // Don't drop corrupted keys. - hasLastUkey = false - lastUkey = lastUkey[:0] - lastSeq = keyMaxSeq - b.kerrCnt++ - } - - if err := b.appendKV(ikey, iter.Value()); err != nil { - return err - } - } - - if err := iter.Error(); err != nil { - return err - } - - // Finish last table. - if b.tw != nil && !b.tw.empty() { - return b.flush() - } - return nil -} - -func (b *tableCompactionBuilder) revert() error { - for _, at := range b.rec.addedTables { - b.s.logf("table@build revert @%d", at.num) - if err := b.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: at.num}); err != nil { - return err - } - } - return nil -} - -func (db *DB) tableCompaction(c *compaction, noTrivial bool) { - defer c.release() - - rec := &sessionRecord{} - rec.addCompPtr(c.sourceLevel, c.imax) - - if !noTrivial && c.trivial() { - t := c.levels[0][0] - db.logf("table@move L%d@%d -> L%d", c.sourceLevel, t.fd.Num, c.sourceLevel+1) - rec.delTable(c.sourceLevel, t.fd.Num) - rec.addTableFile(c.sourceLevel+1, t) - db.compactionCommit("table-move", rec) - return - } - - var stats [2]cStatStaging - for i, tables := range c.levels { - for _, t := range tables { - stats[i].read += t.size - // Insert deleted tables into record - rec.delTable(c.sourceLevel+i, t.fd.Num) - } - } - sourceSize := int(stats[0].read + stats[1].read) - minSeq := db.minSeq() - db.logf("table@compaction L%d·%d -> L%d·%d S·%s Q·%d", c.sourceLevel, len(c.levels[0]), c.sourceLevel+1, len(c.levels[1]), shortenb(sourceSize), minSeq) - - b := &tableCompactionBuilder{ - db: db, - s: db.s, - c: c, - rec: rec, - stat1: &stats[1], - minSeq: minSeq, - strict: db.s.o.GetStrict(opt.StrictCompaction), - tableSize: db.s.o.GetCompactionTableSize(c.sourceLevel + 1), - } - db.compactionTransact("table@build", b) - - // Commit. - stats[1].startTimer() - db.compactionCommit("table", rec) - stats[1].stopTimer() - - resultSize := int(stats[1].write) - db.logf("table@compaction committed F%s S%s Ke·%d D·%d T·%v", sint(len(rec.addedTables)-len(rec.deletedTables)), sshortenb(resultSize-sourceSize), b.kerrCnt, b.dropCnt, stats[1].duration) - - // Save compaction stats - for i := range stats { - db.compStats.addStat(c.sourceLevel+1, &stats[i]) - } -} - -func (db *DB) tableRangeCompaction(level int, umin, umax []byte) error { - db.logf("table@compaction range L%d %q:%q", level, umin, umax) - if level >= 0 { - if c := db.s.getCompactionRange(level, umin, umax, true); c != nil { - db.tableCompaction(c, true) - } - } else { - // Retry until nothing to compact. - for { - compacted := false - - // Scan for maximum level with overlapped tables. - v := db.s.version() - m := 1 - for i := m; i < len(v.levels); i++ { - tables := v.levels[i] - if tables.overlaps(db.s.icmp, umin, umax, false) { - m = i - } - } - v.release() - - for level := 0; level < m; level++ { - if c := db.s.getCompactionRange(level, umin, umax, false); c != nil { - db.tableCompaction(c, true) - compacted = true - } - } - - if !compacted { - break - } - } - } - - return nil -} - -func (db *DB) tableAutoCompaction() { - if c := db.s.pickCompaction(); c != nil { - db.tableCompaction(c, false) - } -} - -func (db *DB) tableNeedCompaction() bool { - v := db.s.version() - defer v.release() - return v.needCompaction() -} - -func (db *DB) pauseCompaction(ch chan<- struct{}) { - select { - case ch <- struct{}{}: - case _, _ = <-db.closeC: - db.compactionExitTransact() - } -} - -type cCmd interface { - ack(err error) -} - -type cAuto struct { - ackC chan<- error -} - -func (r cAuto) ack(err error) { - if r.ackC != nil { - defer func() { - recover() - }() - r.ackC <- err - } -} - -type cRange struct { - level int - min, max []byte - ackC chan<- error -} - -func (r cRange) ack(err error) { - if r.ackC != nil { - defer func() { - recover() - }() - r.ackC <- err - } -} - -// This will trigger auto compaction but will not wait for it. -func (db *DB) compTrigger(compC chan<- cCmd) { - select { - case compC <- cAuto{}: - default: - } -} - -// This will trigger auto compation and/or wait for all compaction to be done. -func (db *DB) compTriggerWait(compC chan<- cCmd) (err error) { - ch := make(chan error) - defer close(ch) - // Send cmd. - select { - case compC <- cAuto{ch}: - case err = <-db.compErrC: - return - case _, _ = <-db.closeC: - return ErrClosed - } - // Wait cmd. - select { - case err = <-ch: - case err = <-db.compErrC: - case _, _ = <-db.closeC: - return ErrClosed - } - return err -} - -// Send range compaction request. -func (db *DB) compTriggerRange(compC chan<- cCmd, level int, min, max []byte) (err error) { - ch := make(chan error) - defer close(ch) - // Send cmd. - select { - case compC <- cRange{level, min, max, ch}: - case err := <-db.compErrC: - return err - case _, _ = <-db.closeC: - return ErrClosed - } - // Wait cmd. - select { - case err = <-ch: - case err = <-db.compErrC: - case _, _ = <-db.closeC: - return ErrClosed - } - return err -} - -func (db *DB) mCompaction() { - var x cCmd - - defer func() { - if x := recover(); x != nil { - if x != errCompactionTransactExiting { - panic(x) - } - } - if x != nil { - x.ack(ErrClosed) - } - db.closeW.Done() - }() - - for { - select { - case x = <-db.mcompCmdC: - switch x.(type) { - case cAuto: - db.memCompaction() - x.ack(nil) - x = nil - default: - panic("leveldb: unknown command") - } - case _, _ = <-db.closeC: - return - } - } -} - -func (db *DB) tCompaction() { - var x cCmd - var ackQ []cCmd - - defer func() { - if x := recover(); x != nil { - if x != errCompactionTransactExiting { - panic(x) - } - } - for i := range ackQ { - ackQ[i].ack(ErrClosed) - ackQ[i] = nil - } - if x != nil { - x.ack(ErrClosed) - } - db.closeW.Done() - }() - - for { - if db.tableNeedCompaction() { - select { - case x = <-db.tcompCmdC: - case ch := <-db.tcompPauseC: - db.pauseCompaction(ch) - continue - case _, _ = <-db.closeC: - return - default: - } - } else { - for i := range ackQ { - ackQ[i].ack(nil) - ackQ[i] = nil - } - ackQ = ackQ[:0] - select { - case x = <-db.tcompCmdC: - case ch := <-db.tcompPauseC: - db.pauseCompaction(ch) - continue - case _, _ = <-db.closeC: - return - } - } - if x != nil { - switch cmd := x.(type) { - case cAuto: - ackQ = append(ackQ, x) - case cRange: - x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)) - default: - panic("leveldb: unknown command") - } - x = nil - } - db.tableAutoCompaction() - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go deleted file mode 100644 index 03c24cdab50d..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "errors" - "math/rand" - "runtime" - "sync" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - errInvalidInternalKey = errors.New("leveldb: Iterator: invalid internal key") -) - -type memdbReleaser struct { - once sync.Once - m *memDB -} - -func (mr *memdbReleaser) Release() { - mr.once.Do(func() { - mr.m.decref() - }) -} - -func (db *DB) newRawIterator(auxm *memDB, auxt tFiles, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - strict := opt.GetStrict(db.s.o.Options, ro, opt.StrictReader) - em, fm := db.getMems() - v := db.s.version() - - tableIts := v.getIterators(slice, ro) - n := len(tableIts) + len(auxt) + 3 - its := make([]iterator.Iterator, 0, n) - - if auxm != nil { - ami := auxm.NewIterator(slice) - ami.SetReleaser(&memdbReleaser{m: auxm}) - its = append(its, ami) - } - for _, t := range auxt { - its = append(its, v.s.tops.newIterator(t, slice, ro)) - } - - emi := em.NewIterator(slice) - emi.SetReleaser(&memdbReleaser{m: em}) - its = append(its, emi) - if fm != nil { - fmi := fm.NewIterator(slice) - fmi.SetReleaser(&memdbReleaser{m: fm}) - its = append(its, fmi) - } - its = append(its, tableIts...) - mi := iterator.NewMergedIterator(its, db.s.icmp, strict) - mi.SetReleaser(&versionReleaser{v: v}) - return mi -} - -func (db *DB) newIterator(auxm *memDB, auxt tFiles, seq uint64, slice *util.Range, ro *opt.ReadOptions) *dbIter { - var islice *util.Range - if slice != nil { - islice = &util.Range{} - if slice.Start != nil { - islice.Start = makeInternalKey(nil, slice.Start, keyMaxSeq, keyTypeSeek) - } - if slice.Limit != nil { - islice.Limit = makeInternalKey(nil, slice.Limit, keyMaxSeq, keyTypeSeek) - } - } - rawIter := db.newRawIterator(auxm, auxt, islice, ro) - iter := &dbIter{ - db: db, - icmp: db.s.icmp, - iter: rawIter, - seq: seq, - strict: opt.GetStrict(db.s.o.Options, ro, opt.StrictReader), - key: make([]byte, 0), - value: make([]byte, 0), - } - atomic.AddInt32(&db.aliveIters, 1) - runtime.SetFinalizer(iter, (*dbIter).Release) - return iter -} - -func (db *DB) iterSamplingRate() int { - return rand.Intn(2 * db.s.o.GetIteratorSamplingRate()) -} - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -// dbIter represent an interator states over a database session. -type dbIter struct { - db *DB - icmp *iComparer - iter iterator.Iterator - seq uint64 - strict bool - - smaplingGap int - dir dir - key []byte - value []byte - err error - releaser util.Releaser -} - -func (i *dbIter) sampleSeek() { - ikey := i.iter.Key() - i.smaplingGap -= len(ikey) + len(i.iter.Value()) - for i.smaplingGap < 0 { - i.smaplingGap += i.db.iterSamplingRate() - i.db.sampleSeek(ikey) - } -} - -func (i *dbIter) setErr(err error) { - i.err = err - i.key = nil - i.value = nil -} - -func (i *dbIter) iterErr() { - if err := i.iter.Error(); err != nil { - i.setErr(err) - } -} - -func (i *dbIter) Valid() bool { - return i.err == nil && i.dir > dirEOI -} - -func (i *dbIter) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.iter.First() { - i.dir = dirSOI - return i.next() - } - i.dir = dirEOI - i.iterErr() - return false -} - -func (i *dbIter) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.iter.Last() { - return i.prev() - } - i.dir = dirSOI - i.iterErr() - return false -} - -func (i *dbIter) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - ikey := makeInternalKey(nil, key, i.seq, keyTypeSeek) - if i.iter.Seek(ikey) { - i.dir = dirSOI - return i.next() - } - i.dir = dirEOI - i.iterErr() - return false -} - -func (i *dbIter) next() bool { - for { - if ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if seq <= i.seq { - switch kt { - case keyTypeDel: - // Skip deleted key. - i.key = append(i.key[:0], ukey...) - i.dir = dirForward - case keyTypeVal: - if i.dir == dirSOI || i.icmp.uCompare(ukey, i.key) > 0 { - i.key = append(i.key[:0], ukey...) - i.value = append(i.value[:0], i.iter.Value()...) - i.dir = dirForward - return true - } - } - } - } else if i.strict { - i.setErr(kerr) - break - } - if !i.iter.Next() { - i.dir = dirEOI - i.iterErr() - break - } - } - return false -} - -func (i *dbIter) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if !i.iter.Next() || (i.dir == dirBackward && !i.iter.Next()) { - i.dir = dirEOI - i.iterErr() - return false - } - return i.next() -} - -func (i *dbIter) prev() bool { - i.dir = dirBackward - del := true - if i.iter.Valid() { - for { - if ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if seq <= i.seq { - if !del && i.icmp.uCompare(ukey, i.key) < 0 { - return true - } - del = (kt == keyTypeDel) - if !del { - i.key = append(i.key[:0], ukey...) - i.value = append(i.value[:0], i.iter.Value()...) - } - } - } else if i.strict { - i.setErr(kerr) - return false - } - if !i.iter.Prev() { - break - } - } - } - if del { - i.dir = dirSOI - i.iterErr() - return false - } - return true -} - -func (i *dbIter) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirEOI: - return i.Last() - case dirForward: - for i.iter.Prev() { - if ukey, _, _, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if i.icmp.uCompare(ukey, i.key) < 0 { - goto cont - } - } else if i.strict { - i.setErr(kerr) - return false - } - } - i.dir = dirSOI - i.iterErr() - return false - } - -cont: - return i.prev() -} - -func (i *dbIter) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.key -} - -func (i *dbIter) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.value -} - -func (i *dbIter) Release() { - if i.dir != dirReleased { - // Clear the finalizer. - runtime.SetFinalizer(i, nil) - - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - - i.dir = dirReleased - i.key = nil - i.value = nil - i.iter.Release() - i.iter = nil - atomic.AddInt32(&i.db.aliveIters, -1) - i.db = nil - } -} - -func (i *dbIter) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *dbIter) Error() error { - return i.err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go deleted file mode 100644 index 977f65ba50cd..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "container/list" - "fmt" - "runtime" - "sync" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type snapshotElement struct { - seq uint64 - ref int - e *list.Element -} - -// Acquires a snapshot, based on latest sequence. -func (db *DB) acquireSnapshot() *snapshotElement { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - seq := db.getSeq() - - if e := db.snapsList.Back(); e != nil { - se := e.Value.(*snapshotElement) - if se.seq == seq { - se.ref++ - return se - } else if seq < se.seq { - panic("leveldb: sequence number is not increasing") - } - } - se := &snapshotElement{seq: seq, ref: 1} - se.e = db.snapsList.PushBack(se) - return se -} - -// Releases given snapshot element. -func (db *DB) releaseSnapshot(se *snapshotElement) { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - se.ref-- - if se.ref == 0 { - db.snapsList.Remove(se.e) - se.e = nil - } else if se.ref < 0 { - panic("leveldb: Snapshot: negative element reference") - } -} - -// Gets minimum sequence that not being snapshoted. -func (db *DB) minSeq() uint64 { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - if e := db.snapsList.Front(); e != nil { - return e.Value.(*snapshotElement).seq - } - - return db.getSeq() -} - -// Snapshot is a DB snapshot. -type Snapshot struct { - db *DB - elem *snapshotElement - mu sync.RWMutex - released bool -} - -// Creates new snapshot object. -func (db *DB) newSnapshot() *Snapshot { - snap := &Snapshot{ - db: db, - elem: db.acquireSnapshot(), - } - atomic.AddInt32(&db.aliveSnaps, 1) - runtime.SetFinalizer(snap, (*Snapshot).Release) - return snap -} - -func (snap *Snapshot) String() string { - return fmt.Sprintf("leveldb.Snapshot{%d}", snap.elem.seq) -} - -// Get gets the value for the given key. It returns ErrNotFound if -// the DB does not contains the key. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Get returns. -func (snap *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - err = snap.db.ok() - if err != nil { - return - } - snap.mu.RLock() - defer snap.mu.RUnlock() - if snap.released { - err = ErrSnapshotReleased - return - } - return snap.db.get(nil, nil, key, snap.elem.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Get returns. -func (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { - err = snap.db.ok() - if err != nil { - return - } - snap.mu.RLock() - defer snap.mu.RUnlock() - if snap.released { - err = ErrSnapshotReleased - return - } - return snap.db.has(nil, nil, key, snap.elem.seq, ro) -} - -// NewIterator returns an iterator for the snapshot of the underlying DB. -// The returned iterator is not goroutine-safe, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. The resultant key/value pairs are guaranteed to be -// consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// Releasing the snapshot doesn't mean releasing the iterator too, the -// iterator would be still valid until released. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - if err := snap.db.ok(); err != nil { - return iterator.NewEmptyIterator(err) - } - snap.mu.Lock() - defer snap.mu.Unlock() - if snap.released { - return iterator.NewEmptyIterator(ErrSnapshotReleased) - } - // Since iterator already hold version ref, it doesn't need to - // hold snapshot ref. - return snap.db.newIterator(nil, nil, snap.elem.seq, slice, ro) -} - -// Release releases the snapshot. This will not release any returned -// iterators, the iterators would still be valid until released or the -// underlying DB is closed. -// -// Other methods should not be called after the snapshot has been released. -func (snap *Snapshot) Release() { - snap.mu.Lock() - defer snap.mu.Unlock() - - if !snap.released { - // Clear the finalizer. - runtime.SetFinalizer(snap, nil) - - snap.released = true - snap.db.releaseSnapshot(snap.elem) - atomic.AddInt32(&snap.db.aliveSnaps, -1) - snap.db = nil - snap.elem = nil - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go deleted file mode 100644 index 40f454da1e4f..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go +++ /dev/null @@ -1,219 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync/atomic" - "time" - - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -type memDB struct { - db *DB - *memdb.DB - ref int32 -} - -func (m *memDB) getref() int32 { - return atomic.LoadInt32(&m.ref) -} - -func (m *memDB) incref() { - atomic.AddInt32(&m.ref, 1) -} - -func (m *memDB) decref() { - if ref := atomic.AddInt32(&m.ref, -1); ref == 0 { - // Only put back memdb with std capacity. - if m.Capacity() == m.db.s.o.GetWriteBuffer() { - m.Reset() - m.db.mpoolPut(m.DB) - } - m.db = nil - m.DB = nil - } else if ref < 0 { - panic("negative memdb ref") - } -} - -// Get latest sequence number. -func (db *DB) getSeq() uint64 { - return atomic.LoadUint64(&db.seq) -} - -// Atomically adds delta to seq. -func (db *DB) addSeq(delta uint64) { - atomic.AddUint64(&db.seq, delta) -} - -func (db *DB) setSeq(seq uint64) { - atomic.StoreUint64(&db.seq, seq) -} - -func (db *DB) sampleSeek(ikey internalKey) { - v := db.s.version() - if v.sampleSeek(ikey) { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - v.release() -} - -func (db *DB) mpoolPut(mem *memdb.DB) { - defer func() { - recover() - }() - select { - case db.memPool <- mem: - default: - } -} - -func (db *DB) mpoolGet(n int) *memDB { - var mdb *memdb.DB - select { - case mdb = <-db.memPool: - default: - } - if mdb == nil || mdb.Capacity() < n { - mdb = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n)) - } - return &memDB{ - db: db, - DB: mdb, - } -} - -func (db *DB) mpoolDrain() { - ticker := time.NewTicker(30 * time.Second) - for { - select { - case <-ticker.C: - select { - case <-db.memPool: - default: - } - case _, _ = <-db.closeC: - close(db.memPool) - return - } - } -} - -// Create new memdb and froze the old one; need external synchronization. -// newMem only called synchronously by the writer. -func (db *DB) newMem(n int) (mem *memDB, err error) { - fd := storage.FileDesc{Type: storage.TypeJournal, Num: db.s.allocFileNum()} - w, err := db.s.stor.Create(fd) - if err != nil { - db.s.reuseFileNum(fd.Num) - return - } - - db.memMu.Lock() - defer db.memMu.Unlock() - - if db.frozenMem != nil { - panic("still has frozen mem") - } - - if db.journal == nil { - db.journal = journal.NewWriter(w) - } else { - db.journal.Reset(w) - db.journalWriter.Close() - db.frozenJournalFd = db.journalFd - } - db.journalWriter = w - db.journalFd = fd - db.frozenMem = db.mem - mem = db.mpoolGet(n) - mem.incref() // for self - mem.incref() // for caller - db.mem = mem - // The seq only incremented by the writer. And whoever called newMem - // should hold write lock, so no need additional synchronization here. - db.frozenSeq = db.seq - return -} - -// Get all memdbs. -func (db *DB) getMems() (e, f *memDB) { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.mem == nil { - panic("nil effective mem") - } - db.mem.incref() - if db.frozenMem != nil { - db.frozenMem.incref() - } - return db.mem, db.frozenMem -} - -// Get frozen memdb. -func (db *DB) getEffectiveMem() *memDB { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.mem == nil { - panic("nil effective mem") - } - db.mem.incref() - return db.mem -} - -// Check whether we has frozen memdb. -func (db *DB) hasFrozenMem() bool { - db.memMu.RLock() - defer db.memMu.RUnlock() - return db.frozenMem != nil -} - -// Get frozen memdb. -func (db *DB) getFrozenMem() *memDB { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.frozenMem != nil { - db.frozenMem.incref() - } - return db.frozenMem -} - -// Drop frozen memdb; assume that frozen memdb isn't nil. -func (db *DB) dropFrozenMem() { - db.memMu.Lock() - if err := db.s.stor.Remove(db.frozenJournalFd); err != nil { - db.logf("journal@remove removing @%d %q", db.frozenJournalFd.Num, err) - } else { - db.logf("journal@remove removed @%d", db.frozenJournalFd.Num) - } - db.frozenJournalFd = storage.FileDesc{} - db.frozenMem.decref() - db.frozenMem = nil - db.memMu.Unlock() -} - -// Set closed flag; return true if not already closed. -func (db *DB) setClosed() bool { - return atomic.CompareAndSwapUint32(&db.closed, 0, 1) -} - -// Check whether DB was closed. -func (db *DB) isClosed() bool { - return atomic.LoadUint32(&db.closed) != 0 -} - -// Check read ok status. -func (db *DB) ok() error { - if db.isClosed() { - return ErrClosed - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go deleted file mode 100644 index fca88037b810..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) 2016, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "errors" - "sync" - "time" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var errTransactionDone = errors.New("leveldb: transaction already closed") - -// Transaction is the transaction handle. -type Transaction struct { - db *DB - lk sync.RWMutex - seq uint64 - mem *memDB - tables tFiles - ikScratch []byte - rec sessionRecord - stats cStatStaging - closed bool -} - -// Get gets the value for the given key. It returns ErrNotFound if the -// DB does not contains the key. -// -// The returned slice is its own copy, it is safe to modify the contents -// of the returned slice. -// It is safe to modify the contents of the argument after Get returns. -func (tr *Transaction) Get(key []byte, ro *opt.ReadOptions) ([]byte, error) { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return nil, errTransactionDone - } - return tr.db.get(tr.mem.DB, tr.tables, key, tr.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Has returns. -func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return false, errTransactionDone - } - return tr.db.has(tr.mem.DB, tr.tables, key, tr.seq, ro) -} - -// NewIterator returns an iterator for the latest snapshot of the transaction. -// The returned iterator is not goroutine-safe, but it is safe to use multiple -// iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently while writes to the -// transaction. The resultant key/value pairs are guaranteed to be consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (tr *Transaction) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return iterator.NewEmptyIterator(errTransactionDone) - } - tr.mem.incref() - return tr.db.newIterator(tr.mem, tr.tables, tr.seq, slice, ro) -} - -func (tr *Transaction) flush() error { - // Flush memdb. - if tr.mem.Len() != 0 { - tr.stats.startTimer() - iter := tr.mem.NewIterator(nil) - t, n, err := tr.db.s.tops.createFrom(iter) - iter.Release() - tr.stats.stopTimer() - if err != nil { - return err - } - if tr.mem.getref() == 1 { - tr.mem.Reset() - } else { - tr.mem.decref() - tr.mem = tr.db.mpoolGet(0) - tr.mem.incref() - } - tr.tables = append(tr.tables, t) - tr.rec.addTableFile(0, t) - tr.stats.write += t.size - tr.db.logf("transaction@flush created L0@%d N·%d S·%s %q:%q", t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax) - } - return nil -} - -func (tr *Transaction) put(kt keyType, key, value []byte) error { - tr.ikScratch = makeInternalKey(tr.ikScratch, key, tr.seq+1, kt) - if tr.mem.Free() < len(tr.ikScratch)+len(value) { - if err := tr.flush(); err != nil { - return err - } - } - if err := tr.mem.Put(tr.ikScratch, value); err != nil { - return err - } - tr.seq++ - return nil -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Put returns. -func (tr *Transaction) Put(key, value []byte, wo *opt.WriteOptions) error { - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return tr.put(keyTypeVal, key, value) -} - -// Delete deletes the value for the given key. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Delete returns. -func (tr *Transaction) Delete(key []byte, wo *opt.WriteOptions) error { - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return tr.put(keyTypeDel, key, nil) -} - -// Write apply the given batch to the transaction. The batch will be applied -// sequentially. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Write returns. -func (tr *Transaction) Write(b *Batch, wo *opt.WriteOptions) error { - if b == nil || b.Len() == 0 { - return nil - } - - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return b.decodeRec(func(i int, kt keyType, key, value []byte) error { - return tr.put(kt, key, value) - }) -} - -func (tr *Transaction) setDone() { - tr.closed = true - tr.db.tr = nil - tr.mem.decref() - <-tr.db.writeLockC -} - -// Commit commits the transaction. -// -// Other methods should not be called after transaction has been committed. -func (tr *Transaction) Commit() error { - if err := tr.db.ok(); err != nil { - return err - } - - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - defer tr.setDone() - if err := tr.flush(); err != nil { - tr.discard() - return err - } - if len(tr.tables) != 0 { - // Committing transaction. - tr.rec.setSeqNum(tr.seq) - tr.db.compCommitLk.Lock() - defer tr.db.compCommitLk.Unlock() - for retry := 0; retry < 3; retry++ { - if err := tr.db.s.commit(&tr.rec); err != nil { - tr.db.logf("transaction@commit error R·%d %q", retry, err) - select { - case <-time.After(time.Second): - case _, _ = <-tr.db.closeC: - tr.db.logf("transaction@commit exiting") - return err - } - } else { - // Success. Set db.seq. - tr.db.setSeq(tr.seq) - break - } - } - // Trigger table auto-compaction. - tr.db.compTrigger(tr.db.tcompCmdC) - } - return nil -} - -func (tr *Transaction) discard() { - // Discard transaction. - for _, t := range tr.tables { - tr.db.logf("transaction@discard @%d", t.fd.Num) - if err1 := tr.db.s.stor.Remove(t.fd); err1 == nil { - tr.db.s.reuseFileNum(t.fd.Num) - } - } -} - -// Discard discards the transaction. -// -// Other methods should not be called after transaction has been discarded. -func (tr *Transaction) Discard() { - tr.lk.Lock() - if !tr.closed { - tr.discard() - tr.setDone() - } - tr.lk.Unlock() -} - -// OpenTransaction opens an atomic DB transaction. Only one transaction can be -// opened at a time. Write will be blocked until the transaction is committed or -// discarded. -// The returned transaction handle is goroutine-safe. -// -// The transaction must be closed once done, either by committing or discarding -// the transaction. -// Closing the DB will discard open transaction. -func (db *DB) OpenTransaction() (*Transaction, error) { - if err := db.ok(); err != nil { - return nil, err - } - - // The write happen synchronously. - select { - case db.writeLockC <- struct{}{}: - case err := <-db.compPerErrC: - return nil, err - case _, _ = <-db.closeC: - return nil, ErrClosed - } - - if db.tr != nil { - panic("leveldb: has open transaction") - } - - // Flush current memdb. - if db.mem != nil && db.mem.Len() != 0 { - if _, err := db.rotateMem(0, true); err != nil { - return nil, err - } - } - - tr := &Transaction{ - db: db, - seq: db.seq, - mem: db.mpoolGet(0), - } - tr.mem.incref() - db.tr = tr - return tr, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go deleted file mode 100644 index 7fd386ca43c4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Reader is the interface that wraps basic Get and NewIterator methods. -// This interface implemented by both DB and Snapshot. -type Reader interface { - Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) - NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator -} - -// Sizes is list of size. -type Sizes []int64 - -// Sum returns sum of the sizes. -func (sizes Sizes) Sum() int64 { - var sum int64 - for _, size := range sizes { - sum += size - } - return sum -} - -// Logging. -func (db *DB) log(v ...interface{}) { db.s.log(v...) } -func (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) } - -// Check and clean files. -func (db *DB) checkAndCleanFiles() error { - v := db.s.version() - defer v.release() - - tmap := make(map[int64]bool) - for _, tables := range v.levels { - for _, t := range tables { - tmap[t.fd.Num] = false - } - } - - fds, err := db.s.stor.List(storage.TypeAll) - if err != nil { - return err - } - - var nt int - var rem []storage.FileDesc - for _, fd := range fds { - keep := true - switch fd.Type { - case storage.TypeManifest: - keep = fd.Num >= db.s.manifestFd.Num - case storage.TypeJournal: - if !db.frozenJournalFd.Nil() { - keep = fd.Num >= db.frozenJournalFd.Num - } else { - keep = fd.Num >= db.journalFd.Num - } - case storage.TypeTable: - _, keep = tmap[fd.Num] - if keep { - tmap[fd.Num] = true - nt++ - } - } - - if !keep { - rem = append(rem, fd) - } - } - - if nt != len(tmap) { - var mfds []storage.FileDesc - for num, present := range tmap { - if !present { - mfds = append(mfds, storage.FileDesc{storage.TypeTable, num}) - db.logf("db@janitor table missing @%d", num) - } - } - return errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds}) - } - - db.logf("db@janitor F·%d G·%d", len(fds), len(rem)) - for _, fd := range rem { - db.logf("db@janitor removing %s-%d", fd.Type, fd.Num) - if err := db.s.stor.Remove(fd); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go deleted file mode 100644 index 5576761fedb6..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "time" - - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -func (db *DB) writeJournal(b *Batch) error { - w, err := db.journal.Next() - if err != nil { - return err - } - if _, err := w.Write(b.encode()); err != nil { - return err - } - if err := db.journal.Flush(); err != nil { - return err - } - if b.sync { - return db.journalWriter.Sync() - } - return nil -} - -func (db *DB) jWriter() { - defer db.closeW.Done() - for { - select { - case b := <-db.journalC: - if b != nil { - db.journalAckC <- db.writeJournal(b) - } - case _, _ = <-db.closeC: - return - } - } -} - -func (db *DB) rotateMem(n int, wait bool) (mem *memDB, err error) { - // Wait for pending memdb compaction. - err = db.compTriggerWait(db.mcompCmdC) - if err != nil { - return - } - - // Create new memdb and journal. - mem, err = db.newMem(n) - if err != nil { - return - } - - // Schedule memdb compaction. - if wait { - err = db.compTriggerWait(db.mcompCmdC) - } else { - db.compTrigger(db.mcompCmdC) - } - return -} - -func (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) { - delayed := false - flush := func() (retry bool) { - v := db.s.version() - defer v.release() - mdb = db.getEffectiveMem() - defer func() { - if retry { - mdb.decref() - mdb = nil - } - }() - mdbFree = mdb.Free() - switch { - case v.tLen(0) >= db.s.o.GetWriteL0SlowdownTrigger() && !delayed: - delayed = true - time.Sleep(time.Millisecond) - case mdbFree >= n: - return false - case v.tLen(0) >= db.s.o.GetWriteL0PauseTrigger(): - delayed = true - err = db.compTriggerWait(db.tcompCmdC) - if err != nil { - return false - } - default: - // Allow memdb to grow if it has no entry. - if mdb.Len() == 0 { - mdbFree = n - } else { - mdb.decref() - mdb, err = db.rotateMem(n, false) - if err == nil { - mdbFree = mdb.Free() - } else { - mdbFree = 0 - } - } - return false - } - return true - } - start := time.Now() - for flush() { - } - if delayed { - db.writeDelay += time.Since(start) - db.writeDelayN++ - } else if db.writeDelayN > 0 { - db.logf("db@write was delayed N·%d T·%v", db.writeDelayN, db.writeDelay) - db.writeDelay = 0 - db.writeDelayN = 0 - } - return -} - -// Write apply the given batch to the DB. The batch will be applied -// sequentially. -// -// It is safe to modify the contents of the arguments after Write returns. -func (db *DB) Write(b *Batch, wo *opt.WriteOptions) (err error) { - err = db.ok() - if err != nil || b == nil || b.Len() == 0 { - return - } - - b.init(wo.GetSync() && !db.s.o.GetNoSync()) - - if b.size() > db.s.o.GetWriteBuffer() && !db.s.o.GetDisableLargeBatchTransaction() { - // Writes using transaction. - tr, err1 := db.OpenTransaction() - if err1 != nil { - return err1 - } - if err1 := tr.Write(b, wo); err1 != nil { - tr.Discard() - return err1 - } - return tr.Commit() - } - - // The write happen synchronously. - select { - case db.writeC <- b: - if <-db.writeMergedC { - return <-db.writeAckC - } - // Continue, the write lock already acquired by previous writer - // and handed out to us. - case db.writeLockC <- struct{}{}: - case err = <-db.compPerErrC: - return - case _, _ = <-db.closeC: - return ErrClosed - } - - merged := 0 - danglingMerge := false - defer func() { - for i := 0; i < merged; i++ { - db.writeAckC <- err - } - if danglingMerge { - // Only one dangling merge at most, so this is safe. - db.writeMergedC <- false - } else { - <-db.writeLockC - } - }() - - mdb, mdbFree, err := db.flush(b.size()) - if err != nil { - return - } - defer mdb.decref() - - // Calculate maximum size of the batch. - m := 1 << 20 - if x := b.size(); x <= 128<<10 { - m = x + (128 << 10) - } - m = minInt(m, mdbFree) - - // Merge with other batch. -drain: - for b.size() < m && !b.sync { - select { - case nb := <-db.writeC: - if b.size()+nb.size() <= m { - b.append(nb) - db.writeMergedC <- true - merged++ - } else { - danglingMerge = true - break drain - } - default: - break drain - } - } - - // Set batch first seq number relative from last seq. - b.seq = db.seq + 1 - - // Write journal concurrently if it is large enough. - if b.size() >= (128 << 10) { - // Push the write batch to the journal writer - select { - case db.journalC <- b: - // Write into memdb - if berr := b.memReplay(mdb.DB); berr != nil { - panic(berr) - } - case err = <-db.compPerErrC: - return - case _, _ = <-db.closeC: - err = ErrClosed - return - } - // Wait for journal writer - select { - case err = <-db.journalAckC: - if err != nil { - // Revert memdb if error detected - if berr := b.revertMemReplay(mdb.DB); berr != nil { - panic(berr) - } - return - } - case _, _ = <-db.closeC: - err = ErrClosed - return - } - } else { - err = db.writeJournal(b) - if err != nil { - return - } - if berr := b.memReplay(mdb.DB); berr != nil { - panic(berr) - } - } - - // Set last seq number. - db.addSeq(uint64(b.Len())) - - if b.size() >= mdbFree { - db.rotateMem(0, false) - } - return -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. -// -// It is safe to modify the contents of the arguments after Put returns. -func (db *DB) Put(key, value []byte, wo *opt.WriteOptions) error { - b := new(Batch) - b.Put(key, value) - return db.Write(b, wo) -} - -// Delete deletes the value for the given key. -// -// It is safe to modify the contents of the arguments after Delete returns. -func (db *DB) Delete(key []byte, wo *opt.WriteOptions) error { - b := new(Batch) - b.Delete(key) - return db.Write(b, wo) -} - -func isMemOverlaps(icmp *iComparer, mem *memdb.DB, min, max []byte) bool { - iter := mem.NewIterator(nil) - defer iter.Release() - return (max == nil || (iter.First() && icmp.uCompare(max, internalKey(iter.Key()).ukey()) >= 0)) && - (min == nil || (iter.Last() && icmp.uCompare(min, internalKey(iter.Key()).ukey()) <= 0)) -} - -// CompactRange compacts the underlying DB for the given key range. -// In particular, deleted and overwritten versions are discarded, -// and the data is rearranged to reduce the cost of operations -// needed to access the data. This operation should typically only -// be invoked by users who understand the underlying implementation. -// -// A nil Range.Start is treated as a key before all keys in the DB. -// And a nil Range.Limit is treated as a key after all keys in the DB. -// Therefore if both is nil then it will compact entire DB. -func (db *DB) CompactRange(r util.Range) error { - if err := db.ok(); err != nil { - return err - } - - // Lock writer. - select { - case db.writeLockC <- struct{}{}: - case err := <-db.compPerErrC: - return err - case _, _ = <-db.closeC: - return ErrClosed - } - - // Check for overlaps in memdb. - mdb := db.getEffectiveMem() - defer mdb.decref() - if isMemOverlaps(db.s.icmp, mdb.DB, r.Start, r.Limit) { - // Memdb compaction. - if _, err := db.rotateMem(0, false); err != nil { - <-db.writeLockC - return err - } - <-db.writeLockC - if err := db.compTriggerWait(db.mcompCmdC); err != nil { - return err - } - } else { - <-db.writeLockC - } - - // Table compaction. - return db.compTriggerRange(db.tcompCmdC, -1, r.Start, r.Limit) -} - -// SetReadOnly makes DB read-only. It will stay read-only until reopened. -func (db *DB) SetReadOnly() error { - if err := db.ok(); err != nil { - return err - } - - // Lock writer. - select { - case db.writeLockC <- struct{}{}: - db.compWriteLocking = true - case err := <-db.compPerErrC: - return err - case _, _ = <-db.closeC: - return ErrClosed - } - - // Set compaction read-only. - select { - case db.compErrSetC <- ErrReadOnly: - case perr := <-db.compPerErrC: - return perr - case _, _ = <-db.closeC: - return ErrClosed - } - - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go b/vendor/github.com/syndtr/goleveldb/leveldb/doc.go deleted file mode 100644 index 53f13bb24ccf..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package leveldb provides implementation of LevelDB key/value database. -// -// Create or open a database: -// -// db, err := leveldb.OpenFile("path/to/db", nil) -// ... -// defer db.Close() -// ... -// -// Read or modify the database content: -// -// // Remember that the contents of the returned slice should not be modified. -// data, err := db.Get([]byte("key"), nil) -// ... -// err = db.Put([]byte("key"), []byte("value"), nil) -// ... -// err = db.Delete([]byte("key"), nil) -// ... -// -// Iterate over database content: -// -// iter := db.NewIterator(nil, nil) -// for iter.Next() { -// // Remember that the contents of the returned slice should not be modified, and -// // only valid until the next call to Next. -// key := iter.Key() -// value := iter.Value() -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Iterate over subset of database content with a particular prefix: -// iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil) -// for iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Seek-then-Iterate: -// -// iter := db.NewIterator(nil, nil) -// for ok := iter.Seek(key); ok; ok = iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Iterate over subset of database content: -// -// iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil) -// for iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Batch writes: -// -// batch := new(leveldb.Batch) -// batch.Put([]byte("foo"), []byte("value")) -// batch.Put([]byte("bar"), []byte("another value")) -// batch.Delete([]byte("baz")) -// err = db.Write(batch, nil) -// ... -// -// Use bloom filter: -// -// o := &opt.Options{ -// Filter: filter.NewBloomFilter(10), -// } -// db, err := leveldb.OpenFile("path/to/db", o) -// ... -// defer db.Close() -// ... -package leveldb diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/errors.go b/vendor/github.com/syndtr/goleveldb/leveldb/errors.go deleted file mode 100644 index c8bd66a5aa9a..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/errors.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" -) - -var ( - ErrNotFound = errors.ErrNotFound - ErrReadOnly = errors.New("leveldb: read-only mode") - ErrSnapshotReleased = errors.New("leveldb: snapshot released") - ErrIterReleased = errors.New("leveldb: iterator released") - ErrClosed = errors.New("leveldb: closed") -) diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go b/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go deleted file mode 100644 index 9a0f6e2c1513..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package errors provides common error types used throughout leveldb. -package errors - -import ( - "errors" - "fmt" - - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - ErrNotFound = New("leveldb: not found") - ErrReleased = util.ErrReleased - ErrHasReleaser = util.ErrHasReleaser -) - -// New returns an error that formats as the given text. -func New(text string) error { - return errors.New(text) -} - -// ErrCorrupted is the type that wraps errors that indicate corruption in -// the database. -type ErrCorrupted struct { - Fd storage.FileDesc - Err error -} - -func (e *ErrCorrupted) Error() string { - if !e.Fd.Nil() { - return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd) - } else { - return e.Err.Error() - } -} - -// NewErrCorrupted creates new ErrCorrupted error. -func NewErrCorrupted(fd storage.FileDesc, err error) error { - return &ErrCorrupted{fd, err} -} - -// IsCorrupted returns a boolean indicating whether the error is indicating -// a corruption. -func IsCorrupted(err error) bool { - switch err.(type) { - case *ErrCorrupted: - return true - case *storage.ErrCorrupted: - return true - } - return false -} - -// ErrMissingFiles is the type that indicating a corruption due to missing -// files. ErrMissingFiles always wrapped with ErrCorrupted. -type ErrMissingFiles struct { - Fds []storage.FileDesc -} - -func (e *ErrMissingFiles) Error() string { return "file missing" } - -// SetFd sets 'file info' of the given error with the given file. -// Currently only ErrCorrupted is supported, otherwise will do nothing. -func SetFd(err error, fd storage.FileDesc) error { - switch x := err.(type) { - case *ErrCorrupted: - x.Fd = fd - return x - } - return err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter.go deleted file mode 100644 index e961e420d3c4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/filter" -) - -type iFilter struct { - filter.Filter -} - -func (f iFilter) Contains(filter, key []byte) bool { - return f.Filter.Contains(filter, internalKey(key).ukey()) -} - -func (f iFilter) NewGenerator() filter.FilterGenerator { - return iFilterGenerator{f.Filter.NewGenerator()} -} - -type iFilterGenerator struct { - filter.FilterGenerator -} - -func (g iFilterGenerator) Add(key []byte) { - g.FilterGenerator.Add(internalKey(key).ukey()) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go deleted file mode 100644 index bab0e99705f5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package filter - -import ( - "github.com/syndtr/goleveldb/leveldb/util" -) - -func bloomHash(key []byte) uint32 { - return util.Hash(key, 0xbc9f1d34) -} - -type bloomFilter int - -// The bloom filter serializes its parameters and is backward compatible -// with respect to them. Therefor, its parameters are not added to its -// name. -func (bloomFilter) Name() string { - return "leveldb.BuiltinBloomFilter" -} - -func (f bloomFilter) Contains(filter, key []byte) bool { - nBytes := len(filter) - 1 - if nBytes < 1 { - return false - } - nBits := uint32(nBytes * 8) - - // Use the encoded k so that we can read filters generated by - // bloom filters created using different parameters. - k := filter[nBytes] - if k > 30 { - // Reserved for potentially new encodings for short bloom filters. - // Consider it a match. - return true - } - - kh := bloomHash(key) - delta := (kh >> 17) | (kh << 15) // Rotate right 17 bits - for j := uint8(0); j < k; j++ { - bitpos := kh % nBits - if (uint32(filter[bitpos/8]) & (1 << (bitpos % 8))) == 0 { - return false - } - kh += delta - } - return true -} - -func (f bloomFilter) NewGenerator() FilterGenerator { - // Round down to reduce probing cost a little bit. - k := uint8(f * 69 / 100) // 0.69 =~ ln(2) - if k < 1 { - k = 1 - } else if k > 30 { - k = 30 - } - return &bloomFilterGenerator{ - n: int(f), - k: k, - } -} - -type bloomFilterGenerator struct { - n int - k uint8 - - keyHashes []uint32 -} - -func (g *bloomFilterGenerator) Add(key []byte) { - // Use double-hashing to generate a sequence of hash values. - // See analysis in [Kirsch,Mitzenmacher 2006]. - g.keyHashes = append(g.keyHashes, bloomHash(key)) -} - -func (g *bloomFilterGenerator) Generate(b Buffer) { - // Compute bloom filter size (in both bits and bytes) - nBits := uint32(len(g.keyHashes) * g.n) - // For small n, we can see a very high false positive rate. Fix it - // by enforcing a minimum bloom filter length. - if nBits < 64 { - nBits = 64 - } - nBytes := (nBits + 7) / 8 - nBits = nBytes * 8 - - dest := b.Alloc(int(nBytes) + 1) - dest[nBytes] = g.k - for _, kh := range g.keyHashes { - delta := (kh >> 17) | (kh << 15) // Rotate right 17 bits - for j := uint8(0); j < g.k; j++ { - bitpos := kh % nBits - dest[bitpos/8] |= (1 << (bitpos % 8)) - kh += delta - } - } - - g.keyHashes = g.keyHashes[:0] -} - -// NewBloomFilter creates a new initialized bloom filter for given -// bitsPerKey. -// -// Since bitsPerKey is persisted individually for each bloom filter -// serialization, bloom filters are backwards compatible with respect to -// changing bitsPerKey. This means that no big performance penalty will -// be experienced when changing the parameter. See documentation for -// opt.Options.Filter for more information. -func NewBloomFilter(bitsPerKey int) Filter { - return bloomFilter(bitsPerKey) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go deleted file mode 100644 index 7a925c5a869e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package filter provides interface and implementation of probabilistic -// data structure. -// -// The filter is resposible for creating small filter from a set of keys. -// These filter will then used to test whether a key is a member of the set. -// In many cases, a filter can cut down the number of disk seeks from a -// handful to a single disk seek per DB.Get call. -package filter - -// Buffer is the interface that wraps basic Alloc, Write and WriteByte methods. -type Buffer interface { - // Alloc allocs n bytes of slice from the buffer. This also advancing - // write offset. - Alloc(n int) []byte - - // Write appends the contents of p to the buffer. - Write(p []byte) (n int, err error) - - // WriteByte appends the byte c to the buffer. - WriteByte(c byte) error -} - -// Filter is the filter. -type Filter interface { - // Name returns the name of this policy. - // - // Note that if the filter encoding changes in an incompatible way, - // the name returned by this method must be changed. Otherwise, old - // incompatible filters may be passed to methods of this type. - Name() string - - // NewGenerator creates a new filter generator. - NewGenerator() FilterGenerator - - // Contains returns true if the filter contains the given key. - // - // The filter are filters generated by the filter generator. - Contains(filter, key []byte) bool -} - -// FilterGenerator is the filter generator. -type FilterGenerator interface { - // Add adds a key to the filter generator. - // - // The key may become invalid after call to this method end, therefor - // key must be copied if implementation require keeping key for later - // use. The key should not modified directly, doing so may cause - // undefined results. - Add(key []byte) - - // Generate generates filters based on keys passed so far. After call - // to Generate the filter generator maybe resetted, depends on implementation. - Generate(b Buffer) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go deleted file mode 100644 index a23ab05f70fe..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/util" -) - -// BasicArray is the interface that wraps basic Len and Search method. -type BasicArray interface { - // Len returns length of the array. - Len() int - - // Search finds smallest index that point to a key that is greater - // than or equal to the given key. - Search(key []byte) int -} - -// Array is the interface that wraps BasicArray and basic Index method. -type Array interface { - BasicArray - - // Index returns key/value pair with index of i. - Index(i int) (key, value []byte) -} - -// Array is the interface that wraps BasicArray and basic Get method. -type ArrayIndexer interface { - BasicArray - - // Get returns a new data iterator with index of i. - Get(i int) Iterator -} - -type basicArrayIterator struct { - util.BasicReleaser - array BasicArray - pos int - err error -} - -func (i *basicArrayIterator) Valid() bool { - return i.pos >= 0 && i.pos < i.array.Len() && !i.Released() -} - -func (i *basicArrayIterator) First() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.array.Len() == 0 { - i.pos = -1 - return false - } - i.pos = 0 - return true -} - -func (i *basicArrayIterator) Last() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - n := i.array.Len() - if n == 0 { - i.pos = 0 - return false - } - i.pos = n - 1 - return true -} - -func (i *basicArrayIterator) Seek(key []byte) bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - n := i.array.Len() - if n == 0 { - i.pos = 0 - return false - } - i.pos = i.array.Search(key) - if i.pos >= n { - return false - } - return true -} - -func (i *basicArrayIterator) Next() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.pos++ - if n := i.array.Len(); i.pos >= n { - i.pos = n - return false - } - return true -} - -func (i *basicArrayIterator) Prev() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.pos-- - if i.pos < 0 { - i.pos = -1 - return false - } - return true -} - -func (i *basicArrayIterator) Error() error { return i.err } - -type arrayIterator struct { - basicArrayIterator - array Array - pos int - key, value []byte -} - -func (i *arrayIterator) updateKV() { - if i.pos == i.basicArrayIterator.pos { - return - } - i.pos = i.basicArrayIterator.pos - if i.Valid() { - i.key, i.value = i.array.Index(i.pos) - } else { - i.key = nil - i.value = nil - } -} - -func (i *arrayIterator) Key() []byte { - i.updateKV() - return i.key -} - -func (i *arrayIterator) Value() []byte { - i.updateKV() - return i.value -} - -type arrayIteratorIndexer struct { - basicArrayIterator - array ArrayIndexer -} - -func (i *arrayIteratorIndexer) Get() Iterator { - if i.Valid() { - return i.array.Get(i.basicArrayIterator.pos) - } - return nil -} - -// NewArrayIterator returns an iterator from the given array. -func NewArrayIterator(array Array) Iterator { - return &arrayIterator{ - basicArrayIterator: basicArrayIterator{array: array, pos: -1}, - array: array, - pos: -1, - } -} - -// NewArrayIndexer returns an index iterator from the given array. -func NewArrayIndexer(array ArrayIndexer) IteratorIndexer { - return &arrayIteratorIndexer{ - basicArrayIterator: basicArrayIterator{array: array, pos: -1}, - array: array, - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go deleted file mode 100644 index 939adbb9332b..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// IteratorIndexer is the interface that wraps CommonIterator and basic Get -// method. IteratorIndexer provides index for indexed iterator. -type IteratorIndexer interface { - CommonIterator - - // Get returns a new data iterator for the current position, or nil if - // done. - Get() Iterator -} - -type indexedIterator struct { - util.BasicReleaser - index IteratorIndexer - strict bool - - data Iterator - err error - errf func(err error) - closed bool -} - -func (i *indexedIterator) setData() { - if i.data != nil { - i.data.Release() - } - i.data = i.index.Get() -} - -func (i *indexedIterator) clearData() { - if i.data != nil { - i.data.Release() - } - i.data = nil -} - -func (i *indexedIterator) indexErr() { - if err := i.index.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - i.err = err - } -} - -func (i *indexedIterator) dataErr() bool { - if err := i.data.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - if i.strict || !errors.IsCorrupted(err) { - i.err = err - return true - } - } - return false -} - -func (i *indexedIterator) Valid() bool { - return i.data != nil && i.data.Valid() -} - -func (i *indexedIterator) First() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.First() { - i.indexErr() - i.clearData() - return false - } - i.setData() - return i.Next() -} - -func (i *indexedIterator) Last() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.Last() { - i.indexErr() - i.clearData() - return false - } - i.setData() - if !i.data.Last() { - if i.dataErr() { - return false - } - i.clearData() - return i.Prev() - } - return true -} - -func (i *indexedIterator) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.Seek(key) { - i.indexErr() - i.clearData() - return false - } - i.setData() - if !i.data.Seek(key) { - if i.dataErr() { - return false - } - i.clearData() - return i.Next() - } - return true -} - -func (i *indexedIterator) Next() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - switch { - case i.data != nil && !i.data.Next(): - if i.dataErr() { - return false - } - i.clearData() - fallthrough - case i.data == nil: - if !i.index.Next() { - i.indexErr() - return false - } - i.setData() - return i.Next() - } - return true -} - -func (i *indexedIterator) Prev() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - switch { - case i.data != nil && !i.data.Prev(): - if i.dataErr() { - return false - } - i.clearData() - fallthrough - case i.data == nil: - if !i.index.Prev() { - i.indexErr() - return false - } - i.setData() - if !i.data.Last() { - if i.dataErr() { - return false - } - i.clearData() - return i.Prev() - } - } - return true -} - -func (i *indexedIterator) Key() []byte { - if i.data == nil { - return nil - } - return i.data.Key() -} - -func (i *indexedIterator) Value() []byte { - if i.data == nil { - return nil - } - return i.data.Value() -} - -func (i *indexedIterator) Release() { - i.clearData() - i.index.Release() - i.BasicReleaser.Release() -} - -func (i *indexedIterator) Error() error { - if i.err != nil { - return i.err - } - if err := i.index.Error(); err != nil { - return err - } - return nil -} - -func (i *indexedIterator) SetErrorCallback(f func(err error)) { - i.errf = f -} - -// NewIndexedIterator returns an 'indexed iterator'. An index is iterator -// that returns another iterator, a 'data iterator'. A 'data iterator' is the -// iterator that contains actual key/value pairs. -// -// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true) -// won't be ignored and will halt 'indexed iterator', otherwise the iterator will -// continue to the next 'data iterator'. Corruption on 'index iterator' will not be -// ignored and will halt the iterator. -func NewIndexedIterator(index IteratorIndexer, strict bool) Iterator { - return &indexedIterator{index: index, strict: strict} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go deleted file mode 100644 index c2522860b0b8..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package iterator provides interface and implementation to traverse over -// contents of a database. -package iterator - -import ( - "errors" - - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - ErrIterReleased = errors.New("leveldb/iterator: iterator released") -) - -// IteratorSeeker is the interface that wraps the 'seeks method'. -type IteratorSeeker interface { - // First moves the iterator to the first key/value pair. If the iterator - // only contains one key/value pair then First and Last whould moves - // to the same key/value pair. - // It returns whether such pair exist. - First() bool - - // Last moves the iterator to the last key/value pair. If the iterator - // only contains one key/value pair then First and Last whould moves - // to the same key/value pair. - // It returns whether such pair exist. - Last() bool - - // Seek moves the iterator to the first key/value pair whose key is greater - // than or equal to the given key. - // It returns whether such pair exist. - // - // It is safe to modify the contents of the argument after Seek returns. - Seek(key []byte) bool - - // Next moves the iterator to the next key/value pair. - // It returns whether the iterator is exhausted. - Next() bool - - // Prev moves the iterator to the previous key/value pair. - // It returns whether the iterator is exhausted. - Prev() bool -} - -// CommonIterator is the interface that wraps common interator methods. -type CommonIterator interface { - IteratorSeeker - - // util.Releaser is the interface that wraps basic Release method. - // When called Release will releases any resources associated with the - // iterator. - util.Releaser - - // util.ReleaseSetter is the interface that wraps the basic SetReleaser - // method. - util.ReleaseSetter - - // TODO: Remove this when ready. - Valid() bool - - // Error returns any accumulated error. Exhausting all the key/value pairs - // is not considered to be an error. - Error() error -} - -// Iterator iterates over a DB's key/value pairs in key order. -// -// When encouter an error any 'seeks method' will return false and will -// yield no key/value pairs. The error can be queried by calling the Error -// method. Calling Release is still necessary. -// -// An iterator must be released after use, but it is not necessary to read -// an iterator until exhaustion. -// Also, an iterator is not necessarily goroutine-safe, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -type Iterator interface { - CommonIterator - - // Key returns the key of the current key/value pair, or nil if done. - // The caller should not modify the contents of the returned slice, and - // its contents may change on the next call to any 'seeks method'. - Key() []byte - - // Value returns the key of the current key/value pair, or nil if done. - // The caller should not modify the contents of the returned slice, and - // its contents may change on the next call to any 'seeks method'. - Value() []byte -} - -// ErrorCallbackSetter is the interface that wraps basic SetErrorCallback -// method. -// -// ErrorCallbackSetter implemented by indexed and merged iterator. -type ErrorCallbackSetter interface { - // SetErrorCallback allows set an error callback of the coresponding - // iterator. Use nil to clear the callback. - SetErrorCallback(f func(err error)) -} - -type emptyIterator struct { - util.BasicReleaser - err error -} - -func (i *emptyIterator) rErr() { - if i.err == nil && i.Released() { - i.err = ErrIterReleased - } -} - -func (*emptyIterator) Valid() bool { return false } -func (i *emptyIterator) First() bool { i.rErr(); return false } -func (i *emptyIterator) Last() bool { i.rErr(); return false } -func (i *emptyIterator) Seek(key []byte) bool { i.rErr(); return false } -func (i *emptyIterator) Next() bool { i.rErr(); return false } -func (i *emptyIterator) Prev() bool { i.rErr(); return false } -func (*emptyIterator) Key() []byte { return nil } -func (*emptyIterator) Value() []byte { return nil } -func (i *emptyIterator) Error() error { return i.err } - -// NewEmptyIterator creates an empty iterator. The err parameter can be -// nil, but if not nil the given err will be returned by Error method. -func NewEmptyIterator(err error) Iterator { - return &emptyIterator{err: err} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go deleted file mode 100644 index 1a7e29df8fbd..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -type mergedIterator struct { - cmp comparer.Comparer - iters []Iterator - strict bool - - keys [][]byte - index int - dir dir - err error - errf func(err error) - releaser util.Releaser -} - -func assertKey(key []byte) []byte { - if key == nil { - panic("leveldb/iterator: nil key") - } - return key -} - -func (i *mergedIterator) iterErr(iter Iterator) bool { - if err := iter.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - if i.strict || !errors.IsCorrupted(err) { - i.err = err - return true - } - } - return false -} - -func (i *mergedIterator) Valid() bool { - return i.err == nil && i.dir > dirEOI -} - -func (i *mergedIterator) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.First(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirSOI - return i.next() -} - -func (i *mergedIterator) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.Last(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirEOI - return i.prev() -} - -func (i *mergedIterator) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.Seek(key): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirSOI - return i.next() -} - -func (i *mergedIterator) next() bool { - var key []byte - if i.dir == dirForward { - key = i.keys[i.index] - } - for x, tkey := range i.keys { - if tkey != nil && (key == nil || i.cmp.Compare(tkey, key) < 0) { - key = tkey - i.index = x - } - } - if key == nil { - i.dir = dirEOI - return false - } - i.dir = dirForward - return true -} - -func (i *mergedIterator) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirSOI: - return i.First() - case dirBackward: - key := append([]byte{}, i.keys[i.index]...) - if !i.Seek(key) { - return false - } - return i.Next() - } - - x := i.index - iter := i.iters[x] - switch { - case iter.Next(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - return i.next() -} - -func (i *mergedIterator) prev() bool { - var key []byte - if i.dir == dirBackward { - key = i.keys[i.index] - } - for x, tkey := range i.keys { - if tkey != nil && (key == nil || i.cmp.Compare(tkey, key) > 0) { - key = tkey - i.index = x - } - } - if key == nil { - i.dir = dirSOI - return false - } - i.dir = dirBackward - return true -} - -func (i *mergedIterator) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirEOI: - return i.Last() - case dirForward: - key := append([]byte{}, i.keys[i.index]...) - for x, iter := range i.iters { - if x == i.index { - continue - } - seek := iter.Seek(key) - switch { - case seek && iter.Prev(), !seek && iter.Last(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - } - - x := i.index - iter := i.iters[x] - switch { - case iter.Prev(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - return i.prev() -} - -func (i *mergedIterator) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.keys[i.index] -} - -func (i *mergedIterator) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.iters[i.index].Value() -} - -func (i *mergedIterator) Release() { - if i.dir != dirReleased { - i.dir = dirReleased - for _, iter := range i.iters { - iter.Release() - } - i.iters = nil - i.keys = nil - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - } -} - -func (i *mergedIterator) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *mergedIterator) Error() error { - return i.err -} - -func (i *mergedIterator) SetErrorCallback(f func(err error)) { - i.errf = f -} - -// NewMergedIterator returns an iterator that merges its input. Walking the -// resultant iterator will return all key/value pairs of all input iterators -// in strictly increasing key order, as defined by cmp. -// The input's key ranges may overlap, but there are assumed to be no duplicate -// keys: if iters[i] contains a key k then iters[j] will not contain that key k. -// None of the iters may be nil. -// -// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true) -// won't be ignored and will halt 'merged iterator', otherwise the iterator will -// continue to the next 'input iterator'. -func NewMergedIterator(iters []Iterator, cmp comparer.Comparer, strict bool) Iterator { - return &mergedIterator{ - iters: iters, - cmp: cmp, - strict: strict, - keys: make([][]byte, len(iters)), - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go b/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go deleted file mode 100644 index 891098bb77a0..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go +++ /dev/null @@ -1,521 +0,0 @@ -// Copyright 2011 The LevelDB-Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Taken from: https://code.google.com/p/leveldb-go/source/browse/leveldb/record/record.go?r=1d5ccbe03246da926391ee12d1c6caae054ff4b0 -// License, authors and contributors informations can be found at bellow URLs respectively: -// https://code.google.com/p/leveldb-go/source/browse/LICENSE -// https://code.google.com/p/leveldb-go/source/browse/AUTHORS -// https://code.google.com/p/leveldb-go/source/browse/CONTRIBUTORS - -// Package journal reads and writes sequences of journals. Each journal is a stream -// of bytes that completes before the next journal starts. -// -// When reading, call Next to obtain an io.Reader for the next journal. Next will -// return io.EOF when there are no more journals. It is valid to call Next -// without reading the current journal to exhaustion. -// -// When writing, call Next to obtain an io.Writer for the next journal. Calling -// Next finishes the current journal. Call Close to finish the final journal. -// -// Optionally, call Flush to finish the current journal and flush the underlying -// writer without starting a new journal. To start a new journal after flushing, -// call Next. -// -// Neither Readers or Writers are safe to use concurrently. -// -// Example code: -// func read(r io.Reader) ([]string, error) { -// var ss []string -// journals := journal.NewReader(r, nil, true, true) -// for { -// j, err := journals.Next() -// if err == io.EOF { -// break -// } -// if err != nil { -// return nil, err -// } -// s, err := ioutil.ReadAll(j) -// if err != nil { -// return nil, err -// } -// ss = append(ss, string(s)) -// } -// return ss, nil -// } -// -// func write(w io.Writer, ss []string) error { -// journals := journal.NewWriter(w) -// for _, s := range ss { -// j, err := journals.Next() -// if err != nil { -// return err -// } -// if _, err := j.Write([]byte(s)), err != nil { -// return err -// } -// } -// return journals.Close() -// } -// -// The wire format is that the stream is divided into 32KiB blocks, and each -// block contains a number of tightly packed chunks. Chunks cannot cross block -// boundaries. The last block may be shorter than 32 KiB. Any unused bytes in a -// block must be zero. -// -// A journal maps to one or more chunks. Each chunk has a 7 byte header (a 4 -// byte checksum, a 2 byte little-endian uint16 length, and a 1 byte chunk type) -// followed by a payload. The checksum is over the chunk type and the payload. -// -// There are four chunk types: whether the chunk is the full journal, or the -// first, middle or last chunk of a multi-chunk journal. A multi-chunk journal -// has one first chunk, zero or more middle chunks, and one last chunk. -// -// The wire format allows for limited recovery in the face of data corruption: -// on a format error (such as a checksum mismatch), the reader moves to the -// next block and looks for the next full or first chunk. -package journal - -import ( - "encoding/binary" - "fmt" - "io" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// These constants are part of the wire format and should not be changed. -const ( - fullChunkType = 1 - firstChunkType = 2 - middleChunkType = 3 - lastChunkType = 4 -) - -const ( - blockSize = 32 * 1024 - headerSize = 7 -) - -type flusher interface { - Flush() error -} - -// ErrCorrupted is the error type that generated by corrupted block or chunk. -type ErrCorrupted struct { - Size int - Reason string -} - -func (e *ErrCorrupted) Error() string { - return fmt.Sprintf("leveldb/journal: block/chunk corrupted: %s (%d bytes)", e.Reason, e.Size) -} - -// Dropper is the interface that wrap simple Drop method. The Drop -// method will be called when the journal reader dropping a block or chunk. -type Dropper interface { - Drop(err error) -} - -// Reader reads journals from an underlying io.Reader. -type Reader struct { - // r is the underlying reader. - r io.Reader - // the dropper. - dropper Dropper - // strict flag. - strict bool - // checksum flag. - checksum bool - // seq is the sequence number of the current journal. - seq int - // buf[i:j] is the unread portion of the current chunk's payload. - // The low bound, i, excludes the chunk header. - i, j int - // n is the number of bytes of buf that are valid. Once reading has started, - // only the final block can have n < blockSize. - n int - // last is whether the current chunk is the last chunk of the journal. - last bool - // err is any accumulated error. - err error - // buf is the buffer. - buf [blockSize]byte -} - -// NewReader returns a new reader. The dropper may be nil, and if -// strict is true then corrupted or invalid chunk will halt the journal -// reader entirely. -func NewReader(r io.Reader, dropper Dropper, strict, checksum bool) *Reader { - return &Reader{ - r: r, - dropper: dropper, - strict: strict, - checksum: checksum, - last: true, - } -} - -var errSkip = errors.New("leveldb/journal: skipped") - -func (r *Reader) corrupt(n int, reason string, skip bool) error { - if r.dropper != nil { - r.dropper.Drop(&ErrCorrupted{n, reason}) - } - if r.strict && !skip { - r.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrCorrupted{n, reason}) - return r.err - } - return errSkip -} - -// nextChunk sets r.buf[r.i:r.j] to hold the next chunk's payload, reading the -// next block into the buffer if necessary. -func (r *Reader) nextChunk(first bool) error { - for { - if r.j+headerSize <= r.n { - checksum := binary.LittleEndian.Uint32(r.buf[r.j+0 : r.j+4]) - length := binary.LittleEndian.Uint16(r.buf[r.j+4 : r.j+6]) - chunkType := r.buf[r.j+6] - - if checksum == 0 && length == 0 && chunkType == 0 { - // Drop entire block. - m := r.n - r.j - r.i = r.n - r.j = r.n - return r.corrupt(m, "zero header", false) - } else { - m := r.n - r.j - r.i = r.j + headerSize - r.j = r.j + headerSize + int(length) - if r.j > r.n { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(m, "chunk length overflows block", false) - } else if r.checksum && checksum != util.NewCRC(r.buf[r.i-1:r.j]).Value() { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(m, "checksum mismatch", false) - } - } - if first && chunkType != fullChunkType && chunkType != firstChunkType { - m := r.j - r.i - r.i = r.j - // Report the error, but skip it. - return r.corrupt(m+headerSize, "orphan chunk", true) - } - r.last = chunkType == fullChunkType || chunkType == lastChunkType - return nil - } - - // The last block. - if r.n < blockSize && r.n > 0 { - if !first { - return r.corrupt(0, "missing chunk part", false) - } - r.err = io.EOF - return r.err - } - - // Read block. - n, err := io.ReadFull(r.r, r.buf[:]) - if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { - return err - } - if n == 0 { - if !first { - return r.corrupt(0, "missing chunk part", false) - } - r.err = io.EOF - return r.err - } - r.i, r.j, r.n = 0, 0, n - } -} - -// Next returns a reader for the next journal. It returns io.EOF if there are no -// more journals. The reader returned becomes stale after the next Next call, -// and should no longer be used. If strict is false, the reader will returns -// io.ErrUnexpectedEOF error when found corrupted journal. -func (r *Reader) Next() (io.Reader, error) { - r.seq++ - if r.err != nil { - return nil, r.err - } - r.i = r.j - for { - if err := r.nextChunk(true); err == nil { - break - } else if err != errSkip { - return nil, err - } - } - return &singleReader{r, r.seq, nil}, nil -} - -// Reset resets the journal reader, allows reuse of the journal reader. Reset returns -// last accumulated error. -func (r *Reader) Reset(reader io.Reader, dropper Dropper, strict, checksum bool) error { - r.seq++ - err := r.err - r.r = reader - r.dropper = dropper - r.strict = strict - r.checksum = checksum - r.i = 0 - r.j = 0 - r.n = 0 - r.last = true - r.err = nil - return err -} - -type singleReader struct { - r *Reader - seq int - err error -} - -func (x *singleReader) Read(p []byte) (int, error) { - r := x.r - if r.seq != x.seq { - return 0, errors.New("leveldb/journal: stale reader") - } - if x.err != nil { - return 0, x.err - } - if r.err != nil { - return 0, r.err - } - for r.i == r.j { - if r.last { - return 0, io.EOF - } - x.err = r.nextChunk(false) - if x.err != nil { - if x.err == errSkip { - x.err = io.ErrUnexpectedEOF - } - return 0, x.err - } - } - n := copy(p, r.buf[r.i:r.j]) - r.i += n - return n, nil -} - -func (x *singleReader) ReadByte() (byte, error) { - r := x.r - if r.seq != x.seq { - return 0, errors.New("leveldb/journal: stale reader") - } - if x.err != nil { - return 0, x.err - } - if r.err != nil { - return 0, r.err - } - for r.i == r.j { - if r.last { - return 0, io.EOF - } - x.err = r.nextChunk(false) - if x.err != nil { - if x.err == errSkip { - x.err = io.ErrUnexpectedEOF - } - return 0, x.err - } - } - c := r.buf[r.i] - r.i++ - return c, nil -} - -// Writer writes journals to an underlying io.Writer. -type Writer struct { - // w is the underlying writer. - w io.Writer - // seq is the sequence number of the current journal. - seq int - // f is w as a flusher. - f flusher - // buf[i:j] is the bytes that will become the current chunk. - // The low bound, i, includes the chunk header. - i, j int - // buf[:written] has already been written to w. - // written is zero unless Flush has been called. - written int - // first is whether the current chunk is the first chunk of the journal. - first bool - // pending is whether a chunk is buffered but not yet written. - pending bool - // err is any accumulated error. - err error - // buf is the buffer. - buf [blockSize]byte -} - -// NewWriter returns a new Writer. -func NewWriter(w io.Writer) *Writer { - f, _ := w.(flusher) - return &Writer{ - w: w, - f: f, - } -} - -// fillHeader fills in the header for the pending chunk. -func (w *Writer) fillHeader(last bool) { - if w.i+headerSize > w.j || w.j > blockSize { - panic("leveldb/journal: bad writer state") - } - if last { - if w.first { - w.buf[w.i+6] = fullChunkType - } else { - w.buf[w.i+6] = lastChunkType - } - } else { - if w.first { - w.buf[w.i+6] = firstChunkType - } else { - w.buf[w.i+6] = middleChunkType - } - } - binary.LittleEndian.PutUint32(w.buf[w.i+0:w.i+4], util.NewCRC(w.buf[w.i+6:w.j]).Value()) - binary.LittleEndian.PutUint16(w.buf[w.i+4:w.i+6], uint16(w.j-w.i-headerSize)) -} - -// writeBlock writes the buffered block to the underlying writer, and reserves -// space for the next chunk's header. -func (w *Writer) writeBlock() { - _, w.err = w.w.Write(w.buf[w.written:]) - w.i = 0 - w.j = headerSize - w.written = 0 -} - -// writePending finishes the current journal and writes the buffer to the -// underlying writer. -func (w *Writer) writePending() { - if w.err != nil { - return - } - if w.pending { - w.fillHeader(true) - w.pending = false - } - _, w.err = w.w.Write(w.buf[w.written:w.j]) - w.written = w.j -} - -// Close finishes the current journal and closes the writer. -func (w *Writer) Close() error { - w.seq++ - w.writePending() - if w.err != nil { - return w.err - } - w.err = errors.New("leveldb/journal: closed Writer") - return nil -} - -// Flush finishes the current journal, writes to the underlying writer, and -// flushes it if that writer implements interface{ Flush() error }. -func (w *Writer) Flush() error { - w.seq++ - w.writePending() - if w.err != nil { - return w.err - } - if w.f != nil { - w.err = w.f.Flush() - return w.err - } - return nil -} - -// Reset resets the journal writer, allows reuse of the journal writer. Reset -// will also closes the journal writer if not already. -func (w *Writer) Reset(writer io.Writer) (err error) { - w.seq++ - if w.err == nil { - w.writePending() - err = w.err - } - w.w = writer - w.f, _ = writer.(flusher) - w.i = 0 - w.j = 0 - w.written = 0 - w.first = false - w.pending = false - w.err = nil - return -} - -// Next returns a writer for the next journal. The writer returned becomes stale -// after the next Close, Flush or Next call, and should no longer be used. -func (w *Writer) Next() (io.Writer, error) { - w.seq++ - if w.err != nil { - return nil, w.err - } - if w.pending { - w.fillHeader(true) - } - w.i = w.j - w.j = w.j + headerSize - // Check if there is room in the block for the header. - if w.j > blockSize { - // Fill in the rest of the block with zeroes. - for k := w.i; k < blockSize; k++ { - w.buf[k] = 0 - } - w.writeBlock() - if w.err != nil { - return nil, w.err - } - } - w.first = true - w.pending = true - return singleWriter{w, w.seq}, nil -} - -type singleWriter struct { - w *Writer - seq int -} - -func (x singleWriter) Write(p []byte) (int, error) { - w := x.w - if w.seq != x.seq { - return 0, errors.New("leveldb/journal: stale writer") - } - if w.err != nil { - return 0, w.err - } - n0 := len(p) - for len(p) > 0 { - // Write a block, if it is full. - if w.j == blockSize { - w.fillHeader(false) - w.writeBlock() - if w.err != nil { - return 0, w.err - } - w.first = false - } - // Copy bytes into the buffer. - n := copy(w.buf[w.j:], p) - w.j += n - p = p[n:] - } - return n0, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/key.go b/vendor/github.com/syndtr/goleveldb/leveldb/key.go deleted file mode 100644 index d0b80aaf9793..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/key.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "encoding/binary" - "fmt" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrInternalKeyCorrupted records internal key corruption. -type ErrInternalKeyCorrupted struct { - Ikey []byte - Reason string -} - -func (e *ErrInternalKeyCorrupted) Error() string { - return fmt.Sprintf("leveldb: internal key %q corrupted: %s", e.Ikey, e.Reason) -} - -func newErrInternalKeyCorrupted(ikey []byte, reason string) error { - return errors.NewErrCorrupted(storage.FileDesc{}, &ErrInternalKeyCorrupted{append([]byte{}, ikey...), reason}) -} - -type keyType uint - -func (kt keyType) String() string { - switch kt { - case keyTypeDel: - return "d" - case keyTypeVal: - return "v" - } - return "x" -} - -// Value types encoded as the last component of internal keys. -// Don't modify; this value are saved to disk. -const ( - keyTypeDel keyType = iota - keyTypeVal -) - -// keyTypeSeek defines the keyType that should be passed when constructing an -// internal key for seeking to a particular sequence number (since we -// sort sequence numbers in decreasing order and the value type is -// embedded as the low 8 bits in the sequence number in internal keys, -// we need to use the highest-numbered ValueType, not the lowest). -const keyTypeSeek = keyTypeVal - -const ( - // Maximum value possible for sequence number; the 8-bits are - // used by value type, so its can packed together in single - // 64-bit integer. - keyMaxSeq = (uint64(1) << 56) - 1 - // Maximum value possible for packed sequence number and type. - keyMaxNum = (keyMaxSeq << 8) | uint64(keyTypeSeek) -) - -// Maximum number encoded in bytes. -var keyMaxNumBytes = make([]byte, 8) - -func init() { - binary.LittleEndian.PutUint64(keyMaxNumBytes, keyMaxNum) -} - -type internalKey []byte - -func makeInternalKey(dst, ukey []byte, seq uint64, kt keyType) internalKey { - if seq > keyMaxSeq { - panic("leveldb: invalid sequence number") - } else if kt > keyTypeVal { - panic("leveldb: invalid type") - } - - if n := len(ukey) + 8; cap(dst) < n { - dst = make([]byte, n) - } else { - dst = dst[:n] - } - copy(dst, ukey) - binary.LittleEndian.PutUint64(dst[len(ukey):], (seq<<8)|uint64(kt)) - return internalKey(dst) -} - -func parseInternalKey(ik []byte) (ukey []byte, seq uint64, kt keyType, err error) { - if len(ik) < 8 { - return nil, 0, 0, newErrInternalKeyCorrupted(ik, "invalid length") - } - num := binary.LittleEndian.Uint64(ik[len(ik)-8:]) - seq, kt = uint64(num>>8), keyType(num&0xff) - if kt > keyTypeVal { - return nil, 0, 0, newErrInternalKeyCorrupted(ik, "invalid type") - } - ukey = ik[:len(ik)-8] - return -} - -func validInternalKey(ik []byte) bool { - _, _, _, err := parseInternalKey(ik) - return err == nil -} - -func (ik internalKey) assert() { - if ik == nil { - panic("leveldb: nil internalKey") - } - if len(ik) < 8 { - panic(fmt.Sprintf("leveldb: internal key %q, len=%d: invalid length", []byte(ik), len(ik))) - } -} - -func (ik internalKey) ukey() []byte { - ik.assert() - return ik[:len(ik)-8] -} - -func (ik internalKey) num() uint64 { - ik.assert() - return binary.LittleEndian.Uint64(ik[len(ik)-8:]) -} - -func (ik internalKey) parseNum() (seq uint64, kt keyType) { - num := ik.num() - seq, kt = uint64(num>>8), keyType(num&0xff) - if kt > keyTypeVal { - panic(fmt.Sprintf("leveldb: internal key %q, len=%d: invalid type %#x", []byte(ik), len(ik), kt)) - } - return -} - -func (ik internalKey) String() string { - if ik == nil { - return "" - } - - if ukey, seq, kt, err := parseInternalKey(ik); err == nil { - return fmt.Sprintf("%s,%s%d", shorten(string(ukey)), kt, seq) - } - return "" -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go b/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go deleted file mode 100644 index 1395bd928080..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go +++ /dev/null @@ -1,471 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package memdb provides in-memory key/value database implementation. -package memdb - -import ( - "math/rand" - "sync" - - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - ErrNotFound = errors.ErrNotFound - ErrIterReleased = errors.New("leveldb/memdb: iterator released") -) - -const tMaxHeight = 12 - -type dbIter struct { - util.BasicReleaser - p *DB - slice *util.Range - node int - forward bool - key, value []byte - err error -} - -func (i *dbIter) fill(checkStart, checkLimit bool) bool { - if i.node != 0 { - n := i.p.nodeData[i.node] - m := n + i.p.nodeData[i.node+nKey] - i.key = i.p.kvData[n:m] - if i.slice != nil { - switch { - case checkLimit && i.slice.Limit != nil && i.p.cmp.Compare(i.key, i.slice.Limit) >= 0: - fallthrough - case checkStart && i.slice.Start != nil && i.p.cmp.Compare(i.key, i.slice.Start) < 0: - i.node = 0 - goto bail - } - } - i.value = i.p.kvData[m : m+i.p.nodeData[i.node+nVal]] - return true - } -bail: - i.key = nil - i.value = nil - return false -} - -func (i *dbIter) Valid() bool { - return i.node != 0 -} - -func (i *dbIter) First() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Start != nil { - i.node, _ = i.p.findGE(i.slice.Start, false) - } else { - i.node = i.p.nodeData[nNext] - } - return i.fill(false, true) -} - -func (i *dbIter) Last() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = false - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Limit != nil { - i.node = i.p.findLT(i.slice.Limit) - } else { - i.node = i.p.findLast() - } - return i.fill(true, false) -} - -func (i *dbIter) Seek(key []byte) bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Start != nil && i.p.cmp.Compare(key, i.slice.Start) < 0 { - key = i.slice.Start - } - i.node, _ = i.p.findGE(key, false) - return i.fill(false, true) -} - -func (i *dbIter) Next() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.node == 0 { - if !i.forward { - return i.First() - } - return false - } - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - i.node = i.p.nodeData[i.node+nNext] - return i.fill(false, true) -} - -func (i *dbIter) Prev() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.node == 0 { - if i.forward { - return i.Last() - } - return false - } - i.forward = false - i.p.mu.RLock() - defer i.p.mu.RUnlock() - i.node = i.p.findLT(i.key) - return i.fill(true, false) -} - -func (i *dbIter) Key() []byte { - return i.key -} - -func (i *dbIter) Value() []byte { - return i.value -} - -func (i *dbIter) Error() error { return i.err } - -func (i *dbIter) Release() { - if !i.Released() { - i.p = nil - i.node = 0 - i.key = nil - i.value = nil - i.BasicReleaser.Release() - } -} - -const ( - nKV = iota - nKey - nVal - nHeight - nNext -) - -// DB is an in-memory key/value database. -type DB struct { - cmp comparer.BasicComparer - rnd *rand.Rand - - mu sync.RWMutex - kvData []byte - // Node data: - // [0] : KV offset - // [1] : Key length - // [2] : Value length - // [3] : Height - // [3..height] : Next nodes - nodeData []int - prevNode [tMaxHeight]int - maxHeight int - n int - kvSize int -} - -func (p *DB) randHeight() (h int) { - const branching = 4 - h = 1 - for h < tMaxHeight && p.rnd.Int()%branching == 0 { - h++ - } - return -} - -// Must hold RW-lock if prev == true, as it use shared prevNode slice. -func (p *DB) findGE(key []byte, prev bool) (int, bool) { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - cmp := 1 - if next != 0 { - o := p.nodeData[next] - cmp = p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key) - } - if cmp < 0 { - // Keep searching in this list - node = next - } else { - if prev { - p.prevNode[h] = node - } else if cmp == 0 { - return next, true - } - if h == 0 { - return next, cmp == 0 - } - h-- - } - } -} - -func (p *DB) findLT(key []byte) int { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - o := p.nodeData[next] - if next == 0 || p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key) >= 0 { - if h == 0 { - break - } - h-- - } else { - node = next - } - } - return node -} - -func (p *DB) findLast() int { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - if next == 0 { - if h == 0 { - break - } - h-- - } else { - node = next - } - } - return node -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. -// -// It is safe to modify the contents of the arguments after Put returns. -func (p *DB) Put(key []byte, value []byte) error { - p.mu.Lock() - defer p.mu.Unlock() - - if node, exact := p.findGE(key, true); exact { - kvOffset := len(p.kvData) - p.kvData = append(p.kvData, key...) - p.kvData = append(p.kvData, value...) - p.nodeData[node] = kvOffset - m := p.nodeData[node+nVal] - p.nodeData[node+nVal] = len(value) - p.kvSize += len(value) - m - return nil - } - - h := p.randHeight() - if h > p.maxHeight { - for i := p.maxHeight; i < h; i++ { - p.prevNode[i] = 0 - } - p.maxHeight = h - } - - kvOffset := len(p.kvData) - p.kvData = append(p.kvData, key...) - p.kvData = append(p.kvData, value...) - // Node - node := len(p.nodeData) - p.nodeData = append(p.nodeData, kvOffset, len(key), len(value), h) - for i, n := range p.prevNode[:h] { - m := n + nNext + i - p.nodeData = append(p.nodeData, p.nodeData[m]) - p.nodeData[m] = node - } - - p.kvSize += len(key) + len(value) - p.n++ - return nil -} - -// Delete deletes the value for the given key. It returns ErrNotFound if -// the DB does not contain the key. -// -// It is safe to modify the contents of the arguments after Delete returns. -func (p *DB) Delete(key []byte) error { - p.mu.Lock() - defer p.mu.Unlock() - - node, exact := p.findGE(key, true) - if !exact { - return ErrNotFound - } - - h := p.nodeData[node+nHeight] - for i, n := range p.prevNode[:h] { - m := n + 4 + i - p.nodeData[m] = p.nodeData[p.nodeData[m]+nNext+i] - } - - p.kvSize -= p.nodeData[node+nKey] + p.nodeData[node+nVal] - p.n-- - return nil -} - -// Contains returns true if the given key are in the DB. -// -// It is safe to modify the contents of the arguments after Contains returns. -func (p *DB) Contains(key []byte) bool { - p.mu.RLock() - _, exact := p.findGE(key, false) - p.mu.RUnlock() - return exact -} - -// Get gets the value for the given key. It returns error.ErrNotFound if the -// DB does not contain the key. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Get returns. -func (p *DB) Get(key []byte) (value []byte, err error) { - p.mu.RLock() - if node, exact := p.findGE(key, false); exact { - o := p.nodeData[node] + p.nodeData[node+nKey] - value = p.kvData[o : o+p.nodeData[node+nVal]] - } else { - err = ErrNotFound - } - p.mu.RUnlock() - return -} - -// Find finds key/value pair whose key is greater than or equal to the -// given key. It returns ErrNotFound if the table doesn't contain -// such pair. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Find returns. -func (p *DB) Find(key []byte) (rkey, value []byte, err error) { - p.mu.RLock() - if node, _ := p.findGE(key, false); node != 0 { - n := p.nodeData[node] - m := n + p.nodeData[node+nKey] - rkey = p.kvData[n:m] - value = p.kvData[m : m+p.nodeData[node+nVal]] - } else { - err = ErrNotFound - } - p.mu.RUnlock() - return -} - -// NewIterator returns an iterator of the DB. -// The returned iterator is not goroutine-safe, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. However, the resultant key/value pairs are not guaranteed -// to be a consistent snapshot of the DB at a particular point in time. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (p *DB) NewIterator(slice *util.Range) iterator.Iterator { - return &dbIter{p: p, slice: slice} -} - -// Capacity returns keys/values buffer capacity. -func (p *DB) Capacity() int { - p.mu.RLock() - defer p.mu.RUnlock() - return cap(p.kvData) -} - -// Size returns sum of keys and values length. Note that deleted -// key/value will not be accouted for, but it will still consume -// the buffer, since the buffer is append only. -func (p *DB) Size() int { - p.mu.RLock() - defer p.mu.RUnlock() - return p.kvSize -} - -// Free returns keys/values free buffer before need to grow. -func (p *DB) Free() int { - p.mu.RLock() - defer p.mu.RUnlock() - return cap(p.kvData) - len(p.kvData) -} - -// Len returns the number of entries in the DB. -func (p *DB) Len() int { - p.mu.RLock() - defer p.mu.RUnlock() - return p.n -} - -// Reset resets the DB to initial empty state. Allows reuse the buffer. -func (p *DB) Reset() { - p.mu.Lock() - p.rnd = rand.New(rand.NewSource(0xdeadbeef)) - p.maxHeight = 1 - p.n = 0 - p.kvSize = 0 - p.kvData = p.kvData[:0] - p.nodeData = p.nodeData[:nNext+tMaxHeight] - p.nodeData[nKV] = 0 - p.nodeData[nKey] = 0 - p.nodeData[nVal] = 0 - p.nodeData[nHeight] = tMaxHeight - for n := 0; n < tMaxHeight; n++ { - p.nodeData[nNext+n] = 0 - p.prevNode[n] = 0 - } - p.mu.Unlock() -} - -// New creates a new initalized in-memory key/value DB. The capacity -// is the initial key/value buffer capacity. The capacity is advisory, -// not enforced. -// -// The returned DB instance is goroutine-safe. -func New(cmp comparer.BasicComparer, capacity int) *DB { - p := &DB{ - cmp: cmp, - rnd: rand.New(rand.NewSource(0xdeadbeef)), - maxHeight: 1, - kvData: make([]byte, 0, capacity), - nodeData: make([]int, 4+tMaxHeight), - } - p.nodeData[nHeight] = tMaxHeight - return p -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go deleted file mode 100644 index 3d2bf1c02a00..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go +++ /dev/null @@ -1,660 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package opt provides sets of options used by LevelDB. -package opt - -import ( - "math" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/filter" -) - -const ( - KiB = 1024 - MiB = KiB * 1024 - GiB = MiB * 1024 -) - -var ( - DefaultBlockCacher = LRUCacher - DefaultBlockCacheCapacity = 8 * MiB - DefaultBlockRestartInterval = 16 - DefaultBlockSize = 4 * KiB - DefaultCompactionExpandLimitFactor = 25 - DefaultCompactionGPOverlapsFactor = 10 - DefaultCompactionL0Trigger = 4 - DefaultCompactionSourceLimitFactor = 1 - DefaultCompactionTableSize = 2 * MiB - DefaultCompactionTableSizeMultiplier = 1.0 - DefaultCompactionTotalSize = 10 * MiB - DefaultCompactionTotalSizeMultiplier = 10.0 - DefaultCompressionType = SnappyCompression - DefaultIteratorSamplingRate = 1 * MiB - DefaultOpenFilesCacher = LRUCacher - DefaultOpenFilesCacheCapacity = 500 - DefaultWriteBuffer = 4 * MiB - DefaultWriteL0PauseTrigger = 12 - DefaultWriteL0SlowdownTrigger = 8 -) - -// Cacher is a caching algorithm. -type Cacher interface { - New(capacity int) cache.Cacher -} - -type CacherFunc struct { - NewFunc func(capacity int) cache.Cacher -} - -func (f *CacherFunc) New(capacity int) cache.Cacher { - if f.NewFunc != nil { - return f.NewFunc(capacity) - } - return nil -} - -func noCacher(int) cache.Cacher { return nil } - -var ( - // LRUCacher is the LRU-cache algorithm. - LRUCacher = &CacherFunc{cache.NewLRU} - - // NoCacher is the value to disable caching algorithm. - NoCacher = &CacherFunc{} -) - -// Compression is the 'sorted table' block compression algorithm to use. -type Compression uint - -func (c Compression) String() string { - switch c { - case DefaultCompression: - return "default" - case NoCompression: - return "none" - case SnappyCompression: - return "snappy" - } - return "invalid" -} - -const ( - DefaultCompression Compression = iota - NoCompression - SnappyCompression - nCompression -) - -// Strict is the DB 'strict level'. -type Strict uint - -const ( - // If present then a corrupted or invalid chunk or block in manifest - // journal will cause an error instead of being dropped. - // This will prevent database with corrupted manifest to be opened. - StrictManifest Strict = 1 << iota - - // If present then journal chunk checksum will be verified. - StrictJournalChecksum - - // If present then a corrupted or invalid chunk or block in journal - // will cause an error instead of being dropped. - // This will prevent database with corrupted journal to be opened. - StrictJournal - - // If present then 'sorted table' block checksum will be verified. - // This has effect on both 'read operation' and compaction. - StrictBlockChecksum - - // If present then a corrupted 'sorted table' will fails compaction. - // The database will enter read-only mode. - StrictCompaction - - // If present then a corrupted 'sorted table' will halts 'read operation'. - StrictReader - - // If present then leveldb.Recover will drop corrupted 'sorted table'. - StrictRecovery - - // This only applicable for ReadOptions, if present then this ReadOptions - // 'strict level' will override global ones. - StrictOverride - - // StrictAll enables all strict flags. - StrictAll = StrictManifest | StrictJournalChecksum | StrictJournal | StrictBlockChecksum | StrictCompaction | StrictReader | StrictRecovery - - // DefaultStrict is the default strict flags. Specify any strict flags - // will override default strict flags as whole (i.e. not OR'ed). - DefaultStrict = StrictJournalChecksum | StrictBlockChecksum | StrictCompaction | StrictReader - - // NoStrict disables all strict flags. Override default strict flags. - NoStrict = ^StrictAll -) - -// Options holds the optional parameters for the DB at large. -type Options struct { - // AltFilters defines one or more 'alternative filters'. - // 'alternative filters' will be used during reads if a filter block - // does not match with the 'effective filter'. - // - // The default value is nil - AltFilters []filter.Filter - - // BlockCacher provides cache algorithm for LevelDB 'sorted table' block caching. - // Specify NoCacher to disable caching algorithm. - // - // The default value is LRUCacher. - BlockCacher Cacher - - // BlockCacheCapacity defines the capacity of the 'sorted table' block caching. - // Use -1 for zero, this has same effect as specifying NoCacher to BlockCacher. - // - // The default value is 8MiB. - BlockCacheCapacity int - - // BlockRestartInterval is the number of keys between restart points for - // delta encoding of keys. - // - // The default value is 16. - BlockRestartInterval int - - // BlockSize is the minimum uncompressed size in bytes of each 'sorted table' - // block. - // - // The default value is 4KiB. - BlockSize int - - // CompactionExpandLimitFactor limits compaction size after expanded. - // This will be multiplied by table size limit at compaction target level. - // - // The default value is 25. - CompactionExpandLimitFactor int - - // CompactionGPOverlapsFactor limits overlaps in grandparent (Level + 2) that a - // single 'sorted table' generates. - // This will be multiplied by table size limit at grandparent level. - // - // The default value is 10. - CompactionGPOverlapsFactor int - - // CompactionL0Trigger defines number of 'sorted table' at level-0 that will - // trigger compaction. - // - // The default value is 4. - CompactionL0Trigger int - - // CompactionSourceLimitFactor limits compaction source size. This doesn't apply to - // level-0. - // This will be multiplied by table size limit at compaction target level. - // - // The default value is 1. - CompactionSourceLimitFactor int - - // CompactionTableSize limits size of 'sorted table' that compaction generates. - // The limits for each level will be calculated as: - // CompactionTableSize * (CompactionTableSizeMultiplier ^ Level) - // The multiplier for each level can also fine-tuned using CompactionTableSizeMultiplierPerLevel. - // - // The default value is 2MiB. - CompactionTableSize int - - // CompactionTableSizeMultiplier defines multiplier for CompactionTableSize. - // - // The default value is 1. - CompactionTableSizeMultiplier float64 - - // CompactionTableSizeMultiplierPerLevel defines per-level multiplier for - // CompactionTableSize. - // Use zero to skip a level. - // - // The default value is nil. - CompactionTableSizeMultiplierPerLevel []float64 - - // CompactionTotalSize limits total size of 'sorted table' for each level. - // The limits for each level will be calculated as: - // CompactionTotalSize * (CompactionTotalSizeMultiplier ^ Level) - // The multiplier for each level can also fine-tuned using - // CompactionTotalSizeMultiplierPerLevel. - // - // The default value is 10MiB. - CompactionTotalSize int - - // CompactionTotalSizeMultiplier defines multiplier for CompactionTotalSize. - // - // The default value is 10. - CompactionTotalSizeMultiplier float64 - - // CompactionTotalSizeMultiplierPerLevel defines per-level multiplier for - // CompactionTotalSize. - // Use zero to skip a level. - // - // The default value is nil. - CompactionTotalSizeMultiplierPerLevel []float64 - - // Comparer defines a total ordering over the space of []byte keys: a 'less - // than' relationship. The same comparison algorithm must be used for reads - // and writes over the lifetime of the DB. - // - // The default value uses the same ordering as bytes.Compare. - Comparer comparer.Comparer - - // Compression defines the 'sorted table' block compression to use. - // - // The default value (DefaultCompression) uses snappy compression. - Compression Compression - - // DisableBufferPool allows disable use of util.BufferPool functionality. - // - // The default value is false. - DisableBufferPool bool - - // DisableBlockCache allows disable use of cache.Cache functionality on - // 'sorted table' block. - // - // The default value is false. - DisableBlockCache bool - - // DisableCompactionBackoff allows disable compaction retry backoff. - // - // The default value is false. - DisableCompactionBackoff bool - - // DisableLargeBatchTransaction allows disabling switch-to-transaction mode - // on large batch write. If enable batch writes large than WriteBuffer will - // use transaction. - // - // The default is false. - DisableLargeBatchTransaction bool - - // ErrorIfExist defines whether an error should returned if the DB already - // exist. - // - // The default value is false. - ErrorIfExist bool - - // ErrorIfMissing defines whether an error should returned if the DB is - // missing. If false then the database will be created if missing, otherwise - // an error will be returned. - // - // The default value is false. - ErrorIfMissing bool - - // Filter defines an 'effective filter' to use. An 'effective filter' - // if defined will be used to generate per-table filter block. - // The filter name will be stored on disk. - // During reads LevelDB will try to find matching filter from - // 'effective filter' and 'alternative filters'. - // - // Filter can be changed after a DB has been created. It is recommended - // to put old filter to the 'alternative filters' to mitigate lack of - // filter during transition period. - // - // A filter is used to reduce disk reads when looking for a specific key. - // - // The default value is nil. - Filter filter.Filter - - // IteratorSamplingRate defines approximate gap (in bytes) between read - // sampling of an iterator. The samples will be used to determine when - // compaction should be triggered. - // - // The default is 1MiB. - IteratorSamplingRate int - - // NoSync allows completely disable fsync. - // - // The default is false. - NoSync bool - - // OpenFilesCacher provides cache algorithm for open files caching. - // Specify NoCacher to disable caching algorithm. - // - // The default value is LRUCacher. - OpenFilesCacher Cacher - - // OpenFilesCacheCapacity defines the capacity of the open files caching. - // Use -1 for zero, this has same effect as specifying NoCacher to OpenFilesCacher. - // - // The default value is 500. - OpenFilesCacheCapacity int - - // If true then opens DB in read-only mode. - // - // The default value is false. - ReadOnly bool - - // Strict defines the DB strict level. - Strict Strict - - // WriteBuffer defines maximum size of a 'memdb' before flushed to - // 'sorted table'. 'memdb' is an in-memory DB backed by an on-disk - // unsorted journal. - // - // LevelDB may held up to two 'memdb' at the same time. - // - // The default value is 4MiB. - WriteBuffer int - - // WriteL0StopTrigger defines number of 'sorted table' at level-0 that will - // pause write. - // - // The default value is 12. - WriteL0PauseTrigger int - - // WriteL0SlowdownTrigger defines number of 'sorted table' at level-0 that - // will trigger write slowdown. - // - // The default value is 8. - WriteL0SlowdownTrigger int -} - -func (o *Options) GetAltFilters() []filter.Filter { - if o == nil { - return nil - } - return o.AltFilters -} - -func (o *Options) GetBlockCacher() Cacher { - if o == nil || o.BlockCacher == nil { - return DefaultBlockCacher - } else if o.BlockCacher == NoCacher { - return nil - } - return o.BlockCacher -} - -func (o *Options) GetBlockCacheCapacity() int { - if o == nil || o.BlockCacheCapacity == 0 { - return DefaultBlockCacheCapacity - } else if o.BlockCacheCapacity < 0 { - return 0 - } - return o.BlockCacheCapacity -} - -func (o *Options) GetBlockRestartInterval() int { - if o == nil || o.BlockRestartInterval <= 0 { - return DefaultBlockRestartInterval - } - return o.BlockRestartInterval -} - -func (o *Options) GetBlockSize() int { - if o == nil || o.BlockSize <= 0 { - return DefaultBlockSize - } - return o.BlockSize -} - -func (o *Options) GetCompactionExpandLimit(level int) int { - factor := DefaultCompactionExpandLimitFactor - if o != nil && o.CompactionExpandLimitFactor > 0 { - factor = o.CompactionExpandLimitFactor - } - return o.GetCompactionTableSize(level+1) * factor -} - -func (o *Options) GetCompactionGPOverlaps(level int) int { - factor := DefaultCompactionGPOverlapsFactor - if o != nil && o.CompactionGPOverlapsFactor > 0 { - factor = o.CompactionGPOverlapsFactor - } - return o.GetCompactionTableSize(level+2) * factor -} - -func (o *Options) GetCompactionL0Trigger() int { - if o == nil || o.CompactionL0Trigger == 0 { - return DefaultCompactionL0Trigger - } - return o.CompactionL0Trigger -} - -func (o *Options) GetCompactionSourceLimit(level int) int { - factor := DefaultCompactionSourceLimitFactor - if o != nil && o.CompactionSourceLimitFactor > 0 { - factor = o.CompactionSourceLimitFactor - } - return o.GetCompactionTableSize(level+1) * factor -} - -func (o *Options) GetCompactionTableSize(level int) int { - var ( - base = DefaultCompactionTableSize - mult float64 - ) - if o != nil { - if o.CompactionTableSize > 0 { - base = o.CompactionTableSize - } - if level < len(o.CompactionTableSizeMultiplierPerLevel) && o.CompactionTableSizeMultiplierPerLevel[level] > 0 { - mult = o.CompactionTableSizeMultiplierPerLevel[level] - } else if o.CompactionTableSizeMultiplier > 0 { - mult = math.Pow(o.CompactionTableSizeMultiplier, float64(level)) - } - } - if mult == 0 { - mult = math.Pow(DefaultCompactionTableSizeMultiplier, float64(level)) - } - return int(float64(base) * mult) -} - -func (o *Options) GetCompactionTotalSize(level int) int64 { - var ( - base = DefaultCompactionTotalSize - mult float64 - ) - if o != nil { - if o.CompactionTotalSize > 0 { - base = o.CompactionTotalSize - } - if level < len(o.CompactionTotalSizeMultiplierPerLevel) && o.CompactionTotalSizeMultiplierPerLevel[level] > 0 { - mult = o.CompactionTotalSizeMultiplierPerLevel[level] - } else if o.CompactionTotalSizeMultiplier > 0 { - mult = math.Pow(o.CompactionTotalSizeMultiplier, float64(level)) - } - } - if mult == 0 { - mult = math.Pow(DefaultCompactionTotalSizeMultiplier, float64(level)) - } - return int64(float64(base) * mult) -} - -func (o *Options) GetComparer() comparer.Comparer { - if o == nil || o.Comparer == nil { - return comparer.DefaultComparer - } - return o.Comparer -} - -func (o *Options) GetCompression() Compression { - if o == nil || o.Compression <= DefaultCompression || o.Compression >= nCompression { - return DefaultCompressionType - } - return o.Compression -} - -func (o *Options) GetDisableBufferPool() bool { - if o == nil { - return false - } - return o.DisableBufferPool -} - -func (o *Options) GetDisableBlockCache() bool { - if o == nil { - return false - } - return o.DisableBlockCache -} - -func (o *Options) GetDisableCompactionBackoff() bool { - if o == nil { - return false - } - return o.DisableCompactionBackoff -} - -func (o *Options) GetDisableLargeBatchTransaction() bool { - if o == nil { - return false - } - return o.DisableLargeBatchTransaction -} - -func (o *Options) GetErrorIfExist() bool { - if o == nil { - return false - } - return o.ErrorIfExist -} - -func (o *Options) GetErrorIfMissing() bool { - if o == nil { - return false - } - return o.ErrorIfMissing -} - -func (o *Options) GetFilter() filter.Filter { - if o == nil { - return nil - } - return o.Filter -} - -func (o *Options) GetIteratorSamplingRate() int { - if o == nil || o.IteratorSamplingRate <= 0 { - return DefaultIteratorSamplingRate - } - return o.IteratorSamplingRate -} - -func (o *Options) GetNoSync() bool { - if o == nil { - return false - } - return o.NoSync -} - -func (o *Options) GetOpenFilesCacher() Cacher { - if o == nil || o.OpenFilesCacher == nil { - return DefaultOpenFilesCacher - } - if o.OpenFilesCacher == NoCacher { - return nil - } - return o.OpenFilesCacher -} - -func (o *Options) GetOpenFilesCacheCapacity() int { - if o == nil || o.OpenFilesCacheCapacity == 0 { - return DefaultOpenFilesCacheCapacity - } else if o.OpenFilesCacheCapacity < 0 { - return 0 - } - return o.OpenFilesCacheCapacity -} - -func (o *Options) GetReadOnly() bool { - if o == nil { - return false - } - return o.ReadOnly -} - -func (o *Options) GetStrict(strict Strict) bool { - if o == nil || o.Strict == 0 { - return DefaultStrict&strict != 0 - } - return o.Strict&strict != 0 -} - -func (o *Options) GetWriteBuffer() int { - if o == nil || o.WriteBuffer <= 0 { - return DefaultWriteBuffer - } - return o.WriteBuffer -} - -func (o *Options) GetWriteL0PauseTrigger() int { - if o == nil || o.WriteL0PauseTrigger == 0 { - return DefaultWriteL0PauseTrigger - } - return o.WriteL0PauseTrigger -} - -func (o *Options) GetWriteL0SlowdownTrigger() int { - if o == nil || o.WriteL0SlowdownTrigger == 0 { - return DefaultWriteL0SlowdownTrigger - } - return o.WriteL0SlowdownTrigger -} - -// ReadOptions holds the optional parameters for 'read operation'. The -// 'read operation' includes Get, Find and NewIterator. -type ReadOptions struct { - // DontFillCache defines whether block reads for this 'read operation' - // should be cached. If false then the block will be cached. This does - // not affects already cached block. - // - // The default value is false. - DontFillCache bool - - // Strict will be OR'ed with global DB 'strict level' unless StrictOverride - // is present. Currently only StrictReader that has effect here. - Strict Strict -} - -func (ro *ReadOptions) GetDontFillCache() bool { - if ro == nil { - return false - } - return ro.DontFillCache -} - -func (ro *ReadOptions) GetStrict(strict Strict) bool { - if ro == nil { - return false - } - return ro.Strict&strict != 0 -} - -// WriteOptions holds the optional parameters for 'write operation'. The -// 'write operation' includes Write, Put and Delete. -type WriteOptions struct { - // Sync is whether to sync underlying writes from the OS buffer cache - // through to actual disk, if applicable. Setting Sync can result in - // slower writes. - // - // If false, and the machine crashes, then some recent writes may be lost. - // Note that if it is just the process that crashes (and the machine does - // not) then no writes will be lost. - // - // In other words, Sync being false has the same semantics as a write - // system call. Sync being true means write followed by fsync. - // - // The default value is false. - Sync bool -} - -func (wo *WriteOptions) GetSync() bool { - if wo == nil { - return false - } - return wo.Sync -} - -func GetStrict(o *Options, ro *ReadOptions, strict Strict) bool { - if ro.GetStrict(StrictOverride) { - return ro.GetStrict(strict) - } else { - return o.GetStrict(strict) || ro.GetStrict(strict) - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/options.go deleted file mode 100644 index b072b1ac4c78..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/options.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -func dupOptions(o *opt.Options) *opt.Options { - newo := &opt.Options{} - if o != nil { - *newo = *o - } - if newo.Strict == 0 { - newo.Strict = opt.DefaultStrict - } - return newo -} - -func (s *session) setOptions(o *opt.Options) { - no := dupOptions(o) - // Alternative filters. - if filters := o.GetAltFilters(); len(filters) > 0 { - no.AltFilters = make([]filter.Filter, len(filters)) - for i, filter := range filters { - no.AltFilters[i] = &iFilter{filter} - } - } - // Comparer. - s.icmp = &iComparer{o.GetComparer()} - no.Comparer = s.icmp - // Filter. - if filter := o.GetFilter(); filter != nil { - no.Filter = &iFilter{filter} - } - - s.o = &cachedOptions{Options: no} - s.o.cache() -} - -const optCachedLevel = 7 - -type cachedOptions struct { - *opt.Options - - compactionExpandLimit []int - compactionGPOverlaps []int - compactionSourceLimit []int - compactionTableSize []int - compactionTotalSize []int64 -} - -func (co *cachedOptions) cache() { - co.compactionExpandLimit = make([]int, optCachedLevel) - co.compactionGPOverlaps = make([]int, optCachedLevel) - co.compactionSourceLimit = make([]int, optCachedLevel) - co.compactionTableSize = make([]int, optCachedLevel) - co.compactionTotalSize = make([]int64, optCachedLevel) - - for level := 0; level < optCachedLevel; level++ { - co.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level) - co.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level) - co.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level) - co.compactionTableSize[level] = co.Options.GetCompactionTableSize(level) - co.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level) - } -} - -func (co *cachedOptions) GetCompactionExpandLimit(level int) int { - if level < optCachedLevel { - return co.compactionExpandLimit[level] - } - return co.Options.GetCompactionExpandLimit(level) -} - -func (co *cachedOptions) GetCompactionGPOverlaps(level int) int { - if level < optCachedLevel { - return co.compactionGPOverlaps[level] - } - return co.Options.GetCompactionGPOverlaps(level) -} - -func (co *cachedOptions) GetCompactionSourceLimit(level int) int { - if level < optCachedLevel { - return co.compactionSourceLimit[level] - } - return co.Options.GetCompactionSourceLimit(level) -} - -func (co *cachedOptions) GetCompactionTableSize(level int) int { - if level < optCachedLevel { - return co.compactionTableSize[level] - } - return co.Options.GetCompactionTableSize(level) -} - -func (co *cachedOptions) GetCompactionTotalSize(level int) int64 { - if level < optCachedLevel { - return co.compactionTotalSize[level] - } - return co.Options.GetCompactionTotalSize(level) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go deleted file mode 100644 index b0d3fef1d8bb..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "io" - "os" - "sync" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrManifestCorrupted records manifest corruption. -type ErrManifestCorrupted struct { - Field string - Reason string -} - -func (e *ErrManifestCorrupted) Error() string { - return fmt.Sprintf("leveldb: manifest corrupted (field '%s'): %s", e.Field, e.Reason) -} - -func newErrManifestCorrupted(fd storage.FileDesc, field, reason string) error { - return errors.NewErrCorrupted(fd, &ErrManifestCorrupted{field, reason}) -} - -// session represent a persistent database session. -type session struct { - // Need 64-bit alignment. - stNextFileNum int64 // current unused file number - stJournalNum int64 // current journal file number; need external synchronization - stPrevJournalNum int64 // prev journal file number; no longer used; for compatibility with older version of leveldb - stTempFileNum int64 - stSeqNum uint64 // last mem compacted seq; need external synchronization - - stor storage.Storage - storLock storage.Lock - o *cachedOptions - icmp *iComparer - tops *tOps - - manifest *journal.Writer - manifestWriter storage.Writer - manifestFd storage.FileDesc - - stCompPtrs []internalKey // compaction pointers; need external synchronization - stVersion *version // current version - vmu sync.Mutex -} - -// Creates new initialized session instance. -func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) { - if stor == nil { - return nil, os.ErrInvalid - } - storLock, err := stor.Lock() - if err != nil { - return - } - s = &session{ - stor: stor, - storLock: storLock, - } - s.setOptions(o) - s.tops = newTableOps(s) - s.setVersion(newVersion(s)) - s.log("log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed") - return -} - -// Close session. -func (s *session) close() { - s.tops.close() - if s.manifest != nil { - s.manifest.Close() - } - if s.manifestWriter != nil { - s.manifestWriter.Close() - } - s.manifest = nil - s.manifestWriter = nil - s.stVersion = nil -} - -// Release session lock. -func (s *session) release() { - s.storLock.Release() -} - -// Create a new database session; need external synchronization. -func (s *session) create() error { - // create manifest - return s.newManifest(nil, nil) -} - -// Recover a database session; need external synchronization. -func (s *session) recover() (err error) { - defer func() { - if os.IsNotExist(err) { - // Don't return os.ErrNotExist if the underlying storage contains - // other files that belong to LevelDB. So the DB won't get trashed. - if fds, _ := s.stor.List(storage.TypeAll); len(fds) > 0 { - err = &errors.ErrCorrupted{Fd: storage.FileDesc{Type: storage.TypeManifest}, Err: &errors.ErrMissingFiles{}} - } - } - }() - - fd, err := s.stor.GetMeta() - if err != nil { - return - } - - reader, err := s.stor.Open(fd) - if err != nil { - return - } - defer reader.Close() - - var ( - // Options. - strict = s.o.GetStrict(opt.StrictManifest) - - jr = journal.NewReader(reader, dropper{s, fd}, strict, true) - rec = &sessionRecord{} - staging = s.stVersion.newStaging() - ) - for { - var r io.Reader - r, err = jr.Next() - if err != nil { - if err == io.EOF { - err = nil - break - } - return errors.SetFd(err, fd) - } - - err = rec.decode(r) - if err == nil { - // save compact pointers - for _, r := range rec.compPtrs { - s.setCompPtr(r.level, internalKey(r.ikey)) - } - // commit record to version staging - staging.commit(rec) - } else { - err = errors.SetFd(err, fd) - if strict || !errors.IsCorrupted(err) { - return - } - s.logf("manifest error: %v (skipped)", errors.SetFd(err, fd)) - } - rec.resetCompPtrs() - rec.resetAddedTables() - rec.resetDeletedTables() - } - - switch { - case !rec.has(recComparer): - return newErrManifestCorrupted(fd, "comparer", "missing") - case rec.comparer != s.icmp.uName(): - return newErrManifestCorrupted(fd, "comparer", fmt.Sprintf("mismatch: want '%s', got '%s'", s.icmp.uName(), rec.comparer)) - case !rec.has(recNextFileNum): - return newErrManifestCorrupted(fd, "next-file-num", "missing") - case !rec.has(recJournalNum): - return newErrManifestCorrupted(fd, "journal-file-num", "missing") - case !rec.has(recSeqNum): - return newErrManifestCorrupted(fd, "seq-num", "missing") - } - - s.manifestFd = fd - s.setVersion(staging.finish()) - s.setNextFileNum(rec.nextFileNum) - s.recordCommited(rec) - return nil -} - -// Commit session; need external synchronization. -func (s *session) commit(r *sessionRecord) (err error) { - v := s.version() - defer v.release() - - // spawn new version based on current version - nv := v.spawn(r) - - if s.manifest == nil { - // manifest journal writer not yet created, create one - err = s.newManifest(r, nv) - } else { - err = s.flushManifest(r) - } - - // finally, apply new version if no error rise - if err == nil { - s.setVersion(nv) - } - - return -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go deleted file mode 100644 index 089cd00b26d5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -func (s *session) pickMemdbLevel(umin, umax []byte, maxLevel int) int { - v := s.version() - defer v.release() - return v.pickMemdbLevel(umin, umax, maxLevel) -} - -func (s *session) flushMemdb(rec *sessionRecord, mdb *memdb.DB, maxLevel int) (int, error) { - // Create sorted table. - iter := mdb.NewIterator(nil) - defer iter.Release() - t, n, err := s.tops.createFrom(iter) - if err != nil { - return 0, err - } - - // Pick level other than zero can cause compaction issue with large - // bulk insert and delete on strictly incrementing key-space. The - // problem is that the small deletion markers trapped at lower level, - // while key/value entries keep growing at higher level. Since the - // key-space is strictly incrementing it will not overlaps with - // higher level, thus maximum possible level is always picked, while - // overlapping deletion marker pushed into lower level. - // See: https://github.com/syndtr/goleveldb/issues/127. - flushLevel := s.pickMemdbLevel(t.imin.ukey(), t.imax.ukey(), maxLevel) - rec.addTableFile(flushLevel, t) - - s.logf("memdb@flush created L%d@%d N·%d S·%s %q:%q", flushLevel, t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax) - return flushLevel, nil -} - -// Pick a compaction based on current state; need external synchronization. -func (s *session) pickCompaction() *compaction { - v := s.version() - - var sourceLevel int - var t0 tFiles - if v.cScore >= 1 { - sourceLevel = v.cLevel - cptr := s.getCompPtr(sourceLevel) - tables := v.levels[sourceLevel] - for _, t := range tables { - if cptr == nil || s.icmp.Compare(t.imax, cptr) > 0 { - t0 = append(t0, t) - break - } - } - if len(t0) == 0 { - t0 = append(t0, tables[0]) - } - } else { - if p := atomic.LoadPointer(&v.cSeek); p != nil { - ts := (*tSet)(p) - sourceLevel = ts.level - t0 = append(t0, ts.table) - } else { - v.release() - return nil - } - } - - return newCompaction(s, v, sourceLevel, t0) -} - -// Create compaction from given level and range; need external synchronization. -func (s *session) getCompactionRange(sourceLevel int, umin, umax []byte, noLimit bool) *compaction { - v := s.version() - - if sourceLevel >= len(v.levels) { - v.release() - return nil - } - - t0 := v.levels[sourceLevel].getOverlaps(nil, s.icmp, umin, umax, sourceLevel == 0) - if len(t0) == 0 { - v.release() - return nil - } - - // Avoid compacting too much in one shot in case the range is large. - // But we cannot do this for level-0 since level-0 files can overlap - // and we must not pick one file and drop another older file if the - // two files overlap. - if !noLimit && sourceLevel > 0 { - limit := int64(v.s.o.GetCompactionSourceLimit(sourceLevel)) - total := int64(0) - for i, t := range t0 { - total += t.size - if total >= limit { - s.logf("table@compaction limiting F·%d -> F·%d", len(t0), i+1) - t0 = t0[:i+1] - break - } - } - } - - return newCompaction(s, v, sourceLevel, t0) -} - -func newCompaction(s *session, v *version, sourceLevel int, t0 tFiles) *compaction { - c := &compaction{ - s: s, - v: v, - sourceLevel: sourceLevel, - levels: [2]tFiles{t0, nil}, - maxGPOverlaps: int64(s.o.GetCompactionGPOverlaps(sourceLevel)), - tPtrs: make([]int, len(v.levels)), - } - c.expand() - c.save() - return c -} - -// compaction represent a compaction state. -type compaction struct { - s *session - v *version - - sourceLevel int - levels [2]tFiles - maxGPOverlaps int64 - - gp tFiles - gpi int - seenKey bool - gpOverlappedBytes int64 - imin, imax internalKey - tPtrs []int - released bool - - snapGPI int - snapSeenKey bool - snapGPOverlappedBytes int64 - snapTPtrs []int -} - -func (c *compaction) save() { - c.snapGPI = c.gpi - c.snapSeenKey = c.seenKey - c.snapGPOverlappedBytes = c.gpOverlappedBytes - c.snapTPtrs = append(c.snapTPtrs[:0], c.tPtrs...) -} - -func (c *compaction) restore() { - c.gpi = c.snapGPI - c.seenKey = c.snapSeenKey - c.gpOverlappedBytes = c.snapGPOverlappedBytes - c.tPtrs = append(c.tPtrs[:0], c.snapTPtrs...) -} - -func (c *compaction) release() { - if !c.released { - c.released = true - c.v.release() - } -} - -// Expand compacted tables; need external synchronization. -func (c *compaction) expand() { - limit := int64(c.s.o.GetCompactionExpandLimit(c.sourceLevel)) - vt0 := c.v.levels[c.sourceLevel] - vt1 := tFiles{} - if level := c.sourceLevel + 1; level < len(c.v.levels) { - vt1 = c.v.levels[level] - } - - t0, t1 := c.levels[0], c.levels[1] - imin, imax := t0.getRange(c.s.icmp) - // We expand t0 here just incase ukey hop across tables. - t0 = vt0.getOverlaps(t0, c.s.icmp, imin.ukey(), imax.ukey(), c.sourceLevel == 0) - if len(t0) != len(c.levels[0]) { - imin, imax = t0.getRange(c.s.icmp) - } - t1 = vt1.getOverlaps(t1, c.s.icmp, imin.ukey(), imax.ukey(), false) - // Get entire range covered by compaction. - amin, amax := append(t0, t1...).getRange(c.s.icmp) - - // See if we can grow the number of inputs in "sourceLevel" without - // changing the number of "sourceLevel+1" files we pick up. - if len(t1) > 0 { - exp0 := vt0.getOverlaps(nil, c.s.icmp, amin.ukey(), amax.ukey(), c.sourceLevel == 0) - if len(exp0) > len(t0) && t1.size()+exp0.size() < limit { - xmin, xmax := exp0.getRange(c.s.icmp) - exp1 := vt1.getOverlaps(nil, c.s.icmp, xmin.ukey(), xmax.ukey(), false) - if len(exp1) == len(t1) { - c.s.logf("table@compaction expanding L%d+L%d (F·%d S·%s)+(F·%d S·%s) -> (F·%d S·%s)+(F·%d S·%s)", - c.sourceLevel, c.sourceLevel+1, len(t0), shortenb(int(t0.size())), len(t1), shortenb(int(t1.size())), - len(exp0), shortenb(int(exp0.size())), len(exp1), shortenb(int(exp1.size()))) - imin, imax = xmin, xmax - t0, t1 = exp0, exp1 - amin, amax = append(t0, t1...).getRange(c.s.icmp) - } - } - } - - // Compute the set of grandparent files that overlap this compaction - // (parent == sourceLevel+1; grandparent == sourceLevel+2) - if level := c.sourceLevel + 2; level < len(c.v.levels) { - c.gp = c.v.levels[level].getOverlaps(c.gp, c.s.icmp, amin.ukey(), amax.ukey(), false) - } - - c.levels[0], c.levels[1] = t0, t1 - c.imin, c.imax = imin, imax -} - -// Check whether compaction is trivial. -func (c *compaction) trivial() bool { - return len(c.levels[0]) == 1 && len(c.levels[1]) == 0 && c.gp.size() <= c.maxGPOverlaps -} - -func (c *compaction) baseLevelForKey(ukey []byte) bool { - for level := c.sourceLevel + 2; level < len(c.v.levels); level++ { - tables := c.v.levels[level] - for c.tPtrs[level] < len(tables) { - t := tables[c.tPtrs[level]] - if c.s.icmp.uCompare(ukey, t.imax.ukey()) <= 0 { - // We've advanced far enough. - if c.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 { - // Key falls in this file's range, so definitely not base level. - return false - } - break - } - c.tPtrs[level]++ - } - } - return true -} - -func (c *compaction) shouldStopBefore(ikey internalKey) bool { - for ; c.gpi < len(c.gp); c.gpi++ { - gp := c.gp[c.gpi] - if c.s.icmp.Compare(ikey, gp.imax) <= 0 { - break - } - if c.seenKey { - c.gpOverlappedBytes += gp.size - } - } - c.seenKey = true - - if c.gpOverlappedBytes > c.maxGPOverlaps { - // Too much overlap for current output; start new output. - c.gpOverlappedBytes = 0 - return true - } - return false -} - -// Creates an iterator. -func (c *compaction) newIterator() iterator.Iterator { - // Creates iterator slice. - icap := len(c.levels) - if c.sourceLevel == 0 { - // Special case for level-0. - icap = len(c.levels[0]) + 1 - } - its := make([]iterator.Iterator, 0, icap) - - // Options. - ro := &opt.ReadOptions{ - DontFillCache: true, - Strict: opt.StrictOverride, - } - strict := c.s.o.GetStrict(opt.StrictCompaction) - if strict { - ro.Strict |= opt.StrictReader - } - - for i, tables := range c.levels { - if len(tables) == 0 { - continue - } - - // Level-0 is not sorted and may overlaps each other. - if c.sourceLevel+i == 0 { - for _, t := range tables { - its = append(its, c.s.tops.newIterator(t, nil, ro)) - } - } else { - it := iterator.NewIndexedIterator(tables.newIndexIterator(c.s.tops, c.s.icmp, nil, ro), strict) - its = append(its, it) - } - } - - return iterator.NewMergedIterator(its, c.s.icmp, strict) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go deleted file mode 100644 index 854e1aa6f9b4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "bufio" - "encoding/binary" - "io" - "strings" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -type byteReader interface { - io.Reader - io.ByteReader -} - -// These numbers are written to disk and should not be changed. -const ( - recComparer = 1 - recJournalNum = 2 - recNextFileNum = 3 - recSeqNum = 4 - recCompPtr = 5 - recDelTable = 6 - recAddTable = 7 - // 8 was used for large value refs - recPrevJournalNum = 9 -) - -type cpRecord struct { - level int - ikey internalKey -} - -type atRecord struct { - level int - num int64 - size int64 - imin internalKey - imax internalKey -} - -type dtRecord struct { - level int - num int64 -} - -type sessionRecord struct { - hasRec int - comparer string - journalNum int64 - prevJournalNum int64 - nextFileNum int64 - seqNum uint64 - compPtrs []cpRecord - addedTables []atRecord - deletedTables []dtRecord - - scratch [binary.MaxVarintLen64]byte - err error -} - -func (p *sessionRecord) has(rec int) bool { - return p.hasRec&(1< -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// Logging. - -type dropper struct { - s *session - fd storage.FileDesc -} - -func (d dropper) Drop(err error) { - if e, ok := err.(*journal.ErrCorrupted); ok { - d.s.logf("journal@drop %s-%d S·%s %q", d.fd.Type, d.fd.Num, shortenb(e.Size), e.Reason) - } else { - d.s.logf("journal@drop %s-%d %q", d.fd.Type, d.fd.Num, err) - } -} - -func (s *session) log(v ...interface{}) { s.stor.Log(fmt.Sprint(v...)) } -func (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf(format, v...)) } - -// File utils. - -func (s *session) newTemp() storage.FileDesc { - num := atomic.AddInt64(&s.stTempFileNum, 1) - 1 - return storage.FileDesc{storage.TypeTemp, num} -} - -// Session state. - -// Get current version. This will incr version ref, must call -// version.release (exactly once) after use. -func (s *session) version() *version { - s.vmu.Lock() - defer s.vmu.Unlock() - s.stVersion.ref++ - return s.stVersion -} - -// Set current version to v. -func (s *session) setVersion(v *version) { - s.vmu.Lock() - v.ref = 1 // Holds by session. - if old := s.stVersion; old != nil { - v.ref++ // Holds by old version. - old.next = v - old.releaseNB() - } - s.stVersion = v - s.vmu.Unlock() -} - -// Get current unused file number. -func (s *session) nextFileNum() int64 { - return atomic.LoadInt64(&s.stNextFileNum) -} - -// Set current unused file number to num. -func (s *session) setNextFileNum(num int64) { - atomic.StoreInt64(&s.stNextFileNum, num) -} - -// Mark file number as used. -func (s *session) markFileNum(num int64) { - nextFileNum := num + 1 - for { - old, x := s.stNextFileNum, nextFileNum - if old > x { - x = old - } - if atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) { - break - } - } -} - -// Allocate a file number. -func (s *session) allocFileNum() int64 { - return atomic.AddInt64(&s.stNextFileNum, 1) - 1 -} - -// Reuse given file number. -func (s *session) reuseFileNum(num int64) { - for { - old, x := s.stNextFileNum, num - if old != x+1 { - x = old - } - if atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) { - break - } - } -} - -// Set compaction ptr at given level; need external synchronization. -func (s *session) setCompPtr(level int, ik internalKey) { - if level >= len(s.stCompPtrs) { - newCompPtrs := make([]internalKey, level+1) - copy(newCompPtrs, s.stCompPtrs) - s.stCompPtrs = newCompPtrs - } - s.stCompPtrs[level] = append(internalKey{}, ik...) -} - -// Get compaction ptr at given level; need external synchronization. -func (s *session) getCompPtr(level int) internalKey { - if level >= len(s.stCompPtrs) { - return nil - } - return s.stCompPtrs[level] -} - -// Manifest related utils. - -// Fill given session record obj with current states; need external -// synchronization. -func (s *session) fillRecord(r *sessionRecord, snapshot bool) { - r.setNextFileNum(s.nextFileNum()) - - if snapshot { - if !r.has(recJournalNum) { - r.setJournalNum(s.stJournalNum) - } - - if !r.has(recSeqNum) { - r.setSeqNum(s.stSeqNum) - } - - for level, ik := range s.stCompPtrs { - if ik != nil { - r.addCompPtr(level, ik) - } - } - - r.setComparer(s.icmp.uName()) - } -} - -// Mark if record has been committed, this will update session state; -// need external synchronization. -func (s *session) recordCommited(rec *sessionRecord) { - if rec.has(recJournalNum) { - s.stJournalNum = rec.journalNum - } - - if rec.has(recPrevJournalNum) { - s.stPrevJournalNum = rec.prevJournalNum - } - - if rec.has(recSeqNum) { - s.stSeqNum = rec.seqNum - } - - for _, r := range rec.compPtrs { - s.setCompPtr(r.level, internalKey(r.ikey)) - } -} - -// Create a new manifest file; need external synchronization. -func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { - fd := storage.FileDesc{storage.TypeManifest, s.allocFileNum()} - writer, err := s.stor.Create(fd) - if err != nil { - return - } - jw := journal.NewWriter(writer) - - if v == nil { - v = s.version() - defer v.release() - } - if rec == nil { - rec = &sessionRecord{} - } - s.fillRecord(rec, true) - v.fillRecord(rec) - - defer func() { - if err == nil { - s.recordCommited(rec) - if s.manifest != nil { - s.manifest.Close() - } - if s.manifestWriter != nil { - s.manifestWriter.Close() - } - if !s.manifestFd.Nil() { - s.stor.Remove(s.manifestFd) - } - s.manifestFd = fd - s.manifestWriter = writer - s.manifest = jw - } else { - writer.Close() - s.stor.Remove(fd) - s.reuseFileNum(fd.Num) - } - }() - - w, err := jw.Next() - if err != nil { - return - } - err = rec.encode(w) - if err != nil { - return - } - err = jw.Flush() - if err != nil { - return - } - err = s.stor.SetMeta(fd) - return -} - -// Flush record to disk. -func (s *session) flushManifest(rec *sessionRecord) (err error) { - s.fillRecord(rec, false) - w, err := s.manifest.Next() - if err != nil { - return - } - err = rec.encode(w) - if err != nil { - return - } - err = s.manifest.Flush() - if err != nil { - return - } - if !s.o.GetNoSync() { - err = s.manifestWriter.Sync() - if err != nil { - return - } - } - s.recordCommited(rec) - return -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go deleted file mode 100644 index cbe1dc103121..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reservefs. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strconv" - "strings" - "sync" - "time" -) - -var ( - errFileOpen = errors.New("leveldb/storage: file still open") - errReadOnly = errors.New("leveldb/storage: storage is read-only") -) - -type fileLock interface { - release() error -} - -type fileStorageLock struct { - fs *fileStorage -} - -func (lock *fileStorageLock) Release() { - if lock.fs != nil { - lock.fs.mu.Lock() - defer lock.fs.mu.Unlock() - if lock.fs.slock == lock { - lock.fs.slock = nil - } - } -} - -const logSizeThreshold = 1024 * 1024 // 1 MiB - -// fileStorage is a file-system backed storage. -type fileStorage struct { - path string - readOnly bool - - mu sync.Mutex - flock fileLock - slock *fileStorageLock - logw *os.File - logSize int64 - buf []byte - // Opened file counter; if open < 0 means closed. - open int - day int -} - -// OpenFile returns a new filesytem-backed storage implementation with the given -// path. This also acquire a file lock, so any subsequent attempt to open the -// same path will fail. -// -// The storage must be closed after use, by calling Close method. -func OpenFile(path string, readOnly bool) (Storage, error) { - if fi, err := os.Stat(path); err == nil { - if !fi.IsDir() { - return nil, fmt.Errorf("leveldb/storage: open %s: not a directory", path) - } - } else if os.IsNotExist(err) && !readOnly { - if err := os.MkdirAll(path, 0755); err != nil { - return nil, err - } - } else { - return nil, err - } - - flock, err := newFileLock(filepath.Join(path, "LOCK"), readOnly) - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - flock.release() - } - }() - - var ( - logw *os.File - logSize int64 - ) - if !readOnly { - logw, err = os.OpenFile(filepath.Join(path, "LOG"), os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, err - } - logSize, err = logw.Seek(0, os.SEEK_END) - if err != nil { - logw.Close() - return nil, err - } - } - - fs := &fileStorage{ - path: path, - readOnly: readOnly, - flock: flock, - logw: logw, - logSize: logSize, - } - runtime.SetFinalizer(fs, (*fileStorage).Close) - return fs, nil -} - -func (fs *fileStorage) Lock() (Lock, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - if fs.readOnly { - return &fileStorageLock{}, nil - } - if fs.slock != nil { - return nil, ErrLocked - } - fs.slock = &fileStorageLock{fs: fs} - return fs.slock, nil -} - -func itoa(buf []byte, i int, wid int) []byte { - u := uint(i) - if u == 0 && wid <= 1 { - return append(buf, '0') - } - - // Assemble decimal in reverse order. - var b [32]byte - bp := len(b) - for ; u > 0 || wid > 0; u /= 10 { - bp-- - wid-- - b[bp] = byte(u%10) + '0' - } - return append(buf, b[bp:]...) -} - -func (fs *fileStorage) printDay(t time.Time) { - if fs.day == t.Day() { - return - } - fs.day = t.Day() - fs.logw.Write([]byte("=============== " + t.Format("Jan 2, 2006 (MST)") + " ===============\n")) -} - -func (fs *fileStorage) doLog(t time.Time, str string) { - if fs.logSize > logSizeThreshold { - // Rotate log file. - fs.logw.Close() - fs.logw = nil - fs.logSize = 0 - rename(filepath.Join(fs.path, "LOG"), filepath.Join(fs.path, "LOG.old")) - } - if fs.logw == nil { - var err error - fs.logw, err = os.OpenFile(filepath.Join(fs.path, "LOG"), os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return - } - // Force printDay on new log file. - fs.day = 0 - } - fs.printDay(t) - hour, min, sec := t.Clock() - msec := t.Nanosecond() / 1e3 - // time - fs.buf = itoa(fs.buf[:0], hour, 2) - fs.buf = append(fs.buf, ':') - fs.buf = itoa(fs.buf, min, 2) - fs.buf = append(fs.buf, ':') - fs.buf = itoa(fs.buf, sec, 2) - fs.buf = append(fs.buf, '.') - fs.buf = itoa(fs.buf, msec, 6) - fs.buf = append(fs.buf, ' ') - // write - fs.buf = append(fs.buf, []byte(str)...) - fs.buf = append(fs.buf, '\n') - fs.logw.Write(fs.buf) -} - -func (fs *fileStorage) Log(str string) { - if !fs.readOnly { - t := time.Now() - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return - } - fs.doLog(t, str) - } -} - -func (fs *fileStorage) log(str string) { - if !fs.readOnly { - fs.doLog(time.Now(), str) - } -} - -func (fs *fileStorage) SetMeta(fd FileDesc) (err error) { - if !FileDescOk(fd) { - return ErrInvalidFile - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - defer func() { - if err != nil { - fs.log(fmt.Sprintf("CURRENT: %v", err)) - } - }() - path := fmt.Sprintf("%s.%d", filepath.Join(fs.path, "CURRENT"), fd.Num) - w, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return - } - _, err = fmt.Fprintln(w, fsGenName(fd)) - // Close the file first. - if cerr := w.Close(); cerr != nil { - fs.log(fmt.Sprintf("close CURRENT.%d: %v", fd.Num, cerr)) - } - if err != nil { - return - } - return rename(path, filepath.Join(fs.path, "CURRENT")) -} - -func (fs *fileStorage) GetMeta() (fd FileDesc, err error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return FileDesc{}, ErrClosed - } - dir, err := os.Open(fs.path) - if err != nil { - return - } - names, err := dir.Readdirnames(0) - // Close the dir first before checking for Readdirnames error. - if ce := dir.Close(); ce != nil { - fs.log(fmt.Sprintf("close dir: %v", ce)) - } - if err != nil { - return - } - // Find latest CURRENT file. - var rem []string - var pend bool - var cerr error - for _, name := range names { - if strings.HasPrefix(name, "CURRENT") { - pend1 := len(name) > 7 - var pendNum int64 - // Make sure it is valid name for a CURRENT file, otherwise skip it. - if pend1 { - if name[7] != '.' || len(name) < 9 { - fs.log(fmt.Sprintf("skipping %s: invalid file name", name)) - continue - } - var e1 error - if pendNum, e1 = strconv.ParseInt(name[8:], 10, 0); e1 != nil { - fs.log(fmt.Sprintf("skipping %s: invalid file num: %v", name, e1)) - continue - } - } - path := filepath.Join(fs.path, name) - r, e1 := os.OpenFile(path, os.O_RDONLY, 0) - if e1 != nil { - return FileDesc{}, e1 - } - b, e1 := ioutil.ReadAll(r) - if e1 != nil { - r.Close() - return FileDesc{}, e1 - } - var fd1 FileDesc - if len(b) < 1 || b[len(b)-1] != '\n' || !fsParseNamePtr(string(b[:len(b)-1]), &fd1) { - fs.log(fmt.Sprintf("skipping %s: corrupted or incomplete", name)) - if pend1 { - rem = append(rem, name) - } - if !pend1 || cerr == nil { - metaFd, _ := fsParseName(name) - cerr = &ErrCorrupted{ - Fd: metaFd, - Err: errors.New("leveldb/storage: corrupted or incomplete meta file"), - } - } - } else if pend1 && pendNum != fd1.Num { - fs.log(fmt.Sprintf("skipping %s: inconsistent pending-file num: %d vs %d", name, pendNum, fd1.Num)) - rem = append(rem, name) - } else if fd1.Num < fd.Num { - fs.log(fmt.Sprintf("skipping %s: obsolete", name)) - if pend1 { - rem = append(rem, name) - } - } else { - fd = fd1 - pend = pend1 - } - if err := r.Close(); err != nil { - fs.log(fmt.Sprintf("close %s: %v", name, err)) - } - } - } - // Don't remove any files if there is no valid CURRENT file. - if fd.Nil() { - if cerr != nil { - err = cerr - } else { - err = os.ErrNotExist - } - return - } - if !fs.readOnly { - // Rename pending CURRENT file to an effective CURRENT. - if pend { - path := fmt.Sprintf("%s.%d", filepath.Join(fs.path, "CURRENT"), fd.Num) - if err := rename(path, filepath.Join(fs.path, "CURRENT")); err != nil { - fs.log(fmt.Sprintf("CURRENT.%d -> CURRENT: %v", fd.Num, err)) - } - } - // Remove obsolete or incomplete pending CURRENT files. - for _, name := range rem { - path := filepath.Join(fs.path, name) - if err := os.Remove(path); err != nil { - fs.log(fmt.Sprintf("remove %s: %v", name, err)) - } - } - } - return -} - -func (fs *fileStorage) List(ft FileType) (fds []FileDesc, err error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - dir, err := os.Open(fs.path) - if err != nil { - return - } - names, err := dir.Readdirnames(0) - // Close the dir first before checking for Readdirnames error. - if cerr := dir.Close(); cerr != nil { - fs.log(fmt.Sprintf("close dir: %v", cerr)) - } - if err == nil { - for _, name := range names { - if fd, ok := fsParseName(name); ok && fd.Type&ft != 0 { - fds = append(fds, fd) - } - } - } - return -} - -func (fs *fileStorage) Open(fd FileDesc) (Reader, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - of, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_RDONLY, 0) - if err != nil { - if fsHasOldName(fd) && os.IsNotExist(err) { - of, err = os.OpenFile(filepath.Join(fs.path, fsGenOldName(fd)), os.O_RDONLY, 0) - if err == nil { - goto ok - } - } - return nil, err - } -ok: - fs.open++ - return &fileWrap{File: of, fs: fs, fd: fd}, nil -} - -func (fs *fileStorage) Create(fd FileDesc) (Writer, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - if fs.readOnly { - return nil, errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - of, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return nil, err - } - fs.open++ - return &fileWrap{File: of, fs: fs, fd: fd}, nil -} - -func (fs *fileStorage) Remove(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - err := os.Remove(filepath.Join(fs.path, fsGenName(fd))) - if err != nil { - if fsHasOldName(fd) && os.IsNotExist(err) { - if e1 := os.Remove(filepath.Join(fs.path, fsGenOldName(fd))); !os.IsNotExist(e1) { - fs.log(fmt.Sprintf("remove %s: %v (old name)", fd, err)) - err = e1 - } - } else { - fs.log(fmt.Sprintf("remove %s: %v", fd, err)) - } - } - return err -} - -func (fs *fileStorage) Rename(oldfd, newfd FileDesc) error { - if !FileDescOk(oldfd) || !FileDescOk(newfd) { - return ErrInvalidFile - } - if oldfd == newfd { - return nil - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - return rename(filepath.Join(fs.path, fsGenName(oldfd)), filepath.Join(fs.path, fsGenName(newfd))) -} - -func (fs *fileStorage) Close() error { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - // Clear the finalizer. - runtime.SetFinalizer(fs, nil) - - if fs.open > 0 { - fs.log(fmt.Sprintf("close: warning, %d files still open", fs.open)) - } - fs.open = -1 - if fs.logw != nil { - fs.logw.Close() - } - return fs.flock.release() -} - -type fileWrap struct { - *os.File - fs *fileStorage - fd FileDesc - closed bool -} - -func (fw *fileWrap) Sync() error { - if err := fw.File.Sync(); err != nil { - return err - } - if fw.fd.Type == TypeManifest { - // Also sync parent directory if file type is manifest. - // See: https://code.google.com/p/leveldb/issues/detail?id=190. - if err := syncDir(fw.fs.path); err != nil { - fw.fs.log(fmt.Sprintf("syncDir: %v", err)) - return err - } - } - return nil -} - -func (fw *fileWrap) Close() error { - fw.fs.mu.Lock() - defer fw.fs.mu.Unlock() - if fw.closed { - return ErrClosed - } - fw.closed = true - fw.fs.open-- - err := fw.File.Close() - if err != nil { - fw.fs.log(fmt.Sprintf("close %s: %v", fw.fd, err)) - } - return err -} - -func fsGenName(fd FileDesc) string { - switch fd.Type { - case TypeManifest: - return fmt.Sprintf("MANIFEST-%06d", fd.Num) - case TypeJournal: - return fmt.Sprintf("%06d.log", fd.Num) - case TypeTable: - return fmt.Sprintf("%06d.ldb", fd.Num) - case TypeTemp: - return fmt.Sprintf("%06d.tmp", fd.Num) - default: - panic("invalid file type") - } -} - -func fsHasOldName(fd FileDesc) bool { - return fd.Type == TypeTable -} - -func fsGenOldName(fd FileDesc) string { - switch fd.Type { - case TypeTable: - return fmt.Sprintf("%06d.sst", fd.Num) - } - return fsGenName(fd) -} - -func fsParseName(name string) (fd FileDesc, ok bool) { - var tail string - _, err := fmt.Sscanf(name, "%d.%s", &fd.Num, &tail) - if err == nil { - switch tail { - case "log": - fd.Type = TypeJournal - case "ldb", "sst": - fd.Type = TypeTable - case "tmp": - fd.Type = TypeTemp - default: - return - } - return fd, true - } - n, _ := fmt.Sscanf(name, "MANIFEST-%d%s", &fd.Num, &tail) - if n == 1 { - fd.Type = TypeManifest - return fd, true - } - return -} - -func fsParseNamePtr(name string, fd *FileDesc) bool { - _fd, ok := fsParseName(name) - if fd != nil { - *fd = _fd - } - return ok -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go deleted file mode 100644 index bab62bfcee8b..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "os" - "path/filepath" -) - -type plan9FileLock struct { - f *os.File -} - -func (fl *plan9FileLock) release() error { - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var ( - flag int - perm os.FileMode - ) - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - perm = os.ModeExclusive - } - f, err := os.OpenFile(path, flag, perm) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644) - } - if err != nil { - return - } - fl = &plan9FileLock{f: f} - return -} - -func rename(oldpath, newpath string) error { - if _, err := os.Stat(newpath); err == nil { - if err := os.Remove(newpath); err != nil { - return err - } - } - - _, fname := filepath.Split(newpath) - return os.Rename(oldpath, fname) -} - -func syncDir(name string) error { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go deleted file mode 100644 index 79901ee4a7a3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// +build solaris - -package storage - -import ( - "os" - "syscall" -) - -type unixFileLock struct { - f *os.File -} - -func (fl *unixFileLock) release() error { - if err := setFileLock(fl.f, false, false); err != nil { - return err - } - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var flag int - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - } - f, err := os.OpenFile(path, flag, 0) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) - } - if err != nil { - return - } - err = setFileLock(f, readOnly, true) - if err != nil { - f.Close() - return - } - fl = &unixFileLock{f: f} - return -} - -func setFileLock(f *os.File, readOnly, lock bool) error { - flock := syscall.Flock_t{ - Type: syscall.F_UNLCK, - Start: 0, - Len: 0, - Whence: 1, - } - if lock { - if readOnly { - flock.Type = syscall.F_RDLCK - } else { - flock.Type = syscall.F_WRLCK - } - } - return syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock) -} - -func rename(oldpath, newpath string) error { - return os.Rename(oldpath, newpath) -} - -func syncDir(name string) error { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go deleted file mode 100644 index 7e29915379e1..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package storage - -import ( - "os" - "syscall" -) - -type unixFileLock struct { - f *os.File -} - -func (fl *unixFileLock) release() error { - if err := setFileLock(fl.f, false, false); err != nil { - return err - } - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var flag int - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - } - f, err := os.OpenFile(path, flag, 0) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) - } - if err != nil { - return - } - err = setFileLock(f, readOnly, true) - if err != nil { - f.Close() - return - } - fl = &unixFileLock{f: f} - return -} - -func setFileLock(f *os.File, readOnly, lock bool) error { - how := syscall.LOCK_UN - if lock { - if readOnly { - how = syscall.LOCK_SH - } else { - how = syscall.LOCK_EX - } - } - return syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB) -} - -func rename(oldpath, newpath string) error { - return os.Rename(oldpath, newpath) -} - -func isErrInvalid(err error) bool { - if err == os.ErrInvalid { - return true - } - if syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL { - return true - } - return false -} - -func syncDir(name string) error { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil && !isErrInvalid(err) { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go deleted file mode 100644 index 899335fd7e4e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "syscall" - "unsafe" -) - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - - procMoveFileExW = modkernel32.NewProc("MoveFileExW") -) - -const ( - _MOVEFILE_REPLACE_EXISTING = 1 -) - -type windowsFileLock struct { - fd syscall.Handle -} - -func (fl *windowsFileLock) release() error { - return syscall.Close(fl.fd) -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - pathp, err := syscall.UTF16PtrFromString(path) - if err != nil { - return - } - var access, shareMode uint32 - if readOnly { - access = syscall.GENERIC_READ - shareMode = syscall.FILE_SHARE_READ - } else { - access = syscall.GENERIC_READ | syscall.GENERIC_WRITE - } - fd, err := syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_EXISTING, syscall.FILE_ATTRIBUTE_NORMAL, 0) - if err == syscall.ERROR_FILE_NOT_FOUND { - fd, err = syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0) - } - if err != nil { - return - } - fl = &windowsFileLock{fd: fd} - return -} - -func moveFileEx(from *uint16, to *uint16, flags uint32) error { - r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) - if r1 == 0 { - if e1 != 0 { - return error(e1) - } - return syscall.EINVAL - } - return nil -} - -func rename(oldpath, newpath string) error { - from, err := syscall.UTF16PtrFromString(oldpath) - if err != nil { - return err - } - to, err := syscall.UTF16PtrFromString(newpath) - if err != nil { - return err - } - return moveFileEx(from, to, _MOVEFILE_REPLACE_EXISTING) -} - -func syncDir(name string) error { return nil } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go deleted file mode 100644 index 9b70e151369f..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "bytes" - "os" - "sync" -) - -const typeShift = 3 - -type memStorageLock struct { - ms *memStorage -} - -func (lock *memStorageLock) Release() { - ms := lock.ms - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.slock == lock { - ms.slock = nil - } - return -} - -// memStorage is a memory-backed storage. -type memStorage struct { - mu sync.Mutex - slock *memStorageLock - files map[uint64]*memFile - meta FileDesc -} - -// NewMemStorage returns a new memory-backed storage implementation. -func NewMemStorage() Storage { - return &memStorage{ - files: make(map[uint64]*memFile), - } -} - -func (ms *memStorage) Lock() (Lock, error) { - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.slock != nil { - return nil, ErrLocked - } - ms.slock = &memStorageLock{ms: ms} - return ms.slock, nil -} - -func (*memStorage) Log(str string) {} - -func (ms *memStorage) SetMeta(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - - ms.mu.Lock() - ms.meta = fd - ms.mu.Unlock() - return nil -} - -func (ms *memStorage) GetMeta() (FileDesc, error) { - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.meta.Nil() { - return FileDesc{}, os.ErrNotExist - } - return ms.meta, nil -} - -func (ms *memStorage) List(ft FileType) ([]FileDesc, error) { - ms.mu.Lock() - var fds []FileDesc - for x, _ := range ms.files { - fd := unpackFile(x) - if fd.Type&ft != 0 { - fds = append(fds, fd) - } - } - ms.mu.Unlock() - return fds, nil -} - -func (ms *memStorage) Open(fd FileDesc) (Reader, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - ms.mu.Lock() - defer ms.mu.Unlock() - if m, exist := ms.files[packFile(fd)]; exist { - if m.open { - return nil, errFileOpen - } - m.open = true - return &memReader{Reader: bytes.NewReader(m.Bytes()), ms: ms, m: m}, nil - } - return nil, os.ErrNotExist -} - -func (ms *memStorage) Create(fd FileDesc) (Writer, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - x := packFile(fd) - ms.mu.Lock() - defer ms.mu.Unlock() - m, exist := ms.files[x] - if exist { - if m.open { - return nil, errFileOpen - } - m.Reset() - } else { - m = &memFile{} - ms.files[x] = m - } - m.open = true - return &memWriter{memFile: m, ms: ms}, nil -} - -func (ms *memStorage) Remove(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - - x := packFile(fd) - ms.mu.Lock() - defer ms.mu.Unlock() - if _, exist := ms.files[x]; exist { - delete(ms.files, x) - return nil - } - return os.ErrNotExist -} - -func (ms *memStorage) Rename(oldfd, newfd FileDesc) error { - if FileDescOk(oldfd) || FileDescOk(newfd) { - return ErrInvalidFile - } - if oldfd == newfd { - return nil - } - - oldx := packFile(oldfd) - newx := packFile(newfd) - ms.mu.Lock() - defer ms.mu.Unlock() - oldm, exist := ms.files[oldx] - if !exist { - return os.ErrNotExist - } - newm, exist := ms.files[newx] - if (exist && newm.open) || oldm.open { - return errFileOpen - } - delete(ms.files, oldx) - ms.files[newx] = oldm - return nil -} - -func (*memStorage) Close() error { return nil } - -type memFile struct { - bytes.Buffer - open bool -} - -type memReader struct { - *bytes.Reader - ms *memStorage - m *memFile - closed bool -} - -func (mr *memReader) Close() error { - mr.ms.mu.Lock() - defer mr.ms.mu.Unlock() - if mr.closed { - return ErrClosed - } - mr.m.open = false - return nil -} - -type memWriter struct { - *memFile - ms *memStorage - closed bool -} - -func (*memWriter) Sync() error { return nil } - -func (mw *memWriter) Close() error { - mw.ms.mu.Lock() - defer mw.ms.mu.Unlock() - if mw.closed { - return ErrClosed - } - mw.memFile.open = false - return nil -} - -func packFile(fd FileDesc) uint64 { - return uint64(fd.Num)<> typeShift)} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go deleted file mode 100644 index 9b30b6727fc3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package storage provides storage abstraction for LevelDB. -package storage - -import ( - "errors" - "fmt" - "io" - - "github.com/syndtr/goleveldb/leveldb/util" -) - -type FileType int - -const ( - TypeManifest FileType = 1 << iota - TypeJournal - TypeTable - TypeTemp - - TypeAll = TypeManifest | TypeJournal | TypeTable | TypeTemp -) - -func (t FileType) String() string { - switch t { - case TypeManifest: - return "manifest" - case TypeJournal: - return "journal" - case TypeTable: - return "table" - case TypeTemp: - return "temp" - } - return fmt.Sprintf("", t) -} - -var ( - ErrInvalidFile = errors.New("leveldb/storage: invalid file for argument") - ErrLocked = errors.New("leveldb/storage: already locked") - ErrClosed = errors.New("leveldb/storage: closed") -) - -// ErrCorrupted is the type that wraps errors that indicate corruption of -// a file. Package storage has its own type instead of using -// errors.ErrCorrupted to prevent circular import. -type ErrCorrupted struct { - Fd FileDesc - Err error -} - -func (e *ErrCorrupted) Error() string { - if !e.Fd.Nil() { - return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd) - } else { - return e.Err.Error() - } -} - -// Syncer is the interface that wraps basic Sync method. -type Syncer interface { - // Sync commits the current contents of the file to stable storage. - Sync() error -} - -// Reader is the interface that groups the basic Read, Seek, ReadAt and Close -// methods. -type Reader interface { - io.ReadSeeker - io.ReaderAt - io.Closer -} - -// Writer is the interface that groups the basic Write, Sync and Close -// methods. -type Writer interface { - io.WriteCloser - Syncer -} - -type Lock interface { - util.Releaser -} - -// FileDesc is a file descriptor. -type FileDesc struct { - Type FileType - Num int64 -} - -func (fd FileDesc) String() string { - switch fd.Type { - case TypeManifest: - return fmt.Sprintf("MANIFEST-%06d", fd.Num) - case TypeJournal: - return fmt.Sprintf("%06d.log", fd.Num) - case TypeTable: - return fmt.Sprintf("%06d.ldb", fd.Num) - case TypeTemp: - return fmt.Sprintf("%06d.tmp", fd.Num) - default: - return fmt.Sprintf("%#x-%d", fd.Type, fd.Num) - } -} - -// Nil returns true if fd == (FileDesc{}). -func (fd FileDesc) Nil() bool { - return fd == (FileDesc{}) -} - -// FileDescOk returns true if fd is a valid file descriptor. -func FileDescOk(fd FileDesc) bool { - switch fd.Type { - case TypeManifest: - case TypeJournal: - case TypeTable: - case TypeTemp: - default: - return false - } - return fd.Num >= 0 -} - -// Storage is the storage. A storage instance must be goroutine-safe. -type Storage interface { - // Lock locks the storage. Any subsequent attempt to call Lock will fail - // until the last lock released. - // After use the caller should call the Release method. - Lock() (Lock, error) - - // Log logs a string. This is used for logging. - // An implementation may write to a file, stdout or simply do nothing. - Log(str string) - - // SetMeta sets to point to the given fd, which then can be acquired using - // GetMeta method. - // SetMeta should be implemented in such way that changes should happened - // atomically. - SetMeta(fd FileDesc) error - - // GetManifest returns a manifest file. - // Returns os.ErrNotExist if meta doesn't point to any fd, or point to fd - // that doesn't exist. - GetMeta() (FileDesc, error) - - // List returns fds that match the given file types. - // The file types may be OR'ed together. - List(ft FileType) ([]FileDesc, error) - - // Open opens file with the given fd read-only. - // Returns os.ErrNotExist error if the file does not exist. - // Returns ErrClosed if the underlying storage is closed. - Open(fd FileDesc) (Reader, error) - - // Create creates file with the given fd, truncate if already exist and - // opens write-only. - // Returns ErrClosed if the underlying storage is closed. - Create(fd FileDesc) (Writer, error) - - // Remove removes file with the given fd. - // Returns ErrClosed if the underlying storage is closed. - Remove(fd FileDesc) error - - // Rename renames file from oldfd to newfd. - // Returns ErrClosed if the underlying storage is closed. - Rename(oldfd, newfd FileDesc) error - - // Close closes the storage. - // It is valid to call Close multiple times. Other methods should not be - // called after the storage has been closed. - Close() error -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go deleted file mode 100644 index 310ba6c2299a..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ /dev/null @@ -1,529 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sort" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/table" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// tFile holds basic information about a table. -type tFile struct { - fd storage.FileDesc - seekLeft int32 - size int64 - imin, imax internalKey -} - -// Returns true if given key is after largest key of this table. -func (t *tFile) after(icmp *iComparer, ukey []byte) bool { - return ukey != nil && icmp.uCompare(ukey, t.imax.ukey()) > 0 -} - -// Returns true if given key is before smallest key of this table. -func (t *tFile) before(icmp *iComparer, ukey []byte) bool { - return ukey != nil && icmp.uCompare(ukey, t.imin.ukey()) < 0 -} - -// Returns true if given key range overlaps with this table key range. -func (t *tFile) overlaps(icmp *iComparer, umin, umax []byte) bool { - return !t.after(icmp, umin) && !t.before(icmp, umax) -} - -// Cosumes one seek and return current seeks left. -func (t *tFile) consumeSeek() int32 { - return atomic.AddInt32(&t.seekLeft, -1) -} - -// Creates new tFile. -func newTableFile(fd storage.FileDesc, size int64, imin, imax internalKey) *tFile { - f := &tFile{ - fd: fd, - size: size, - imin: imin, - imax: imax, - } - - // We arrange to automatically compact this file after - // a certain number of seeks. Let's assume: - // (1) One seek costs 10ms - // (2) Writing or reading 1MB costs 10ms (100MB/s) - // (3) A compaction of 1MB does 25MB of IO: - // 1MB read from this level - // 10-12MB read from next level (boundaries may be misaligned) - // 10-12MB written to next level - // This implies that 25 seeks cost the same as the compaction - // of 1MB of data. I.e., one seek costs approximately the - // same as the compaction of 40KB of data. We are a little - // conservative and allow approximately one seek for every 16KB - // of data before triggering a compaction. - f.seekLeft = int32(size / 16384) - if f.seekLeft < 100 { - f.seekLeft = 100 - } - - return f -} - -func tableFileFromRecord(r atRecord) *tFile { - return newTableFile(storage.FileDesc{storage.TypeTable, r.num}, r.size, r.imin, r.imax) -} - -// tFiles hold multiple tFile. -type tFiles []*tFile - -func (tf tFiles) Len() int { return len(tf) } -func (tf tFiles) Swap(i, j int) { tf[i], tf[j] = tf[j], tf[i] } - -func (tf tFiles) nums() string { - x := "[ " - for i, f := range tf { - if i != 0 { - x += ", " - } - x += fmt.Sprint(f.fd.Num) - } - x += " ]" - return x -} - -// Returns true if i smallest key is less than j. -// This used for sort by key in ascending order. -func (tf tFiles) lessByKey(icmp *iComparer, i, j int) bool { - a, b := tf[i], tf[j] - n := icmp.Compare(a.imin, b.imin) - if n == 0 { - return a.fd.Num < b.fd.Num - } - return n < 0 -} - -// Returns true if i file number is greater than j. -// This used for sort by file number in descending order. -func (tf tFiles) lessByNum(i, j int) bool { - return tf[i].fd.Num > tf[j].fd.Num -} - -// Sorts tables by key in ascending order. -func (tf tFiles) sortByKey(icmp *iComparer) { - sort.Sort(&tFilesSortByKey{tFiles: tf, icmp: icmp}) -} - -// Sorts tables by file number in descending order. -func (tf tFiles) sortByNum() { - sort.Sort(&tFilesSortByNum{tFiles: tf}) -} - -// Returns sum of all tables size. -func (tf tFiles) size() (sum int64) { - for _, t := range tf { - sum += t.size - } - return sum -} - -// Searches smallest index of tables whose its smallest -// key is after or equal with given key. -func (tf tFiles) searchMin(icmp *iComparer, ikey internalKey) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.Compare(tf[i].imin, ikey) >= 0 - }) -} - -// Searches smallest index of tables whose its largest -// key is after or equal with given key. -func (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.Compare(tf[i].imax, ikey) >= 0 - }) -} - -// Returns true if given key range overlaps with one or more -// tables key range. If unsorted is true then binary search will not be used. -func (tf tFiles) overlaps(icmp *iComparer, umin, umax []byte, unsorted bool) bool { - if unsorted { - // Check against all files. - for _, t := range tf { - if t.overlaps(icmp, umin, umax) { - return true - } - } - return false - } - - i := 0 - if len(umin) > 0 { - // Find the earliest possible internal key for min. - i = tf.searchMax(icmp, makeInternalKey(nil, umin, keyMaxSeq, keyTypeSeek)) - } - if i >= len(tf) { - // Beginning of range is after all files, so no overlap. - return false - } - return !tf[i].before(icmp, umax) -} - -// Returns tables whose its key range overlaps with given key range. -// Range will be expanded if ukey found hop across tables. -// If overlapped is true then the search will be restarted if umax -// expanded. -// The dst content will be overwritten. -func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles { - dst = dst[:0] - for i := 0; i < len(tf); { - t := tf[i] - if t.overlaps(icmp, umin, umax) { - if umin != nil && icmp.uCompare(t.imin.ukey(), umin) < 0 { - umin = t.imin.ukey() - dst = dst[:0] - i = 0 - continue - } else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 { - umax = t.imax.ukey() - // Restart search if it is overlapped. - if overlapped { - dst = dst[:0] - i = 0 - continue - } - } - - dst = append(dst, t) - } - i++ - } - - return dst -} - -// Returns tables key range. -func (tf tFiles) getRange(icmp *iComparer) (imin, imax internalKey) { - for i, t := range tf { - if i == 0 { - imin, imax = t.imin, t.imax - continue - } - if icmp.Compare(t.imin, imin) < 0 { - imin = t.imin - } - if icmp.Compare(t.imax, imax) > 0 { - imax = t.imax - } - } - - return -} - -// Creates iterator index from tables. -func (tf tFiles) newIndexIterator(tops *tOps, icmp *iComparer, slice *util.Range, ro *opt.ReadOptions) iterator.IteratorIndexer { - if slice != nil { - var start, limit int - if slice.Start != nil { - start = tf.searchMax(icmp, internalKey(slice.Start)) - } - if slice.Limit != nil { - limit = tf.searchMin(icmp, internalKey(slice.Limit)) - } else { - limit = tf.Len() - } - tf = tf[start:limit] - } - return iterator.NewArrayIndexer(&tFilesArrayIndexer{ - tFiles: tf, - tops: tops, - icmp: icmp, - slice: slice, - ro: ro, - }) -} - -// Tables iterator index. -type tFilesArrayIndexer struct { - tFiles - tops *tOps - icmp *iComparer - slice *util.Range - ro *opt.ReadOptions -} - -func (a *tFilesArrayIndexer) Search(key []byte) int { - return a.searchMax(a.icmp, internalKey(key)) -} - -func (a *tFilesArrayIndexer) Get(i int) iterator.Iterator { - if i == 0 || i == a.Len()-1 { - return a.tops.newIterator(a.tFiles[i], a.slice, a.ro) - } - return a.tops.newIterator(a.tFiles[i], nil, a.ro) -} - -// Helper type for sortByKey. -type tFilesSortByKey struct { - tFiles - icmp *iComparer -} - -func (x *tFilesSortByKey) Less(i, j int) bool { - return x.lessByKey(x.icmp, i, j) -} - -// Helper type for sortByNum. -type tFilesSortByNum struct { - tFiles -} - -func (x *tFilesSortByNum) Less(i, j int) bool { - return x.lessByNum(i, j) -} - -// Table operations. -type tOps struct { - s *session - noSync bool - cache *cache.Cache - bcache *cache.Cache - bpool *util.BufferPool -} - -// Creates an empty table and returns table writer. -func (t *tOps) create() (*tWriter, error) { - fd := storage.FileDesc{storage.TypeTable, t.s.allocFileNum()} - fw, err := t.s.stor.Create(fd) - if err != nil { - return nil, err - } - return &tWriter{ - t: t, - fd: fd, - w: fw, - tw: table.NewWriter(fw, t.s.o.Options), - }, nil -} - -// Builds table from src iterator. -func (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) { - w, err := t.create() - if err != nil { - return - } - - defer func() { - if err != nil { - w.drop() - } - }() - - for src.Next() { - err = w.append(src.Key(), src.Value()) - if err != nil { - return - } - } - err = src.Error() - if err != nil { - return - } - - n = w.tw.EntriesLen() - f, err = w.finish() - return -} - -// Opens table. It returns a cache handle, which should -// be released after use. -func (t *tOps) open(f *tFile) (ch *cache.Handle, err error) { - ch = t.cache.Get(0, uint64(f.fd.Num), func() (size int, value cache.Value) { - var r storage.Reader - r, err = t.s.stor.Open(f.fd) - if err != nil { - return 0, nil - } - - var bcache *cache.NamespaceGetter - if t.bcache != nil { - bcache = &cache.NamespaceGetter{Cache: t.bcache, NS: uint64(f.fd.Num)} - } - - var tr *table.Reader - tr, err = table.NewReader(r, f.size, f.fd, bcache, t.bpool, t.s.o.Options) - if err != nil { - r.Close() - return 0, nil - } - return 1, tr - - }) - if ch == nil && err == nil { - err = ErrClosed - } - return -} - -// Finds key/value pair whose key is greater than or equal to the -// given key. -func (t *tOps) find(f *tFile, key []byte, ro *opt.ReadOptions) (rkey, rvalue []byte, err error) { - ch, err := t.open(f) - if err != nil { - return nil, nil, err - } - defer ch.Release() - return ch.Value().(*table.Reader).Find(key, true, ro) -} - -// Finds key that is greater than or equal to the given key. -func (t *tOps) findKey(f *tFile, key []byte, ro *opt.ReadOptions) (rkey []byte, err error) { - ch, err := t.open(f) - if err != nil { - return nil, err - } - defer ch.Release() - return ch.Value().(*table.Reader).FindKey(key, true, ro) -} - -// Returns approximate offset of the given key. -func (t *tOps) offsetOf(f *tFile, key []byte) (offset int64, err error) { - ch, err := t.open(f) - if err != nil { - return - } - defer ch.Release() - return ch.Value().(*table.Reader).OffsetOf(key) -} - -// Creates an iterator from the given table. -func (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - ch, err := t.open(f) - if err != nil { - return iterator.NewEmptyIterator(err) - } - iter := ch.Value().(*table.Reader).NewIterator(slice, ro) - iter.SetReleaser(ch) - return iter -} - -// Removes table from persistent storage. It waits until -// no one use the the table. -func (t *tOps) remove(f *tFile) { - t.cache.Delete(0, uint64(f.fd.Num), func() { - if err := t.s.stor.Remove(f.fd); err != nil { - t.s.logf("table@remove removing @%d %q", f.fd.Num, err) - } else { - t.s.logf("table@remove removed @%d", f.fd.Num) - } - if t.bcache != nil { - t.bcache.EvictNS(uint64(f.fd.Num)) - } - }) -} - -// Closes the table ops instance. It will close all tables, -// regadless still used or not. -func (t *tOps) close() { - t.bpool.Close() - t.cache.Close() - if t.bcache != nil { - t.bcache.Close() - } -} - -// Creates new initialized table ops instance. -func newTableOps(s *session) *tOps { - var ( - cacher cache.Cacher - bcache *cache.Cache - bpool *util.BufferPool - ) - if s.o.GetOpenFilesCacheCapacity() > 0 { - cacher = cache.NewLRU(s.o.GetOpenFilesCacheCapacity()) - } - if !s.o.GetDisableBlockCache() { - var bcacher cache.Cacher - if s.o.GetBlockCacheCapacity() > 0 { - bcacher = cache.NewLRU(s.o.GetBlockCacheCapacity()) - } - bcache = cache.NewCache(bcacher) - } - if !s.o.GetDisableBufferPool() { - bpool = util.NewBufferPool(s.o.GetBlockSize() + 5) - } - return &tOps{ - s: s, - noSync: s.o.GetNoSync(), - cache: cache.NewCache(cacher), - bcache: bcache, - bpool: bpool, - } -} - -// tWriter wraps the table writer. It keep track of file descriptor -// and added key range. -type tWriter struct { - t *tOps - - fd storage.FileDesc - w storage.Writer - tw *table.Writer - - first, last []byte -} - -// Append key/value pair to the table. -func (w *tWriter) append(key, value []byte) error { - if w.first == nil { - w.first = append([]byte{}, key...) - } - w.last = append(w.last[:0], key...) - return w.tw.Append(key, value) -} - -// Returns true if the table is empty. -func (w *tWriter) empty() bool { - return w.first == nil -} - -// Closes the storage.Writer. -func (w *tWriter) close() { - if w.w != nil { - w.w.Close() - w.w = nil - } -} - -// Finalizes the table and returns table file. -func (w *tWriter) finish() (f *tFile, err error) { - defer w.close() - err = w.tw.Close() - if err != nil { - return - } - if !w.t.noSync { - err = w.w.Sync() - if err != nil { - return - } - } - f = newTableFile(w.fd, int64(w.tw.BytesLen()), internalKey(w.first), internalKey(w.last)) - return -} - -// Drops the table. -func (w *tWriter) drop() { - w.close() - w.t.s.stor.Remove(w.fd) - w.t.s.reuseFileNum(w.fd.Num) - w.tw = nil - w.first = nil - w.last = nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go deleted file mode 100644 index ae61bece9378..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go +++ /dev/null @@ -1,1107 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package table - -import ( - "encoding/binary" - "fmt" - "io" - "sort" - "strings" - "sync" - - "github.com/golang/snappy" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - ErrNotFound = errors.ErrNotFound - ErrReaderReleased = errors.New("leveldb/table: reader released") - ErrIterReleased = errors.New("leveldb/table: iterator released") -) - -type ErrCorrupted struct { - Pos int64 - Size int64 - Kind string - Reason string -} - -func (e *ErrCorrupted) Error() string { - return fmt.Sprintf("leveldb/table: corruption on %s (pos=%d): %s", e.Kind, e.Pos, e.Reason) -} - -func max(x, y int) int { - if x > y { - return x - } - return y -} - -type block struct { - bpool *util.BufferPool - bh blockHandle - data []byte - restartsLen int - restartsOffset int -} - -func (b *block) seek(cmp comparer.Comparer, rstart, rlimit int, key []byte) (index, offset int, err error) { - index = sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool { - offset := int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) - offset += 1 // shared always zero, since this is a restart point - v1, n1 := binary.Uvarint(b.data[offset:]) // key length - _, n2 := binary.Uvarint(b.data[offset+n1:]) // value length - m := offset + n1 + n2 - return cmp.Compare(b.data[m:m+int(v1)], key) > 0 - }) + rstart - 1 - if index < rstart { - // The smallest key is greater-than key sought. - index = rstart - } - offset = int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:])) - return -} - -func (b *block) restartIndex(rstart, rlimit, offset int) int { - return sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool { - return int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) > offset - }) + rstart - 1 -} - -func (b *block) restartOffset(index int) int { - return int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:])) -} - -func (b *block) entry(offset int) (key, value []byte, nShared, n int, err error) { - if offset >= b.restartsOffset { - if offset != b.restartsOffset { - err = &ErrCorrupted{Reason: "entries offset not aligned"} - } - return - } - v0, n0 := binary.Uvarint(b.data[offset:]) // Shared prefix length - v1, n1 := binary.Uvarint(b.data[offset+n0:]) // Key length - v2, n2 := binary.Uvarint(b.data[offset+n0+n1:]) // Value length - m := n0 + n1 + n2 - n = m + int(v1) + int(v2) - if n0 <= 0 || n1 <= 0 || n2 <= 0 || offset+n > b.restartsOffset { - err = &ErrCorrupted{Reason: "entries corrupted"} - return - } - key = b.data[offset+m : offset+m+int(v1)] - value = b.data[offset+m+int(v1) : offset+n] - nShared = int(v0) - return -} - -func (b *block) Release() { - b.bpool.Put(b.data) - b.bpool = nil - b.data = nil -} - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -type blockIter struct { - tr *Reader - block *block - blockReleaser util.Releaser - releaser util.Releaser - key, value []byte - offset int - // Previous offset, only filled by Next. - prevOffset int - prevNode []int - prevKeys []byte - restartIndex int - // Iterator direction. - dir dir - // Restart index slice range. - riStart int - riLimit int - // Offset slice range. - offsetStart int - offsetRealStart int - offsetLimit int - // Error. - err error -} - -func (i *blockIter) sErr(err error) { - i.err = err - i.key = nil - i.value = nil - i.prevNode = nil - i.prevKeys = nil -} - -func (i *blockIter) reset() { - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.restartIndex = i.riStart - i.offset = i.offsetStart - i.dir = dirSOI - i.key = i.key[:0] - i.value = nil -} - -func (i *blockIter) isFirst() bool { - switch i.dir { - case dirForward: - return i.prevOffset == i.offsetRealStart - case dirBackward: - return len(i.prevNode) == 1 && i.restartIndex == i.riStart - } - return false -} - -func (i *blockIter) isLast() bool { - switch i.dir { - case dirForward, dirBackward: - return i.offset == i.offsetLimit - } - return false -} - -func (i *blockIter) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.dir = dirSOI - return i.Next() -} - -func (i *blockIter) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.dir = dirEOI - return i.Prev() -} - -func (i *blockIter) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - ri, offset, err := i.block.seek(i.tr.cmp, i.riStart, i.riLimit, key) - if err != nil { - i.sErr(err) - return false - } - i.restartIndex = ri - i.offset = max(i.offsetStart, offset) - if i.dir == dirSOI || i.dir == dirEOI { - i.dir = dirForward - } - for i.Next() { - if i.tr.cmp.Compare(i.key, key) >= 0 { - return true - } - } - return false -} - -func (i *blockIter) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirSOI { - i.restartIndex = i.riStart - i.offset = i.offsetStart - } else if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - for i.offset < i.offsetRealStart { - key, value, nShared, n, err := i.block.entry(i.offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if n == 0 { - i.dir = dirEOI - return false - } - i.key = append(i.key[:nShared], key...) - i.value = value - i.offset += n - } - if i.offset >= i.offsetLimit { - i.dir = dirEOI - if i.offset != i.offsetLimit { - i.sErr(i.tr.newErrCorruptedBH(i.block.bh, "entries offset not aligned")) - } - return false - } - key, value, nShared, n, err := i.block.entry(i.offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if n == 0 { - i.dir = dirEOI - return false - } - i.key = append(i.key[:nShared], key...) - i.value = value - i.prevOffset = i.offset - i.offset += n - i.dir = dirForward - return true -} - -func (i *blockIter) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - var ri int - if i.dir == dirForward { - // Change direction. - i.offset = i.prevOffset - if i.offset == i.offsetRealStart { - i.dir = dirSOI - return false - } - ri = i.block.restartIndex(i.restartIndex, i.riLimit, i.offset) - i.dir = dirBackward - } else if i.dir == dirEOI { - // At the end of iterator. - i.restartIndex = i.riLimit - i.offset = i.offsetLimit - if i.offset == i.offsetRealStart { - i.dir = dirSOI - return false - } - ri = i.riLimit - 1 - i.dir = dirBackward - } else if len(i.prevNode) == 1 { - // This is the end of a restart range. - i.offset = i.prevNode[0] - i.prevNode = i.prevNode[:0] - if i.restartIndex == i.riStart { - i.dir = dirSOI - return false - } - i.restartIndex-- - ri = i.restartIndex - } else { - // In the middle of restart range, get from cache. - n := len(i.prevNode) - 3 - node := i.prevNode[n:] - i.prevNode = i.prevNode[:n] - // Get the key. - ko := node[0] - i.key = append(i.key[:0], i.prevKeys[ko:]...) - i.prevKeys = i.prevKeys[:ko] - // Get the value. - vo := node[1] - vl := vo + node[2] - i.value = i.block.data[vo:vl] - i.offset = vl - return true - } - // Build entries cache. - i.key = i.key[:0] - i.value = nil - offset := i.block.restartOffset(ri) - if offset == i.offset { - ri -= 1 - if ri < 0 { - i.dir = dirSOI - return false - } - offset = i.block.restartOffset(ri) - } - i.prevNode = append(i.prevNode, offset) - for { - key, value, nShared, n, err := i.block.entry(offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if offset >= i.offsetRealStart { - if i.value != nil { - // Appends 3 variables: - // 1. Previous keys offset - // 2. Value offset in the data block - // 3. Value length - i.prevNode = append(i.prevNode, len(i.prevKeys), offset-len(i.value), len(i.value)) - i.prevKeys = append(i.prevKeys, i.key...) - } - i.value = value - } - i.key = append(i.key[:nShared], key...) - offset += n - // Stop if target offset reached. - if offset >= i.offset { - if offset != i.offset { - i.sErr(i.tr.newErrCorruptedBH(i.block.bh, "entries offset not aligned")) - return false - } - - break - } - } - i.restartIndex = ri - i.offset = offset - return true -} - -func (i *blockIter) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.key -} - -func (i *blockIter) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.value -} - -func (i *blockIter) Release() { - if i.dir != dirReleased { - i.tr = nil - i.block = nil - i.prevNode = nil - i.prevKeys = nil - i.key = nil - i.value = nil - i.dir = dirReleased - if i.blockReleaser != nil { - i.blockReleaser.Release() - i.blockReleaser = nil - } - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - } -} - -func (i *blockIter) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *blockIter) Valid() bool { - return i.err == nil && (i.dir == dirBackward || i.dir == dirForward) -} - -func (i *blockIter) Error() error { - return i.err -} - -type filterBlock struct { - bpool *util.BufferPool - data []byte - oOffset int - baseLg uint - filtersNum int -} - -func (b *filterBlock) contains(filter filter.Filter, offset uint64, key []byte) bool { - i := int(offset >> b.baseLg) - if i < b.filtersNum { - o := b.data[b.oOffset+i*4:] - n := int(binary.LittleEndian.Uint32(o)) - m := int(binary.LittleEndian.Uint32(o[4:])) - if n < m && m <= b.oOffset { - return filter.Contains(b.data[n:m], key) - } else if n == m { - return false - } - } - return true -} - -func (b *filterBlock) Release() { - b.bpool.Put(b.data) - b.bpool = nil - b.data = nil -} - -type indexIter struct { - *blockIter - tr *Reader - slice *util.Range - // Options - fillCache bool -} - -func (i *indexIter) Get() iterator.Iterator { - value := i.Value() - if value == nil { - return nil - } - dataBH, n := decodeBlockHandle(value) - if n == 0 { - return iterator.NewEmptyIterator(i.tr.newErrCorruptedBH(i.tr.indexBH, "bad data block handle")) - } - - var slice *util.Range - if i.slice != nil && (i.blockIter.isFirst() || i.blockIter.isLast()) { - slice = i.slice - } - return i.tr.getDataIterErr(dataBH, slice, i.tr.verifyChecksum, i.fillCache) -} - -// Reader is a table reader. -type Reader struct { - mu sync.RWMutex - fd storage.FileDesc - reader io.ReaderAt - cache *cache.NamespaceGetter - err error - bpool *util.BufferPool - // Options - o *opt.Options - cmp comparer.Comparer - filter filter.Filter - verifyChecksum bool - - dataEnd int64 - metaBH, indexBH, filterBH blockHandle - indexBlock *block - filterBlock *filterBlock -} - -func (r *Reader) blockKind(bh blockHandle) string { - switch bh.offset { - case r.metaBH.offset: - return "meta-block" - case r.indexBH.offset: - return "index-block" - case r.filterBH.offset: - if r.filterBH.length > 0 { - return "filter-block" - } - } - return "data-block" -} - -func (r *Reader) newErrCorrupted(pos, size int64, kind, reason string) error { - return &errors.ErrCorrupted{Fd: r.fd, Err: &ErrCorrupted{Pos: pos, Size: size, Kind: kind, Reason: reason}} -} - -func (r *Reader) newErrCorruptedBH(bh blockHandle, reason string) error { - return r.newErrCorrupted(int64(bh.offset), int64(bh.length), r.blockKind(bh), reason) -} - -func (r *Reader) fixErrCorruptedBH(bh blockHandle, err error) error { - if cerr, ok := err.(*ErrCorrupted); ok { - cerr.Pos = int64(bh.offset) - cerr.Size = int64(bh.length) - cerr.Kind = r.blockKind(bh) - return &errors.ErrCorrupted{Fd: r.fd, Err: cerr} - } - return err -} - -func (r *Reader) readRawBlock(bh blockHandle, verifyChecksum bool) ([]byte, error) { - data := r.bpool.Get(int(bh.length + blockTrailerLen)) - if _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF { - return nil, err - } - - if verifyChecksum { - n := bh.length + 1 - checksum0 := binary.LittleEndian.Uint32(data[n:]) - checksum1 := util.NewCRC(data[:n]).Value() - if checksum0 != checksum1 { - r.bpool.Put(data) - return nil, r.newErrCorruptedBH(bh, fmt.Sprintf("checksum mismatch, want=%#x got=%#x", checksum0, checksum1)) - } - } - - switch data[bh.length] { - case blockTypeNoCompression: - data = data[:bh.length] - case blockTypeSnappyCompression: - decLen, err := snappy.DecodedLen(data[:bh.length]) - if err != nil { - return nil, r.newErrCorruptedBH(bh, err.Error()) - } - decData := r.bpool.Get(decLen) - decData, err = snappy.Decode(decData, data[:bh.length]) - r.bpool.Put(data) - if err != nil { - r.bpool.Put(decData) - return nil, r.newErrCorruptedBH(bh, err.Error()) - } - data = decData - default: - r.bpool.Put(data) - return nil, r.newErrCorruptedBH(bh, fmt.Sprintf("unknown compression type %#x", data[bh.length])) - } - return data, nil -} - -func (r *Reader) readBlock(bh blockHandle, verifyChecksum bool) (*block, error) { - data, err := r.readRawBlock(bh, verifyChecksum) - if err != nil { - return nil, err - } - restartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:])) - b := &block{ - bpool: r.bpool, - bh: bh, - data: data, - restartsLen: restartsLen, - restartsOffset: len(data) - (restartsLen+1)*4, - } - return b, nil -} - -func (r *Reader) readBlockCached(bh blockHandle, verifyChecksum, fillCache bool) (*block, util.Releaser, error) { - if r.cache != nil { - var ( - err error - ch *cache.Handle - ) - if fillCache { - ch = r.cache.Get(bh.offset, func() (size int, value cache.Value) { - var b *block - b, err = r.readBlock(bh, verifyChecksum) - if err != nil { - return 0, nil - } - return cap(b.data), b - }) - } else { - ch = r.cache.Get(bh.offset, nil) - } - if ch != nil { - b, ok := ch.Value().(*block) - if !ok { - ch.Release() - return nil, nil, errors.New("leveldb/table: inconsistent block type") - } - return b, ch, err - } else if err != nil { - return nil, nil, err - } - } - - b, err := r.readBlock(bh, verifyChecksum) - return b, b, err -} - -func (r *Reader) readFilterBlock(bh blockHandle) (*filterBlock, error) { - data, err := r.readRawBlock(bh, true) - if err != nil { - return nil, err - } - n := len(data) - if n < 5 { - return nil, r.newErrCorruptedBH(bh, "too short") - } - m := n - 5 - oOffset := int(binary.LittleEndian.Uint32(data[m:])) - if oOffset > m { - return nil, r.newErrCorruptedBH(bh, "invalid data-offsets offset") - } - b := &filterBlock{ - bpool: r.bpool, - data: data, - oOffset: oOffset, - baseLg: uint(data[n-1]), - filtersNum: (m - oOffset) / 4, - } - return b, nil -} - -func (r *Reader) readFilterBlockCached(bh blockHandle, fillCache bool) (*filterBlock, util.Releaser, error) { - if r.cache != nil { - var ( - err error - ch *cache.Handle - ) - if fillCache { - ch = r.cache.Get(bh.offset, func() (size int, value cache.Value) { - var b *filterBlock - b, err = r.readFilterBlock(bh) - if err != nil { - return 0, nil - } - return cap(b.data), b - }) - } else { - ch = r.cache.Get(bh.offset, nil) - } - if ch != nil { - b, ok := ch.Value().(*filterBlock) - if !ok { - ch.Release() - return nil, nil, errors.New("leveldb/table: inconsistent block type") - } - return b, ch, err - } else if err != nil { - return nil, nil, err - } - } - - b, err := r.readFilterBlock(bh) - return b, b, err -} - -func (r *Reader) getIndexBlock(fillCache bool) (b *block, rel util.Releaser, err error) { - if r.indexBlock == nil { - return r.readBlockCached(r.indexBH, true, fillCache) - } - return r.indexBlock, util.NoopReleaser{}, nil -} - -func (r *Reader) getFilterBlock(fillCache bool) (*filterBlock, util.Releaser, error) { - if r.filterBlock == nil { - return r.readFilterBlockCached(r.filterBH, fillCache) - } - return r.filterBlock, util.NoopReleaser{}, nil -} - -func (r *Reader) newBlockIter(b *block, bReleaser util.Releaser, slice *util.Range, inclLimit bool) *blockIter { - bi := &blockIter{ - tr: r, - block: b, - blockReleaser: bReleaser, - // Valid key should never be nil. - key: make([]byte, 0), - dir: dirSOI, - riStart: 0, - riLimit: b.restartsLen, - offsetStart: 0, - offsetRealStart: 0, - offsetLimit: b.restartsOffset, - } - if slice != nil { - if slice.Start != nil { - if bi.Seek(slice.Start) { - bi.riStart = b.restartIndex(bi.restartIndex, b.restartsLen, bi.prevOffset) - bi.offsetStart = b.restartOffset(bi.riStart) - bi.offsetRealStart = bi.prevOffset - } else { - bi.riStart = b.restartsLen - bi.offsetStart = b.restartsOffset - bi.offsetRealStart = b.restartsOffset - } - } - if slice.Limit != nil { - if bi.Seek(slice.Limit) && (!inclLimit || bi.Next()) { - bi.offsetLimit = bi.prevOffset - bi.riLimit = bi.restartIndex + 1 - } - } - bi.reset() - if bi.offsetStart > bi.offsetLimit { - bi.sErr(errors.New("leveldb/table: invalid slice range")) - } - } - return bi -} - -func (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator { - b, rel, err := r.readBlockCached(dataBH, verifyChecksum, fillCache) - if err != nil { - return iterator.NewEmptyIterator(err) - } - return r.newBlockIter(b, rel, slice, false) -} - -func (r *Reader) getDataIterErr(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - return iterator.NewEmptyIterator(r.err) - } - - return r.getDataIter(dataBH, slice, verifyChecksum, fillCache) -} - -// NewIterator creates an iterator from the table. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// table. And a nil Range.Limit is treated as a key after all keys in -// the table. -// -// The returned iterator is not goroutine-safe and should be released -// when not used. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - return iterator.NewEmptyIterator(r.err) - } - - fillCache := !ro.GetDontFillCache() - indexBlock, rel, err := r.getIndexBlock(fillCache) - if err != nil { - return iterator.NewEmptyIterator(err) - } - index := &indexIter{ - blockIter: r.newBlockIter(indexBlock, rel, slice, true), - tr: r, - slice: slice, - fillCache: !ro.GetDontFillCache(), - } - return iterator.NewIndexedIterator(index, opt.GetStrict(r.o, ro, opt.StrictReader)) -} - -func (r *Reader) find(key []byte, filtered bool, ro *opt.ReadOptions, noValue bool) (rkey, value []byte, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - indexBlock, rel, err := r.getIndexBlock(true) - if err != nil { - return - } - defer rel.Release() - - index := r.newBlockIter(indexBlock, nil, nil, true) - defer index.Release() - if !index.Seek(key) { - err = index.Error() - if err == nil { - err = ErrNotFound - } - return - } - dataBH, n := decodeBlockHandle(index.Value()) - if n == 0 { - r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle") - return - } - if filtered && r.filter != nil { - filterBlock, frel, ferr := r.getFilterBlock(true) - if ferr == nil { - if !filterBlock.contains(r.filter, dataBH.offset, key) { - frel.Release() - return nil, nil, ErrNotFound - } - frel.Release() - } else if !errors.IsCorrupted(ferr) { - err = ferr - return - } - } - data := r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache()) - defer data.Release() - if !data.Seek(key) { - err = data.Error() - if err == nil { - err = ErrNotFound - } - return - } - // Don't use block buffer, no need to copy the buffer. - rkey = data.Key() - if !noValue { - if r.bpool == nil { - value = data.Value() - } else { - // Use block buffer, and since the buffer will be recycled, the buffer - // need to be copied. - value = append([]byte{}, data.Value()...) - } - } - return -} - -// Find finds key/value pair whose key is greater than or equal to the -// given key. It returns ErrNotFound if the table doesn't contain -// such pair. -// If filtered is true then the nearest 'block' will be checked against -// 'filter data' (if present) and will immediately return ErrNotFound if -// 'filter data' indicates that such pair doesn't exist. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) Find(key []byte, filtered bool, ro *opt.ReadOptions) (rkey, value []byte, err error) { - return r.find(key, filtered, ro, false) -} - -// Find finds key that is greater than or equal to the given key. -// It returns ErrNotFound if the table doesn't contain such key. -// If filtered is true then the nearest 'block' will be checked against -// 'filter data' (if present) and will immediately return ErrNotFound if -// 'filter data' indicates that such key doesn't exist. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) FindKey(key []byte, filtered bool, ro *opt.ReadOptions) (rkey []byte, err error) { - rkey, _, err = r.find(key, filtered, ro, true) - return -} - -// Get gets the value for the given key. It returns errors.ErrNotFound -// if the table does not contain the key. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - rkey, value, err := r.find(key, false, ro, false) - if err == nil && r.cmp.Compare(rkey, key) != 0 { - value = nil - err = ErrNotFound - } - return -} - -// OffsetOf returns approximate offset for the given key. -// -// It is safe to modify the contents of the argument after Get returns. -func (r *Reader) OffsetOf(key []byte) (offset int64, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - indexBlock, rel, err := r.readBlockCached(r.indexBH, true, true) - if err != nil { - return - } - defer rel.Release() - - index := r.newBlockIter(indexBlock, nil, nil, true) - defer index.Release() - if index.Seek(key) { - dataBH, n := decodeBlockHandle(index.Value()) - if n == 0 { - r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle") - return - } - offset = int64(dataBH.offset) - return - } - err = index.Error() - if err == nil { - offset = r.dataEnd - } - return -} - -// Release implements util.Releaser. -// It also close the file if it is an io.Closer. -func (r *Reader) Release() { - r.mu.Lock() - defer r.mu.Unlock() - - if closer, ok := r.reader.(io.Closer); ok { - closer.Close() - } - if r.indexBlock != nil { - r.indexBlock.Release() - r.indexBlock = nil - } - if r.filterBlock != nil { - r.filterBlock.Release() - r.filterBlock = nil - } - r.reader = nil - r.cache = nil - r.bpool = nil - r.err = ErrReaderReleased -} - -// NewReader creates a new initialized table reader for the file. -// The fi, cache and bpool is optional and can be nil. -// -// The returned table reader instance is goroutine-safe. -func NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.NamespaceGetter, bpool *util.BufferPool, o *opt.Options) (*Reader, error) { - if f == nil { - return nil, errors.New("leveldb/table: nil file") - } - - r := &Reader{ - fd: fd, - reader: f, - cache: cache, - bpool: bpool, - o: o, - cmp: o.GetComparer(), - verifyChecksum: o.GetStrict(opt.StrictBlockChecksum), - } - - if size < footerLen { - r.err = r.newErrCorrupted(0, size, "table", "too small") - return r, nil - } - - footerPos := size - footerLen - var footer [footerLen]byte - if _, err := r.reader.ReadAt(footer[:], footerPos); err != nil && err != io.EOF { - return nil, err - } - if string(footer[footerLen-len(magic):footerLen]) != magic { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad magic number") - return r, nil - } - - var n int - // Decode the metaindex block handle. - r.metaBH, n = decodeBlockHandle(footer[:]) - if n == 0 { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad metaindex block handle") - return r, nil - } - - // Decode the index block handle. - r.indexBH, n = decodeBlockHandle(footer[n:]) - if n == 0 { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad index block handle") - return r, nil - } - - // Read metaindex block. - metaBlock, err := r.readBlock(r.metaBH, true) - if err != nil { - if errors.IsCorrupted(err) { - r.err = err - return r, nil - } else { - return nil, err - } - } - - // Set data end. - r.dataEnd = int64(r.metaBH.offset) - - // Read metaindex. - metaIter := r.newBlockIter(metaBlock, nil, nil, true) - for metaIter.Next() { - key := string(metaIter.Key()) - if !strings.HasPrefix(key, "filter.") { - continue - } - fn := key[7:] - if f0 := o.GetFilter(); f0 != nil && f0.Name() == fn { - r.filter = f0 - } else { - for _, f0 := range o.GetAltFilters() { - if f0.Name() == fn { - r.filter = f0 - break - } - } - } - if r.filter != nil { - filterBH, n := decodeBlockHandle(metaIter.Value()) - if n == 0 { - continue - } - r.filterBH = filterBH - // Update data end. - r.dataEnd = int64(filterBH.offset) - break - } - } - metaIter.Release() - metaBlock.Release() - - // Cache index and filter block locally, since we don't have global cache. - if cache == nil { - r.indexBlock, err = r.readBlock(r.indexBH, true) - if err != nil { - if errors.IsCorrupted(err) { - r.err = err - return r, nil - } else { - return nil, err - } - } - if r.filter != nil { - r.filterBlock, err = r.readFilterBlock(r.filterBH) - if err != nil { - if !errors.IsCorrupted(err) { - return nil, err - } - - // Don't use filter then. - r.filter = nil - } - } - } - - return r, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go deleted file mode 100644 index beacdc1f024a..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package table allows read and write sorted key/value. -package table - -import ( - "encoding/binary" -) - -/* -Table: - -Table is consist of one or more data blocks, an optional filter block -a metaindex block, an index block and a table footer. Metaindex block -is a special block used to keep parameters of the table, such as filter -block name and its block handle. Index block is a special block used to -keep record of data blocks offset and length, index block use one as -restart interval. The key used by index block are the last key of preceding -block, shorter separator of adjacent blocks or shorter successor of the -last key of the last block. Filter block is an optional block contains -sequence of filter data generated by a filter generator. - -Table data structure: - + optional - / - +--------------+--------------+--------------+------+-------+-----------------+-------------+--------+ - | data block 1 | ... | data block n | filter block | metaindex block | index block | footer | - +--------------+--------------+--------------+--------------+-----------------+-------------+--------+ - - Each block followed by a 5-bytes trailer contains compression type and checksum. - -Table block trailer: - - +---------------------------+-------------------+ - | compression type (1-byte) | checksum (4-byte) | - +---------------------------+-------------------+ - - The checksum is a CRC-32 computed using Castagnoli's polynomial. Compression - type also included in the checksum. - -Table footer: - - +------------------- 40-bytes -------------------+ - / \ - +------------------------+--------------------+------+-----------------+ - | metaindex block handle / index block handle / ---- | magic (8-bytes) | - +------------------------+--------------------+------+-----------------+ - - The magic are first 64-bit of SHA-1 sum of "http://code.google.com/p/leveldb/". - -NOTE: All fixed-length integer are little-endian. -*/ - -/* -Block: - -Block is consist of one or more key/value entries and a block trailer. -Block entry shares key prefix with its preceding key until a restart -point reached. A block should contains at least one restart point. -First restart point are always zero. - -Block data structure: - - + restart point + restart point (depends on restart interval) - / / - +---------------+---------------+---------------+---------------+---------+ - | block entry 1 | block entry 2 | ... | block entry n | trailer | - +---------------+---------------+---------------+---------------+---------+ - -Key/value entry: - - +---- key len ----+ - / \ - +-------+---------+-----------+---------+--------------------+--------------+----------------+ - | shared (varint) | not shared (varint) | value len (varint) | key (varlen) | value (varlen) | - +-----------------+---------------------+--------------------+--------------+----------------+ - - Block entry shares key prefix with its preceding key: - Conditions: - restart_interval=2 - entry one : key=deck,value=v1 - entry two : key=dock,value=v2 - entry three: key=duck,value=v3 - The entries will be encoded as follow: - - + restart point (offset=0) + restart point (offset=16) - / / - +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+ - | 0 | 4 | 2 | "deck" | "v1" | 1 | 3 | 2 | "ock" | "v2" | 0 | 4 | 2 | "duck" | "v3" | - +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+ - \ / \ / \ / - +----------- entry one -----------+ +----------- entry two ----------+ +---------- entry three ----------+ - - The block trailer will contains two restart points: - - +------------+-----------+--------+ - | 0 | 16 | 2 | - +------------+-----------+---+----+ - \ / \ - +-- restart points --+ + restart points length - -Block trailer: - - +-- 4-bytes --+ - / \ - +-----------------+-----------------+-----------------+------------------------------+ - | restart point 1 | .... | restart point n | restart points len (4-bytes) | - +-----------------+-----------------+-----------------+------------------------------+ - - -NOTE: All fixed-length integer are little-endian. -*/ - -/* -Filter block: - -Filter block consist of one or more filter data and a filter block trailer. -The trailer contains filter data offsets, a trailer offset and a 1-byte base Lg. - -Filter block data structure: - - + offset 1 + offset 2 + offset n + trailer offset - / / / / - +---------------+---------------+---------------+---------+ - | filter data 1 | ... | filter data n | trailer | - +---------------+---------------+---------------+---------+ - -Filter block trailer: - - +- 4-bytes -+ - / \ - +---------------+---------------+---------------+-------------------------------+------------------+ - | data 1 offset | .... | data n offset | data-offsets offset (4-bytes) | base Lg (1-byte) | - +-------------- +---------------+---------------+-------------------------------+------------------+ - - -NOTE: All fixed-length integer are little-endian. -*/ - -const ( - blockTrailerLen = 5 - footerLen = 48 - - magic = "\x57\xfb\x80\x8b\x24\x75\x47\xdb" - - // The block type gives the per-block compression format. - // These constants are part of the file format and should not be changed. - blockTypeNoCompression = 0 - blockTypeSnappyCompression = 1 - - // Generate new filter every 2KB of data - filterBaseLg = 11 - filterBase = 1 << filterBaseLg -) - -type blockHandle struct { - offset, length uint64 -} - -func decodeBlockHandle(src []byte) (blockHandle, int) { - offset, n := binary.Uvarint(src) - length, m := binary.Uvarint(src[n:]) - if n == 0 || m == 0 { - return blockHandle{}, 0 - } - return blockHandle{offset, length}, n + m -} - -func encodeBlockHandle(dst []byte, b blockHandle) int { - n := binary.PutUvarint(dst, b.offset) - m := binary.PutUvarint(dst[n:], b.length) - return n + m -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go deleted file mode 100644 index 274dee6da855..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package table - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - - "github.com/golang/snappy" - - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -func sharedPrefixLen(a, b []byte) int { - i, n := 0, len(a) - if n > len(b) { - n = len(b) - } - for i < n && a[i] == b[i] { - i++ - } - return i -} - -type blockWriter struct { - restartInterval int - buf util.Buffer - nEntries int - prevKey []byte - restarts []uint32 - scratch []byte -} - -func (w *blockWriter) append(key, value []byte) { - nShared := 0 - if w.nEntries%w.restartInterval == 0 { - w.restarts = append(w.restarts, uint32(w.buf.Len())) - } else { - nShared = sharedPrefixLen(w.prevKey, key) - } - n := binary.PutUvarint(w.scratch[0:], uint64(nShared)) - n += binary.PutUvarint(w.scratch[n:], uint64(len(key)-nShared)) - n += binary.PutUvarint(w.scratch[n:], uint64(len(value))) - w.buf.Write(w.scratch[:n]) - w.buf.Write(key[nShared:]) - w.buf.Write(value) - w.prevKey = append(w.prevKey[:0], key...) - w.nEntries++ -} - -func (w *blockWriter) finish() { - // Write restarts entry. - if w.nEntries == 0 { - // Must have at least one restart entry. - w.restarts = append(w.restarts, 0) - } - w.restarts = append(w.restarts, uint32(len(w.restarts))) - for _, x := range w.restarts { - buf4 := w.buf.Alloc(4) - binary.LittleEndian.PutUint32(buf4, x) - } -} - -func (w *blockWriter) reset() { - w.buf.Reset() - w.nEntries = 0 - w.restarts = w.restarts[:0] -} - -func (w *blockWriter) bytesLen() int { - restartsLen := len(w.restarts) - if restartsLen == 0 { - restartsLen = 1 - } - return w.buf.Len() + 4*restartsLen + 4 -} - -type filterWriter struct { - generator filter.FilterGenerator - buf util.Buffer - nKeys int - offsets []uint32 -} - -func (w *filterWriter) add(key []byte) { - if w.generator == nil { - return - } - w.generator.Add(key) - w.nKeys++ -} - -func (w *filterWriter) flush(offset uint64) { - if w.generator == nil { - return - } - for x := int(offset / filterBase); x > len(w.offsets); { - w.generate() - } -} - -func (w *filterWriter) finish() { - if w.generator == nil { - return - } - // Generate last keys. - - if w.nKeys > 0 { - w.generate() - } - w.offsets = append(w.offsets, uint32(w.buf.Len())) - for _, x := range w.offsets { - buf4 := w.buf.Alloc(4) - binary.LittleEndian.PutUint32(buf4, x) - } - w.buf.WriteByte(filterBaseLg) -} - -func (w *filterWriter) generate() { - // Record offset. - w.offsets = append(w.offsets, uint32(w.buf.Len())) - // Generate filters. - if w.nKeys > 0 { - w.generator.Generate(&w.buf) - w.nKeys = 0 - } -} - -// Writer is a table writer. -type Writer struct { - writer io.Writer - err error - // Options - cmp comparer.Comparer - filter filter.Filter - compression opt.Compression - blockSize int - - dataBlock blockWriter - indexBlock blockWriter - filterBlock filterWriter - pendingBH blockHandle - offset uint64 - nEntries int - // Scratch allocated enough for 5 uvarint. Block writer should not use - // first 20-bytes since it will be used to encode block handle, which - // then passed to the block writer itself. - scratch [50]byte - comparerScratch []byte - compressionScratch []byte -} - -func (w *Writer) writeBlock(buf *util.Buffer, compression opt.Compression) (bh blockHandle, err error) { - // Compress the buffer if necessary. - var b []byte - if compression == opt.SnappyCompression { - // Allocate scratch enough for compression and block trailer. - if n := snappy.MaxEncodedLen(buf.Len()) + blockTrailerLen; len(w.compressionScratch) < n { - w.compressionScratch = make([]byte, n) - } - compressed := snappy.Encode(w.compressionScratch, buf.Bytes()) - n := len(compressed) - b = compressed[:n+blockTrailerLen] - b[n] = blockTypeSnappyCompression - } else { - tmp := buf.Alloc(blockTrailerLen) - tmp[0] = blockTypeNoCompression - b = buf.Bytes() - } - - // Calculate the checksum. - n := len(b) - 4 - checksum := util.NewCRC(b[:n]).Value() - binary.LittleEndian.PutUint32(b[n:], checksum) - - // Write the buffer to the file. - _, err = w.writer.Write(b) - if err != nil { - return - } - bh = blockHandle{w.offset, uint64(len(b) - blockTrailerLen)} - w.offset += uint64(len(b)) - return -} - -func (w *Writer) flushPendingBH(key []byte) { - if w.pendingBH.length == 0 { - return - } - var separator []byte - if len(key) == 0 { - separator = w.cmp.Successor(w.comparerScratch[:0], w.dataBlock.prevKey) - } else { - separator = w.cmp.Separator(w.comparerScratch[:0], w.dataBlock.prevKey, key) - } - if separator == nil { - separator = w.dataBlock.prevKey - } else { - w.comparerScratch = separator - } - n := encodeBlockHandle(w.scratch[:20], w.pendingBH) - // Append the block handle to the index block. - w.indexBlock.append(separator, w.scratch[:n]) - // Reset prev key of the data block. - w.dataBlock.prevKey = w.dataBlock.prevKey[:0] - // Clear pending block handle. - w.pendingBH = blockHandle{} -} - -func (w *Writer) finishBlock() error { - w.dataBlock.finish() - bh, err := w.writeBlock(&w.dataBlock.buf, w.compression) - if err != nil { - return err - } - w.pendingBH = bh - // Reset the data block. - w.dataBlock.reset() - // Flush the filter block. - w.filterBlock.flush(w.offset) - return nil -} - -// Append appends key/value pair to the table. The keys passed must -// be in increasing order. -// -// It is safe to modify the contents of the arguments after Append returns. -func (w *Writer) Append(key, value []byte) error { - if w.err != nil { - return w.err - } - if w.nEntries > 0 && w.cmp.Compare(w.dataBlock.prevKey, key) >= 0 { - w.err = fmt.Errorf("leveldb/table: Writer: keys are not in increasing order: %q, %q", w.dataBlock.prevKey, key) - return w.err - } - - w.flushPendingBH(key) - // Append key/value pair to the data block. - w.dataBlock.append(key, value) - // Add key to the filter block. - w.filterBlock.add(key) - - // Finish the data block if block size target reached. - if w.dataBlock.bytesLen() >= w.blockSize { - if err := w.finishBlock(); err != nil { - w.err = err - return w.err - } - } - w.nEntries++ - return nil -} - -// BlocksLen returns number of blocks written so far. -func (w *Writer) BlocksLen() int { - n := w.indexBlock.nEntries - if w.pendingBH.length > 0 { - // Includes the pending block. - n++ - } - return n -} - -// EntriesLen returns number of entries added so far. -func (w *Writer) EntriesLen() int { - return w.nEntries -} - -// BytesLen returns number of bytes written so far. -func (w *Writer) BytesLen() int { - return int(w.offset) -} - -// Close will finalize the table. Calling Append is not possible -// after Close, but calling BlocksLen, EntriesLen and BytesLen -// is still possible. -func (w *Writer) Close() error { - if w.err != nil { - return w.err - } - - // Write the last data block. Or empty data block if there - // aren't any data blocks at all. - if w.dataBlock.nEntries > 0 || w.nEntries == 0 { - if err := w.finishBlock(); err != nil { - w.err = err - return w.err - } - } - w.flushPendingBH(nil) - - // Write the filter block. - var filterBH blockHandle - w.filterBlock.finish() - if buf := &w.filterBlock.buf; buf.Len() > 0 { - filterBH, w.err = w.writeBlock(buf, opt.NoCompression) - if w.err != nil { - return w.err - } - } - - // Write the metaindex block. - if filterBH.length > 0 { - key := []byte("filter." + w.filter.Name()) - n := encodeBlockHandle(w.scratch[:20], filterBH) - w.dataBlock.append(key, w.scratch[:n]) - } - w.dataBlock.finish() - metaindexBH, err := w.writeBlock(&w.dataBlock.buf, w.compression) - if err != nil { - w.err = err - return w.err - } - - // Write the index block. - w.indexBlock.finish() - indexBH, err := w.writeBlock(&w.indexBlock.buf, w.compression) - if err != nil { - w.err = err - return w.err - } - - // Write the table footer. - footer := w.scratch[:footerLen] - for i := range footer { - footer[i] = 0 - } - n := encodeBlockHandle(footer, metaindexBH) - encodeBlockHandle(footer[n:], indexBH) - copy(footer[footerLen-len(magic):], magic) - if _, err := w.writer.Write(footer); err != nil { - w.err = err - return w.err - } - w.offset += footerLen - - w.err = errors.New("leveldb/table: writer is closed") - return nil -} - -// NewWriter creates a new initialized table writer for the file. -// -// Table writer is not goroutine-safe. -func NewWriter(f io.Writer, o *opt.Options) *Writer { - w := &Writer{ - writer: f, - cmp: o.GetComparer(), - filter: o.GetFilter(), - compression: o.GetCompression(), - blockSize: o.GetBlockSize(), - comparerScratch: make([]byte, 0), - } - // data block - w.dataBlock.restartInterval = o.GetBlockRestartInterval() - // The first 20-bytes are used for encoding block handle. - w.dataBlock.scratch = w.scratch[20:] - // index block - w.indexBlock.restartInterval = 1 - w.indexBlock.scratch = w.scratch[20:] - // filter block - if w.filter != nil { - w.filterBlock.generator = w.filter.NewGenerator() - w.filterBlock.flush(0) - } - return w -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util.go b/vendor/github.com/syndtr/goleveldb/leveldb/util.go deleted file mode 100644 index 3b663d1cca36..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sort" - - "github.com/syndtr/goleveldb/leveldb/storage" -) - -func shorten(str string) string { - if len(str) <= 8 { - return str - } - return str[:3] + ".." + str[len(str)-3:] -} - -var bunits = [...]string{"", "Ki", "Mi", "Gi"} - -func shortenb(bytes int) string { - i := 0 - for ; bytes > 1024 && i < 4; i++ { - bytes /= 1024 - } - return fmt.Sprintf("%d%sB", bytes, bunits[i]) -} - -func sshortenb(bytes int) string { - if bytes == 0 { - return "~" - } - sign := "+" - if bytes < 0 { - sign = "-" - bytes *= -1 - } - i := 0 - for ; bytes > 1024 && i < 4; i++ { - bytes /= 1024 - } - return fmt.Sprintf("%s%d%sB", sign, bytes, bunits[i]) -} - -func sint(x int) string { - if x == 0 { - return "~" - } - sign := "+" - if x < 0 { - sign = "-" - x *= -1 - } - return fmt.Sprintf("%s%d", sign, x) -} - -func minInt(a, b int) int { - if a < b { - return a - } - return b -} - -func maxInt(a, b int) int { - if a > b { - return a - } - return b -} - -type fdSorter []storage.FileDesc - -func (p fdSorter) Len() int { - return len(p) -} - -func (p fdSorter) Less(i, j int) bool { - return p[i].Num < p[j].Num -} - -func (p fdSorter) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -func sortFds(fds []storage.FileDesc) { - sort.Sort(fdSorter(fds)) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go deleted file mode 100644 index 21de242552d2..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package util - -// This a copy of Go std bytes.Buffer with some modification -// and some features stripped. - -import ( - "bytes" - "io" -) - -// A Buffer is a variable-sized buffer of bytes with Read and Write methods. -// The zero value for Buffer is an empty buffer ready to use. -type Buffer struct { - buf []byte // contents are the bytes buf[off : len(buf)] - off int // read at &buf[off], write at &buf[len(buf)] - bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation. -} - -// Bytes returns a slice of the contents of the unread portion of the buffer; -// len(b.Bytes()) == b.Len(). If the caller changes the contents of the -// returned slice, the contents of the buffer will change provided there -// are no intervening method calls on the Buffer. -func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } - -// String returns the contents of the unread portion of the buffer -// as a string. If the Buffer is a nil pointer, it returns "". -func (b *Buffer) String() string { - if b == nil { - // Special case, useful in debugging. - return "" - } - return string(b.buf[b.off:]) -} - -// Len returns the number of bytes of the unread portion of the buffer; -// b.Len() == len(b.Bytes()). -func (b *Buffer) Len() int { return len(b.buf) - b.off } - -// Truncate discards all but the first n unread bytes from the buffer. -// It panics if n is negative or greater than the length of the buffer. -func (b *Buffer) Truncate(n int) { - switch { - case n < 0 || n > b.Len(): - panic("leveldb/util.Buffer: truncation out of range") - case n == 0: - // Reuse buffer space. - b.off = 0 - } - b.buf = b.buf[0 : b.off+n] -} - -// Reset resets the buffer so it has no content. -// b.Reset() is the same as b.Truncate(0). -func (b *Buffer) Reset() { b.Truncate(0) } - -// grow grows the buffer to guarantee space for n more bytes. -// It returns the index where bytes should be written. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) grow(n int) int { - m := b.Len() - // If buffer is empty, reset to recover space. - if m == 0 && b.off != 0 { - b.Truncate(0) - } - if len(b.buf)+n > cap(b.buf) { - var buf []byte - if b.buf == nil && n <= len(b.bootstrap) { - buf = b.bootstrap[0:] - } else if m+n <= cap(b.buf)/2 { - // We can slide things down instead of allocating a new - // slice. We only need m+n <= cap(b.buf) to slide, but - // we instead let capacity get twice as large so we - // don't spend all our time copying. - copy(b.buf[:], b.buf[b.off:]) - buf = b.buf[:m] - } else { - // not enough space anywhere - buf = makeSlice(2*cap(b.buf) + n) - copy(buf, b.buf[b.off:]) - } - b.buf = buf - b.off = 0 - } - b.buf = b.buf[0 : b.off+m+n] - return b.off + m -} - -// Alloc allocs n bytes of slice from the buffer, growing the buffer as -// needed. If n is negative, Alloc will panic. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) Alloc(n int) []byte { - if n < 0 { - panic("leveldb/util.Buffer.Alloc: negative count") - } - m := b.grow(n) - return b.buf[m:] -} - -// Grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After Grow(n), at least n bytes can be written to the -// buffer without another allocation. -// If n is negative, Grow will panic. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) Grow(n int) { - if n < 0 { - panic("leveldb/util.Buffer.Grow: negative count") - } - m := b.grow(n) - b.buf = b.buf[0:m] -} - -// Write appends the contents of p to the buffer, growing the buffer as -// needed. The return value n is the length of p; err is always nil. If the -// buffer becomes too large, Write will panic with bytes.ErrTooLarge. -func (b *Buffer) Write(p []byte) (n int, err error) { - m := b.grow(len(p)) - return copy(b.buf[m:], p), nil -} - -// MinRead is the minimum slice size passed to a Read call by -// Buffer.ReadFrom. As long as the Buffer has at least MinRead bytes beyond -// what is required to hold the contents of r, ReadFrom will not grow the -// underlying buffer. -const MinRead = 512 - -// ReadFrom reads data from r until EOF and appends it to the buffer, growing -// the buffer as needed. The return value n is the number of bytes read. Any -// error except io.EOF encountered during the read is also returned. If the -// buffer becomes too large, ReadFrom will panic with bytes.ErrTooLarge. -func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) { - // If buffer is empty, reset to recover space. - if b.off >= len(b.buf) { - b.Truncate(0) - } - for { - if free := cap(b.buf) - len(b.buf); free < MinRead { - // not enough space at end - newBuf := b.buf - if b.off+free < MinRead { - // not enough space using beginning of buffer; - // double buffer capacity - newBuf = makeSlice(2*cap(b.buf) + MinRead) - } - copy(newBuf, b.buf[b.off:]) - b.buf = newBuf[:len(b.buf)-b.off] - b.off = 0 - } - m, e := r.Read(b.buf[len(b.buf):cap(b.buf)]) - b.buf = b.buf[0 : len(b.buf)+m] - n += int64(m) - if e == io.EOF { - break - } - if e != nil { - return n, e - } - } - return n, nil // err is EOF, so return nil explicitly -} - -// makeSlice allocates a slice of size n. If the allocation fails, it panics -// with bytes.ErrTooLarge. -func makeSlice(n int) []byte { - // If the make fails, give a known error. - defer func() { - if recover() != nil { - panic(bytes.ErrTooLarge) - } - }() - return make([]byte, n) -} - -// WriteTo writes data to w until the buffer is drained or an error occurs. -// The return value n is the number of bytes written; it always fits into an -// int, but it is int64 to match the io.WriterTo interface. Any error -// encountered during the write is also returned. -func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) { - if b.off < len(b.buf) { - nBytes := b.Len() - m, e := w.Write(b.buf[b.off:]) - if m > nBytes { - panic("leveldb/util.Buffer.WriteTo: invalid Write count") - } - b.off += m - n = int64(m) - if e != nil { - return n, e - } - // all bytes should have been written, by definition of - // Write method in io.Writer - if m != nBytes { - return n, io.ErrShortWrite - } - } - // Buffer is now empty; reset. - b.Truncate(0) - return -} - -// WriteByte appends the byte c to the buffer, growing the buffer as needed. -// The returned error is always nil, but is included to match bufio.Writer's -// WriteByte. If the buffer becomes too large, WriteByte will panic with -// bytes.ErrTooLarge. -func (b *Buffer) WriteByte(c byte) error { - m := b.grow(1) - b.buf[m] = c - return nil -} - -// Read reads the next len(p) bytes from the buffer or until the buffer -// is drained. The return value n is the number of bytes read. If the -// buffer has no data to return, err is io.EOF (unless len(p) is zero); -// otherwise it is nil. -func (b *Buffer) Read(p []byte) (n int, err error) { - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - if len(p) == 0 { - return - } - return 0, io.EOF - } - n = copy(p, b.buf[b.off:]) - b.off += n - return -} - -// Next returns a slice containing the next n bytes from the buffer, -// advancing the buffer as if the bytes had been returned by Read. -// If there are fewer than n bytes in the buffer, Next returns the entire buffer. -// The slice is only valid until the next call to a read or write method. -func (b *Buffer) Next(n int) []byte { - m := b.Len() - if n > m { - n = m - } - data := b.buf[b.off : b.off+n] - b.off += n - return data -} - -// ReadByte reads and returns the next byte from the buffer. -// If no byte is available, it returns error io.EOF. -func (b *Buffer) ReadByte() (c byte, err error) { - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - return 0, io.EOF - } - c = b.buf[b.off] - b.off++ - return c, nil -} - -// ReadBytes reads until the first occurrence of delim in the input, -// returning a slice containing the data up to and including the delimiter. -// If ReadBytes encounters an error before finding a delimiter, -// it returns the data read before the error and the error itself (often io.EOF). -// ReadBytes returns err != nil if and only if the returned data does not end in -// delim. -func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) { - slice, err := b.readSlice(delim) - // return a copy of slice. The buffer's backing array may - // be overwritten by later calls. - line = append(line, slice...) - return -} - -// readSlice is like ReadBytes but returns a reference to internal buffer data. -func (b *Buffer) readSlice(delim byte) (line []byte, err error) { - i := bytes.IndexByte(b.buf[b.off:], delim) - end := b.off + i + 1 - if i < 0 { - end = len(b.buf) - err = io.EOF - } - line = b.buf[b.off:end] - b.off = end - return line, err -} - -// NewBuffer creates and initializes a new Buffer using buf as its initial -// contents. It is intended to prepare a Buffer to read existing data. It -// can also be used to size the internal buffer for writing. To do that, -// buf should have the desired capacity but a length of zero. -// -// In most cases, new(Buffer) (or just declaring a Buffer variable) is -// sufficient to initialize a Buffer. -func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go deleted file mode 100644 index 2f3db974a796..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -import ( - "fmt" - "sync" - "sync/atomic" - "time" -) - -type buffer struct { - b []byte - miss int -} - -// BufferPool is a 'buffer pool'. -type BufferPool struct { - pool [6]chan []byte - size [5]uint32 - sizeMiss [5]uint32 - sizeHalf [5]uint32 - baseline [4]int - baseline0 int - - mu sync.RWMutex - closed bool - closeC chan struct{} - - get uint32 - put uint32 - half uint32 - less uint32 - equal uint32 - greater uint32 - miss uint32 -} - -func (p *BufferPool) poolNum(n int) int { - if n <= p.baseline0 && n > p.baseline0/2 { - return 0 - } - for i, x := range p.baseline { - if n <= x { - return i + 1 - } - } - return len(p.baseline) + 1 -} - -// Get returns buffer with length of n. -func (p *BufferPool) Get(n int) []byte { - if p == nil { - return make([]byte, n) - } - - p.mu.RLock() - defer p.mu.RUnlock() - - if p.closed { - return make([]byte, n) - } - - atomic.AddUint32(&p.get, 1) - - poolNum := p.poolNum(n) - pool := p.pool[poolNum] - if poolNum == 0 { - // Fast path. - select { - case b := <-pool: - switch { - case cap(b) > n: - if cap(b)-n >= n { - atomic.AddUint32(&p.half, 1) - select { - case pool <- b: - default: - } - return make([]byte, n) - } else { - atomic.AddUint32(&p.less, 1) - return b[:n] - } - case cap(b) == n: - atomic.AddUint32(&p.equal, 1) - return b[:n] - default: - atomic.AddUint32(&p.greater, 1) - } - default: - atomic.AddUint32(&p.miss, 1) - } - - return make([]byte, n, p.baseline0) - } else { - sizePtr := &p.size[poolNum-1] - - select { - case b := <-pool: - switch { - case cap(b) > n: - if cap(b)-n >= n { - atomic.AddUint32(&p.half, 1) - sizeHalfPtr := &p.sizeHalf[poolNum-1] - if atomic.AddUint32(sizeHalfPtr, 1) == 20 { - atomic.StoreUint32(sizePtr, uint32(cap(b)/2)) - atomic.StoreUint32(sizeHalfPtr, 0) - } else { - select { - case pool <- b: - default: - } - } - return make([]byte, n) - } else { - atomic.AddUint32(&p.less, 1) - return b[:n] - } - case cap(b) == n: - atomic.AddUint32(&p.equal, 1) - return b[:n] - default: - atomic.AddUint32(&p.greater, 1) - if uint32(cap(b)) >= atomic.LoadUint32(sizePtr) { - select { - case pool <- b: - default: - } - } - } - default: - atomic.AddUint32(&p.miss, 1) - } - - if size := atomic.LoadUint32(sizePtr); uint32(n) > size { - if size == 0 { - atomic.CompareAndSwapUint32(sizePtr, 0, uint32(n)) - } else { - sizeMissPtr := &p.sizeMiss[poolNum-1] - if atomic.AddUint32(sizeMissPtr, 1) == 20 { - atomic.StoreUint32(sizePtr, uint32(n)) - atomic.StoreUint32(sizeMissPtr, 0) - } - } - return make([]byte, n) - } else { - return make([]byte, n, size) - } - } -} - -// Put adds given buffer to the pool. -func (p *BufferPool) Put(b []byte) { - if p == nil { - return - } - - p.mu.RLock() - defer p.mu.RUnlock() - - if p.closed { - return - } - - atomic.AddUint32(&p.put, 1) - - pool := p.pool[p.poolNum(cap(b))] - select { - case pool <- b: - default: - } - -} - -func (p *BufferPool) Close() { - if p == nil { - return - } - - p.mu.Lock() - if !p.closed { - p.closed = true - p.closeC <- struct{}{} - } - p.mu.Unlock() -} - -func (p *BufferPool) String() string { - if p == nil { - return "" - } - - return fmt.Sprintf("BufferPool{B·%d Z·%v Zm·%v Zh·%v G·%d P·%d H·%d <·%d =·%d >·%d M·%d}", - p.baseline0, p.size, p.sizeMiss, p.sizeHalf, p.get, p.put, p.half, p.less, p.equal, p.greater, p.miss) -} - -func (p *BufferPool) drain() { - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - for _, ch := range p.pool { - select { - case <-ch: - default: - } - } - case <-p.closeC: - close(p.closeC) - for _, ch := range p.pool { - close(ch) - } - return - } - } -} - -// NewBufferPool creates a new initialized 'buffer pool'. -func NewBufferPool(baseline int) *BufferPool { - if baseline <= 0 { - panic("baseline can't be <= 0") - } - p := &BufferPool{ - baseline0: baseline, - baseline: [...]int{baseline / 4, baseline / 2, baseline * 2, baseline * 4}, - closeC: make(chan struct{}, 1), - } - for i, cap := range []int{2, 2, 4, 4, 2, 1} { - p.pool[i] = make(chan []byte, cap) - } - go p.drain() - return p -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go deleted file mode 100644 index 631c9d6109c9..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2011 The LevelDB-Go Authors. All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -import ( - "hash/crc32" -) - -var table = crc32.MakeTable(crc32.Castagnoli) - -// CRC is a CRC-32 checksum computed using Castagnoli's polynomial. -type CRC uint32 - -// NewCRC creates a new crc based on the given bytes. -func NewCRC(b []byte) CRC { - return CRC(0).Update(b) -} - -// Update updates the crc with the given bytes. -func (c CRC) Update(b []byte) CRC { - return CRC(crc32.Update(uint32(c), table, b)) -} - -// Value returns a masked crc. -func (c CRC) Value() uint32 { - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go deleted file mode 100644 index 54903660ffa7..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -import ( - "bytes" - "encoding/binary" -) - -// Hash return hash of the given data. -func Hash(data []byte, seed uint32) uint32 { - // Similar to murmur hash - var m uint32 = 0xc6a4a793 - var r uint32 = 24 - h := seed ^ (uint32(len(data)) * m) - - buf := bytes.NewBuffer(data) - for buf.Len() >= 4 { - var w uint32 - binary.Read(buf, binary.LittleEndian, &w) - h += w - h *= m - h ^= (h >> 16) - } - - rest := buf.Bytes() - switch len(rest) { - default: - panic("not reached") - case 3: - h += uint32(rest[2]) << 16 - fallthrough - case 2: - h += uint32(rest[1]) << 8 - fallthrough - case 1: - h += uint32(rest[0]) - h *= m - h ^= (h >> r) - case 0: - } - - return h -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go deleted file mode 100644 index 85159583d2c3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -// Range is a key range. -type Range struct { - // Start of the key range, include in the range. - Start []byte - - // Limit of the key range, not include in the range. - Limit []byte -} - -// BytesPrefix returns key range that satisfy the given prefix. -// This only applicable for the standard 'bytes comparer'. -func BytesPrefix(prefix []byte) *Range { - var limit []byte - for i := len(prefix) - 1; i >= 0; i-- { - c := prefix[i] - if c < 0xff { - limit = make([]byte, i+1) - copy(limit, prefix) - limit[i] = c + 1 - break - } - } - return &Range{prefix, limit} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go deleted file mode 100644 index f35976865bff..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package util provides utilities used throughout leveldb. -package util - -import ( - "errors" -) - -var ( - ErrReleased = errors.New("leveldb: resource already relesed") - ErrHasReleaser = errors.New("leveldb: releaser already defined") -) - -// Releaser is the interface that wraps the basic Release method. -type Releaser interface { - // Release releases associated resources. Release should always success - // and can be called multipe times without causing error. - Release() -} - -// ReleaseSetter is the interface that wraps the basic SetReleaser method. -type ReleaseSetter interface { - // SetReleaser associates the given releaser to the resources. The - // releaser will be called once coresponding resources released. - // Calling SetReleaser with nil will clear the releaser. - // - // This will panic if a releaser already present or coresponding - // resource is already released. Releaser should be cleared first - // before assigned a new one. - SetReleaser(releaser Releaser) -} - -// BasicReleaser provides basic implementation of Releaser and ReleaseSetter. -type BasicReleaser struct { - releaser Releaser - released bool -} - -// Released returns whether Release method already called. -func (r *BasicReleaser) Released() bool { - return r.released -} - -// Release implements Releaser.Release. -func (r *BasicReleaser) Release() { - if !r.released { - if r.releaser != nil { - r.releaser.Release() - r.releaser = nil - } - r.released = true - } -} - -// SetReleaser implements ReleaseSetter.SetReleaser. -func (r *BasicReleaser) SetReleaser(releaser Releaser) { - if r.released { - panic(ErrReleased) - } - if r.releaser != nil && releaser != nil { - panic(ErrHasReleaser) - } - r.releaser = releaser -} - -type NoopReleaser struct{} - -func (NoopReleaser) Release() {} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go deleted file mode 100644 index d274eeff211f..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go +++ /dev/null @@ -1,519 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sync/atomic" - "unsafe" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type tSet struct { - level int - table *tFile -} - -type version struct { - s *session - - levels []tFiles - - // Level that should be compacted next and its compaction score. - // Score < 1 means compaction is not strictly needed. These fields - // are initialized by computeCompaction() - cLevel int - cScore float64 - - cSeek unsafe.Pointer - - ref int - // Succeeding version. - next *version -} - -func newVersion(s *session) *version { - return &version{s: s} -} - -func (v *version) releaseNB() { - v.ref-- - if v.ref > 0 { - return - } - if v.ref < 0 { - panic("negative version ref") - } - - nextTables := make(map[int64]bool) - for _, tt := range v.next.levels { - for _, t := range tt { - num := t.fd.Num - nextTables[num] = true - } - } - - for _, tt := range v.levels { - for _, t := range tt { - num := t.fd.Num - if _, ok := nextTables[num]; !ok { - v.s.tops.remove(t) - } - } - } - - v.next.releaseNB() - v.next = nil -} - -func (v *version) release() { - v.s.vmu.Lock() - v.releaseNB() - v.s.vmu.Unlock() -} - -func (v *version) walkOverlapping(aux tFiles, ikey internalKey, f func(level int, t *tFile) bool, lf func(level int) bool) { - ukey := ikey.ukey() - - // Aux level. - if aux != nil { - for _, t := range aux { - if t.overlaps(v.s.icmp, ukey, ukey) { - if !f(-1, t) { - return - } - } - } - - if lf != nil && !lf(-1) { - return - } - } - - // Walk tables level-by-level. - for level, tables := range v.levels { - if len(tables) == 0 { - continue - } - - if level == 0 { - // Level-0 files may overlap each other. Find all files that - // overlap ukey. - for _, t := range tables { - if t.overlaps(v.s.icmp, ukey, ukey) { - if !f(level, t) { - return - } - } - } - } else { - if i := tables.searchMax(v.s.icmp, ikey); i < len(tables) { - t := tables[i] - if v.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 { - if !f(level, t) { - return - } - } - } - } - - if lf != nil && !lf(level) { - return - } - } -} - -func (v *version) get(aux tFiles, ikey internalKey, ro *opt.ReadOptions, noValue bool) (value []byte, tcomp bool, err error) { - ukey := ikey.ukey() - - var ( - tset *tSet - tseek bool - - // Level-0. - zfound bool - zseq uint64 - zkt keyType - zval []byte - ) - - err = ErrNotFound - - // Since entries never hop across level, finding key/value - // in smaller level make later levels irrelevant. - v.walkOverlapping(aux, ikey, func(level int, t *tFile) bool { - if level >= 0 && !tseek { - if tset == nil { - tset = &tSet{level, t} - } else { - tseek = true - } - } - - var ( - fikey, fval []byte - ferr error - ) - if noValue { - fikey, ferr = v.s.tops.findKey(t, ikey, ro) - } else { - fikey, fval, ferr = v.s.tops.find(t, ikey, ro) - } - - switch ferr { - case nil: - case ErrNotFound: - return true - default: - err = ferr - return false - } - - if fukey, fseq, fkt, fkerr := parseInternalKey(fikey); fkerr == nil { - if v.s.icmp.uCompare(ukey, fukey) == 0 { - // Level <= 0 may overlaps each-other. - if level <= 0 { - if fseq >= zseq { - zfound = true - zseq = fseq - zkt = fkt - zval = fval - } - } else { - switch fkt { - case keyTypeVal: - value = fval - err = nil - case keyTypeDel: - default: - panic("leveldb: invalid internalKey type") - } - return false - } - } - } else { - err = fkerr - return false - } - - return true - }, func(level int) bool { - if zfound { - switch zkt { - case keyTypeVal: - value = zval - err = nil - case keyTypeDel: - default: - panic("leveldb: invalid internalKey type") - } - return false - } - - return true - }) - - if tseek && tset.table.consumeSeek() <= 0 { - tcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset)) - } - - return -} - -func (v *version) sampleSeek(ikey internalKey) (tcomp bool) { - var tset *tSet - - v.walkOverlapping(nil, ikey, func(level int, t *tFile) bool { - if tset == nil { - tset = &tSet{level, t} - return true - } - if tset.table.consumeSeek() <= 0 { - tcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset)) - } - return false - }, nil) - - return -} - -func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) { - strict := opt.GetStrict(v.s.o.Options, ro, opt.StrictReader) - for level, tables := range v.levels { - if level == 0 { - // Merge all level zero files together since they may overlap. - for _, t := range tables { - its = append(its, v.s.tops.newIterator(t, slice, ro)) - } - } else if len(tables) != 0 { - its = append(its, iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict)) - } - } - return -} - -func (v *version) newStaging() *versionStaging { - return &versionStaging{base: v} -} - -// Spawn a new version based on this version. -func (v *version) spawn(r *sessionRecord) *version { - staging := v.newStaging() - staging.commit(r) - return staging.finish() -} - -func (v *version) fillRecord(r *sessionRecord) { - for level, tables := range v.levels { - for _, t := range tables { - r.addTableFile(level, t) - } - } -} - -func (v *version) tLen(level int) int { - if level < len(v.levels) { - return len(v.levels[level]) - } - return 0 -} - -func (v *version) offsetOf(ikey internalKey) (n int64, err error) { - for level, tables := range v.levels { - for _, t := range tables { - if v.s.icmp.Compare(t.imax, ikey) <= 0 { - // Entire file is before "ikey", so just add the file size - n += t.size - } else if v.s.icmp.Compare(t.imin, ikey) > 0 { - // Entire file is after "ikey", so ignore - if level > 0 { - // Files other than level 0 are sorted by meta->min, so - // no further files in this level will contain data for - // "ikey". - break - } - } else { - // "ikey" falls in the range for this table. Add the - // approximate offset of "ikey" within the table. - if m, err := v.s.tops.offsetOf(t, ikey); err == nil { - n += m - } else { - return 0, err - } - } - } - } - - return -} - -func (v *version) pickMemdbLevel(umin, umax []byte, maxLevel int) (level int) { - if maxLevel > 0 { - if len(v.levels) == 0 { - return maxLevel - } - if !v.levels[0].overlaps(v.s.icmp, umin, umax, true) { - var overlaps tFiles - for ; level < maxLevel; level++ { - if pLevel := level + 1; pLevel >= len(v.levels) { - return maxLevel - } else if v.levels[pLevel].overlaps(v.s.icmp, umin, umax, false) { - break - } - if gpLevel := level + 2; gpLevel < len(v.levels) { - overlaps = v.levels[gpLevel].getOverlaps(overlaps, v.s.icmp, umin, umax, false) - if overlaps.size() > int64(v.s.o.GetCompactionGPOverlaps(level)) { - break - } - } - } - } - } - return -} - -func (v *version) computeCompaction() { - // Precomputed best level for next compaction - bestLevel := int(-1) - bestScore := float64(-1) - - statFiles := make([]int, len(v.levels)) - statSizes := make([]string, len(v.levels)) - statScore := make([]string, len(v.levels)) - statTotSize := int64(0) - - for level, tables := range v.levels { - var score float64 - size := tables.size() - if level == 0 { - // We treat level-0 specially by bounding the number of files - // instead of number of bytes for two reasons: - // - // (1) With larger write-buffer sizes, it is nice not to do too - // many level-0 compaction. - // - // (2) The files in level-0 are merged on every read and - // therefore we wish to avoid too many files when the individual - // file size is small (perhaps because of a small write-buffer - // setting, or very high compression ratios, or lots of - // overwrites/deletions). - score = float64(len(tables)) / float64(v.s.o.GetCompactionL0Trigger()) - } else { - score = float64(size) / float64(v.s.o.GetCompactionTotalSize(level)) - } - - if score > bestScore { - bestLevel = level - bestScore = score - } - - statFiles[level] = len(tables) - statSizes[level] = shortenb(int(size)) - statScore[level] = fmt.Sprintf("%.2f", score) - statTotSize += size - } - - v.cLevel = bestLevel - v.cScore = bestScore - - v.s.logf("version@stat F·%v S·%s%v Sc·%v", statFiles, shortenb(int(statTotSize)), statSizes, statScore) -} - -func (v *version) needCompaction() bool { - return v.cScore >= 1 || atomic.LoadPointer(&v.cSeek) != nil -} - -type tablesScratch struct { - added map[int64]atRecord - deleted map[int64]struct{} -} - -type versionStaging struct { - base *version - levels []tablesScratch -} - -func (p *versionStaging) getScratch(level int) *tablesScratch { - if level >= len(p.levels) { - newLevels := make([]tablesScratch, level+1) - copy(newLevels, p.levels) - p.levels = newLevels - } - return &(p.levels[level]) -} - -func (p *versionStaging) commit(r *sessionRecord) { - // Deleted tables. - for _, r := range r.deletedTables { - scratch := p.getScratch(r.level) - if r.level < len(p.base.levels) && len(p.base.levels[r.level]) > 0 { - if scratch.deleted == nil { - scratch.deleted = make(map[int64]struct{}) - } - scratch.deleted[r.num] = struct{}{} - } - if scratch.added != nil { - delete(scratch.added, r.num) - } - } - - // New tables. - for _, r := range r.addedTables { - scratch := p.getScratch(r.level) - if scratch.added == nil { - scratch.added = make(map[int64]atRecord) - } - scratch.added[r.num] = r - if scratch.deleted != nil { - delete(scratch.deleted, r.num) - } - } -} - -func (p *versionStaging) finish() *version { - // Build new version. - nv := newVersion(p.base.s) - numLevel := len(p.levels) - if len(p.base.levels) > numLevel { - numLevel = len(p.base.levels) - } - nv.levels = make([]tFiles, numLevel) - for level := 0; level < numLevel; level++ { - var baseTabels tFiles - if level < len(p.base.levels) { - baseTabels = p.base.levels[level] - } - - if level < len(p.levels) { - scratch := p.levels[level] - - var nt tFiles - // Prealloc list if possible. - if n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 { - nt = make(tFiles, 0, n) - } - - // Base tables. - for _, t := range baseTabels { - if _, ok := scratch.deleted[t.fd.Num]; ok { - continue - } - if _, ok := scratch.added[t.fd.Num]; ok { - continue - } - nt = append(nt, t) - } - - // New tables. - for _, r := range scratch.added { - nt = append(nt, tableFileFromRecord(r)) - } - - if len(nt) != 0 { - // Sort tables. - if level == 0 { - nt.sortByNum() - } else { - nt.sortByKey(p.base.s.icmp) - } - - nv.levels[level] = nt - } - } else { - nv.levels[level] = baseTabels - } - } - - // Trim levels. - n := len(nv.levels) - for ; n > 0 && nv.levels[n-1] == nil; n-- { - } - nv.levels = nv.levels[:n] - - // Compute compaction score for new version. - nv.computeCompaction() - - return nv -} - -type versionReleaser struct { - v *version - once bool -} - -func (vr *versionReleaser) Release() { - v := vr.v - v.s.vmu.Lock() - if !vr.once { - v.releaseNB() - vr.once = true - } - v.s.vmu.Unlock() -} diff --git a/vendor/github.com/twinj/uuid/LICENSE b/vendor/github.com/twinj/uuid/LICENSE deleted file mode 100644 index a92c1e08f496..000000000000 --- a/vendor/github.com/twinj/uuid/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (C) 2011 by Krzysztof Kowalik -Copyright (C) 2014 by Daniel Kemp Derivative work - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/twinj/uuid/array.go b/vendor/github.com/twinj/uuid/array.go deleted file mode 100644 index add7e19bea12..000000000000 --- a/vendor/github.com/twinj/uuid/array.go +++ /dev/null @@ -1,68 +0,0 @@ -package uuid - -/**************** - * Date: 1/02/14 - * Time: 10:08 AM - ***************/ - -const ( - variantIndex = 8 - versionIndex = 6 -) - -// A clean UUID type for simpler UUID versions -type Array [length]byte - -func (Array) Size() int { - return length -} - -func (o Array) Version() int { - return int(o[versionIndex]) >> 4 -} - -func (o *Array) setVersion(pVersion int) { - o[versionIndex] &= 0x0F - o[versionIndex] |= byte(pVersion) << 4 -} - -func (o *Array) Variant() byte { - return variant(o[variantIndex]) -} - -func (o *Array) setVariant(pVariant byte) { - setVariant(&o[variantIndex], pVariant) -} - -func (o *Array) Unmarshal(pData []byte) { - copy(o[:], pData) -} - -func (o *Array) Bytes() []byte { - return o[:] -} - -func (o Array) String() string { - return formatter(&o, format) -} - -func (o Array) Format(pFormat string) string { - return formatter(&o, pFormat) -} - -// Set the three most significant bits (bits 0, 1 and 2) of the -// sequenceHiAndVariant equivalent in the array to ReservedRFC4122. -func (o *Array) setRFC4122Variant() { - o[variantIndex] &= 0x3F - o[variantIndex] |= ReservedRFC4122 -} - -// Marshals the UUID bytes into a slice -func (o *Array) MarshalBinary() ([]byte, error) { - return o.Bytes(), nil -} - -// Un-marshals the data bytes into the UUID. -func (o *Array) UnmarshalBinary(pData []byte) error { - return UnmarshalBinary(o, pData) -} diff --git a/vendor/github.com/twinj/uuid/rfc4122.go b/vendor/github.com/twinj/uuid/rfc4122.go deleted file mode 100644 index 64ef55613411..000000000000 --- a/vendor/github.com/twinj/uuid/rfc4122.go +++ /dev/null @@ -1,146 +0,0 @@ -package uuid - -/*************** - * Date: 14/02/14 - * Time: 7:44 PM - ***************/ - -import ( - "crypto/md5" - "crypto/rand" - "crypto/sha1" - "encoding/binary" - "log" - seed "math/rand" - "net" -) - -const ( - length = 16 - - // 3F used by RFC4122 although 1F works for all - variantSet = 0x3F - - // rather than using 0xC0 we use 0xE0 to retrieve the variant - // The result is the same for all other variants - // 0x80 and 0xA0 are used to identify RFC4122 compliance - variantGet = 0xE0 -) - -var ( - // nodeID is the default Namespace node - nodeId = []byte{ - // 00.192.79.212.48.200 - 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8, - } - // The following standard UUIDs are for use with V3 or V5 UUIDs. - NamespaceDNS = &Struct{0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, nodeId, length} - NamespaceURL = &Struct{0x6ba7b811, 0x9dad, 0x11d1, 0x80, 0xb4, nodeId, length} - NamespaceOID = &Struct{0x6ba7b812, 0x9dad, 0x11d1, 0x80, 0xb4, nodeId, length} - NamespaceX500 = &Struct{0x6ba7b814, 0x9dad, 0x11d1, 0x80, 0xb4, nodeId, length} - - state State -) - -func init() { - seed.Seed((int64(timestamp())^int64(gregorianToUNIXOffset))*0x6ba7b814<<0x6ba7b812 | 1391463463) - state = State{ - randomNode: true, - randomSequence: true, - past: Timestamp((1391463463 * 10000000) + (100 * 10) + gregorianToUNIXOffset), - node: nodeId, - sequence: uint16(seed.Int()) & 0x3FFF, - saver: nil, - } -} - -// NewV1 will generate a new RFC4122 version 1 UUID -func NewV1() UUID { - state.Lock() - defer state.Unlock() - now := currentUUIDTimestamp() - state.read(now, currentUUIDNodeId()) - state.persist() - return formatV1(now, uint16(1), ReservedRFC4122, state.node) -} - -// NewV3 will generate a new RFC4122 version 3 UUID -// V3 is based on the MD5 hash of a namespace identifier UUID and -// any type which implements the UniqueName interface for the name. -// For strings and slices cast to a Name type -func NewV3(pNs UUID, pName UniqueName) UUID { - o := new(Array) - // Set all bits to MD5 hash generated from namespace and name. - Digest(o, pNs, pName, md5.New()) - o.setRFC4122Variant() - o.setVersion(3) - return o -} - -// NewV4 will generate a new RFC4122 version 4 UUID -// A cryptographically secure random UUID. -func NewV4() UUID { - o := new(Array) - // Read random values (or pseudo-randomly) into Array type. - _, err := rand.Read(o[:length]) - if err != nil { - panic(err) - } - o.setRFC4122Variant() - o.setVersion(4) - return o -} - -// NewV5 will generate a new RFC4122 version 5 UUID -// Generate a UUID based on the SHA-1 hash of a namespace -// identifier and a name. -func NewV5(pNs UUID, pName UniqueName) UUID { - o := new(Array) - Digest(o, pNs, pName, sha1.New()) - o.setRFC4122Variant() - o.setVersion(5) - return o -} - -// either generates a random node when there is an error or gets -// the pre initialised one -func currentUUIDNodeId() (node net.HardwareAddr) { - if state.randomNode { - b := make([]byte, 16+6) - _, err := rand.Read(b) - if err != nil { - log.Println("UUID.currentUUIDNodeId error:", err) - node = nodeId - return - } - h := sha1.New() - h.Write(b) - binary.Write(h, binary.LittleEndian, state.sequence) - node = h.Sum(nil)[:6] - if err != nil { - log.Println("UUID.currentUUIDNodeId error:", err) - node = nodeId - return - } - // Mark as randomly generated - node[0] |= 0x01 - } else { - node = state.node - } - return -} - -// Unmarshal data into struct for V1 UUIDs -func formatV1(pNow Timestamp, pVersion uint16, pVariant byte, pNode []byte) UUID { - o := new(Struct) - o.timeLow = uint32(pNow & 0xFFFFFFFF) - o.timeMid = uint16((pNow >> 32) & 0xFFFF) - o.timeHiAndVersion = uint16((pNow >> 48) & 0x0FFF) - o.timeHiAndVersion |= uint16(pVersion << 12) - o.sequenceLow = byte(state.sequence & 0xFF) - o.sequenceHiAndVariant = byte((state.sequence & 0x3F00) >> 8) - o.sequenceHiAndVariant |= pVariant - o.node = pNode - o.size = length - return o -} diff --git a/vendor/github.com/twinj/uuid/saver.go b/vendor/github.com/twinj/uuid/saver.go deleted file mode 100644 index 0b776a46a93f..000000000000 --- a/vendor/github.com/twinj/uuid/saver.go +++ /dev/null @@ -1,140 +0,0 @@ -package uuid - -/**************** - * Date: 21/06/15 - * Time: 5:48 PM - ***************/ - -import ( - "encoding/gob" - "log" - "os" - "time" -) - -func init() { - gob.Register(stateEntity{}) -} - -func SetupFileSystemStateSaver(pConfig StateSaverConfig) { - saver := &FileSystemSaver{} - saver.saveReport = pConfig.SaveReport - saver.saveSchedule = int64(pConfig.SaveSchedule) - SetupCustomStateSaver(saver) -} - -// A wrapper for default setup of the FileSystemStateSaver -type StateSaverConfig struct { - - // Print save log - SaveReport bool - - // Save every x nanoseconds - SaveSchedule time.Duration -} - -// *********************************************** StateEntity - -// StateEntity acts as a marshaller struct for the state -type stateEntity struct { - Past Timestamp - Node []byte - Sequence uint16 -} - -// This implements the StateSaver interface for UUIDs -type FileSystemSaver struct { - cache *os.File - saveState uint64 - saveReport bool - saveSchedule int64 -} - -// Saves the current state of the generator -// If the scheduled file save is reached then the file is synced -func (o *FileSystemSaver) Save(pState *State) { - if pState.past >= pState.next { - err := o.open() - defer o.cache.Close() - if err != nil { - log.Println("uuid.State.save:", err) - return - } - // do the save - o.encode(pState) - // a tick is 100 nano seconds - pState.next = pState.past + Timestamp(o.saveSchedule / 100) - if o.saveReport { - log.Printf("UUID STATE: SAVED %d", pState.past) - } - } -} - -func (o *FileSystemSaver) Init(pState *State) { - pState.saver = o - err := o.open() - defer o.cache.Close() - if err != nil { - if os.IsNotExist(err) { - log.Printf("'%s' created\n", "uuid.SaveState") - var err error - o.cache, err = os.Create(os.TempDir() + "/state.unique") - if err != nil { - log.Println("uuid.State.init: SaveState error:", err) - goto pastInit - } - o.encode(pState) - } else { - log.Println("uuid.State.init: SaveState error:", err) - goto pastInit - } - } - err = o.decode(pState) - if err != nil { - goto pastInit - } - pState.randomSequence = false -pastInit: - if timestamp() <= pState.past { - pState.sequence++ - } - pState.next = pState.past -} - -func (o *FileSystemSaver) reset() { - o.cache.Seek(0, 0) -} - -func (o *FileSystemSaver) open() error { - var err error - o.cache, err = os.OpenFile(os.TempDir()+"/state.unique", os.O_RDWR, os.ModeExclusive) - return err -} - -// Encodes State generator data into a saved file -func (o *FileSystemSaver) encode(pState *State) { - // ensure reader state is ready for use - o.reset() - enc := gob.NewEncoder(o.cache) - // Wrap private State data into the StateEntity - err := enc.Encode(&stateEntity{pState.past, pState.node, pState.sequence}) - if err != nil { - log.Panic("UUID.encode error:", err) - } -} - -// Decodes StateEntity data into the main State -func (o *FileSystemSaver) decode(pState *State) error { - o.reset() - dec := gob.NewDecoder(o.cache) - entity := stateEntity{} - err := dec.Decode(&entity) - if err != nil { - log.Println("uuid.decode error:", err) - return err - } - pState.past = entity.Past - pState.node = entity.Node - pState.sequence = entity.Sequence - return nil -} diff --git a/vendor/github.com/twinj/uuid/state.go b/vendor/github.com/twinj/uuid/state.go deleted file mode 100644 index f3920776cda6..000000000000 --- a/vendor/github.com/twinj/uuid/state.go +++ /dev/null @@ -1,137 +0,0 @@ -package uuid - -/**************** - * Date: 14/02/14 - * Time: 7:43 PM - ***************/ - -import ( - "bytes" - "log" - seed "math/rand" - "net" - "sync" -) - - -// **************************************************** State - -func SetupCustomStateSaver(pSaver StateSaver) { - state.Lock() - pSaver.Init(&state) - state.init() - state.Unlock() -} - -// Holds package information about the current -// state of the UUID generator -type State struct { - - // A flag which informs whether to - // randomly create a node id - randomNode bool - - // A flag which informs whether to - // randomly create the sequence - randomSequence bool - - // the last time UUID was saved - past Timestamp - - // the next time the state will be saved - next Timestamp - - // the last node which saved a UUID - node []byte - - // An iterated value to help ensure different - // values across the same domain - sequence uint16 - - sync.Mutex - - // save state interface - saver StateSaver -} - -// Changes the state with current data -// Compares the current found node to the last node stored, -// If they are the same or randomSequence is already set due -// to an earlier read issue then the sequence is randomly generated -// else if there is an issue with the time the sequence is incremented -func (o *State) read(pNow Timestamp, pNode net.HardwareAddr) { - if bytes.Equal([]byte(pNode), o.node) || o.randomSequence { - o.sequence = uint16(seed.Int()) & 0x3FFF - } else if pNow < o.past { - o.sequence++ - } - o.past = pNow - o.node = pNode -} - -func (o *State) persist() { - if o.saver != nil { - o.saver.Save(o) - } -} - -// Initialises the UUID state when the package is first loaded -// it first attempts to decode the file state into State -// if this file does not exist it will create the file and do a flush -// of the random state which gets loaded at package runtime -// second it will attempt to resolve the current hardware address nodeId -// thirdly it will check the state of the clock -func (o *State) init() { - if o.saver != nil { - intfcs, err := net.Interfaces() - if err != nil { - log.Println("uuid.State.init: address error: will generate random node id instead", err) - return - } - a := getHardwareAddress(intfcs) - if a == nil { - log.Println("uuid.State.init: address error: will generate random node id instead", err) - return - } - // Don't use random as we have a real address - o.randomSequence = false - if bytes.Equal([]byte(a), state.node) { - state.sequence++ - } - state.node = a - state.randomNode = false - } -} - -func getHardwareAddress(pInterfaces []net.Interface) net.HardwareAddr { - for _, inter := range pInterfaces { - // Initially I could multicast out the Flags to get - // whether the interface was up but started failing - if (inter.Flags & (1 << net.FlagUp)) != 0 { - //if inter.Flags.String() != "0" { - if addrs, err := inter.Addrs(); err == nil { - for _, addr := range addrs { - if addr.String() != "0.0.0.0" && !bytes.Equal([]byte(inter.HardwareAddr), make([]byte, len(inter.HardwareAddr))) { - return inter.HardwareAddr - } - } - } - } - } - return nil -} - -// *********************************************** StateSaver interface - -// Use this interface to setup a custom state saver if you wish to have -// v1 UUIDs based on your node id and constant time. -type StateSaver interface { - // Init is run if Setup() is false - // Init should setup the system to save the state - Init(*State) - - // Save saves the state and is called only if const V1Save and - // Setup() is true - Save(*State) -} - diff --git a/vendor/github.com/twinj/uuid/struct.go b/vendor/github.com/twinj/uuid/struct.go deleted file mode 100644 index 4f2fba8bdfc4..000000000000 --- a/vendor/github.com/twinj/uuid/struct.go +++ /dev/null @@ -1,103 +0,0 @@ -package uuid - -/**************** - * Date: 31/01/14 - * Time: 3:34 PM - ***************/ - -import "net" - -// Struct is used for RFC4122 Version 1 UUIDs -type Struct struct { - timeLow uint32 - timeMid uint16 - timeHiAndVersion uint16 - sequenceHiAndVariant byte - sequenceLow byte - node []byte - size int -} - -func (o Struct) Size() int { - return o.size -} - -func (o Struct) Version() int { - return int(o.timeHiAndVersion >> 12) -} - -func (o Struct) Variant() byte { - return variant(o.sequenceHiAndVariant) -} - -// Sets the four most significant bits (bits 12 through 15) of the -// timeHiAndVersion field to the 4-bit version number. -func (o *Struct) setVersion(pVersion int) { - o.timeHiAndVersion &= 0x0FFF - o.timeHiAndVersion |= (uint16(pVersion) << 12) -} - -func (o *Struct) setVariant(pVariant byte) { - setVariant(&o.sequenceHiAndVariant, pVariant) -} - -func (o *Struct) Unmarshal(pData []byte) { - o.timeLow = uint32(pData[3]) | uint32(pData[2])<<8 | uint32(pData[1])<<16 | uint32(pData[0])<<24 - o.timeMid = uint16(pData[5]) | uint16(pData[4])<<8 - o.timeHiAndVersion = uint16(pData[7]) | uint16(pData[6])<<8 - o.sequenceHiAndVariant = pData[8] - o.sequenceLow = pData[9] - o.node = pData[10:o.Size()] -} - -func (o *Struct) Bytes() (data []byte) { - data = []byte{ - byte(o.timeLow >> 24), byte(o.timeLow >> 16), byte(o.timeLow >> 8), byte(o.timeLow), - byte(o.timeMid >> 8), byte(o.timeMid), - byte(o.timeHiAndVersion >> 8), byte(o.timeHiAndVersion), - } - data = append(data, o.sequenceHiAndVariant) - data = append(data, o.sequenceLow) - data = append(data, o.node...) - return -} - -// Marshals the UUID bytes into a slice -func (o *Struct) MarshalBinary() ([]byte, error) { - return o.Bytes(), nil -} - -// Un-marshals the data bytes into the UUID struct. -// Implements the BinaryUn-marshaller interface -func (o *Struct) UnmarshalBinary(pData []byte) error { - return UnmarshalBinary(o, pData) -} - -func (o Struct) String() string { - return formatter(&o, format) -} - -func (o Struct) Format(pFormat string) string { - return formatter(&o, pFormat) -} - -// Set the three most significant bits (bits 0, 1 and 2) of the -// sequenceHiAndVariant to variant mask 0x80. -func (o *Struct) setRFC4122Variant() { - o.sequenceHiAndVariant &= variantSet - o.sequenceHiAndVariant |= ReservedRFC4122 -} - -// Unmarshals data into struct for V1 UUIDs -func newV1(pNow Timestamp, pVersion uint16, pVariant byte, pNode net.HardwareAddr) UUID { - o := new(Struct) - o.timeLow = uint32(pNow & 0xFFFFFFFF) - o.timeMid = uint16((pNow >> 32) & 0xFFFF) - o.timeHiAndVersion = uint16((pNow >> 48) & 0x0FFF) - o.timeHiAndVersion |= uint16(pVersion << 12) - o.sequenceLow = byte(state.sequence & 0xFF) - o.sequenceHiAndVariant = byte((state.sequence & 0x3F00) >> 8) - o.sequenceHiAndVariant |= pVariant - o.node = pNode - return o -} diff --git a/vendor/github.com/twinj/uuid/timestamp.go b/vendor/github.com/twinj/uuid/timestamp.go deleted file mode 100644 index 616428745512..000000000000 --- a/vendor/github.com/twinj/uuid/timestamp.go +++ /dev/null @@ -1,81 +0,0 @@ -package uuid - -/**************** - * Date: 14/02/14 - * Time: 7:46 PM - ***************/ - -import ( - "time" -) - -const ( - // A tick is 100 ns - ticksPerSecond = 10000000 - - // Difference between - gregorianToUNIXOffset uint64 = 0x01B21DD213814000 - - // set the following to the number of 100ns ticks of the actual - // resolution of your system's clock - idsPerTimestamp = 1024 -) - -var ( - lastTimestamp Timestamp - idsThisTimestamp = idsPerTimestamp -) - -// ********************************************** Timestamp - -type Timestamp uint64 - -// TODO Create c version same as package runtime and time -func Now() (sec int64, nsec int32) { - t := time.Now() - sec = t.Unix() - nsec = int32(t.Nanosecond()) - return -} - -// Converts Unix formatted time to RFC4122 UUID formatted times -// UUID UTC base time is October 15, 1582. -// Unix base time is January 1, 1970. -// Converts time to 100 nanosecond ticks since epoch -// There are 1000000000 nanoseconds in a second, -// 1000000000 / 100 = 10000000 tiks per second -func timestamp() Timestamp { - sec, nsec := Now() - return Timestamp(uint64(sec)*ticksPerSecond + - uint64(nsec)/100 + gregorianToUNIXOffset) -} - -func (o Timestamp) Unix() time.Time { - t := uint64(o) - gregorianToUNIXOffset - return time.Unix(0, int64(t*100)) -} - -// Get time as 60-bit 100ns ticks since UUID epoch. -// Compensate for the fact that real clock resolution is -// less than 100ns. -func currentUUIDTimestamp() Timestamp { - var timeNow Timestamp - for { - timeNow = timestamp() - - // if clock reading changed since last UUID generated - if lastTimestamp != timeNow { - // reset count of UUIDs with this timestamp - idsThisTimestamp = 0 - lastTimestamp = timeNow - break - } - if idsThisTimestamp < idsPerTimestamp { - idsThisTimestamp++ - break - } - // going too fast for the clock; spin - } - // add the count of UUIDs to low order bits of the clock reading - return timeNow + Timestamp(idsThisTimestamp) -} diff --git a/vendor/github.com/twinj/uuid/uuids.go b/vendor/github.com/twinj/uuid/uuids.go deleted file mode 100644 index 846ff05e97d6..000000000000 --- a/vendor/github.com/twinj/uuid/uuids.go +++ /dev/null @@ -1,296 +0,0 @@ -// This package provides RFC4122 UUIDs. -// -// NewV1, NewV3, NewV4, NewV5, for generating versions 1, 3, 4 -// and 5 UUIDs as specified in RFC-4122. -// -// New([]byte), unsafe; NewHex(string); and Parse(string) for -// creating UUIDs from existing data. -// -// The original version was from Krzysztof Kowalik -// Unfortunately, that version was non compliant with RFC4122. -// I forked it but have since heavily redesigned it. -// -// The example code in the specification was also used as reference -// for design. -// -// Copyright (C) 2014 twinj@github.com 2014 MIT style licence -package uuid - -/**************** - * Date: 31/01/14 - * Time: 3:35 PM - ***************/ - -import ( - "encoding" - "encoding/hex" - "errors" - "fmt" - "hash" - "regexp" - "strings" - "bytes" -) - -const ( - ReservedNCS byte = 0x00 - ReservedRFC4122 byte = 0x80 // or and A0 if masked with 1F - ReservedMicrosoft byte = 0xC0 - ReservedFuture byte = 0xE0 - TakeBack byte = 0xF0 -) - -const ( - - // Pattern used to parse string representation of the UUID. - // Current one allows to parse string where only one opening - // or closing bracket or any of the hyphens are optional. - // It is only used to extract the main bytes to create a UUID, - // so these imperfections are of no consequence. - hexPattern = `^(urn\:uuid\:)?[\{(\[]?([A-Fa-f0-9]{8})-?([A-Fa-f0-9]{4})-?([1-5][A-Fa-f0-9]{3})-?([A-Fa-f0-9]{4})-?([A-Fa-f0-9]{12})[\]\})]?$` -) - -var ( - parseUUIDRegex = regexp.MustCompile(hexPattern) - format string -) - -func init() { - SwitchFormat(CleanHyphen) -} - -// ****************************************************** UUID - -// The main interface for UUIDs -// Each implementation must also implement the UniqueName interface -type UUID interface { - encoding.BinaryMarshaler - encoding.BinaryUnmarshaler - - // Marshals the UUID bytes or data - Bytes() (data []byte) - - // Organises data into a new UUID - Unmarshal(pData []byte) - - // Size is used where different implementations require - // different sizes. Should return the number of bytes in - // the implementation. - // Enables unmarshal and Bytes to screen for size - Size() int - - // Version returns a version number of the algorithm used - // to generate the UUID. - // This may may behave independently across non RFC4122 UUIDs - Version() int - - // Variant returns the UUID Variant - // This will be one of the constants: - // ReservedRFC4122, - // ReservedMicrosoft, - // ReservedFuture, - // ReservedNCS. - // This may behave differently across non RFC4122 UUIDs - Variant() byte - - // UUID can be used as a Name within a namespace - // Is simply just a String() string method - // Returns a formatted version of the UUID. - String() string -} - -// New creates a UUID from a slice of bytes. -// Truncates any bytes past the default length of 16 -// Will panic if data slice is too small. -func New(pData []byte) UUID { - o := new(Array) - o.Unmarshal(pData[:length]) - return o -} - - -// Creates a UUID from a hex string -// Will panic if hex string is invalid - will panic even with hyphens and brackets -// Expects a clean string use Parse otherwise. -func NewHex(pUuid string) UUID { - bytes, err := hex.DecodeString(pUuid) - if err != nil { - panic(err) - } - return New(bytes) -} - -// Parse creates a UUID from a valid string representation. -// Accepts UUID string in following formats: -// 6ba7b8149dad11d180b400c04fd430c8 -// 6ba7b814-9dad-11d1-80b4-00c04fd430c8 -// {6ba7b814-9dad-11d1-80b4-00c04fd430c8} -// urn:uuid:6ba7b814-9dad-11d1-80b4-00c04fd430c8 -// [6ba7b814-9dad-11d1-80b4-00c04fd430c8] -// -func Parse(pUUID string) (UUID, error) { - md := parseUUIDRegex.FindStringSubmatch(pUUID) - if md == nil { - return nil, errors.New("uuid.Parse: invalid string") - } - return NewHex(md[2] + md[3] + md[4] + md[5] + md[6]), nil -} - -// Digest a namespace UUID and a UniqueName, which then marshals to -// a new UUID -func Digest(o, pNs UUID, pName UniqueName, pHash hash.Hash) { - // Hash writer never returns an error - pHash.Write(pNs.Bytes()) - pHash.Write([]byte(pName.String())) - o.Unmarshal(pHash.Sum(nil)[:o.Size()]) -} - -// Function provides a safe way to unmarshal bytes into an -// existing UUID. -// Checks for length. -func UnmarshalBinary(o UUID, pData []byte) error { - if len(pData) != o.Size() { - return errors.New("uuid.UnmarshalBinary: invalid length") - } - o.Unmarshal(pData) - return nil -} - -// ********************************************** UUID Names - -// A UUID Name is a simple string which implements UniqueName -// which satisfies the Stringer interface. -type Name string - -// Returns the name as a string. Satisfies the Stringer interface. -func (o Name) String() string { - return string(o) -} - -// NewName will create a unique name from several sources -func NewName(salt string, pNames ...UniqueName) UniqueName { - var s string - for _, s2 := range pNames { - s += s2.String() - } - return Name(s + salt) -} - -// UniqueName is a Stinger interface -// Made for easy passing of IPs, URLs, the several Address types, -// Buffers and any other type which implements Stringer -// string, []byte types and Hash sums will need to be cast to -// the Name type or some other type which implements -// Stringer or UniqueName -type UniqueName interface { - - // Many go types implement this method for use with printing - // Will convert the current type to its native string format - String() string -} - -// ********************************************** UUID Printing - -// A Format is a pattern used by the stringer interface with which to print -// the UUID. -type Format string - -const ( - Clean Format = "%x%x%x%x%x%x" - Curly Format = "{%x%x%x%x%x%x}" - Bracket Format = "(%x%x%x%x%x%x)" - - // This is the default format. - CleanHyphen Format = "%x-%x-%x-%x%x-%x" - - CurlyHyphen Format = "{%x-%x-%x-%x%x-%x}" - BracketHyphen Format = "(%x-%x-%x-%x%x-%x)" - GoIdFormat Format = "[%X-%X-%x-%X%X-%x]" -) - -// Gets the current default format pattern -func GetFormat() string { - return format -} - -// Switches the default printing format for ALL UUID strings -// A valid format will have 6 groups if the supplied Format does not -func SwitchFormat(pFormat Format) { - form := string(pFormat) - if strings.Count(form, "%") != 6 { - panic(errors.New("uuid.switchFormat: invalid formatting")) - } - format = form -} - -// Same as SwitchFormat but will make it uppercase -func SwitchFormatUpperCase(pFormat Format) { - form := strings.ToUpper(string(pFormat)) - SwitchFormat(Format(form)) -} - -// Compares whether each UUID is the same -func Equal(p1 UUID, p2 UUID) bool { - return bytes.Equal(p1.Bytes(), p2.Bytes()) -} - -// Format a UUID into a human readable string which matches the given Format -// Use this for one time formatting when setting the default using SwitchFormat -// is overkill. -func Formatter(pUUID UUID, pFormat Format) string { - form := string(pFormat) - if strings.Count(form, "%") != 6 { - panic(errors.New("uuid.Formatter: invalid formatting")) - } - return formatter(pUUID, form) -} - -// ********************************************** UUID Versions - -type UUIDVersion int - -const ( - NONE UUIDVersion = iota - RFC4122v1 - DunnoYetv2 - RFC4122v3 - RFC4122v4 - RFC4122v5 -) - -// *************************************************** Helpers - -// Retrieves the variant from the given byte -func variant(pVariant byte) byte { - switch pVariant & variantGet { - case ReservedRFC4122, 0xA0: - return ReservedRFC4122 - case ReservedMicrosoft: - return ReservedMicrosoft - case ReservedFuture: - return ReservedFuture - } - return ReservedNCS -} - -// not strictly required -func setVariant(pByte *byte, pVariant byte) { - switch pVariant { - case ReservedRFC4122: - *pByte &= variantSet - case ReservedFuture, ReservedMicrosoft: - *pByte &= 0x1F - case ReservedNCS: - *pByte &= 0x7F - default: - panic(errors.New("uuid.setVariant: invalid variant mask")) - } - *pByte |= pVariant -} - -// format a UUID into a human readable string -func formatter(pUUID UUID, pFormat string) string { - b := pUUID.Bytes() - return fmt.Sprintf(pFormat, b[0:4], b[4:6], b[6:8], b[8:9], b[9:10], b[10:pUUID.Size()]) -} - diff --git a/vendor/github.com/ugorji/go/LICENSE b/vendor/github.com/ugorji/go/LICENSE deleted file mode 100644 index 95a0f0541cda..000000000000 --- a/vendor/github.com/ugorji/go/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2012-2015 Ugorji Nwoke. -All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/ugorji/go/codec/0doc.go b/vendor/github.com/ugorji/go/codec/0doc.go deleted file mode 100644 index bd7361c8796e..000000000000 --- a/vendor/github.com/ugorji/go/codec/0doc.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -/* -High Performance, Feature-Rich Idiomatic Go codec/encoding library for -binc, msgpack, cbor, json. - -Supported Serialization formats are: - - - msgpack: https://github.com/msgpack/msgpack - - binc: http://github.com/ugorji/binc - - cbor: http://cbor.io http://tools.ietf.org/html/rfc7049 - - json: http://json.org http://tools.ietf.org/html/rfc7159 - - simple: - -To install: - - go get github.com/ugorji/go/codec - -This package understands the 'unsafe' tag, to allow using unsafe semantics: - - - When decoding into a struct, you need to read the field name as a string - so you can find the struct field it is mapped to. - Using `unsafe` will bypass the allocation and copying overhead of []byte->string conversion. - -To install using unsafe, pass the 'unsafe' tag: - - go get -tags=unsafe github.com/ugorji/go/codec - -For detailed usage information, read the primer at http://ugorji.net/blog/go-codec-primer . - -The idiomatic Go support is as seen in other encoding packages in -the standard library (ie json, xml, gob, etc). - -Rich Feature Set includes: - - - Simple but extremely powerful and feature-rich API - - Very High Performance. - Our extensive benchmarks show us outperforming Gob, Json, Bson, etc by 2-4X. - - Multiple conversions: - Package coerces types where appropriate - e.g. decode an int in the stream into a float, etc. - - Corner Cases: - Overflows, nil maps/slices, nil values in streams are handled correctly - - Standard field renaming via tags - - Support for omitting empty fields during an encoding - - Encoding from any value and decoding into pointer to any value - (struct, slice, map, primitives, pointers, interface{}, etc) - - Extensions to support efficient encoding/decoding of any named types - - Support encoding.(Binary|Text)(M|Unm)arshaler interfaces - - Decoding without a schema (into a interface{}). - Includes Options to configure what specific map or slice type to use - when decoding an encoded list or map into a nil interface{} - - Encode a struct as an array, and decode struct from an array in the data stream - - Comprehensive support for anonymous fields - - Fast (no-reflection) encoding/decoding of common maps and slices - - Code-generation for faster performance. - - Support binary (e.g. messagepack, cbor) and text (e.g. json) formats - - Support indefinite-length formats to enable true streaming - (for formats which support it e.g. json, cbor) - - Support canonical encoding, where a value is ALWAYS encoded as same sequence of bytes. - This mostly applies to maps, where iteration order is non-deterministic. - - NIL in data stream decoded as zero value - - Never silently skip data when decoding. - User decides whether to return an error or silently skip data when keys or indexes - in the data stream do not map to fields in the struct. - - Detect and error when encoding a cyclic reference (instead of stack overflow shutdown) - - Encode/Decode from/to chan types (for iterative streaming support) - - Drop-in replacement for encoding/json. `json:` key in struct tag supported. - - Provides a RPC Server and Client Codec for net/rpc communication protocol. - - Handle unique idiosynchracies of codecs e.g. - - For messagepack, configure how ambiguities in handling raw bytes are resolved - - For messagepack, provide rpc server/client codec to support - msgpack-rpc protocol defined at: - https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md - -Extension Support - -Users can register a function to handle the encoding or decoding of -their custom types. - -There are no restrictions on what the custom type can be. Some examples: - - type BisSet []int - type BitSet64 uint64 - type UUID string - type MyStructWithUnexportedFields struct { a int; b bool; c []int; } - type GifImage struct { ... } - -As an illustration, MyStructWithUnexportedFields would normally be -encoded as an empty map because it has no exported fields, while UUID -would be encoded as a string. However, with extension support, you can -encode any of these however you like. - -RPC - -RPC Client and Server Codecs are implemented, so the codecs can be used -with the standard net/rpc package. - -Usage - -The Handle is SAFE for concurrent READ, but NOT SAFE for concurrent modification. - -The Encoder and Decoder are NOT safe for concurrent use. - -Consequently, the usage model is basically: - - - Create and initialize the Handle before any use. - Once created, DO NOT modify it. - - Multiple Encoders or Decoders can now use the Handle concurrently. - They only read information off the Handle (never write). - - However, each Encoder or Decoder MUST not be used concurrently - - To re-use an Encoder/Decoder, call Reset(...) on it first. - This allows you use state maintained on the Encoder/Decoder. - -Sample usage model: - - // create and configure Handle - var ( - bh codec.BincHandle - mh codec.MsgpackHandle - ch codec.CborHandle - ) - - mh.MapType = reflect.TypeOf(map[string]interface{}(nil)) - - // configure extensions - // e.g. for msgpack, define functions and enable Time support for tag 1 - // mh.SetExt(reflect.TypeOf(time.Time{}), 1, myExt) - - // create and use decoder/encoder - var ( - r io.Reader - w io.Writer - b []byte - h = &bh // or mh to use msgpack - ) - - dec = codec.NewDecoder(r, h) - dec = codec.NewDecoderBytes(b, h) - err = dec.Decode(&v) - - enc = codec.NewEncoder(w, h) - enc = codec.NewEncoderBytes(&b, h) - err = enc.Encode(v) - - //RPC Server - go func() { - for { - conn, err := listener.Accept() - rpcCodec := codec.GoRpc.ServerCodec(conn, h) - //OR rpcCodec := codec.MsgpackSpecRpc.ServerCodec(conn, h) - rpc.ServeCodec(rpcCodec) - } - }() - - //RPC Communication (client side) - conn, err = net.Dial("tcp", "localhost:5555") - rpcCodec := codec.GoRpc.ClientCodec(conn, h) - //OR rpcCodec := codec.MsgpackSpecRpc.ClientCodec(conn, h) - client := rpc.NewClientWithCodec(rpcCodec) - -*/ -package codec - -// Benefits of go-codec: -// -// - encoding/json always reads whole file into memory first. -// This makes it unsuitable for parsing very large files. -// - encoding/xml cannot parse into a map[string]interface{} -// I found this out on reading https://github.com/clbanning/mxj - -// TODO: -// -// - optimization for codecgen: -// if len of entity is <= 3 words, then support a value receiver for encode. -// - (En|De)coder should store an error when it occurs. -// Until reset, subsequent calls return that error that was stored. -// This means that free panics must go away. -// All errors must be raised through errorf method. -// - Decoding using a chan is good, but incurs concurrency costs. -// This is because there's no fast way to use a channel without it -// having to switch goroutines constantly. -// Callback pattern is still the best. Maybe cnsider supporting something like: -// type X struct { -// Name string -// Ys []Y -// Ys chan <- Y -// Ys func(Y) -> call this function for each entry -// } -// - Consider adding a isZeroer interface { isZero() bool } -// It is used within isEmpty, for omitEmpty support. -// - Consider making Handle used AS-IS within the encoding/decoding session. -// This means that we don't cache Handle information within the (En|De)coder, -// except we really need it at Reset(...) -// - Consider adding math/big support -// - Consider reducing the size of the generated functions: -// Maybe use one loop, and put the conditionals in the loop. -// for ... { if cLen > 0 { if j == cLen { break } } else if dd.CheckBreak() { break } } diff --git a/vendor/github.com/ugorji/go/codec/binc.go b/vendor/github.com/ugorji/go/codec/binc.go deleted file mode 100644 index 766d26cf6d73..000000000000 --- a/vendor/github.com/ugorji/go/codec/binc.go +++ /dev/null @@ -1,922 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "math" - "reflect" - "time" -) - -const bincDoPrune = true // No longer needed. Needed before as C lib did not support pruning. - -// vd as low 4 bits (there are 16 slots) -const ( - bincVdSpecial byte = iota - bincVdPosInt - bincVdNegInt - bincVdFloat - - bincVdString - bincVdByteArray - bincVdArray - bincVdMap - - bincVdTimestamp - bincVdSmallInt - bincVdUnicodeOther - bincVdSymbol - - bincVdDecimal - _ // open slot - _ // open slot - bincVdCustomExt = 0x0f -) - -const ( - bincSpNil byte = iota - bincSpFalse - bincSpTrue - bincSpNan - bincSpPosInf - bincSpNegInf - bincSpZeroFloat - bincSpZero - bincSpNegOne -) - -const ( - bincFlBin16 byte = iota - bincFlBin32 - _ // bincFlBin32e - bincFlBin64 - _ // bincFlBin64e - // others not currently supported -) - -type bincEncDriver struct { - e *Encoder - w encWriter - m map[string]uint16 // symbols - b [scratchByteArrayLen]byte - s uint16 // symbols sequencer - encNoSeparator -} - -func (e *bincEncDriver) IsBuiltinType(rt uintptr) bool { - return rt == timeTypId -} - -func (e *bincEncDriver) EncodeBuiltin(rt uintptr, v interface{}) { - if rt == timeTypId { - var bs []byte - switch x := v.(type) { - case time.Time: - bs = encodeTime(x) - case *time.Time: - bs = encodeTime(*x) - default: - e.e.errorf("binc error encoding builtin: expect time.Time, received %T", v) - } - e.w.writen1(bincVdTimestamp<<4 | uint8(len(bs))) - e.w.writeb(bs) - } -} - -func (e *bincEncDriver) EncodeNil() { - e.w.writen1(bincVdSpecial<<4 | bincSpNil) -} - -func (e *bincEncDriver) EncodeBool(b bool) { - if b { - e.w.writen1(bincVdSpecial<<4 | bincSpTrue) - } else { - e.w.writen1(bincVdSpecial<<4 | bincSpFalse) - } -} - -func (e *bincEncDriver) EncodeFloat32(f float32) { - if f == 0 { - e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat) - return - } - e.w.writen1(bincVdFloat<<4 | bincFlBin32) - bigenHelper{e.b[:4], e.w}.writeUint32(math.Float32bits(f)) -} - -func (e *bincEncDriver) EncodeFloat64(f float64) { - if f == 0 { - e.w.writen1(bincVdSpecial<<4 | bincSpZeroFloat) - return - } - bigen.PutUint64(e.b[:8], math.Float64bits(f)) - if bincDoPrune { - i := 7 - for ; i >= 0 && (e.b[i] == 0); i-- { - } - i++ - if i <= 6 { - e.w.writen1(bincVdFloat<<4 | 0x8 | bincFlBin64) - e.w.writen1(byte(i)) - e.w.writeb(e.b[:i]) - return - } - } - e.w.writen1(bincVdFloat<<4 | bincFlBin64) - e.w.writeb(e.b[:8]) -} - -func (e *bincEncDriver) encIntegerPrune(bd byte, pos bool, v uint64, lim uint8) { - if lim == 4 { - bigen.PutUint32(e.b[:lim], uint32(v)) - } else { - bigen.PutUint64(e.b[:lim], v) - } - if bincDoPrune { - i := pruneSignExt(e.b[:lim], pos) - e.w.writen1(bd | lim - 1 - byte(i)) - e.w.writeb(e.b[i:lim]) - } else { - e.w.writen1(bd | lim - 1) - e.w.writeb(e.b[:lim]) - } -} - -func (e *bincEncDriver) EncodeInt(v int64) { - const nbd byte = bincVdNegInt << 4 - if v >= 0 { - e.encUint(bincVdPosInt<<4, true, uint64(v)) - } else if v == -1 { - e.w.writen1(bincVdSpecial<<4 | bincSpNegOne) - } else { - e.encUint(bincVdNegInt<<4, false, uint64(-v)) - } -} - -func (e *bincEncDriver) EncodeUint(v uint64) { - e.encUint(bincVdPosInt<<4, true, v) -} - -func (e *bincEncDriver) encUint(bd byte, pos bool, v uint64) { - if v == 0 { - e.w.writen1(bincVdSpecial<<4 | bincSpZero) - } else if pos && v >= 1 && v <= 16 { - e.w.writen1(bincVdSmallInt<<4 | byte(v-1)) - } else if v <= math.MaxUint8 { - e.w.writen2(bd|0x0, byte(v)) - } else if v <= math.MaxUint16 { - e.w.writen1(bd | 0x01) - bigenHelper{e.b[:2], e.w}.writeUint16(uint16(v)) - } else if v <= math.MaxUint32 { - e.encIntegerPrune(bd, pos, v, 4) - } else { - e.encIntegerPrune(bd, pos, v, 8) - } -} - -func (e *bincEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, _ *Encoder) { - bs := ext.WriteExt(rv) - if bs == nil { - e.EncodeNil() - return - } - e.encodeExtPreamble(uint8(xtag), len(bs)) - e.w.writeb(bs) -} - -func (e *bincEncDriver) EncodeRawExt(re *RawExt, _ *Encoder) { - e.encodeExtPreamble(uint8(re.Tag), len(re.Data)) - e.w.writeb(re.Data) -} - -func (e *bincEncDriver) encodeExtPreamble(xtag byte, length int) { - e.encLen(bincVdCustomExt<<4, uint64(length)) - e.w.writen1(xtag) -} - -func (e *bincEncDriver) EncodeArrayStart(length int) { - e.encLen(bincVdArray<<4, uint64(length)) -} - -func (e *bincEncDriver) EncodeMapStart(length int) { - e.encLen(bincVdMap<<4, uint64(length)) -} - -func (e *bincEncDriver) EncodeString(c charEncoding, v string) { - l := uint64(len(v)) - e.encBytesLen(c, l) - if l > 0 { - e.w.writestr(v) - } -} - -func (e *bincEncDriver) EncodeSymbol(v string) { - // if WriteSymbolsNoRefs { - // e.encodeString(c_UTF8, v) - // return - // } - - //symbols only offer benefit when string length > 1. - //This is because strings with length 1 take only 2 bytes to store - //(bd with embedded length, and single byte for string val). - - l := len(v) - if l == 0 { - e.encBytesLen(c_UTF8, 0) - return - } else if l == 1 { - e.encBytesLen(c_UTF8, 1) - e.w.writen1(v[0]) - return - } - if e.m == nil { - e.m = make(map[string]uint16, 16) - } - ui, ok := e.m[v] - if ok { - if ui <= math.MaxUint8 { - e.w.writen2(bincVdSymbol<<4, byte(ui)) - } else { - e.w.writen1(bincVdSymbol<<4 | 0x8) - bigenHelper{e.b[:2], e.w}.writeUint16(ui) - } - } else { - e.s++ - ui = e.s - //ui = uint16(atomic.AddUint32(&e.s, 1)) - e.m[v] = ui - var lenprec uint8 - if l <= math.MaxUint8 { - // lenprec = 0 - } else if l <= math.MaxUint16 { - lenprec = 1 - } else if int64(l) <= math.MaxUint32 { - lenprec = 2 - } else { - lenprec = 3 - } - if ui <= math.MaxUint8 { - e.w.writen2(bincVdSymbol<<4|0x0|0x4|lenprec, byte(ui)) - } else { - e.w.writen1(bincVdSymbol<<4 | 0x8 | 0x4 | lenprec) - bigenHelper{e.b[:2], e.w}.writeUint16(ui) - } - if lenprec == 0 { - e.w.writen1(byte(l)) - } else if lenprec == 1 { - bigenHelper{e.b[:2], e.w}.writeUint16(uint16(l)) - } else if lenprec == 2 { - bigenHelper{e.b[:4], e.w}.writeUint32(uint32(l)) - } else { - bigenHelper{e.b[:8], e.w}.writeUint64(uint64(l)) - } - e.w.writestr(v) - } -} - -func (e *bincEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - l := uint64(len(v)) - e.encBytesLen(c, l) - if l > 0 { - e.w.writeb(v) - } -} - -func (e *bincEncDriver) encBytesLen(c charEncoding, length uint64) { - //TODO: support bincUnicodeOther (for now, just use string or bytearray) - if c == c_RAW { - e.encLen(bincVdByteArray<<4, length) - } else { - e.encLen(bincVdString<<4, length) - } -} - -func (e *bincEncDriver) encLen(bd byte, l uint64) { - if l < 12 { - e.w.writen1(bd | uint8(l+4)) - } else { - e.encLenNumber(bd, l) - } -} - -func (e *bincEncDriver) encLenNumber(bd byte, v uint64) { - if v <= math.MaxUint8 { - e.w.writen2(bd, byte(v)) - } else if v <= math.MaxUint16 { - e.w.writen1(bd | 0x01) - bigenHelper{e.b[:2], e.w}.writeUint16(uint16(v)) - } else if v <= math.MaxUint32 { - e.w.writen1(bd | 0x02) - bigenHelper{e.b[:4], e.w}.writeUint32(uint32(v)) - } else { - e.w.writen1(bd | 0x03) - bigenHelper{e.b[:8], e.w}.writeUint64(uint64(v)) - } -} - -//------------------------------------ - -type bincDecSymbol struct { - s string - b []byte - i uint16 -} - -type bincDecDriver struct { - d *Decoder - h *BincHandle - r decReader - br bool // bytes reader - bdRead bool - bd byte - vd byte - vs byte - noStreamingCodec - decNoSeparator - b [scratchByteArrayLen]byte - - // linear searching on this slice is ok, - // because we typically expect < 32 symbols in each stream. - s []bincDecSymbol -} - -func (d *bincDecDriver) readNextBd() { - d.bd = d.r.readn1() - d.vd = d.bd >> 4 - d.vs = d.bd & 0x0f - d.bdRead = true -} - -func (d *bincDecDriver) ContainerType() (vt valueType) { - if d.vd == bincVdSpecial && d.vs == bincSpNil { - return valueTypeNil - } else if d.vd == bincVdByteArray { - return valueTypeBytes - } else if d.vd == bincVdString { - return valueTypeString - } else if d.vd == bincVdArray { - return valueTypeArray - } else if d.vd == bincVdMap { - return valueTypeMap - } else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - } - return valueTypeUnset -} - -func (d *bincDecDriver) TryDecodeAsNil() bool { - if !d.bdRead { - d.readNextBd() - } - if d.bd == bincVdSpecial<<4|bincSpNil { - d.bdRead = false - return true - } - return false -} - -func (d *bincDecDriver) IsBuiltinType(rt uintptr) bool { - return rt == timeTypId -} - -func (d *bincDecDriver) DecodeBuiltin(rt uintptr, v interface{}) { - if !d.bdRead { - d.readNextBd() - } - if rt == timeTypId { - if d.vd != bincVdTimestamp { - d.d.errorf("Invalid d.vd. Expecting 0x%x. Received: 0x%x", bincVdTimestamp, d.vd) - return - } - tt, err := decodeTime(d.r.readx(int(d.vs))) - if err != nil { - panic(err) - } - var vt *time.Time = v.(*time.Time) - *vt = tt - d.bdRead = false - } -} - -func (d *bincDecDriver) decFloatPre(vs, defaultLen byte) { - if vs&0x8 == 0 { - d.r.readb(d.b[0:defaultLen]) - } else { - l := d.r.readn1() - if l > 8 { - d.d.errorf("At most 8 bytes used to represent float. Received: %v bytes", l) - return - } - for i := l; i < 8; i++ { - d.b[i] = 0 - } - d.r.readb(d.b[0:l]) - } -} - -func (d *bincDecDriver) decFloat() (f float64) { - //if true { f = math.Float64frombits(bigen.Uint64(d.r.readx(8))); break; } - if x := d.vs & 0x7; x == bincFlBin32 { - d.decFloatPre(d.vs, 4) - f = float64(math.Float32frombits(bigen.Uint32(d.b[0:4]))) - } else if x == bincFlBin64 { - d.decFloatPre(d.vs, 8) - f = math.Float64frombits(bigen.Uint64(d.b[0:8])) - } else { - d.d.errorf("only float32 and float64 are supported. d.vd: 0x%x, d.vs: 0x%x", d.vd, d.vs) - return - } - return -} - -func (d *bincDecDriver) decUint() (v uint64) { - // need to inline the code (interface conversion and type assertion expensive) - switch d.vs { - case 0: - v = uint64(d.r.readn1()) - case 1: - d.r.readb(d.b[6:8]) - v = uint64(bigen.Uint16(d.b[6:8])) - case 2: - d.b[4] = 0 - d.r.readb(d.b[5:8]) - v = uint64(bigen.Uint32(d.b[4:8])) - case 3: - d.r.readb(d.b[4:8]) - v = uint64(bigen.Uint32(d.b[4:8])) - case 4, 5, 6: - lim := int(7 - d.vs) - d.r.readb(d.b[lim:8]) - for i := 0; i < lim; i++ { - d.b[i] = 0 - } - v = uint64(bigen.Uint64(d.b[:8])) - case 7: - d.r.readb(d.b[:8]) - v = uint64(bigen.Uint64(d.b[:8])) - default: - d.d.errorf("unsigned integers with greater than 64 bits of precision not supported") - return - } - return -} - -func (d *bincDecDriver) decCheckInteger() (ui uint64, neg bool) { - if !d.bdRead { - d.readNextBd() - } - vd, vs := d.vd, d.vs - if vd == bincVdPosInt { - ui = d.decUint() - } else if vd == bincVdNegInt { - ui = d.decUint() - neg = true - } else if vd == bincVdSmallInt { - ui = uint64(d.vs) + 1 - } else if vd == bincVdSpecial { - if vs == bincSpZero { - //i = 0 - } else if vs == bincSpNegOne { - neg = true - ui = 1 - } else { - d.d.errorf("numeric decode fails for special value: d.vs: 0x%x", d.vs) - return - } - } else { - d.d.errorf("number can only be decoded from uint or int values. d.bd: 0x%x, d.vd: 0x%x", d.bd, d.vd) - return - } - return -} - -func (d *bincDecDriver) DecodeInt(bitsize uint8) (i int64) { - ui, neg := d.decCheckInteger() - i, overflow := chkOvf.SignedInt(ui) - if overflow { - d.d.errorf("simple: overflow converting %v to signed integer", ui) - return - } - if neg { - i = -i - } - if chkOvf.Int(i, bitsize) { - d.d.errorf("binc: overflow integer: %v", i) - return - } - d.bdRead = false - return -} - -func (d *bincDecDriver) DecodeUint(bitsize uint8) (ui uint64) { - ui, neg := d.decCheckInteger() - if neg { - d.d.errorf("Assigning negative signed value to unsigned type") - return - } - if chkOvf.Uint(ui, bitsize) { - d.d.errorf("binc: overflow integer: %v", ui) - return - } - d.bdRead = false - return -} - -func (d *bincDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - if !d.bdRead { - d.readNextBd() - } - vd, vs := d.vd, d.vs - if vd == bincVdSpecial { - d.bdRead = false - if vs == bincSpNan { - return math.NaN() - } else if vs == bincSpPosInf { - return math.Inf(1) - } else if vs == bincSpZeroFloat || vs == bincSpZero { - return - } else if vs == bincSpNegInf { - return math.Inf(-1) - } else { - d.d.errorf("Invalid d.vs decoding float where d.vd=bincVdSpecial: %v", d.vs) - return - } - } else if vd == bincVdFloat { - f = d.decFloat() - } else { - f = float64(d.DecodeInt(64)) - } - if chkOverflow32 && chkOvf.Float32(f) { - d.d.errorf("binc: float32 overflow: %v", f) - return - } - d.bdRead = false - return -} - -// bool can be decoded from bool only (single byte). -func (d *bincDecDriver) DecodeBool() (b bool) { - if !d.bdRead { - d.readNextBd() - } - if bd := d.bd; bd == (bincVdSpecial | bincSpFalse) { - // b = false - } else if bd == (bincVdSpecial | bincSpTrue) { - b = true - } else { - d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) - return - } - d.bdRead = false - return -} - -func (d *bincDecDriver) ReadMapStart() (length int) { - if d.vd != bincVdMap { - d.d.errorf("Invalid d.vd for map. Expecting 0x%x. Got: 0x%x", bincVdMap, d.vd) - return - } - length = d.decLen() - d.bdRead = false - return -} - -func (d *bincDecDriver) ReadArrayStart() (length int) { - if d.vd != bincVdArray { - d.d.errorf("Invalid d.vd for array. Expecting 0x%x. Got: 0x%x", bincVdArray, d.vd) - return - } - length = d.decLen() - d.bdRead = false - return -} - -func (d *bincDecDriver) decLen() int { - if d.vs > 3 { - return int(d.vs - 4) - } - return int(d.decLenNumber()) -} - -func (d *bincDecDriver) decLenNumber() (v uint64) { - if x := d.vs; x == 0 { - v = uint64(d.r.readn1()) - } else if x == 1 { - d.r.readb(d.b[6:8]) - v = uint64(bigen.Uint16(d.b[6:8])) - } else if x == 2 { - d.r.readb(d.b[4:8]) - v = uint64(bigen.Uint32(d.b[4:8])) - } else { - d.r.readb(d.b[:8]) - v = bigen.Uint64(d.b[:8]) - } - return -} - -func (d *bincDecDriver) decStringAndBytes(bs []byte, withString, zerocopy bool) (bs2 []byte, s string) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == bincVdSpecial<<4|bincSpNil { - d.bdRead = false - return - } - var slen int = -1 - // var ok bool - switch d.vd { - case bincVdString, bincVdByteArray: - slen = d.decLen() - if zerocopy { - if d.br { - bs2 = d.r.readx(slen) - } else if len(bs) == 0 { - bs2 = decByteSlice(d.r, slen, d.b[:]) - } else { - bs2 = decByteSlice(d.r, slen, bs) - } - } else { - bs2 = decByteSlice(d.r, slen, bs) - } - if withString { - s = string(bs2) - } - case bincVdSymbol: - // zerocopy doesn't apply for symbols, - // as the values must be stored in a table for later use. - // - //from vs: extract numSymbolBytes, containsStringVal, strLenPrecision, - //extract symbol - //if containsStringVal, read it and put in map - //else look in map for string value - var symbol uint16 - vs := d.vs - if vs&0x8 == 0 { - symbol = uint16(d.r.readn1()) - } else { - symbol = uint16(bigen.Uint16(d.r.readx(2))) - } - if d.s == nil { - d.s = make([]bincDecSymbol, 0, 16) - } - - if vs&0x4 == 0 { - for i := range d.s { - j := &d.s[i] - if j.i == symbol { - bs2 = j.b - if withString { - if j.s == "" && bs2 != nil { - j.s = string(bs2) - } - s = j.s - } - break - } - } - } else { - switch vs & 0x3 { - case 0: - slen = int(d.r.readn1()) - case 1: - slen = int(bigen.Uint16(d.r.readx(2))) - case 2: - slen = int(bigen.Uint32(d.r.readx(4))) - case 3: - slen = int(bigen.Uint64(d.r.readx(8))) - } - // since using symbols, do not store any part of - // the parameter bs in the map, as it might be a shared buffer. - // bs2 = decByteSlice(d.r, slen, bs) - bs2 = decByteSlice(d.r, slen, nil) - if withString { - s = string(bs2) - } - d.s = append(d.s, bincDecSymbol{i: symbol, s: s, b: bs2}) - } - default: - d.d.errorf("Invalid d.vd. Expecting string:0x%x, bytearray:0x%x or symbol: 0x%x. Got: 0x%x", - bincVdString, bincVdByteArray, bincVdSymbol, d.vd) - return - } - d.bdRead = false - return -} - -func (d *bincDecDriver) DecodeString() (s string) { - // DecodeBytes does not accomodate symbols, whose impl stores string version in map. - // Use decStringAndBytes directly. - // return string(d.DecodeBytes(d.b[:], true, true)) - _, s = d.decStringAndBytes(d.b[:], true, true) - return -} - -func (d *bincDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { - if isstring { - bsOut, _ = d.decStringAndBytes(bs, false, zerocopy) - return - } - if !d.bdRead { - d.readNextBd() - } - if d.bd == bincVdSpecial<<4|bincSpNil { - d.bdRead = false - return nil - } - var clen int - if d.vd == bincVdString || d.vd == bincVdByteArray { - clen = d.decLen() - } else { - d.d.errorf("Invalid d.vd for bytes. Expecting string:0x%x or bytearray:0x%x. Got: 0x%x", - bincVdString, bincVdByteArray, d.vd) - return - } - d.bdRead = false - if zerocopy { - if d.br { - return d.r.readx(clen) - } else if len(bs) == 0 { - bs = d.b[:] - } - } - return decByteSlice(d.r, clen, bs) -} - -func (d *bincDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { - if xtag > 0xff { - d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) - return - } - realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) - realxtag = uint64(realxtag1) - if ext == nil { - re := rv.(*RawExt) - re.Tag = realxtag - re.Data = detachZeroCopyBytes(d.br, re.Data, xbs) - } else { - ext.ReadExt(rv, xbs) - } - return -} - -func (d *bincDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs []byte) { - if !d.bdRead { - d.readNextBd() - } - if d.vd == bincVdCustomExt { - l := d.decLen() - xtag = d.r.readn1() - if verifyTag && xtag != tag { - d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) - return - } - xbs = d.r.readx(l) - } else if d.vd == bincVdByteArray { - xbs = d.DecodeBytes(nil, false, true) - } else { - d.d.errorf("Invalid d.vd for extensions (Expecting extensions or byte array). Got: 0x%x", d.vd) - return - } - d.bdRead = false - return -} - -func (d *bincDecDriver) DecodeNaked() { - if !d.bdRead { - d.readNextBd() - } - - n := &d.d.n - var decodeFurther bool - - switch d.vd { - case bincVdSpecial: - switch d.vs { - case bincSpNil: - n.v = valueTypeNil - case bincSpFalse: - n.v = valueTypeBool - n.b = false - case bincSpTrue: - n.v = valueTypeBool - n.b = true - case bincSpNan: - n.v = valueTypeFloat - n.f = math.NaN() - case bincSpPosInf: - n.v = valueTypeFloat - n.f = math.Inf(1) - case bincSpNegInf: - n.v = valueTypeFloat - n.f = math.Inf(-1) - case bincSpZeroFloat: - n.v = valueTypeFloat - n.f = float64(0) - case bincSpZero: - n.v = valueTypeUint - n.u = uint64(0) // int8(0) - case bincSpNegOne: - n.v = valueTypeInt - n.i = int64(-1) // int8(-1) - default: - d.d.errorf("decodeNaked: Unrecognized special value 0x%x", d.vs) - } - case bincVdSmallInt: - n.v = valueTypeUint - n.u = uint64(int8(d.vs)) + 1 // int8(d.vs) + 1 - case bincVdPosInt: - n.v = valueTypeUint - n.u = d.decUint() - case bincVdNegInt: - n.v = valueTypeInt - n.i = -(int64(d.decUint())) - case bincVdFloat: - n.v = valueTypeFloat - n.f = d.decFloat() - case bincVdSymbol: - n.v = valueTypeSymbol - n.s = d.DecodeString() - case bincVdString: - n.v = valueTypeString - n.s = d.DecodeString() - case bincVdByteArray: - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - case bincVdTimestamp: - n.v = valueTypeTimestamp - tt, err := decodeTime(d.r.readx(int(d.vs))) - if err != nil { - panic(err) - } - n.t = tt - case bincVdCustomExt: - n.v = valueTypeExt - l := d.decLen() - n.u = uint64(d.r.readn1()) - n.l = d.r.readx(l) - case bincVdArray: - n.v = valueTypeArray - decodeFurther = true - case bincVdMap: - n.v = valueTypeMap - decodeFurther = true - default: - d.d.errorf("decodeNaked: Unrecognized d.vd: 0x%x", d.vd) - } - - if !decodeFurther { - d.bdRead = false - } - if n.v == valueTypeUint && d.h.SignedInteger { - n.v = valueTypeInt - n.i = int64(n.u) - } - return -} - -//------------------------------------ - -//BincHandle is a Handle for the Binc Schema-Free Encoding Format -//defined at https://github.com/ugorji/binc . -// -//BincHandle currently supports all Binc features with the following EXCEPTIONS: -// - only integers up to 64 bits of precision are supported. -// big integers are unsupported. -// - Only IEEE 754 binary32 and binary64 floats are supported (ie Go float32 and float64 types). -// extended precision and decimal IEEE 754 floats are unsupported. -// - Only UTF-8 strings supported. -// Unicode_Other Binc types (UTF16, UTF32) are currently unsupported. -// -//Note that these EXCEPTIONS are temporary and full support is possible and may happen soon. -type BincHandle struct { - BasicHandle - binaryEncodingType -} - -func (h *BincHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &setExtWrapper{b: ext}) -} - -func (h *BincHandle) newEncDriver(e *Encoder) encDriver { - return &bincEncDriver{e: e, w: e.w} -} - -func (h *BincHandle) newDecDriver(d *Decoder) decDriver { - return &bincDecDriver{d: d, r: d.r, h: h, br: d.bytes} -} - -func (e *bincEncDriver) reset() { - e.w = e.e.w - e.s = 0 - e.m = nil -} - -func (d *bincDecDriver) reset() { - d.r = d.d.r - d.s = nil - d.bd, d.bdRead, d.vd, d.vs = 0, false, 0, 0 -} - -var _ decDriver = (*bincDecDriver)(nil) -var _ encDriver = (*bincEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/cbor.go b/vendor/github.com/ugorji/go/codec/cbor.go deleted file mode 100644 index a224cd3a72ce..000000000000 --- a/vendor/github.com/ugorji/go/codec/cbor.go +++ /dev/null @@ -1,585 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "math" - "reflect" -) - -const ( - cborMajorUint byte = iota - cborMajorNegInt - cborMajorBytes - cborMajorText - cborMajorArray - cborMajorMap - cborMajorTag - cborMajorOther -) - -const ( - cborBdFalse byte = 0xf4 + iota - cborBdTrue - cborBdNil - cborBdUndefined - cborBdExt - cborBdFloat16 - cborBdFloat32 - cborBdFloat64 -) - -const ( - cborBdIndefiniteBytes byte = 0x5f - cborBdIndefiniteString = 0x7f - cborBdIndefiniteArray = 0x9f - cborBdIndefiniteMap = 0xbf - cborBdBreak = 0xff -) - -const ( - CborStreamBytes byte = 0x5f - CborStreamString = 0x7f - CborStreamArray = 0x9f - CborStreamMap = 0xbf - CborStreamBreak = 0xff -) - -const ( - cborBaseUint byte = 0x00 - cborBaseNegInt = 0x20 - cborBaseBytes = 0x40 - cborBaseString = 0x60 - cborBaseArray = 0x80 - cborBaseMap = 0xa0 - cborBaseTag = 0xc0 - cborBaseSimple = 0xe0 -) - -// ------------------- - -type cborEncDriver struct { - noBuiltInTypes - encNoSeparator - e *Encoder - w encWriter - h *CborHandle - x [8]byte -} - -func (e *cborEncDriver) EncodeNil() { - e.w.writen1(cborBdNil) -} - -func (e *cborEncDriver) EncodeBool(b bool) { - if b { - e.w.writen1(cborBdTrue) - } else { - e.w.writen1(cborBdFalse) - } -} - -func (e *cborEncDriver) EncodeFloat32(f float32) { - e.w.writen1(cborBdFloat32) - bigenHelper{e.x[:4], e.w}.writeUint32(math.Float32bits(f)) -} - -func (e *cborEncDriver) EncodeFloat64(f float64) { - e.w.writen1(cborBdFloat64) - bigenHelper{e.x[:8], e.w}.writeUint64(math.Float64bits(f)) -} - -func (e *cborEncDriver) encUint(v uint64, bd byte) { - if v <= 0x17 { - e.w.writen1(byte(v) + bd) - } else if v <= math.MaxUint8 { - e.w.writen2(bd+0x18, uint8(v)) - } else if v <= math.MaxUint16 { - e.w.writen1(bd + 0x19) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(v)) - } else if v <= math.MaxUint32 { - e.w.writen1(bd + 0x1a) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(v)) - } else { // if v <= math.MaxUint64 { - e.w.writen1(bd + 0x1b) - bigenHelper{e.x[:8], e.w}.writeUint64(v) - } -} - -func (e *cborEncDriver) EncodeInt(v int64) { - if v < 0 { - e.encUint(uint64(-1-v), cborBaseNegInt) - } else { - e.encUint(uint64(v), cborBaseUint) - } -} - -func (e *cborEncDriver) EncodeUint(v uint64) { - e.encUint(v, cborBaseUint) -} - -func (e *cborEncDriver) encLen(bd byte, length int) { - e.encUint(uint64(length), bd) -} - -func (e *cborEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Encoder) { - e.encUint(uint64(xtag), cborBaseTag) - if v := ext.ConvertExt(rv); v == nil { - e.EncodeNil() - } else { - en.encode(v) - } -} - -func (e *cborEncDriver) EncodeRawExt(re *RawExt, en *Encoder) { - e.encUint(uint64(re.Tag), cborBaseTag) - if re.Data != nil { - en.encode(re.Data) - } else if re.Value == nil { - e.EncodeNil() - } else { - en.encode(re.Value) - } -} - -func (e *cborEncDriver) EncodeArrayStart(length int) { - e.encLen(cborBaseArray, length) -} - -func (e *cborEncDriver) EncodeMapStart(length int) { - e.encLen(cborBaseMap, length) -} - -func (e *cborEncDriver) EncodeString(c charEncoding, v string) { - e.encLen(cborBaseString, len(v)) - e.w.writestr(v) -} - -func (e *cborEncDriver) EncodeSymbol(v string) { - e.EncodeString(c_UTF8, v) -} - -func (e *cborEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - if c == c_RAW { - e.encLen(cborBaseBytes, len(v)) - } else { - e.encLen(cborBaseString, len(v)) - } - e.w.writeb(v) -} - -// ---------------------- - -type cborDecDriver struct { - d *Decoder - h *CborHandle - r decReader - b [scratchByteArrayLen]byte - br bool // bytes reader - bdRead bool - bd byte - noBuiltInTypes - decNoSeparator -} - -func (d *cborDecDriver) readNextBd() { - d.bd = d.r.readn1() - d.bdRead = true -} - -func (d *cborDecDriver) ContainerType() (vt valueType) { - if d.bd == cborBdNil { - return valueTypeNil - } else if d.bd == cborBdIndefiniteBytes || (d.bd >= cborBaseBytes && d.bd < cborBaseString) { - return valueTypeBytes - } else if d.bd == cborBdIndefiniteString || (d.bd >= cborBaseString && d.bd < cborBaseArray) { - return valueTypeString - } else if d.bd == cborBdIndefiniteArray || (d.bd >= cborBaseArray && d.bd < cborBaseMap) { - return valueTypeArray - } else if d.bd == cborBdIndefiniteMap || (d.bd >= cborBaseMap && d.bd < cborBaseTag) { - return valueTypeMap - } else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - } - return valueTypeUnset -} - -func (d *cborDecDriver) TryDecodeAsNil() bool { - if !d.bdRead { - d.readNextBd() - } - // treat Nil and Undefined as nil values - if d.bd == cborBdNil || d.bd == cborBdUndefined { - d.bdRead = false - return true - } - return false -} - -func (d *cborDecDriver) CheckBreak() bool { - if !d.bdRead { - d.readNextBd() - } - if d.bd == cborBdBreak { - d.bdRead = false - return true - } - return false -} - -func (d *cborDecDriver) decUint() (ui uint64) { - v := d.bd & 0x1f - if v <= 0x17 { - ui = uint64(v) - } else { - if v == 0x18 { - ui = uint64(d.r.readn1()) - } else if v == 0x19 { - ui = uint64(bigen.Uint16(d.r.readx(2))) - } else if v == 0x1a { - ui = uint64(bigen.Uint32(d.r.readx(4))) - } else if v == 0x1b { - ui = uint64(bigen.Uint64(d.r.readx(8))) - } else { - d.d.errorf("decUint: Invalid descriptor: %v", d.bd) - return - } - } - return -} - -func (d *cborDecDriver) decCheckInteger() (neg bool) { - if !d.bdRead { - d.readNextBd() - } - major := d.bd >> 5 - if major == cborMajorUint { - } else if major == cborMajorNegInt { - neg = true - } else { - d.d.errorf("invalid major: %v (bd: %v)", major, d.bd) - return - } - return -} - -func (d *cborDecDriver) DecodeInt(bitsize uint8) (i int64) { - neg := d.decCheckInteger() - ui := d.decUint() - // check if this number can be converted to an int without overflow - var overflow bool - if neg { - if i, overflow = chkOvf.SignedInt(ui + 1); overflow { - d.d.errorf("cbor: overflow converting %v to signed integer", ui+1) - return - } - i = -i - } else { - if i, overflow = chkOvf.SignedInt(ui); overflow { - d.d.errorf("cbor: overflow converting %v to signed integer", ui) - return - } - } - if chkOvf.Int(i, bitsize) { - d.d.errorf("cbor: overflow integer: %v", i) - return - } - d.bdRead = false - return -} - -func (d *cborDecDriver) DecodeUint(bitsize uint8) (ui uint64) { - if d.decCheckInteger() { - d.d.errorf("Assigning negative signed value to unsigned type") - return - } - ui = d.decUint() - if chkOvf.Uint(ui, bitsize) { - d.d.errorf("cbor: overflow integer: %v", ui) - return - } - d.bdRead = false - return -} - -func (d *cborDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - if !d.bdRead { - d.readNextBd() - } - if bd := d.bd; bd == cborBdFloat16 { - f = float64(math.Float32frombits(halfFloatToFloatBits(bigen.Uint16(d.r.readx(2))))) - } else if bd == cborBdFloat32 { - f = float64(math.Float32frombits(bigen.Uint32(d.r.readx(4)))) - } else if bd == cborBdFloat64 { - f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) - } else if bd >= cborBaseUint && bd < cborBaseBytes { - f = float64(d.DecodeInt(64)) - } else { - d.d.errorf("Float only valid from float16/32/64: Invalid descriptor: %v", bd) - return - } - if chkOverflow32 && chkOvf.Float32(f) { - d.d.errorf("cbor: float32 overflow: %v", f) - return - } - d.bdRead = false - return -} - -// bool can be decoded from bool only (single byte). -func (d *cborDecDriver) DecodeBool() (b bool) { - if !d.bdRead { - d.readNextBd() - } - if bd := d.bd; bd == cborBdTrue { - b = true - } else if bd == cborBdFalse { - } else { - d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) - return - } - d.bdRead = false - return -} - -func (d *cborDecDriver) ReadMapStart() (length int) { - d.bdRead = false - if d.bd == cborBdIndefiniteMap { - return -1 - } - return d.decLen() -} - -func (d *cborDecDriver) ReadArrayStart() (length int) { - d.bdRead = false - if d.bd == cborBdIndefiniteArray { - return -1 - } - return d.decLen() -} - -func (d *cborDecDriver) decLen() int { - return int(d.decUint()) -} - -func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte) []byte { - d.bdRead = false - for { - if d.CheckBreak() { - break - } - if major := d.bd >> 5; major != cborMajorBytes && major != cborMajorText { - d.d.errorf("cbor: expect bytes or string major type in indefinite string/bytes; got: %v, byte: %v", major, d.bd) - return nil - } - n := d.decLen() - oldLen := len(bs) - newLen := oldLen + n - if newLen > cap(bs) { - bs2 := make([]byte, newLen, 2*cap(bs)+n) - copy(bs2, bs) - bs = bs2 - } else { - bs = bs[:newLen] - } - d.r.readb(bs[oldLen:newLen]) - // bs = append(bs, d.r.readn()...) - d.bdRead = false - } - d.bdRead = false - return bs -} - -func (d *cborDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == cborBdNil || d.bd == cborBdUndefined { - d.bdRead = false - return nil - } - if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString { - if bs == nil { - return d.decAppendIndefiniteBytes(nil) - } - return d.decAppendIndefiniteBytes(bs[:0]) - } - clen := d.decLen() - d.bdRead = false - if zerocopy { - if d.br { - return d.r.readx(clen) - } else if len(bs) == 0 { - bs = d.b[:] - } - } - return decByteSlice(d.r, clen, bs) -} - -func (d *cborDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.b[:], true, true)) -} - -func (d *cborDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { - if !d.bdRead { - d.readNextBd() - } - u := d.decUint() - d.bdRead = false - realxtag = u - if ext == nil { - re := rv.(*RawExt) - re.Tag = realxtag - d.d.decode(&re.Value) - } else if xtag != realxtag { - d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", realxtag, xtag) - return - } else { - var v interface{} - d.d.decode(&v) - ext.UpdateExt(rv, v) - } - d.bdRead = false - return -} - -func (d *cborDecDriver) DecodeNaked() { - if !d.bdRead { - d.readNextBd() - } - - n := &d.d.n - var decodeFurther bool - - switch d.bd { - case cborBdNil: - n.v = valueTypeNil - case cborBdFalse: - n.v = valueTypeBool - n.b = false - case cborBdTrue: - n.v = valueTypeBool - n.b = true - case cborBdFloat16, cborBdFloat32: - n.v = valueTypeFloat - n.f = d.DecodeFloat(true) - case cborBdFloat64: - n.v = valueTypeFloat - n.f = d.DecodeFloat(false) - case cborBdIndefiniteBytes: - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - case cborBdIndefiniteString: - n.v = valueTypeString - n.s = d.DecodeString() - case cborBdIndefiniteArray: - n.v = valueTypeArray - decodeFurther = true - case cborBdIndefiniteMap: - n.v = valueTypeMap - decodeFurther = true - default: - switch { - case d.bd >= cborBaseUint && d.bd < cborBaseNegInt: - if d.h.SignedInteger { - n.v = valueTypeInt - n.i = d.DecodeInt(64) - } else { - n.v = valueTypeUint - n.u = d.DecodeUint(64) - } - case d.bd >= cborBaseNegInt && d.bd < cborBaseBytes: - n.v = valueTypeInt - n.i = d.DecodeInt(64) - case d.bd >= cborBaseBytes && d.bd < cborBaseString: - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - case d.bd >= cborBaseString && d.bd < cborBaseArray: - n.v = valueTypeString - n.s = d.DecodeString() - case d.bd >= cborBaseArray && d.bd < cborBaseMap: - n.v = valueTypeArray - decodeFurther = true - case d.bd >= cborBaseMap && d.bd < cborBaseTag: - n.v = valueTypeMap - decodeFurther = true - case d.bd >= cborBaseTag && d.bd < cborBaseSimple: - n.v = valueTypeExt - n.u = d.decUint() - n.l = nil - // d.bdRead = false - // d.d.decode(&re.Value) // handled by decode itself. - // decodeFurther = true - default: - d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd) - return - } - } - - if !decodeFurther { - d.bdRead = false - } - return -} - -// ------------------------- - -// CborHandle is a Handle for the CBOR encoding format, -// defined at http://tools.ietf.org/html/rfc7049 and documented further at http://cbor.io . -// -// CBOR is comprehensively supported, including support for: -// - indefinite-length arrays/maps/bytes/strings -// - (extension) tags in range 0..0xffff (0 .. 65535) -// - half, single and double-precision floats -// - all numbers (1, 2, 4 and 8-byte signed and unsigned integers) -// - nil, true, false, ... -// - arrays and maps, bytes and text strings -// -// None of the optional extensions (with tags) defined in the spec are supported out-of-the-box. -// Users can implement them as needed (using SetExt), including spec-documented ones: -// - timestamp, BigNum, BigFloat, Decimals, Encoded Text (e.g. URL, regexp, base64, MIME Message), etc. -// -// To encode with indefinite lengths (streaming), users will use -// (Must)Encode methods of *Encoder, along with writing CborStreamXXX constants. -// -// For example, to encode "one-byte" as an indefinite length string: -// var buf bytes.Buffer -// e := NewEncoder(&buf, new(CborHandle)) -// buf.WriteByte(CborStreamString) -// e.MustEncode("one-") -// e.MustEncode("byte") -// buf.WriteByte(CborStreamBreak) -// encodedBytes := buf.Bytes() -// var vv interface{} -// NewDecoderBytes(buf.Bytes(), new(CborHandle)).MustDecode(&vv) -// // Now, vv contains the same string "one-byte" -// -type CborHandle struct { - binaryEncodingType - BasicHandle -} - -func (h *CborHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceExt) (err error) { - return h.SetExt(rt, tag, &setExtWrapper{i: ext}) -} - -func (h *CborHandle) newEncDriver(e *Encoder) encDriver { - return &cborEncDriver{e: e, w: e.w, h: h} -} - -func (h *CborHandle) newDecDriver(d *Decoder) decDriver { - return &cborDecDriver{d: d, r: d.r, h: h, br: d.bytes} -} - -func (e *cborEncDriver) reset() { - e.w = e.e.w -} - -func (d *cborDecDriver) reset() { - d.r = d.d.r - d.bd, d.bdRead = 0, false -} - -var _ decDriver = (*cborDecDriver)(nil) -var _ encDriver = (*cborEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/decode.go b/vendor/github.com/ugorji/go/codec/decode.go deleted file mode 100644 index b87ea630ee9d..000000000000 --- a/vendor/github.com/ugorji/go/codec/decode.go +++ /dev/null @@ -1,2019 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "encoding" - "errors" - "fmt" - "io" - "reflect" - "time" -) - -// Some tagging information for error messages. -const ( - msgBadDesc = "Unrecognized descriptor byte" - msgDecCannotExpandArr = "cannot expand go array from %v to stream length: %v" -) - -var ( - onlyMapOrArrayCanDecodeIntoStructErr = errors.New("only encoded map or array can be decoded into a struct") - cannotDecodeIntoNilErr = errors.New("cannot decode into nil") -) - -// decReader abstracts the reading source, allowing implementations that can -// read from an io.Reader or directly off a byte slice with zero-copying. -type decReader interface { - unreadn1() - - // readx will use the implementation scratch buffer if possible i.e. n < len(scratchbuf), OR - // just return a view of the []byte being decoded from. - // Ensure you call detachZeroCopyBytes later if this needs to be sent outside codec control. - readx(n int) []byte - readb([]byte) - readn1() uint8 - readn1eof() (v uint8, eof bool) - numread() int // number of bytes read - track() - stopTrack() []byte -} - -type decReaderByteScanner interface { - io.Reader - io.ByteScanner -} - -type decDriver interface { - // this will check if the next token is a break. - CheckBreak() bool - TryDecodeAsNil() bool - // vt is one of: Bytes, String, Nil, Slice or Map. Return unSet if not known. - ContainerType() (vt valueType) - IsBuiltinType(rt uintptr) bool - DecodeBuiltin(rt uintptr, v interface{}) - - // DecodeNaked will decode primitives (number, bool, string, []byte) and RawExt. - // For maps and arrays, it will not do the decoding in-band, but will signal - // the decoder, so that is done later, by setting the decNaked.valueType field. - // - // Note: Numbers are decoded as int64, uint64, float64 only (no smaller sized number types). - // for extensions, DecodeNaked must read the tag and the []byte if it exists. - // if the []byte is not read, then kInterfaceNaked will treat it as a Handle - // that stores the subsequent value in-band, and complete reading the RawExt. - // - // extensions should also use readx to decode them, for efficiency. - // kInterface will extract the detached byte slice if it has to pass it outside its realm. - DecodeNaked() - DecodeInt(bitsize uint8) (i int64) - DecodeUint(bitsize uint8) (ui uint64) - DecodeFloat(chkOverflow32 bool) (f float64) - DecodeBool() (b bool) - // DecodeString can also decode symbols. - // It looks redundant as DecodeBytes is available. - // However, some codecs (e.g. binc) support symbols and can - // return a pre-stored string value, meaning that it can bypass - // the cost of []byte->string conversion. - DecodeString() (s string) - - // DecodeBytes may be called directly, without going through reflection. - // Consequently, it must be designed to handle possible nil. - DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) - - // decodeExt will decode into a *RawExt or into an extension. - DecodeExt(v interface{}, xtag uint64, ext Ext) (realxtag uint64) - // decodeExt(verifyTag bool, tag byte) (xtag byte, xbs []byte) - ReadMapStart() int - ReadArrayStart() int - - reset() - uncacheRead() -} - -type decNoSeparator struct{} - -func (_ decNoSeparator) ReadEnd() {} -func (_ decNoSeparator) uncacheRead() {} - -type DecodeOptions struct { - // MapType specifies type to use during schema-less decoding of a map in the stream. - // If nil, we use map[interface{}]interface{} - MapType reflect.Type - - // SliceType specifies type to use during schema-less decoding of an array in the stream. - // If nil, we use []interface{} - SliceType reflect.Type - - // MaxInitLen defines the initial length that we "make" a collection (slice, chan or map) with. - // If 0 or negative, we default to a sensible value based on the size of an element in the collection. - // - // For example, when decoding, a stream may say that it has MAX_UINT elements. - // We should not auto-matically provision a slice of that length, to prevent Out-Of-Memory crash. - // Instead, we provision up to MaxInitLen, fill that up, and start appending after that. - MaxInitLen int - - // If ErrorIfNoField, return an error when decoding a map - // from a codec stream into a struct, and no matching struct field is found. - ErrorIfNoField bool - - // If ErrorIfNoArrayExpand, return an error when decoding a slice/array that cannot be expanded. - // For example, the stream contains an array of 8 items, but you are decoding into a [4]T array, - // or you are decoding into a slice of length 4 which is non-addressable (and so cannot be set). - ErrorIfNoArrayExpand bool - - // If SignedInteger, use the int64 during schema-less decoding of unsigned values (not uint64). - SignedInteger bool - - // MapValueReset controls how we decode into a map value. - // - // By default, we MAY retrieve the mapping for a key, and then decode into that. - // However, especially with big maps, that retrieval may be expensive and unnecessary - // if the stream already contains all that is necessary to recreate the value. - // - // If true, we will never retrieve the previous mapping, - // but rather decode into a new value and set that in the map. - // - // If false, we will retrieve the previous mapping if necessary e.g. - // the previous mapping is a pointer, or is a struct or array with pre-set state, - // or is an interface. - MapValueReset bool - - // InterfaceReset controls how we decode into an interface. - // - // By default, when we see a field that is an interface{...}, - // or a map with interface{...} value, we will attempt decoding into the - // "contained" value. - // - // However, this prevents us from reading a string into an interface{} - // that formerly contained a number. - // - // If true, we will decode into a new "blank" value, and set that in the interface. - // If false, we will decode into whatever is contained in the interface. - InterfaceReset bool - - // InternString controls interning of strings during decoding. - // - // Some handles, e.g. json, typically will read map keys as strings. - // If the set of keys are finite, it may help reduce allocation to - // look them up from a map (than to allocate them afresh). - // - // Note: Handles will be smart when using the intern functionality. - // So everything will not be interned. - InternString bool -} - -// ------------------------------------ - -// ioDecByteScanner implements Read(), ReadByte(...), UnreadByte(...) methods -// of io.Reader, io.ByteScanner. -type ioDecByteScanner struct { - r io.Reader - l byte // last byte - ls byte // last byte status. 0: init-canDoNothing, 1: canRead, 2: canUnread - b [1]byte // tiny buffer for reading single bytes -} - -func (z *ioDecByteScanner) Read(p []byte) (n int, err error) { - var firstByte bool - if z.ls == 1 { - z.ls = 2 - p[0] = z.l - if len(p) == 1 { - n = 1 - return - } - firstByte = true - p = p[1:] - } - n, err = z.r.Read(p) - if n > 0 { - if err == io.EOF && n == len(p) { - err = nil // read was successful, so postpone EOF (till next time) - } - z.l = p[n-1] - z.ls = 2 - } - if firstByte { - n++ - } - return -} - -func (z *ioDecByteScanner) ReadByte() (c byte, err error) { - n, err := z.Read(z.b[:]) - if n == 1 { - c = z.b[0] - if err == io.EOF { - err = nil // read was successful, so postpone EOF (till next time) - } - } - return -} - -func (z *ioDecByteScanner) UnreadByte() (err error) { - x := z.ls - if x == 0 { - err = errors.New("cannot unread - nothing has been read") - } else if x == 1 { - err = errors.New("cannot unread - last byte has not been read") - } else if x == 2 { - z.ls = 1 - } - return -} - -// ioDecReader is a decReader that reads off an io.Reader -type ioDecReader struct { - br decReaderByteScanner - // temp byte array re-used internally for efficiency during read. - // shares buffer with Decoder, so we keep size of struct within 8 words. - x *[scratchByteArrayLen]byte - bs ioDecByteScanner - n int // num read - tr []byte // tracking bytes read - trb bool -} - -func (z *ioDecReader) numread() int { - return z.n -} - -func (z *ioDecReader) readx(n int) (bs []byte) { - if n <= 0 { - return - } - if n < len(z.x) { - bs = z.x[:n] - } else { - bs = make([]byte, n) - } - if _, err := io.ReadAtLeast(z.br, bs, n); err != nil { - panic(err) - } - z.n += len(bs) - if z.trb { - z.tr = append(z.tr, bs...) - } - return -} - -func (z *ioDecReader) readb(bs []byte) { - if len(bs) == 0 { - return - } - n, err := io.ReadAtLeast(z.br, bs, len(bs)) - z.n += n - if err != nil { - panic(err) - } - if z.trb { - z.tr = append(z.tr, bs...) - } -} - -func (z *ioDecReader) readn1() (b uint8) { - b, err := z.br.ReadByte() - if err != nil { - panic(err) - } - z.n++ - if z.trb { - z.tr = append(z.tr, b) - } - return b -} - -func (z *ioDecReader) readn1eof() (b uint8, eof bool) { - b, err := z.br.ReadByte() - if err == nil { - z.n++ - if z.trb { - z.tr = append(z.tr, b) - } - } else if err == io.EOF { - eof = true - } else { - panic(err) - } - return -} - -func (z *ioDecReader) unreadn1() { - err := z.br.UnreadByte() - if err != nil { - panic(err) - } - z.n-- - if z.trb { - if l := len(z.tr) - 1; l >= 0 { - z.tr = z.tr[:l] - } - } -} - -func (z *ioDecReader) track() { - if z.tr != nil { - z.tr = z.tr[:0] - } - z.trb = true -} - -func (z *ioDecReader) stopTrack() (bs []byte) { - z.trb = false - return z.tr -} - -// ------------------------------------ - -var bytesDecReaderCannotUnreadErr = errors.New("cannot unread last byte read") - -// bytesDecReader is a decReader that reads off a byte slice with zero copying -type bytesDecReader struct { - b []byte // data - c int // cursor - a int // available - t int // track start -} - -func (z *bytesDecReader) reset(in []byte) { - z.b = in - z.a = len(in) - z.c = 0 - z.t = 0 -} - -func (z *bytesDecReader) numread() int { - return z.c -} - -func (z *bytesDecReader) unreadn1() { - if z.c == 0 || len(z.b) == 0 { - panic(bytesDecReaderCannotUnreadErr) - } - z.c-- - z.a++ - return -} - -func (z *bytesDecReader) readx(n int) (bs []byte) { - // slicing from a non-constant start position is more expensive, - // as more computation is required to decipher the pointer start position. - // However, we do it only once, and it's better than reslicing both z.b and return value. - - if n <= 0 { - } else if z.a == 0 { - panic(io.EOF) - } else if n > z.a { - panic(io.ErrUnexpectedEOF) - } else { - c0 := z.c - z.c = c0 + n - z.a = z.a - n - bs = z.b[c0:z.c] - } - return -} - -func (z *bytesDecReader) readn1() (v uint8) { - if z.a == 0 { - panic(io.EOF) - } - v = z.b[z.c] - z.c++ - z.a-- - return -} - -func (z *bytesDecReader) readn1eof() (v uint8, eof bool) { - if z.a == 0 { - eof = true - return - } - v = z.b[z.c] - z.c++ - z.a-- - return -} - -func (z *bytesDecReader) readb(bs []byte) { - copy(bs, z.readx(len(bs))) -} - -func (z *bytesDecReader) track() { - z.t = z.c -} - -func (z *bytesDecReader) stopTrack() (bs []byte) { - return z.b[z.t:z.c] -} - -// ------------------------------------ - -type decFnInfo struct { - d *Decoder - ti *typeInfo - xfFn Ext - xfTag uint64 - seq seqType -} - -// ---------------------------------------- - -type decFn struct { - i decFnInfo - f func(*decFnInfo, reflect.Value) -} - -func (f *decFnInfo) builtin(rv reflect.Value) { - f.d.d.DecodeBuiltin(f.ti.rtid, rv.Addr().Interface()) -} - -func (f *decFnInfo) rawExt(rv reflect.Value) { - f.d.d.DecodeExt(rv.Addr().Interface(), 0, nil) -} - -func (f *decFnInfo) ext(rv reflect.Value) { - f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn) -} - -func (f *decFnInfo) getValueForUnmarshalInterface(rv reflect.Value, indir int8) (v interface{}) { - if indir == -1 { - v = rv.Addr().Interface() - } else if indir == 0 { - v = rv.Interface() - } else { - for j := int8(0); j < indir; j++ { - if rv.IsNil() { - rv.Set(reflect.New(rv.Type().Elem())) - } - rv = rv.Elem() - } - v = rv.Interface() - } - return -} - -func (f *decFnInfo) selferUnmarshal(rv reflect.Value) { - f.getValueForUnmarshalInterface(rv, f.ti.csIndir).(Selfer).CodecDecodeSelf(f.d) -} - -func (f *decFnInfo) binaryUnmarshal(rv reflect.Value) { - bm := f.getValueForUnmarshalInterface(rv, f.ti.bunmIndir).(encoding.BinaryUnmarshaler) - xbs := f.d.d.DecodeBytes(nil, false, true) - if fnerr := bm.UnmarshalBinary(xbs); fnerr != nil { - panic(fnerr) - } -} - -func (f *decFnInfo) textUnmarshal(rv reflect.Value) { - tm := f.getValueForUnmarshalInterface(rv, f.ti.tunmIndir).(encoding.TextUnmarshaler) - fnerr := tm.UnmarshalText(f.d.d.DecodeBytes(f.d.b[:], true, true)) - if fnerr != nil { - panic(fnerr) - } -} - -func (f *decFnInfo) jsonUnmarshal(rv reflect.Value) { - tm := f.getValueForUnmarshalInterface(rv, f.ti.junmIndir).(jsonUnmarshaler) - // bs := f.d.d.DecodeBytes(f.d.b[:], true, true) - // grab the bytes to be read, as UnmarshalJSON needs the full JSON so as to unmarshal it itself. - fnerr := tm.UnmarshalJSON(f.d.nextValueBytes()) - if fnerr != nil { - panic(fnerr) - } -} - -func (f *decFnInfo) kErr(rv reflect.Value) { - f.d.errorf("no decoding function defined for kind %v", rv.Kind()) -} - -func (f *decFnInfo) kString(rv reflect.Value) { - rv.SetString(f.d.d.DecodeString()) -} - -func (f *decFnInfo) kBool(rv reflect.Value) { - rv.SetBool(f.d.d.DecodeBool()) -} - -func (f *decFnInfo) kInt(rv reflect.Value) { - rv.SetInt(f.d.d.DecodeInt(intBitsize)) -} - -func (f *decFnInfo) kInt64(rv reflect.Value) { - rv.SetInt(f.d.d.DecodeInt(64)) -} - -func (f *decFnInfo) kInt32(rv reflect.Value) { - rv.SetInt(f.d.d.DecodeInt(32)) -} - -func (f *decFnInfo) kInt8(rv reflect.Value) { - rv.SetInt(f.d.d.DecodeInt(8)) -} - -func (f *decFnInfo) kInt16(rv reflect.Value) { - rv.SetInt(f.d.d.DecodeInt(16)) -} - -func (f *decFnInfo) kFloat32(rv reflect.Value) { - rv.SetFloat(f.d.d.DecodeFloat(true)) -} - -func (f *decFnInfo) kFloat64(rv reflect.Value) { - rv.SetFloat(f.d.d.DecodeFloat(false)) -} - -func (f *decFnInfo) kUint8(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(8)) -} - -func (f *decFnInfo) kUint64(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(64)) -} - -func (f *decFnInfo) kUint(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(uintBitsize)) -} - -func (f *decFnInfo) kUintptr(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(uintBitsize)) -} - -func (f *decFnInfo) kUint32(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(32)) -} - -func (f *decFnInfo) kUint16(rv reflect.Value) { - rv.SetUint(f.d.d.DecodeUint(16)) -} - -// func (f *decFnInfo) kPtr(rv reflect.Value) { -// debugf(">>>>>>> ??? decode kPtr called - shouldn't get called") -// if rv.IsNil() { -// rv.Set(reflect.New(rv.Type().Elem())) -// } -// f.d.decodeValue(rv.Elem()) -// } - -// var kIntfCtr uint64 - -func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) { - // nil interface: - // use some hieristics to decode it appropriately - // based on the detected next value in the stream. - d := f.d - d.d.DecodeNaked() - n := &d.n - if n.v == valueTypeNil { - return - } - // We cannot decode non-nil stream value into nil interface with methods (e.g. io.Reader). - // if num := f.ti.rt.NumMethod(); num > 0 { - if f.ti.numMeth > 0 { - d.errorf("cannot decode non-nil codec value into nil %v (%v methods)", f.ti.rt, f.ti.numMeth) - return - } - // var useRvn bool - switch n.v { - case valueTypeMap: - // if d.h.MapType == nil || d.h.MapType == mapIntfIntfTyp { - // } else if d.h.MapType == mapStrIntfTyp { // for json performance - // } - if d.mtid == 0 || d.mtid == mapIntfIntfTypId { - l := len(n.ms) - n.ms = append(n.ms, nil) - var v2 interface{} = &n.ms[l] - d.decode(v2) - rvn = reflect.ValueOf(v2).Elem() - n.ms = n.ms[:l] - } else if d.mtid == mapStrIntfTypId { // for json performance - l := len(n.ns) - n.ns = append(n.ns, nil) - var v2 interface{} = &n.ns[l] - d.decode(v2) - rvn = reflect.ValueOf(v2).Elem() - n.ns = n.ns[:l] - } else { - rvn = reflect.New(d.h.MapType).Elem() - d.decodeValue(rvn, nil) - } - case valueTypeArray: - // if d.h.SliceType == nil || d.h.SliceType == intfSliceTyp { - if d.stid == 0 || d.stid == intfSliceTypId { - l := len(n.ss) - n.ss = append(n.ss, nil) - var v2 interface{} = &n.ss[l] - d.decode(v2) - rvn = reflect.ValueOf(v2).Elem() - n.ss = n.ss[:l] - } else { - rvn = reflect.New(d.h.SliceType).Elem() - d.decodeValue(rvn, nil) - } - case valueTypeExt: - var v interface{} - tag, bytes := n.u, n.l // calling decode below might taint the values - if bytes == nil { - l := len(n.is) - n.is = append(n.is, nil) - v2 := &n.is[l] - d.decode(v2) - v = *v2 - n.is = n.is[:l] - } - bfn := d.h.getExtForTag(tag) - if bfn == nil { - var re RawExt - re.Tag = tag - re.Data = detachZeroCopyBytes(d.bytes, nil, bytes) - rvn = reflect.ValueOf(re) - } else { - rvnA := reflect.New(bfn.rt) - rvn = rvnA.Elem() - if bytes != nil { - bfn.ext.ReadExt(rvnA.Interface(), bytes) - } else { - bfn.ext.UpdateExt(rvnA.Interface(), v) - } - } - case valueTypeNil: - // no-op - case valueTypeInt: - rvn = reflect.ValueOf(&n.i).Elem() - case valueTypeUint: - rvn = reflect.ValueOf(&n.u).Elem() - case valueTypeFloat: - rvn = reflect.ValueOf(&n.f).Elem() - case valueTypeBool: - rvn = reflect.ValueOf(&n.b).Elem() - case valueTypeString, valueTypeSymbol: - rvn = reflect.ValueOf(&n.s).Elem() - case valueTypeBytes: - rvn = reflect.ValueOf(&n.l).Elem() - case valueTypeTimestamp: - rvn = reflect.ValueOf(&n.t).Elem() - default: - panic(fmt.Errorf("kInterfaceNaked: unexpected valueType: %d", n.v)) - } - return -} - -func (f *decFnInfo) kInterface(rv reflect.Value) { - // debugf("\t===> kInterface") - - // Note: - // A consequence of how kInterface works, is that - // if an interface already contains something, we try - // to decode into what was there before. - // We do not replace with a generic value (as got from decodeNaked). - - var rvn reflect.Value - if rv.IsNil() { - rvn = f.kInterfaceNaked() - if rvn.IsValid() { - rv.Set(rvn) - } - } else if f.d.h.InterfaceReset { - rvn = f.kInterfaceNaked() - if rvn.IsValid() { - rv.Set(rvn) - } else { - // reset to zero value based on current type in there. - rv.Set(reflect.Zero(rv.Elem().Type())) - } - } else { - rvn = rv.Elem() - // Note: interface{} is settable, but underlying type may not be. - // Consequently, we have to set the reflect.Value directly. - // if underlying type is settable (e.g. ptr or interface), - // we just decode into it. - // Else we create a settable value, decode into it, and set on the interface. - if rvn.CanSet() { - f.d.decodeValue(rvn, nil) - } else { - rvn2 := reflect.New(rvn.Type()).Elem() - rvn2.Set(rvn) - f.d.decodeValue(rvn2, nil) - rv.Set(rvn2) - } - } -} - -func (f *decFnInfo) kStruct(rv reflect.Value) { - fti := f.ti - d := f.d - dd := d.d - cr := d.cr - ctyp := dd.ContainerType() - if ctyp == valueTypeMap { - containerLen := dd.ReadMapStart() - if containerLen == 0 { - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return - } - tisfi := fti.sfi - hasLen := containerLen >= 0 - if hasLen { - for j := 0; j < containerLen; j++ { - // rvkencname := dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapKey) - } - rvkencname := stringView(dd.DecodeBytes(f.d.b[:], true, true)) - // rvksi := ti.getForEncName(rvkencname) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if k := fti.indexForEncName(rvkencname); k > -1 { - si := tisfi[k] - if dd.TryDecodeAsNil() { - si.setToZeroValue(rv) - } else { - d.decodeValue(si.field(rv, true), nil) - } - } else { - d.structFieldNotFound(-1, rvkencname) - } - } - } else { - for j := 0; !dd.CheckBreak(); j++ { - // rvkencname := dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapKey) - } - rvkencname := stringView(dd.DecodeBytes(f.d.b[:], true, true)) - // rvksi := ti.getForEncName(rvkencname) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if k := fti.indexForEncName(rvkencname); k > -1 { - si := tisfi[k] - if dd.TryDecodeAsNil() { - si.setToZeroValue(rv) - } else { - d.decodeValue(si.field(rv, true), nil) - } - } else { - d.structFieldNotFound(-1, rvkencname) - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - } else if ctyp == valueTypeArray { - containerLen := dd.ReadArrayStart() - if containerLen == 0 { - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } - return - } - // Not much gain from doing it two ways for array. - // Arrays are not used as much for structs. - hasLen := containerLen >= 0 - for j, si := range fti.sfip { - if hasLen { - if j == containerLen { - break - } - } else if dd.CheckBreak() { - break - } - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - if dd.TryDecodeAsNil() { - si.setToZeroValue(rv) - } else { - d.decodeValue(si.field(rv, true), nil) - } - } - if containerLen > len(fti.sfip) { - // read remaining values and throw away - for j := len(fti.sfip); j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - d.structFieldNotFound(j, "") - } - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } - } else { - f.d.error(onlyMapOrArrayCanDecodeIntoStructErr) - return - } -} - -func (f *decFnInfo) kSlice(rv reflect.Value) { - // A slice can be set from a map or array in stream. - // This way, the order can be kept (as order is lost with map). - ti := f.ti - d := f.d - dd := d.d - rtelem0 := ti.rt.Elem() - ctyp := dd.ContainerType() - if ctyp == valueTypeBytes || ctyp == valueTypeString { - // you can only decode bytes or string in the stream into a slice or array of bytes - if !(ti.rtid == uint8SliceTypId || rtelem0.Kind() == reflect.Uint8) { - f.d.errorf("bytes or string in the stream must be decoded into a slice or array of bytes, not %v", ti.rt) - } - if f.seq == seqTypeChan { - bs2 := dd.DecodeBytes(nil, false, true) - ch := rv.Interface().(chan<- byte) - for _, b := range bs2 { - ch <- b - } - } else { - rvbs := rv.Bytes() - bs2 := dd.DecodeBytes(rvbs, false, false) - if rvbs == nil && bs2 != nil || rvbs != nil && bs2 == nil || len(bs2) != len(rvbs) { - if rv.CanSet() { - rv.SetBytes(bs2) - } else { - copy(rvbs, bs2) - } - } - } - return - } - - // array := f.seq == seqTypeChan - - slh, containerLenS := d.decSliceHelperStart() // only expects valueType(Array|Map) - - // // an array can never return a nil slice. so no need to check f.array here. - if containerLenS == 0 { - if f.seq == seqTypeSlice { - if rv.IsNil() { - rv.Set(reflect.MakeSlice(ti.rt, 0, 0)) - } else { - rv.SetLen(0) - } - } else if f.seq == seqTypeChan { - if rv.IsNil() { - rv.Set(reflect.MakeChan(ti.rt, 0)) - } - } - slh.End() - return - } - - rtelem := rtelem0 - for rtelem.Kind() == reflect.Ptr { - rtelem = rtelem.Elem() - } - fn := d.getDecFn(rtelem, true, true) - - var rv0, rv9 reflect.Value - rv0 = rv - rvChanged := false - - // for j := 0; j < containerLenS; j++ { - var rvlen int - if containerLenS > 0 { // hasLen - if f.seq == seqTypeChan { - if rv.IsNil() { - rvlen, _ = decInferLen(containerLenS, f.d.h.MaxInitLen, int(rtelem0.Size())) - rv.Set(reflect.MakeChan(ti.rt, rvlen)) - } - // handle chan specially: - for j := 0; j < containerLenS; j++ { - rv9 = reflect.New(rtelem0).Elem() - slh.ElemContainerState(j) - d.decodeValue(rv9, fn) - rv.Send(rv9) - } - } else { // slice or array - var truncated bool // says len of sequence is not same as expected number of elements - numToRead := containerLenS // if truncated, reset numToRead - - rvcap := rv.Cap() - rvlen = rv.Len() - if containerLenS > rvcap { - if f.seq == seqTypeArray { - d.arrayCannotExpand(rvlen, containerLenS) - } else { - oldRvlenGtZero := rvlen > 0 - rvlen, truncated = decInferLen(containerLenS, f.d.h.MaxInitLen, int(rtelem0.Size())) - if truncated { - if rvlen <= rvcap { - rv.SetLen(rvlen) - } else { - rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) - rvChanged = true - } - } else { - rv = reflect.MakeSlice(ti.rt, rvlen, rvlen) - rvChanged = true - } - if rvChanged && oldRvlenGtZero && !isImmutableKind(rtelem0.Kind()) { - reflect.Copy(rv, rv0) // only copy up to length NOT cap i.e. rv0.Slice(0, rvcap) - } - rvcap = rvlen - } - numToRead = rvlen - } else if containerLenS != rvlen { - if f.seq == seqTypeSlice { - rv.SetLen(containerLenS) - rvlen = containerLenS - } - } - j := 0 - // we read up to the numToRead - for ; j < numToRead; j++ { - slh.ElemContainerState(j) - d.decodeValue(rv.Index(j), fn) - } - - // if slice, expand and read up to containerLenS (or EOF) iff truncated - // if array, swallow all the rest. - - if f.seq == seqTypeArray { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } else if truncated { // slice was truncated, as chan NOT in this block - for ; j < containerLenS; j++ { - rv = expandSliceValue(rv, 1) - rv9 = rv.Index(j) - if resetSliceElemToZeroValue { - rv9.Set(reflect.Zero(rtelem0)) - } - slh.ElemContainerState(j) - d.decodeValue(rv9, fn) - } - } - } - } else { - rvlen = rv.Len() - j := 0 - for ; !dd.CheckBreak(); j++ { - if f.seq == seqTypeChan { - slh.ElemContainerState(j) - rv9 = reflect.New(rtelem0).Elem() - d.decodeValue(rv9, fn) - rv.Send(rv9) - } else { - // if indefinite, etc, then expand the slice if necessary - var decodeIntoBlank bool - if j >= rvlen { - if f.seq == seqTypeArray { - d.arrayCannotExpand(rvlen, j+1) - decodeIntoBlank = true - } else { // if f.seq == seqTypeSlice - // rv = reflect.Append(rv, reflect.Zero(rtelem0)) // uses append logic, plus varargs - rv = expandSliceValue(rv, 1) - rv9 = rv.Index(j) - // rv.Index(rv.Len() - 1).Set(reflect.Zero(rtelem0)) - if resetSliceElemToZeroValue { - rv9.Set(reflect.Zero(rtelem0)) - } - rvlen++ - rvChanged = true - } - } else { // slice or array - rv9 = rv.Index(j) - } - slh.ElemContainerState(j) - if decodeIntoBlank { - d.swallow() - } else { // seqTypeSlice - d.decodeValue(rv9, fn) - } - } - } - if f.seq == seqTypeSlice { - if j < rvlen { - rv.SetLen(j) - } else if j == 0 && rv.IsNil() { - rv = reflect.MakeSlice(ti.rt, 0, 0) - rvChanged = true - } - } - } - slh.End() - - if rvChanged { - rv0.Set(rv) - } -} - -func (f *decFnInfo) kArray(rv reflect.Value) { - // f.d.decodeValue(rv.Slice(0, rv.Len())) - f.kSlice(rv.Slice(0, rv.Len())) -} - -func (f *decFnInfo) kMap(rv reflect.Value) { - d := f.d - dd := d.d - containerLen := dd.ReadMapStart() - cr := d.cr - ti := f.ti - if rv.IsNil() { - rv.Set(reflect.MakeMap(ti.rt)) - } - - if containerLen == 0 { - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return - } - - ktype, vtype := ti.rt.Key(), ti.rt.Elem() - ktypeId := reflect.ValueOf(ktype).Pointer() - vtypeKind := vtype.Kind() - var keyFn, valFn *decFn - var xtyp reflect.Type - for xtyp = ktype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() { - } - keyFn = d.getDecFn(xtyp, true, true) - for xtyp = vtype; xtyp.Kind() == reflect.Ptr; xtyp = xtyp.Elem() { - } - valFn = d.getDecFn(xtyp, true, true) - var mapGet, mapSet bool - if !f.d.h.MapValueReset { - // if pointer, mapGet = true - // if interface, mapGet = true if !DecodeNakedAlways (else false) - // if builtin, mapGet = false - // else mapGet = true - if vtypeKind == reflect.Ptr { - mapGet = true - } else if vtypeKind == reflect.Interface { - if !f.d.h.InterfaceReset { - mapGet = true - } - } else if !isImmutableKind(vtypeKind) { - mapGet = true - } - } - - var rvk, rvv, rvz reflect.Value - - // for j := 0; j < containerLen; j++ { - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - rvk = reflect.New(ktype).Elem() - if cr != nil { - cr.sendContainerState(containerMapKey) - } - d.decodeValue(rvk, keyFn) - - // special case if a byte array. - if ktypeId == intfTypId { - rvk = rvk.Elem() - if rvk.Type() == uint8SliceTyp { - rvk = reflect.ValueOf(d.string(rvk.Bytes())) - } - } - mapSet = true // set to false if u do a get, and its a pointer, and exists - if mapGet { - rvv = rv.MapIndex(rvk) - if rvv.IsValid() { - if vtypeKind == reflect.Ptr { - mapSet = false - } - } else { - if rvz.IsValid() { - rvz.Set(reflect.Zero(vtype)) - } else { - rvz = reflect.New(vtype).Elem() - } - rvv = rvz - } - } else { - if rvz.IsValid() { - rvz.Set(reflect.Zero(vtype)) - } else { - rvz = reflect.New(vtype).Elem() - } - rvv = rvz - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - d.decodeValue(rvv, valFn) - if mapSet { - rv.SetMapIndex(rvk, rvv) - } - } - } else { - for j := 0; !dd.CheckBreak(); j++ { - rvk = reflect.New(ktype).Elem() - if cr != nil { - cr.sendContainerState(containerMapKey) - } - d.decodeValue(rvk, keyFn) - - // special case if a byte array. - if ktypeId == intfTypId { - rvk = rvk.Elem() - if rvk.Type() == uint8SliceTyp { - rvk = reflect.ValueOf(d.string(rvk.Bytes())) - } - } - mapSet = true // set to false if u do a get, and its a pointer, and exists - if mapGet { - rvv = rv.MapIndex(rvk) - if rvv.IsValid() { - if vtypeKind == reflect.Ptr { - mapSet = false - } - } else { - if rvz.IsValid() { - rvz.Set(reflect.Zero(vtype)) - } else { - rvz = reflect.New(vtype).Elem() - } - rvv = rvz - } - } else { - if rvz.IsValid() { - rvz.Set(reflect.Zero(vtype)) - } else { - rvz = reflect.New(vtype).Elem() - } - rvv = rvz - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - d.decodeValue(rvv, valFn) - if mapSet { - rv.SetMapIndex(rvk, rvv) - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -type decRtidFn struct { - rtid uintptr - fn decFn -} - -// decNaked is used to keep track of the primitives decoded. -// Without it, we would have to decode each primitive and wrap it -// in an interface{}, causing an allocation. -// In this model, the primitives are decoded in a "pseudo-atomic" fashion, -// so we can rest assured that no other decoding happens while these -// primitives are being decoded. -// -// maps and arrays are not handled by this mechanism. -// However, RawExt is, and we accomodate for extensions that decode -// RawExt from DecodeNaked, but need to decode the value subsequently. -// kInterfaceNaked and swallow, which call DecodeNaked, handle this caveat. -// -// However, decNaked also keeps some arrays of default maps and slices -// used in DecodeNaked. This way, we can get a pointer to it -// without causing a new heap allocation. -// -// kInterfaceNaked will ensure that there is no allocation for the common -// uses. -type decNaked struct { - // r RawExt // used for RawExt, uint, []byte. - u uint64 - i int64 - f float64 - l []byte - s string - t time.Time - b bool - v valueType - - // stacks for reducing allocation - is []interface{} - ms []map[interface{}]interface{} - ns []map[string]interface{} - ss [][]interface{} - // rs []RawExt - - // keep arrays at the bottom? Chance is that they are not used much. - ia [4]interface{} - ma [4]map[interface{}]interface{} - na [4]map[string]interface{} - sa [4][]interface{} - // ra [2]RawExt -} - -func (n *decNaked) reset() { - if n.ss != nil { - n.ss = n.ss[:0] - } - if n.is != nil { - n.is = n.is[:0] - } - if n.ms != nil { - n.ms = n.ms[:0] - } - if n.ns != nil { - n.ns = n.ns[:0] - } -} - -// A Decoder reads and decodes an object from an input stream in the codec format. -type Decoder struct { - // hopefully, reduce derefencing cost by laying the decReader inside the Decoder. - // Try to put things that go together to fit within a cache line (8 words). - - d decDriver - // NOTE: Decoder shouldn't call it's read methods, - // as the handler MAY need to do some coordination. - r decReader - // sa [initCollectionCap]decRtidFn - h *BasicHandle - hh Handle - - be bool // is binary encoding - bytes bool // is bytes reader - js bool // is json handle - - rb bytesDecReader - ri ioDecReader - cr containerStateRecv - - s []decRtidFn - f map[uintptr]*decFn - - // _ uintptr // for alignment purposes, so next one starts from a cache line - - // cache the mapTypeId and sliceTypeId for faster comparisons - mtid uintptr - stid uintptr - - n decNaked - b [scratchByteArrayLen]byte - is map[string]string // used for interning strings -} - -// NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader. -// -// For efficiency, Users are encouraged to pass in a memory buffered reader -// (eg bufio.Reader, bytes.Buffer). -func NewDecoder(r io.Reader, h Handle) *Decoder { - d := newDecoder(h) - d.Reset(r) - return d -} - -// NewDecoderBytes returns a Decoder which efficiently decodes directly -// from a byte slice with zero copying. -func NewDecoderBytes(in []byte, h Handle) *Decoder { - d := newDecoder(h) - d.ResetBytes(in) - return d -} - -func newDecoder(h Handle) *Decoder { - d := &Decoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()} - n := &d.n - // n.rs = n.ra[:0] - n.ms = n.ma[:0] - n.is = n.ia[:0] - n.ns = n.na[:0] - n.ss = n.sa[:0] - _, d.js = h.(*JsonHandle) - if d.h.InternString { - d.is = make(map[string]string, 32) - } - d.d = h.newDecDriver(d) - d.cr, _ = d.d.(containerStateRecv) - // d.d = h.newDecDriver(decReaderT{true, &d.rb, &d.ri}) - return d -} - -func (d *Decoder) resetCommon() { - d.n.reset() - d.d.reset() - // reset all things which were cached from the Handle, - // but could be changed. - d.mtid, d.stid = 0, 0 - if d.h.MapType != nil { - d.mtid = reflect.ValueOf(d.h.MapType).Pointer() - } - if d.h.SliceType != nil { - d.stid = reflect.ValueOf(d.h.SliceType).Pointer() - } -} - -func (d *Decoder) Reset(r io.Reader) { - d.ri.x = &d.b - // d.s = d.sa[:0] - d.ri.bs.r = r - var ok bool - d.ri.br, ok = r.(decReaderByteScanner) - if !ok { - d.ri.br = &d.ri.bs - } - d.r = &d.ri - d.resetCommon() -} - -func (d *Decoder) ResetBytes(in []byte) { - // d.s = d.sa[:0] - d.rb.reset(in) - d.r = &d.rb - d.resetCommon() -} - -// func (d *Decoder) sendContainerState(c containerState) { -// if d.cr != nil { -// d.cr.sendContainerState(c) -// } -// } - -// Decode decodes the stream from reader and stores the result in the -// value pointed to by v. v cannot be a nil pointer. v can also be -// a reflect.Value of a pointer. -// -// Note that a pointer to a nil interface is not a nil pointer. -// If you do not know what type of stream it is, pass in a pointer to a nil interface. -// We will decode and store a value in that nil interface. -// -// Sample usages: -// // Decoding into a non-nil typed value -// var f float32 -// err = codec.NewDecoder(r, handle).Decode(&f) -// -// // Decoding into nil interface -// var v interface{} -// dec := codec.NewDecoder(r, handle) -// err = dec.Decode(&v) -// -// When decoding into a nil interface{}, we will decode into an appropriate value based -// on the contents of the stream: -// - Numbers are decoded as float64, int64 or uint64. -// - Other values are decoded appropriately depending on the type: -// bool, string, []byte, time.Time, etc -// - Extensions are decoded as RawExt (if no ext function registered for the tag) -// Configurations exist on the Handle to override defaults -// (e.g. for MapType, SliceType and how to decode raw bytes). -// -// When decoding into a non-nil interface{} value, the mode of encoding is based on the -// type of the value. When a value is seen: -// - If an extension is registered for it, call that extension function -// - If it implements BinaryUnmarshaler, call its UnmarshalBinary(data []byte) error -// - Else decode it based on its reflect.Kind -// -// There are some special rules when decoding into containers (slice/array/map/struct). -// Decode will typically use the stream contents to UPDATE the container. -// - A map can be decoded from a stream map, by updating matching keys. -// - A slice can be decoded from a stream array, -// by updating the first n elements, where n is length of the stream. -// - A slice can be decoded from a stream map, by decoding as if -// it contains a sequence of key-value pairs. -// - A struct can be decoded from a stream map, by updating matching fields. -// - A struct can be decoded from a stream array, -// by updating fields as they occur in the struct (by index). -// -// When decoding a stream map or array with length of 0 into a nil map or slice, -// we reset the destination map or slice to a zero-length value. -// -// However, when decoding a stream nil, we reset the destination container -// to its "zero" value (e.g. nil for slice/map, etc). -// -func (d *Decoder) Decode(v interface{}) (err error) { - defer panicToErr(&err) - d.decode(v) - return -} - -// this is not a smart swallow, as it allocates objects and does unnecessary work. -func (d *Decoder) swallowViaHammer() { - var blank interface{} - d.decodeValue(reflect.ValueOf(&blank).Elem(), nil) -} - -func (d *Decoder) swallow() { - // smarter decode that just swallows the content - dd := d.d - if dd.TryDecodeAsNil() { - return - } - cr := d.cr - switch dd.ContainerType() { - case valueTypeMap: - containerLen := dd.ReadMapStart() - clenGtEqualZero := containerLen >= 0 - for j := 0; ; j++ { - if clenGtEqualZero { - if j >= containerLen { - break - } - } else if dd.CheckBreak() { - break - } - if cr != nil { - cr.sendContainerState(containerMapKey) - } - d.swallow() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - d.swallow() - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - case valueTypeArray: - containerLenS := dd.ReadArrayStart() - clenGtEqualZero := containerLenS >= 0 - for j := 0; ; j++ { - if clenGtEqualZero { - if j >= containerLenS { - break - } - } else if dd.CheckBreak() { - break - } - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - d.swallow() - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } - case valueTypeBytes: - dd.DecodeBytes(d.b[:], false, true) - case valueTypeString: - dd.DecodeBytes(d.b[:], true, true) - // dd.DecodeStringAsBytes(d.b[:]) - default: - // these are all primitives, which we can get from decodeNaked - // if RawExt using Value, complete the processing. - dd.DecodeNaked() - if n := &d.n; n.v == valueTypeExt && n.l == nil { - l := len(n.is) - n.is = append(n.is, nil) - v2 := &n.is[l] - d.decode(v2) - n.is = n.is[:l] - } - } -} - -// MustDecode is like Decode, but panics if unable to Decode. -// This provides insight to the code location that triggered the error. -func (d *Decoder) MustDecode(v interface{}) { - d.decode(v) -} - -func (d *Decoder) decode(iv interface{}) { - // if ics, ok := iv.(Selfer); ok { - // ics.CodecDecodeSelf(d) - // return - // } - - if d.d.TryDecodeAsNil() { - switch v := iv.(type) { - case nil: - case *string: - *v = "" - case *bool: - *v = false - case *int: - *v = 0 - case *int8: - *v = 0 - case *int16: - *v = 0 - case *int32: - *v = 0 - case *int64: - *v = 0 - case *uint: - *v = 0 - case *uint8: - *v = 0 - case *uint16: - *v = 0 - case *uint32: - *v = 0 - case *uint64: - *v = 0 - case *float32: - *v = 0 - case *float64: - *v = 0 - case *[]uint8: - *v = nil - case reflect.Value: - if v.Kind() != reflect.Ptr || v.IsNil() { - d.errNotValidPtrValue(v) - } - // d.chkPtrValue(v) - v = v.Elem() - if v.IsValid() { - v.Set(reflect.Zero(v.Type())) - } - default: - rv := reflect.ValueOf(iv) - if rv.Kind() != reflect.Ptr || rv.IsNil() { - d.errNotValidPtrValue(rv) - } - // d.chkPtrValue(rv) - rv = rv.Elem() - if rv.IsValid() { - rv.Set(reflect.Zero(rv.Type())) - } - } - return - } - - switch v := iv.(type) { - case nil: - d.error(cannotDecodeIntoNilErr) - return - - case Selfer: - v.CodecDecodeSelf(d) - - case reflect.Value: - if v.Kind() != reflect.Ptr || v.IsNil() { - d.errNotValidPtrValue(v) - } - // d.chkPtrValue(v) - d.decodeValueNotNil(v.Elem(), nil) - - case *string: - *v = d.d.DecodeString() - case *bool: - *v = d.d.DecodeBool() - case *int: - *v = int(d.d.DecodeInt(intBitsize)) - case *int8: - *v = int8(d.d.DecodeInt(8)) - case *int16: - *v = int16(d.d.DecodeInt(16)) - case *int32: - *v = int32(d.d.DecodeInt(32)) - case *int64: - *v = d.d.DecodeInt(64) - case *uint: - *v = uint(d.d.DecodeUint(uintBitsize)) - case *uint8: - *v = uint8(d.d.DecodeUint(8)) - case *uint16: - *v = uint16(d.d.DecodeUint(16)) - case *uint32: - *v = uint32(d.d.DecodeUint(32)) - case *uint64: - *v = d.d.DecodeUint(64) - case *float32: - *v = float32(d.d.DecodeFloat(true)) - case *float64: - *v = d.d.DecodeFloat(false) - case *[]uint8: - *v = d.d.DecodeBytes(*v, false, false) - - case *interface{}: - d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil) - - default: - if !fastpathDecodeTypeSwitch(iv, d) { - d.decodeI(iv, true, false, false, false) - } - } -} - -func (d *Decoder) preDecodeValue(rv reflect.Value, tryNil bool) (rv2 reflect.Value, proceed bool) { - if tryNil && d.d.TryDecodeAsNil() { - // No need to check if a ptr, recursively, to determine - // whether to set value to nil. - // Just always set value to its zero type. - if rv.IsValid() { // rv.CanSet() // always settable, except it's invalid - rv.Set(reflect.Zero(rv.Type())) - } - return - } - - // If stream is not containing a nil value, then we can deref to the base - // non-pointer value, and decode into that. - for rv.Kind() == reflect.Ptr { - if rv.IsNil() { - rv.Set(reflect.New(rv.Type().Elem())) - } - rv = rv.Elem() - } - return rv, true -} - -func (d *Decoder) decodeI(iv interface{}, checkPtr, tryNil, checkFastpath, checkCodecSelfer bool) { - rv := reflect.ValueOf(iv) - if checkPtr { - if rv.Kind() != reflect.Ptr || rv.IsNil() { - d.errNotValidPtrValue(rv) - } - // d.chkPtrValue(rv) - } - rv, proceed := d.preDecodeValue(rv, tryNil) - if proceed { - fn := d.getDecFn(rv.Type(), checkFastpath, checkCodecSelfer) - fn.f(&fn.i, rv) - } -} - -func (d *Decoder) decodeValue(rv reflect.Value, fn *decFn) { - if rv, proceed := d.preDecodeValue(rv, true); proceed { - if fn == nil { - fn = d.getDecFn(rv.Type(), true, true) - } - fn.f(&fn.i, rv) - } -} - -func (d *Decoder) decodeValueNotNil(rv reflect.Value, fn *decFn) { - if rv, proceed := d.preDecodeValue(rv, false); proceed { - if fn == nil { - fn = d.getDecFn(rv.Type(), true, true) - } - fn.f(&fn.i, rv) - } -} - -func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool) (fn *decFn) { - rtid := reflect.ValueOf(rt).Pointer() - - // retrieve or register a focus'ed function for this type - // to eliminate need to do the retrieval multiple times - - // if d.f == nil && d.s == nil { debugf("---->Creating new dec f map for type: %v\n", rt) } - var ok bool - if useMapForCodecCache { - fn, ok = d.f[rtid] - } else { - for i := range d.s { - v := &(d.s[i]) - if v.rtid == rtid { - fn, ok = &(v.fn), true - break - } - } - } - if ok { - return - } - - if useMapForCodecCache { - if d.f == nil { - d.f = make(map[uintptr]*decFn, initCollectionCap) - } - fn = new(decFn) - d.f[rtid] = fn - } else { - if d.s == nil { - d.s = make([]decRtidFn, 0, initCollectionCap) - } - d.s = append(d.s, decRtidFn{rtid: rtid}) - fn = &(d.s[len(d.s)-1]).fn - } - - // debugf("\tCreating new dec fn for type: %v\n", rt) - ti := d.h.getTypeInfo(rtid, rt) - fi := &(fn.i) - fi.d = d - fi.ti = ti - - // An extension can be registered for any type, regardless of the Kind - // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc. - // - // We can't check if it's an extension byte here first, because the user may have - // registered a pointer or non-pointer type, meaning we may have to recurse first - // before matching a mapped type, even though the extension byte is already detected. - // - // NOTE: if decoding into a nil interface{}, we return a non-nil - // value except even if the container registers a length of 0. - if checkCodecSelfer && ti.cs { - fn.f = (*decFnInfo).selferUnmarshal - } else if rtid == rawExtTypId { - fn.f = (*decFnInfo).rawExt - } else if d.d.IsBuiltinType(rtid) { - fn.f = (*decFnInfo).builtin - } else if xfFn := d.h.getExt(rtid); xfFn != nil { - fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext - fn.f = (*decFnInfo).ext - } else if supportMarshalInterfaces && d.be && ti.bunm { - fn.f = (*decFnInfo).binaryUnmarshal - } else if supportMarshalInterfaces && !d.be && d.js && ti.junm { - //If JSON, we should check JSONUnmarshal before textUnmarshal - fn.f = (*decFnInfo).jsonUnmarshal - } else if supportMarshalInterfaces && !d.be && ti.tunm { - fn.f = (*decFnInfo).textUnmarshal - } else { - rk := rt.Kind() - if fastpathEnabled && checkFastpath && (rk == reflect.Map || rk == reflect.Slice) { - if rt.PkgPath() == "" { - if idx := fastpathAV.index(rtid); idx != -1 { - fn.f = fastpathAV[idx].decfn - } - } else { - // use mapping for underlying type if there - ok = false - var rtu reflect.Type - if rk == reflect.Map { - rtu = reflect.MapOf(rt.Key(), rt.Elem()) - } else { - rtu = reflect.SliceOf(rt.Elem()) - } - rtuid := reflect.ValueOf(rtu).Pointer() - if idx := fastpathAV.index(rtuid); idx != -1 { - xfnf := fastpathAV[idx].decfn - xrt := fastpathAV[idx].rt - fn.f = func(xf *decFnInfo, xrv reflect.Value) { - // xfnf(xf, xrv.Convert(xrt)) - xfnf(xf, xrv.Addr().Convert(reflect.PtrTo(xrt)).Elem()) - } - } - } - } - if fn.f == nil { - switch rk { - case reflect.String: - fn.f = (*decFnInfo).kString - case reflect.Bool: - fn.f = (*decFnInfo).kBool - case reflect.Int: - fn.f = (*decFnInfo).kInt - case reflect.Int64: - fn.f = (*decFnInfo).kInt64 - case reflect.Int32: - fn.f = (*decFnInfo).kInt32 - case reflect.Int8: - fn.f = (*decFnInfo).kInt8 - case reflect.Int16: - fn.f = (*decFnInfo).kInt16 - case reflect.Float32: - fn.f = (*decFnInfo).kFloat32 - case reflect.Float64: - fn.f = (*decFnInfo).kFloat64 - case reflect.Uint8: - fn.f = (*decFnInfo).kUint8 - case reflect.Uint64: - fn.f = (*decFnInfo).kUint64 - case reflect.Uint: - fn.f = (*decFnInfo).kUint - case reflect.Uint32: - fn.f = (*decFnInfo).kUint32 - case reflect.Uint16: - fn.f = (*decFnInfo).kUint16 - // case reflect.Ptr: - // fn.f = (*decFnInfo).kPtr - case reflect.Uintptr: - fn.f = (*decFnInfo).kUintptr - case reflect.Interface: - fn.f = (*decFnInfo).kInterface - case reflect.Struct: - fn.f = (*decFnInfo).kStruct - case reflect.Chan: - fi.seq = seqTypeChan - fn.f = (*decFnInfo).kSlice - case reflect.Slice: - fi.seq = seqTypeSlice - fn.f = (*decFnInfo).kSlice - case reflect.Array: - fi.seq = seqTypeArray - fn.f = (*decFnInfo).kArray - case reflect.Map: - fn.f = (*decFnInfo).kMap - default: - fn.f = (*decFnInfo).kErr - } - } - } - - return -} - -func (d *Decoder) structFieldNotFound(index int, rvkencname string) { - // NOTE: rvkencname may be a stringView, so don't pass it to another function. - if d.h.ErrorIfNoField { - if index >= 0 { - d.errorf("no matching struct field found when decoding stream array at index %v", index) - return - } else if rvkencname != "" { - d.errorf("no matching struct field found when decoding stream map with key " + rvkencname) - return - } - } - d.swallow() -} - -func (d *Decoder) arrayCannotExpand(sliceLen, streamLen int) { - if d.h.ErrorIfNoArrayExpand { - d.errorf("cannot expand array len during decode from %v to %v", sliceLen, streamLen) - } -} - -func (d *Decoder) chkPtrValue(rv reflect.Value) { - // We can only decode into a non-nil pointer - if rv.Kind() == reflect.Ptr && !rv.IsNil() { - return - } - d.errNotValidPtrValue(rv) -} - -func (d *Decoder) errNotValidPtrValue(rv reflect.Value) { - if !rv.IsValid() { - d.error(cannotDecodeIntoNilErr) - return - } - if !rv.CanInterface() { - d.errorf("cannot decode into a value without an interface: %v", rv) - return - } - rvi := rv.Interface() - d.errorf("cannot decode into non-pointer or nil pointer. Got: %v, %T, %v", rv.Kind(), rvi, rvi) -} - -func (d *Decoder) error(err error) { - panic(err) -} - -func (d *Decoder) errorf(format string, params ...interface{}) { - params2 := make([]interface{}, len(params)+1) - params2[0] = d.r.numread() - copy(params2[1:], params) - err := fmt.Errorf("[pos %d]: "+format, params2...) - panic(err) -} - -func (d *Decoder) string(v []byte) (s string) { - if d.is != nil { - s, ok := d.is[string(v)] // no allocation here. - if !ok { - s = string(v) - d.is[s] = s - } - return s - } - return string(v) // don't return stringView, as we need a real string here. -} - -func (d *Decoder) intern(s string) { - if d.is != nil { - d.is[s] = s - } -} - -// nextValueBytes returns the next value in the stream as a set of bytes. -func (d *Decoder) nextValueBytes() []byte { - d.d.uncacheRead() - d.r.track() - d.swallow() - return d.r.stopTrack() -} - -// -------------------------------------------------- - -// decSliceHelper assists when decoding into a slice, from a map or an array in the stream. -// A slice can be set from a map or array in stream. This supports the MapBySlice interface. -type decSliceHelper struct { - d *Decoder - // ct valueType - array bool -} - -func (d *Decoder) decSliceHelperStart() (x decSliceHelper, clen int) { - dd := d.d - ctyp := dd.ContainerType() - if ctyp == valueTypeArray { - x.array = true - clen = dd.ReadArrayStart() - } else if ctyp == valueTypeMap { - clen = dd.ReadMapStart() * 2 - } else { - d.errorf("only encoded map or array can be decoded into a slice (%d)", ctyp) - } - // x.ct = ctyp - x.d = d - return -} - -func (x decSliceHelper) End() { - cr := x.d.cr - if cr == nil { - return - } - if x.array { - cr.sendContainerState(containerArrayEnd) - } else { - cr.sendContainerState(containerMapEnd) - } -} - -func (x decSliceHelper) ElemContainerState(index int) { - cr := x.d.cr - if cr == nil { - return - } - if x.array { - cr.sendContainerState(containerArrayElem) - } else { - if index%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } -} - -func decByteSlice(r decReader, clen int, bs []byte) (bsOut []byte) { - if clen == 0 { - return zeroByteSlice - } - if len(bs) == clen { - bsOut = bs - } else if cap(bs) >= clen { - bsOut = bs[:clen] - } else { - bsOut = make([]byte, clen) - } - r.readb(bsOut) - return -} - -func detachZeroCopyBytes(isBytesReader bool, dest []byte, in []byte) (out []byte) { - if xlen := len(in); xlen > 0 { - if isBytesReader || xlen <= scratchByteArrayLen { - if cap(dest) >= xlen { - out = dest[:xlen] - } else { - out = make([]byte, xlen) - } - copy(out, in) - return - } - } - return in -} - -// decInferLen will infer a sensible length, given the following: -// - clen: length wanted. -// - maxlen: max length to be returned. -// if <= 0, it is unset, and we infer it based on the unit size -// - unit: number of bytes for each element of the collection -func decInferLen(clen, maxlen, unit int) (rvlen int, truncated bool) { - // handle when maxlen is not set i.e. <= 0 - if clen <= 0 { - return - } - if maxlen <= 0 { - // no maxlen defined. Use maximum of 256K memory, with a floor of 4K items. - // maxlen = 256 * 1024 / unit - // if maxlen < (4 * 1024) { - // maxlen = 4 * 1024 - // } - if unit < (256 / 4) { - maxlen = 256 * 1024 / unit - } else { - maxlen = 4 * 1024 - } - } - if clen > maxlen { - rvlen = maxlen - truncated = true - } else { - rvlen = clen - } - return - // if clen <= 0 { - // rvlen = 0 - // } else if maxlen > 0 && clen > maxlen { - // rvlen = maxlen - // truncated = true - // } else { - // rvlen = clen - // } - // return -} - -// // implement overall decReader wrapping both, for possible use inline: -// type decReaderT struct { -// bytes bool -// rb *bytesDecReader -// ri *ioDecReader -// } -// -// // implement *Decoder as a decReader. -// // Using decReaderT (defined just above) caused performance degradation -// // possibly because of constant copying the value, -// // and some value->interface conversion causing allocation. -// func (d *Decoder) unreadn1() { -// if d.bytes { -// d.rb.unreadn1() -// } else { -// d.ri.unreadn1() -// } -// } -// ... for other methods of decReader. -// Testing showed that performance improvement was negligible. diff --git a/vendor/github.com/ugorji/go/codec/encode.go b/vendor/github.com/ugorji/go/codec/encode.go deleted file mode 100644 index a60daa2360b8..000000000000 --- a/vendor/github.com/ugorji/go/codec/encode.go +++ /dev/null @@ -1,1422 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "encoding" - "fmt" - "io" - "reflect" - "sort" - "sync" -) - -const ( - defEncByteBufSize = 1 << 6 // 4:16, 6:64, 8:256, 10:1024 -) - -// AsSymbolFlag defines what should be encoded as symbols. -type AsSymbolFlag uint8 - -const ( - // AsSymbolDefault is default. - // Currently, this means only encode struct field names as symbols. - // The default is subject to change. - AsSymbolDefault AsSymbolFlag = iota - - // AsSymbolAll means encode anything which could be a symbol as a symbol. - AsSymbolAll = 0xfe - - // AsSymbolNone means do not encode anything as a symbol. - AsSymbolNone = 1 << iota - - // AsSymbolMapStringKeys means encode keys in map[string]XXX as symbols. - AsSymbolMapStringKeysFlag - - // AsSymbolStructFieldName means encode struct field names as symbols. - AsSymbolStructFieldNameFlag -) - -// encWriter abstracts writing to a byte array or to an io.Writer. -type encWriter interface { - writeb([]byte) - writestr(string) - writen1(byte) - writen2(byte, byte) - atEndOfEncode() -} - -// encDriver abstracts the actual codec (binc vs msgpack, etc) -type encDriver interface { - IsBuiltinType(rt uintptr) bool - EncodeBuiltin(rt uintptr, v interface{}) - EncodeNil() - EncodeInt(i int64) - EncodeUint(i uint64) - EncodeBool(b bool) - EncodeFloat32(f float32) - EncodeFloat64(f float64) - // encodeExtPreamble(xtag byte, length int) - EncodeRawExt(re *RawExt, e *Encoder) - EncodeExt(v interface{}, xtag uint64, ext Ext, e *Encoder) - EncodeArrayStart(length int) - EncodeMapStart(length int) - EncodeString(c charEncoding, v string) - EncodeSymbol(v string) - EncodeStringBytes(c charEncoding, v []byte) - //TODO - //encBignum(f *big.Int) - //encStringRunes(c charEncoding, v []rune) - - reset() -} - -type encDriverAsis interface { - EncodeAsis(v []byte) -} - -type encNoSeparator struct{} - -func (_ encNoSeparator) EncodeEnd() {} - -type ioEncWriterWriter interface { - WriteByte(c byte) error - WriteString(s string) (n int, err error) - Write(p []byte) (n int, err error) -} - -type ioEncStringWriter interface { - WriteString(s string) (n int, err error) -} - -type EncodeOptions struct { - // Encode a struct as an array, and not as a map - StructToArray bool - - // Canonical representation means that encoding a value will always result in the same - // sequence of bytes. - // - // This only affects maps, as the iteration order for maps is random. - // - // The implementation MAY use the natural sort order for the map keys if possible: - // - // - If there is a natural sort order (ie for number, bool, string or []byte keys), - // then the map keys are first sorted in natural order and then written - // with corresponding map values to the strema. - // - If there is no natural sort order, then the map keys will first be - // encoded into []byte, and then sorted, - // before writing the sorted keys and the corresponding map values to the stream. - // - Canonical bool - - // CheckCircularRef controls whether we check for circular references - // and error fast during an encode. - // - // If enabled, an error is received if a pointer to a struct - // references itself either directly or through one of its fields (iteratively). - // - // This is opt-in, as there may be a performance hit to checking circular references. - CheckCircularRef bool - - // AsSymbols defines what should be encoded as symbols. - // - // Encoding as symbols can reduce the encoded size significantly. - // - // However, during decoding, each string to be encoded as a symbol must - // be checked to see if it has been seen before. Consequently, encoding time - // will increase if using symbols, because string comparisons has a clear cost. - // - // Sample values: - // AsSymbolNone - // AsSymbolAll - // AsSymbolMapStringKeys - // AsSymbolMapStringKeysFlag | AsSymbolStructFieldNameFlag - AsSymbols AsSymbolFlag -} - -// --------------------------------------------- - -type simpleIoEncWriterWriter struct { - w io.Writer - bw io.ByteWriter - sw ioEncStringWriter - bs [1]byte -} - -func (o *simpleIoEncWriterWriter) WriteByte(c byte) (err error) { - if o.bw != nil { - return o.bw.WriteByte(c) - } - // _, err = o.w.Write([]byte{c}) - o.bs[0] = c - _, err = o.w.Write(o.bs[:]) - return -} - -func (o *simpleIoEncWriterWriter) WriteString(s string) (n int, err error) { - if o.sw != nil { - return o.sw.WriteString(s) - } - // return o.w.Write([]byte(s)) - return o.w.Write(bytesView(s)) -} - -func (o *simpleIoEncWriterWriter) Write(p []byte) (n int, err error) { - return o.w.Write(p) -} - -// ---------------------------------------- - -// ioEncWriter implements encWriter and can write to an io.Writer implementation -type ioEncWriter struct { - w ioEncWriterWriter - s simpleIoEncWriterWriter - // x [8]byte // temp byte array re-used internally for efficiency -} - -func (z *ioEncWriter) writeb(bs []byte) { - if len(bs) == 0 { - return - } - n, err := z.w.Write(bs) - if err != nil { - panic(err) - } - if n != len(bs) { - panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(bs), n)) - } -} - -func (z *ioEncWriter) writestr(s string) { - n, err := z.w.WriteString(s) - if err != nil { - panic(err) - } - if n != len(s) { - panic(fmt.Errorf("incorrect num bytes written. Expecting: %v, Wrote: %v", len(s), n)) - } -} - -func (z *ioEncWriter) writen1(b byte) { - if err := z.w.WriteByte(b); err != nil { - panic(err) - } -} - -func (z *ioEncWriter) writen2(b1 byte, b2 byte) { - z.writen1(b1) - z.writen1(b2) -} - -func (z *ioEncWriter) atEndOfEncode() {} - -// ---------------------------------------- - -// bytesEncWriter implements encWriter and can write to an byte slice. -// It is used by Marshal function. -type bytesEncWriter struct { - b []byte - c int // cursor - out *[]byte // write out on atEndOfEncode -} - -func (z *bytesEncWriter) writeb(s []byte) { - if len(s) > 0 { - c := z.grow(len(s)) - copy(z.b[c:], s) - } -} - -func (z *bytesEncWriter) writestr(s string) { - if len(s) > 0 { - c := z.grow(len(s)) - copy(z.b[c:], s) - } -} - -func (z *bytesEncWriter) writen1(b1 byte) { - c := z.grow(1) - z.b[c] = b1 -} - -func (z *bytesEncWriter) writen2(b1 byte, b2 byte) { - c := z.grow(2) - z.b[c] = b1 - z.b[c+1] = b2 -} - -func (z *bytesEncWriter) atEndOfEncode() { - *(z.out) = z.b[:z.c] -} - -func (z *bytesEncWriter) grow(n int) (oldcursor int) { - oldcursor = z.c - z.c = oldcursor + n - if z.c > len(z.b) { - if z.c > cap(z.b) { - // appendslice logic (if cap < 1024, *2, else *1.25): more expensive. many copy calls. - // bytes.Buffer model (2*cap + n): much better - // bs := make([]byte, 2*cap(z.b)+n) - bs := make([]byte, growCap(cap(z.b), 1, n)) - copy(bs, z.b[:oldcursor]) - z.b = bs - } else { - z.b = z.b[:cap(z.b)] - } - } - return -} - -// --------------------------------------------- - -type encFnInfo struct { - e *Encoder - ti *typeInfo - xfFn Ext - xfTag uint64 - seq seqType -} - -func (f *encFnInfo) builtin(rv reflect.Value) { - f.e.e.EncodeBuiltin(f.ti.rtid, rv.Interface()) -} - -func (f *encFnInfo) rawExt(rv reflect.Value) { - // rev := rv.Interface().(RawExt) - // f.e.e.EncodeRawExt(&rev, f.e) - var re *RawExt - if rv.CanAddr() { - re = rv.Addr().Interface().(*RawExt) - } else { - rev := rv.Interface().(RawExt) - re = &rev - } - f.e.e.EncodeRawExt(re, f.e) -} - -func (f *encFnInfo) ext(rv reflect.Value) { - // if this is a struct|array and it was addressable, then pass the address directly (not the value) - if k := rv.Kind(); (k == reflect.Struct || k == reflect.Array) && rv.CanAddr() { - rv = rv.Addr() - } - f.e.e.EncodeExt(rv.Interface(), f.xfTag, f.xfFn, f.e) -} - -func (f *encFnInfo) getValueForMarshalInterface(rv reflect.Value, indir int8) (v interface{}, proceed bool) { - if indir == 0 { - v = rv.Interface() - } else if indir == -1 { - // If a non-pointer was passed to Encode(), then that value is not addressable. - // Take addr if addresable, else copy value to an addressable value. - if rv.CanAddr() { - v = rv.Addr().Interface() - } else { - rv2 := reflect.New(rv.Type()) - rv2.Elem().Set(rv) - v = rv2.Interface() - // fmt.Printf("rv.Type: %v, rv2.Type: %v, v: %v\n", rv.Type(), rv2.Type(), v) - } - } else { - for j := int8(0); j < indir; j++ { - if rv.IsNil() { - f.e.e.EncodeNil() - return - } - rv = rv.Elem() - } - v = rv.Interface() - } - return v, true -} - -func (f *encFnInfo) selferMarshal(rv reflect.Value) { - if v, proceed := f.getValueForMarshalInterface(rv, f.ti.csIndir); proceed { - v.(Selfer).CodecEncodeSelf(f.e) - } -} - -func (f *encFnInfo) binaryMarshal(rv reflect.Value) { - if v, proceed := f.getValueForMarshalInterface(rv, f.ti.bmIndir); proceed { - bs, fnerr := v.(encoding.BinaryMarshaler).MarshalBinary() - f.e.marshal(bs, fnerr, false, c_RAW) - } -} - -func (f *encFnInfo) textMarshal(rv reflect.Value) { - if v, proceed := f.getValueForMarshalInterface(rv, f.ti.tmIndir); proceed { - // debugf(">>>> encoding.TextMarshaler: %T", rv.Interface()) - bs, fnerr := v.(encoding.TextMarshaler).MarshalText() - f.e.marshal(bs, fnerr, false, c_UTF8) - } -} - -func (f *encFnInfo) jsonMarshal(rv reflect.Value) { - if v, proceed := f.getValueForMarshalInterface(rv, f.ti.jmIndir); proceed { - bs, fnerr := v.(jsonMarshaler).MarshalJSON() - f.e.marshal(bs, fnerr, true, c_UTF8) - } -} - -func (f *encFnInfo) kBool(rv reflect.Value) { - f.e.e.EncodeBool(rv.Bool()) -} - -func (f *encFnInfo) kString(rv reflect.Value) { - f.e.e.EncodeString(c_UTF8, rv.String()) -} - -func (f *encFnInfo) kFloat64(rv reflect.Value) { - f.e.e.EncodeFloat64(rv.Float()) -} - -func (f *encFnInfo) kFloat32(rv reflect.Value) { - f.e.e.EncodeFloat32(float32(rv.Float())) -} - -func (f *encFnInfo) kInt(rv reflect.Value) { - f.e.e.EncodeInt(rv.Int()) -} - -func (f *encFnInfo) kUint(rv reflect.Value) { - f.e.e.EncodeUint(rv.Uint()) -} - -func (f *encFnInfo) kInvalid(rv reflect.Value) { - f.e.e.EncodeNil() -} - -func (f *encFnInfo) kErr(rv reflect.Value) { - f.e.errorf("unsupported kind %s, for %#v", rv.Kind(), rv) -} - -func (f *encFnInfo) kSlice(rv reflect.Value) { - ti := f.ti - // array may be non-addressable, so we have to manage with care - // (don't call rv.Bytes, rv.Slice, etc). - // E.g. type struct S{B [2]byte}; - // Encode(S{}) will bomb on "panic: slice of unaddressable array". - e := f.e - if f.seq != seqTypeArray { - if rv.IsNil() { - e.e.EncodeNil() - return - } - // If in this method, then there was no extension function defined. - // So it's okay to treat as []byte. - if ti.rtid == uint8SliceTypId { - e.e.EncodeStringBytes(c_RAW, rv.Bytes()) - return - } - } - cr := e.cr - rtelem := ti.rt.Elem() - l := rv.Len() - if ti.rtid == uint8SliceTypId || rtelem.Kind() == reflect.Uint8 { - switch f.seq { - case seqTypeArray: - // if l == 0 { e.e.encodeStringBytes(c_RAW, nil) } else - if rv.CanAddr() { - e.e.EncodeStringBytes(c_RAW, rv.Slice(0, l).Bytes()) - } else { - var bs []byte - if l <= cap(e.b) { - bs = e.b[:l] - } else { - bs = make([]byte, l) - } - reflect.Copy(reflect.ValueOf(bs), rv) - // TODO: Test that reflect.Copy works instead of manual one-by-one - // for i := 0; i < l; i++ { - // bs[i] = byte(rv.Index(i).Uint()) - // } - e.e.EncodeStringBytes(c_RAW, bs) - } - case seqTypeSlice: - e.e.EncodeStringBytes(c_RAW, rv.Bytes()) - case seqTypeChan: - bs := e.b[:0] - // do not use range, so that the number of elements encoded - // does not change, and encoding does not hang waiting on someone to close chan. - // for b := range rv.Interface().(<-chan byte) { - // bs = append(bs, b) - // } - ch := rv.Interface().(<-chan byte) - for i := 0; i < l; i++ { - bs = append(bs, <-ch) - } - e.e.EncodeStringBytes(c_RAW, bs) - } - return - } - - if ti.mbs { - if l%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", l) - return - } - e.e.EncodeMapStart(l / 2) - } else { - e.e.EncodeArrayStart(l) - } - - if l > 0 { - for rtelem.Kind() == reflect.Ptr { - rtelem = rtelem.Elem() - } - // if kind is reflect.Interface, do not pre-determine the - // encoding type, because preEncodeValue may break it down to - // a concrete type and kInterface will bomb. - var fn *encFn - if rtelem.Kind() != reflect.Interface { - rtelemid := reflect.ValueOf(rtelem).Pointer() - fn = e.getEncFn(rtelemid, rtelem, true, true) - } - // TODO: Consider perf implication of encoding odd index values as symbols if type is string - for j := 0; j < l; j++ { - if cr != nil { - if ti.mbs { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } else { - cr.sendContainerState(containerArrayElem) - } - } - if f.seq == seqTypeChan { - if rv2, ok2 := rv.Recv(); ok2 { - e.encodeValue(rv2, fn) - } else { - e.encode(nil) // WE HAVE TO DO SOMETHING, so nil if nothing received. - } - } else { - e.encodeValue(rv.Index(j), fn) - } - } - } - - if cr != nil { - if ti.mbs { - cr.sendContainerState(containerMapEnd) - } else { - cr.sendContainerState(containerArrayEnd) - } - } -} - -func (f *encFnInfo) kStruct(rv reflect.Value) { - fti := f.ti - e := f.e - cr := e.cr - tisfi := fti.sfip - toMap := !(fti.toArray || e.h.StructToArray) - newlen := len(fti.sfi) - - // Use sync.Pool to reduce allocating slices unnecessarily. - // The cost of sync.Pool is less than the cost of new allocation. - pool, poolv, fkvs := encStructPoolGet(newlen) - - // if toMap, use the sorted array. If toArray, use unsorted array (to match sequence in struct) - if toMap { - tisfi = fti.sfi - } - newlen = 0 - var kv stringRv - for _, si := range tisfi { - kv.r = si.field(rv, false) - if toMap { - if si.omitEmpty && isEmptyValue(kv.r) { - continue - } - kv.v = si.encName - } else { - // use the zero value. - // if a reference or struct, set to nil (so you do not output too much) - if si.omitEmpty && isEmptyValue(kv.r) { - switch kv.r.Kind() { - case reflect.Struct, reflect.Interface, reflect.Ptr, reflect.Array, - reflect.Map, reflect.Slice: - kv.r = reflect.Value{} //encode as nil - } - } - } - fkvs[newlen] = kv - newlen++ - } - - // debugf(">>>> kStruct: newlen: %v", newlen) - // sep := !e.be - ee := e.e //don't dereference everytime - - if toMap { - ee.EncodeMapStart(newlen) - // asSymbols := e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0 - asSymbols := e.h.AsSymbols == AsSymbolDefault || e.h.AsSymbols&AsSymbolStructFieldNameFlag != 0 - for j := 0; j < newlen; j++ { - kv = fkvs[j] - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(kv.v) - } else { - ee.EncodeString(c_UTF8, kv.v) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(kv.r, nil) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - } else { - ee.EncodeArrayStart(newlen) - for j := 0; j < newlen; j++ { - kv = fkvs[j] - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - e.encodeValue(kv.r, nil) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } - } - - // do not use defer. Instead, use explicit pool return at end of function. - // defer has a cost we are trying to avoid. - // If there is a panic and these slices are not returned, it is ok. - if pool != nil { - pool.Put(poolv) - } -} - -// func (f *encFnInfo) kPtr(rv reflect.Value) { -// debugf(">>>>>>> ??? encode kPtr called - shouldn't get called") -// if rv.IsNil() { -// f.e.e.encodeNil() -// return -// } -// f.e.encodeValue(rv.Elem()) -// } - -// func (f *encFnInfo) kInterface(rv reflect.Value) { -// println("kInterface called") -// debug.PrintStack() -// if rv.IsNil() { -// f.e.e.EncodeNil() -// return -// } -// f.e.encodeValue(rv.Elem(), nil) -// } - -func (f *encFnInfo) kMap(rv reflect.Value) { - ee := f.e.e - if rv.IsNil() { - ee.EncodeNil() - return - } - - l := rv.Len() - ee.EncodeMapStart(l) - e := f.e - cr := e.cr - if l == 0 { - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return - } - var asSymbols bool - // determine the underlying key and val encFn's for the map. - // This eliminates some work which is done for each loop iteration i.e. - // rv.Type(), ref.ValueOf(rt).Pointer(), then check map/list for fn. - // - // However, if kind is reflect.Interface, do not pre-determine the - // encoding type, because preEncodeValue may break it down to - // a concrete type and kInterface will bomb. - var keyFn, valFn *encFn - ti := f.ti - rtkey := ti.rt.Key() - rtval := ti.rt.Elem() - rtkeyid := reflect.ValueOf(rtkey).Pointer() - // keyTypeIsString := f.ti.rt.Key().Kind() == reflect.String - var keyTypeIsString = rtkeyid == stringTypId - if keyTypeIsString { - asSymbols = e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - } else { - for rtkey.Kind() == reflect.Ptr { - rtkey = rtkey.Elem() - } - if rtkey.Kind() != reflect.Interface { - rtkeyid = reflect.ValueOf(rtkey).Pointer() - keyFn = e.getEncFn(rtkeyid, rtkey, true, true) - } - } - for rtval.Kind() == reflect.Ptr { - rtval = rtval.Elem() - } - if rtval.Kind() != reflect.Interface { - rtvalid := reflect.ValueOf(rtval).Pointer() - valFn = e.getEncFn(rtvalid, rtval, true, true) - } - mks := rv.MapKeys() - // for j, lmks := 0, len(mks); j < lmks; j++ { - - if e.h.Canonical { - e.kMapCanonical(rtkeyid, rtkey, rv, mks, valFn, asSymbols) - } else { - for j := range mks { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if keyTypeIsString { - if asSymbols { - ee.EncodeSymbol(mks[j].String()) - } else { - ee.EncodeString(c_UTF8, mks[j].String()) - } - } else { - e.encodeValue(mks[j], keyFn) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mks[j]), valFn) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (e *Encoder) kMapCanonical(rtkeyid uintptr, rtkey reflect.Type, rv reflect.Value, mks []reflect.Value, valFn *encFn, asSymbols bool) { - ee := e.e - cr := e.cr - // we previously did out-of-band if an extension was registered. - // This is not necessary, as the natural kind is sufficient for ordering. - - if rtkeyid == uint8SliceTypId { - mksv := make([]bytesRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Bytes() - } - sort.Sort(bytesRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeStringBytes(c_RAW, mksv[i].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - } else { - switch rtkey.Kind() { - case reflect.Bool: - mksv := make([]boolRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Bool() - } - sort.Sort(boolRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(mksv[i].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - case reflect.String: - mksv := make([]stringRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.String() - } - sort.Sort(stringRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(mksv[i].v) - } else { - ee.EncodeString(c_UTF8, mksv[i].v) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint, reflect.Uintptr: - mksv := make([]uintRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Uint() - } - sort.Sort(uintRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(mksv[i].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - mksv := make([]intRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Int() - } - sort.Sort(intRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(mksv[i].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - case reflect.Float32: - mksv := make([]floatRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Float() - } - sort.Sort(floatRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(mksv[i].v)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - case reflect.Float64: - mksv := make([]floatRv, len(mks)) - for i, k := range mks { - v := &mksv[i] - v.r = k - v.v = k.Float() - } - sort.Sort(floatRvSlice(mksv)) - for i := range mksv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(mksv[i].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksv[i].r), valFn) - } - default: - // out-of-band - // first encode each key to a []byte first, then sort them, then record - var mksv []byte = make([]byte, 0, len(mks)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - mksbv := make([]bytesRv, len(mks)) - for i, k := range mks { - v := &mksbv[i] - l := len(mksv) - e2.MustEncode(k) - v.r = k - v.v = mksv[l:] - // fmt.Printf(">>>>> %s\n", mksv[l:]) - } - sort.Sort(bytesRvSlice(mksbv)) - for j := range mksbv { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(mksbv[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encodeValue(rv.MapIndex(mksbv[j].r), valFn) - } - } - } -} - -// -------------------------------------------------- - -// encFn encapsulates the captured variables and the encode function. -// This way, we only do some calculations one times, and pass to the -// code block that should be called (encapsulated in a function) -// instead of executing the checks every time. -type encFn struct { - i encFnInfo - f func(*encFnInfo, reflect.Value) -} - -// -------------------------------------------------- - -type encRtidFn struct { - rtid uintptr - fn encFn -} - -// An Encoder writes an object to an output stream in the codec format. -type Encoder struct { - // hopefully, reduce derefencing cost by laying the encWriter inside the Encoder - e encDriver - // NOTE: Encoder shouldn't call it's write methods, - // as the handler MAY need to do some coordination. - w encWriter - s []encRtidFn - ci set - be bool // is binary encoding - js bool // is json handle - - wi ioEncWriter - wb bytesEncWriter - - h *BasicHandle - hh Handle - - cr containerStateRecv - as encDriverAsis - - f map[uintptr]*encFn - b [scratchByteArrayLen]byte -} - -// NewEncoder returns an Encoder for encoding into an io.Writer. -// -// For efficiency, Users are encouraged to pass in a memory buffered writer -// (eg bufio.Writer, bytes.Buffer). -func NewEncoder(w io.Writer, h Handle) *Encoder { - e := newEncoder(h) - e.Reset(w) - return e -} - -// NewEncoderBytes returns an encoder for encoding directly and efficiently -// into a byte slice, using zero-copying to temporary slices. -// -// It will potentially replace the output byte slice pointed to. -// After encoding, the out parameter contains the encoded contents. -func NewEncoderBytes(out *[]byte, h Handle) *Encoder { - e := newEncoder(h) - e.ResetBytes(out) - return e -} - -func newEncoder(h Handle) *Encoder { - e := &Encoder{hh: h, h: h.getBasicHandle(), be: h.isBinary()} - _, e.js = h.(*JsonHandle) - e.e = h.newEncDriver(e) - e.as, _ = e.e.(encDriverAsis) - e.cr, _ = e.e.(containerStateRecv) - return e -} - -// Reset the Encoder with a new output stream. -// -// This accomodates using the state of the Encoder, -// where it has "cached" information about sub-engines. -func (e *Encoder) Reset(w io.Writer) { - ww, ok := w.(ioEncWriterWriter) - if ok { - e.wi.w = ww - } else { - sww := &e.wi.s - sww.w = w - sww.bw, _ = w.(io.ByteWriter) - sww.sw, _ = w.(ioEncStringWriter) - e.wi.w = sww - //ww = bufio.NewWriterSize(w, defEncByteBufSize) - } - e.w = &e.wi - e.e.reset() -} - -func (e *Encoder) ResetBytes(out *[]byte) { - in := *out - if in == nil { - in = make([]byte, defEncByteBufSize) - } - e.wb.b, e.wb.out, e.wb.c = in, out, 0 - e.w = &e.wb - e.e.reset() -} - -// func (e *Encoder) sendContainerState(c containerState) { -// if e.cr != nil { -// e.cr.sendContainerState(c) -// } -// } - -// Encode writes an object into a stream. -// -// Encoding can be configured via the struct tag for the fields. -// The "codec" key in struct field's tag value is the key name, -// followed by an optional comma and options. -// Note that the "json" key is used in the absence of the "codec" key. -// -// To set an option on all fields (e.g. omitempty on all fields), you -// can create a field called _struct, and set flags on it. -// -// Struct values "usually" encode as maps. Each exported struct field is encoded unless: -// - the field's tag is "-", OR -// - the field is empty (empty or the zero value) and its tag specifies the "omitempty" option. -// -// When encoding as a map, the first string in the tag (before the comma) -// is the map key string to use when encoding. -// -// However, struct values may encode as arrays. This happens when: -// - StructToArray Encode option is set, OR -// - the tag on the _struct field sets the "toarray" option -// -// Values with types that implement MapBySlice are encoded as stream maps. -// -// The empty values (for omitempty option) are false, 0, any nil pointer -// or interface value, and any array, slice, map, or string of length zero. -// -// Anonymous fields are encoded inline except: -// - the struct tag specifies a replacement name (first value) -// - the field is of an interface type -// -// Examples: -// -// // NOTE: 'json:' can be used as struct tag key, in place 'codec:' below. -// type MyStruct struct { -// _struct bool `codec:",omitempty"` //set omitempty for every field -// Field1 string `codec:"-"` //skip this field -// Field2 int `codec:"myName"` //Use key "myName" in encode stream -// Field3 int32 `codec:",omitempty"` //use key "Field3". Omit if empty. -// Field4 bool `codec:"f4,omitempty"` //use key "f4". Omit if empty. -// io.Reader //use key "Reader". -// MyStruct `codec:"my1" //use key "my1". -// MyStruct //inline it -// ... -// } -// -// type MyStruct struct { -// _struct bool `codec:",omitempty,toarray"` //set omitempty for every field -// //and encode struct as an array -// } -// -// The mode of encoding is based on the type of the value. When a value is seen: -// - If a Selfer, call its CodecEncodeSelf method -// - If an extension is registered for it, call that extension function -// - If it implements encoding.(Binary|Text|JSON)Marshaler, call its Marshal(Binary|Text|JSON) method -// - Else encode it based on its reflect.Kind -// -// Note that struct field names and keys in map[string]XXX will be treated as symbols. -// Some formats support symbols (e.g. binc) and will properly encode the string -// only once in the stream, and use a tag to refer to it thereafter. -func (e *Encoder) Encode(v interface{}) (err error) { - defer panicToErr(&err) - e.encode(v) - e.w.atEndOfEncode() - return -} - -// MustEncode is like Encode, but panics if unable to Encode. -// This provides insight to the code location that triggered the error. -func (e *Encoder) MustEncode(v interface{}) { - e.encode(v) - e.w.atEndOfEncode() -} - -// comment out these (Must)Write methods. They were only put there to support cbor. -// However, users already have access to the streams, and can write directly. -// -// // Write allows users write to the Encoder stream directly. -// func (e *Encoder) Write(bs []byte) (err error) { -// defer panicToErr(&err) -// e.w.writeb(bs) -// return -// } -// // MustWrite is like write, but panics if unable to Write. -// func (e *Encoder) MustWrite(bs []byte) { -// e.w.writeb(bs) -// } - -func (e *Encoder) encode(iv interface{}) { - // if ics, ok := iv.(Selfer); ok { - // ics.CodecEncodeSelf(e) - // return - // } - - switch v := iv.(type) { - case nil: - e.e.EncodeNil() - case Selfer: - v.CodecEncodeSelf(e) - - case reflect.Value: - e.encodeValue(v, nil) - - case string: - e.e.EncodeString(c_UTF8, v) - case bool: - e.e.EncodeBool(v) - case int: - e.e.EncodeInt(int64(v)) - case int8: - e.e.EncodeInt(int64(v)) - case int16: - e.e.EncodeInt(int64(v)) - case int32: - e.e.EncodeInt(int64(v)) - case int64: - e.e.EncodeInt(v) - case uint: - e.e.EncodeUint(uint64(v)) - case uint8: - e.e.EncodeUint(uint64(v)) - case uint16: - e.e.EncodeUint(uint64(v)) - case uint32: - e.e.EncodeUint(uint64(v)) - case uint64: - e.e.EncodeUint(v) - case float32: - e.e.EncodeFloat32(v) - case float64: - e.e.EncodeFloat64(v) - - case []uint8: - e.e.EncodeStringBytes(c_RAW, v) - - case *string: - e.e.EncodeString(c_UTF8, *v) - case *bool: - e.e.EncodeBool(*v) - case *int: - e.e.EncodeInt(int64(*v)) - case *int8: - e.e.EncodeInt(int64(*v)) - case *int16: - e.e.EncodeInt(int64(*v)) - case *int32: - e.e.EncodeInt(int64(*v)) - case *int64: - e.e.EncodeInt(*v) - case *uint: - e.e.EncodeUint(uint64(*v)) - case *uint8: - e.e.EncodeUint(uint64(*v)) - case *uint16: - e.e.EncodeUint(uint64(*v)) - case *uint32: - e.e.EncodeUint(uint64(*v)) - case *uint64: - e.e.EncodeUint(*v) - case *float32: - e.e.EncodeFloat32(*v) - case *float64: - e.e.EncodeFloat64(*v) - - case *[]uint8: - e.e.EncodeStringBytes(c_RAW, *v) - - default: - const checkCodecSelfer1 = true // in case T is passed, where *T is a Selfer, still checkCodecSelfer - if !fastpathEncodeTypeSwitch(iv, e) { - e.encodeI(iv, false, checkCodecSelfer1) - } - } -} - -func (e *Encoder) preEncodeValue(rv reflect.Value) (rv2 reflect.Value, sptr uintptr, proceed bool) { - // use a goto statement instead of a recursive function for ptr/interface. -TOP: - switch rv.Kind() { - case reflect.Ptr: - if rv.IsNil() { - e.e.EncodeNil() - return - } - rv = rv.Elem() - if e.h.CheckCircularRef && rv.Kind() == reflect.Struct { - // TODO: Movable pointers will be an issue here. Future problem. - sptr = rv.UnsafeAddr() - break TOP - } - goto TOP - case reflect.Interface: - if rv.IsNil() { - e.e.EncodeNil() - return - } - rv = rv.Elem() - goto TOP - case reflect.Slice, reflect.Map: - if rv.IsNil() { - e.e.EncodeNil() - return - } - case reflect.Invalid, reflect.Func: - e.e.EncodeNil() - return - } - - proceed = true - rv2 = rv - return -} - -func (e *Encoder) doEncodeValue(rv reflect.Value, fn *encFn, sptr uintptr, - checkFastpath, checkCodecSelfer bool) { - if sptr != 0 { - if (&e.ci).add(sptr) { - e.errorf("circular reference found: # %d", sptr) - } - } - if fn == nil { - rt := rv.Type() - rtid := reflect.ValueOf(rt).Pointer() - // fn = e.getEncFn(rtid, rt, true, true) - fn = e.getEncFn(rtid, rt, checkFastpath, checkCodecSelfer) - } - fn.f(&fn.i, rv) - if sptr != 0 { - (&e.ci).remove(sptr) - } -} - -func (e *Encoder) encodeI(iv interface{}, checkFastpath, checkCodecSelfer bool) { - if rv, sptr, proceed := e.preEncodeValue(reflect.ValueOf(iv)); proceed { - e.doEncodeValue(rv, nil, sptr, checkFastpath, checkCodecSelfer) - } -} - -func (e *Encoder) encodeValue(rv reflect.Value, fn *encFn) { - // if a valid fn is passed, it MUST BE for the dereferenced type of rv - if rv, sptr, proceed := e.preEncodeValue(rv); proceed { - e.doEncodeValue(rv, fn, sptr, true, true) - } -} - -func (e *Encoder) getEncFn(rtid uintptr, rt reflect.Type, checkFastpath, checkCodecSelfer bool) (fn *encFn) { - // rtid := reflect.ValueOf(rt).Pointer() - var ok bool - if useMapForCodecCache { - fn, ok = e.f[rtid] - } else { - for i := range e.s { - v := &(e.s[i]) - if v.rtid == rtid { - fn, ok = &(v.fn), true - break - } - } - } - if ok { - return - } - - if useMapForCodecCache { - if e.f == nil { - e.f = make(map[uintptr]*encFn, initCollectionCap) - } - fn = new(encFn) - e.f[rtid] = fn - } else { - if e.s == nil { - e.s = make([]encRtidFn, 0, initCollectionCap) - } - e.s = append(e.s, encRtidFn{rtid: rtid}) - fn = &(e.s[len(e.s)-1]).fn - } - - ti := e.h.getTypeInfo(rtid, rt) - fi := &(fn.i) - fi.e = e - fi.ti = ti - - if checkCodecSelfer && ti.cs { - fn.f = (*encFnInfo).selferMarshal - } else if rtid == rawExtTypId { - fn.f = (*encFnInfo).rawExt - } else if e.e.IsBuiltinType(rtid) { - fn.f = (*encFnInfo).builtin - } else if xfFn := e.h.getExt(rtid); xfFn != nil { - fi.xfTag, fi.xfFn = xfFn.tag, xfFn.ext - fn.f = (*encFnInfo).ext - } else if supportMarshalInterfaces && e.be && ti.bm { - fn.f = (*encFnInfo).binaryMarshal - } else if supportMarshalInterfaces && !e.be && e.js && ti.jm { - //If JSON, we should check JSONMarshal before textMarshal - fn.f = (*encFnInfo).jsonMarshal - } else if supportMarshalInterfaces && !e.be && ti.tm { - fn.f = (*encFnInfo).textMarshal - } else { - rk := rt.Kind() - if fastpathEnabled && checkFastpath && (rk == reflect.Map || rk == reflect.Slice) { - if rt.PkgPath() == "" { // un-named slice or map - if idx := fastpathAV.index(rtid); idx != -1 { - fn.f = fastpathAV[idx].encfn - } - } else { - ok = false - // use mapping for underlying type if there - var rtu reflect.Type - if rk == reflect.Map { - rtu = reflect.MapOf(rt.Key(), rt.Elem()) - } else { - rtu = reflect.SliceOf(rt.Elem()) - } - rtuid := reflect.ValueOf(rtu).Pointer() - if idx := fastpathAV.index(rtuid); idx != -1 { - xfnf := fastpathAV[idx].encfn - xrt := fastpathAV[idx].rt - fn.f = func(xf *encFnInfo, xrv reflect.Value) { - xfnf(xf, xrv.Convert(xrt)) - } - } - } - } - if fn.f == nil { - switch rk { - case reflect.Bool: - fn.f = (*encFnInfo).kBool - case reflect.String: - fn.f = (*encFnInfo).kString - case reflect.Float64: - fn.f = (*encFnInfo).kFloat64 - case reflect.Float32: - fn.f = (*encFnInfo).kFloat32 - case reflect.Int, reflect.Int8, reflect.Int64, reflect.Int32, reflect.Int16: - fn.f = (*encFnInfo).kInt - case reflect.Uint8, reflect.Uint64, reflect.Uint, reflect.Uint32, reflect.Uint16, reflect.Uintptr: - fn.f = (*encFnInfo).kUint - case reflect.Invalid: - fn.f = (*encFnInfo).kInvalid - case reflect.Chan: - fi.seq = seqTypeChan - fn.f = (*encFnInfo).kSlice - case reflect.Slice: - fi.seq = seqTypeSlice - fn.f = (*encFnInfo).kSlice - case reflect.Array: - fi.seq = seqTypeArray - fn.f = (*encFnInfo).kSlice - case reflect.Struct: - fn.f = (*encFnInfo).kStruct - // reflect.Ptr and reflect.Interface are handled already by preEncodeValue - // case reflect.Ptr: - // fn.f = (*encFnInfo).kPtr - // case reflect.Interface: - // fn.f = (*encFnInfo).kInterface - case reflect.Map: - fn.f = (*encFnInfo).kMap - default: - fn.f = (*encFnInfo).kErr - } - } - } - - return -} - -func (e *Encoder) marshal(bs []byte, fnerr error, asis bool, c charEncoding) { - if fnerr != nil { - panic(fnerr) - } - if bs == nil { - e.e.EncodeNil() - } else if asis { - e.asis(bs) - } else { - e.e.EncodeStringBytes(c, bs) - } -} - -func (e *Encoder) asis(v []byte) { - if e.as == nil { - e.w.writeb(v) - } else { - e.as.EncodeAsis(v) - } -} - -func (e *Encoder) errorf(format string, params ...interface{}) { - err := fmt.Errorf(format, params...) - panic(err) -} - -// ---------------------------------------- - -const encStructPoolLen = 5 - -// encStructPool is an array of sync.Pool. -// Each element of the array pools one of encStructPool(8|16|32|64). -// It allows the re-use of slices up to 64 in length. -// A performance cost of encoding structs was collecting -// which values were empty and should be omitted. -// We needed slices of reflect.Value and string to collect them. -// This shared pool reduces the amount of unnecessary creation we do. -// The cost is that of locking sometimes, but sync.Pool is efficient -// enough to reduce thread contention. -var encStructPool [encStructPoolLen]sync.Pool - -func init() { - encStructPool[0].New = func() interface{} { return new([8]stringRv) } - encStructPool[1].New = func() interface{} { return new([16]stringRv) } - encStructPool[2].New = func() interface{} { return new([32]stringRv) } - encStructPool[3].New = func() interface{} { return new([64]stringRv) } - encStructPool[4].New = func() interface{} { return new([128]stringRv) } -} - -func encStructPoolGet(newlen int) (p *sync.Pool, v interface{}, s []stringRv) { - // if encStructPoolLen != 5 { // constant chec, so removed at build time. - // panic(errors.New("encStructPoolLen must be equal to 4")) // defensive, in case it is changed - // } - // idxpool := newlen / 8 - if newlen <= 8 { - p = &encStructPool[0] - v = p.Get() - s = v.(*[8]stringRv)[:newlen] - } else if newlen <= 16 { - p = &encStructPool[1] - v = p.Get() - s = v.(*[16]stringRv)[:newlen] - } else if newlen <= 32 { - p = &encStructPool[2] - v = p.Get() - s = v.(*[32]stringRv)[:newlen] - } else if newlen <= 64 { - p = &encStructPool[3] - v = p.Get() - s = v.(*[64]stringRv)[:newlen] - } else if newlen <= 128 { - p = &encStructPool[4] - v = p.Get() - s = v.(*[128]stringRv)[:newlen] - } else { - s = make([]stringRv, newlen) - } - return -} - -// ---------------------------------------- - -// func encErr(format string, params ...interface{}) { -// doPanic(msgTagEnc, format, params...) -// } diff --git a/vendor/github.com/ugorji/go/codec/fast-path.generated.go b/vendor/github.com/ugorji/go/codec/fast-path.generated.go deleted file mode 100644 index cf6e00df2174..000000000000 --- a/vendor/github.com/ugorji/go/codec/fast-path.generated.go +++ /dev/null @@ -1,39365 +0,0 @@ -// +build !notfastpath - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED from fast-path.go.tmpl -// ************************************************************ - -package codec - -// Fast path functions try to create a fast path encode or decode implementation -// for common maps and slices. -// -// We define the functions and register then in this single file -// so as not to pollute the encode.go and decode.go, and create a dependency in there. -// This file can be omitted without causing a build failure. -// -// The advantage of fast paths is: -// - Many calls bypass reflection altogether -// -// Currently support -// - slice of all builtin types, -// - map of all builtin types to string or interface value -// - symetrical maps of all builtin types (e.g. str-str, uint8-uint8) -// This should provide adequate "typical" implementations. -// -// Note that fast track decode functions must handle values for which an address cannot be obtained. -// For example: -// m2 := map[string]int{} -// p2 := []interface{}{m2} -// // decoding into p2 will bomb if fast track functions do not treat like unaddressable. -// - -import ( - "reflect" - "sort" -) - -const fastpathCheckNilFalse = false // for reflect -const fastpathCheckNilTrue = true // for type switch - -type fastpathT struct{} - -var fastpathTV fastpathT - -type fastpathE struct { - rtid uintptr - rt reflect.Type - encfn func(*encFnInfo, reflect.Value) - decfn func(*decFnInfo, reflect.Value) -} - -type fastpathA [271]fastpathE - -func (x *fastpathA) index(rtid uintptr) int { - // use binary search to grab the index (adapted from sort/search.go) - h, i, j := 0, 0, 271 // len(x) - for i < j { - h = i + (j-i)/2 - if x[h].rtid < rtid { - i = h + 1 - } else { - j = h - } - } - if i < 271 && x[i].rtid == rtid { - return i - } - return -1 -} - -type fastpathAslice []fastpathE - -func (x fastpathAslice) Len() int { return len(x) } -func (x fastpathAslice) Less(i, j int) bool { return x[i].rtid < x[j].rtid } -func (x fastpathAslice) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -var fastpathAV fastpathA - -// due to possible initialization loop error, make fastpath in an init() -func init() { - if !fastpathEnabled { - return - } - i := 0 - fn := func(v interface{}, fe func(*encFnInfo, reflect.Value), fd func(*decFnInfo, reflect.Value)) (f fastpathE) { - xrt := reflect.TypeOf(v) - xptr := reflect.ValueOf(xrt).Pointer() - fastpathAV[i] = fastpathE{xptr, xrt, fe, fd} - i++ - return - } - - fn([]interface{}(nil), (*encFnInfo).fastpathEncSliceIntfR, (*decFnInfo).fastpathDecSliceIntfR) - fn([]string(nil), (*encFnInfo).fastpathEncSliceStringR, (*decFnInfo).fastpathDecSliceStringR) - fn([]float32(nil), (*encFnInfo).fastpathEncSliceFloat32R, (*decFnInfo).fastpathDecSliceFloat32R) - fn([]float64(nil), (*encFnInfo).fastpathEncSliceFloat64R, (*decFnInfo).fastpathDecSliceFloat64R) - fn([]uint(nil), (*encFnInfo).fastpathEncSliceUintR, (*decFnInfo).fastpathDecSliceUintR) - fn([]uint16(nil), (*encFnInfo).fastpathEncSliceUint16R, (*decFnInfo).fastpathDecSliceUint16R) - fn([]uint32(nil), (*encFnInfo).fastpathEncSliceUint32R, (*decFnInfo).fastpathDecSliceUint32R) - fn([]uint64(nil), (*encFnInfo).fastpathEncSliceUint64R, (*decFnInfo).fastpathDecSliceUint64R) - fn([]uintptr(nil), (*encFnInfo).fastpathEncSliceUintptrR, (*decFnInfo).fastpathDecSliceUintptrR) - fn([]int(nil), (*encFnInfo).fastpathEncSliceIntR, (*decFnInfo).fastpathDecSliceIntR) - fn([]int8(nil), (*encFnInfo).fastpathEncSliceInt8R, (*decFnInfo).fastpathDecSliceInt8R) - fn([]int16(nil), (*encFnInfo).fastpathEncSliceInt16R, (*decFnInfo).fastpathDecSliceInt16R) - fn([]int32(nil), (*encFnInfo).fastpathEncSliceInt32R, (*decFnInfo).fastpathDecSliceInt32R) - fn([]int64(nil), (*encFnInfo).fastpathEncSliceInt64R, (*decFnInfo).fastpathDecSliceInt64R) - fn([]bool(nil), (*encFnInfo).fastpathEncSliceBoolR, (*decFnInfo).fastpathDecSliceBoolR) - - fn(map[interface{}]interface{}(nil), (*encFnInfo).fastpathEncMapIntfIntfR, (*decFnInfo).fastpathDecMapIntfIntfR) - fn(map[interface{}]string(nil), (*encFnInfo).fastpathEncMapIntfStringR, (*decFnInfo).fastpathDecMapIntfStringR) - fn(map[interface{}]uint(nil), (*encFnInfo).fastpathEncMapIntfUintR, (*decFnInfo).fastpathDecMapIntfUintR) - fn(map[interface{}]uint8(nil), (*encFnInfo).fastpathEncMapIntfUint8R, (*decFnInfo).fastpathDecMapIntfUint8R) - fn(map[interface{}]uint16(nil), (*encFnInfo).fastpathEncMapIntfUint16R, (*decFnInfo).fastpathDecMapIntfUint16R) - fn(map[interface{}]uint32(nil), (*encFnInfo).fastpathEncMapIntfUint32R, (*decFnInfo).fastpathDecMapIntfUint32R) - fn(map[interface{}]uint64(nil), (*encFnInfo).fastpathEncMapIntfUint64R, (*decFnInfo).fastpathDecMapIntfUint64R) - fn(map[interface{}]uintptr(nil), (*encFnInfo).fastpathEncMapIntfUintptrR, (*decFnInfo).fastpathDecMapIntfUintptrR) - fn(map[interface{}]int(nil), (*encFnInfo).fastpathEncMapIntfIntR, (*decFnInfo).fastpathDecMapIntfIntR) - fn(map[interface{}]int8(nil), (*encFnInfo).fastpathEncMapIntfInt8R, (*decFnInfo).fastpathDecMapIntfInt8R) - fn(map[interface{}]int16(nil), (*encFnInfo).fastpathEncMapIntfInt16R, (*decFnInfo).fastpathDecMapIntfInt16R) - fn(map[interface{}]int32(nil), (*encFnInfo).fastpathEncMapIntfInt32R, (*decFnInfo).fastpathDecMapIntfInt32R) - fn(map[interface{}]int64(nil), (*encFnInfo).fastpathEncMapIntfInt64R, (*decFnInfo).fastpathDecMapIntfInt64R) - fn(map[interface{}]float32(nil), (*encFnInfo).fastpathEncMapIntfFloat32R, (*decFnInfo).fastpathDecMapIntfFloat32R) - fn(map[interface{}]float64(nil), (*encFnInfo).fastpathEncMapIntfFloat64R, (*decFnInfo).fastpathDecMapIntfFloat64R) - fn(map[interface{}]bool(nil), (*encFnInfo).fastpathEncMapIntfBoolR, (*decFnInfo).fastpathDecMapIntfBoolR) - fn(map[string]interface{}(nil), (*encFnInfo).fastpathEncMapStringIntfR, (*decFnInfo).fastpathDecMapStringIntfR) - fn(map[string]string(nil), (*encFnInfo).fastpathEncMapStringStringR, (*decFnInfo).fastpathDecMapStringStringR) - fn(map[string]uint(nil), (*encFnInfo).fastpathEncMapStringUintR, (*decFnInfo).fastpathDecMapStringUintR) - fn(map[string]uint8(nil), (*encFnInfo).fastpathEncMapStringUint8R, (*decFnInfo).fastpathDecMapStringUint8R) - fn(map[string]uint16(nil), (*encFnInfo).fastpathEncMapStringUint16R, (*decFnInfo).fastpathDecMapStringUint16R) - fn(map[string]uint32(nil), (*encFnInfo).fastpathEncMapStringUint32R, (*decFnInfo).fastpathDecMapStringUint32R) - fn(map[string]uint64(nil), (*encFnInfo).fastpathEncMapStringUint64R, (*decFnInfo).fastpathDecMapStringUint64R) - fn(map[string]uintptr(nil), (*encFnInfo).fastpathEncMapStringUintptrR, (*decFnInfo).fastpathDecMapStringUintptrR) - fn(map[string]int(nil), (*encFnInfo).fastpathEncMapStringIntR, (*decFnInfo).fastpathDecMapStringIntR) - fn(map[string]int8(nil), (*encFnInfo).fastpathEncMapStringInt8R, (*decFnInfo).fastpathDecMapStringInt8R) - fn(map[string]int16(nil), (*encFnInfo).fastpathEncMapStringInt16R, (*decFnInfo).fastpathDecMapStringInt16R) - fn(map[string]int32(nil), (*encFnInfo).fastpathEncMapStringInt32R, (*decFnInfo).fastpathDecMapStringInt32R) - fn(map[string]int64(nil), (*encFnInfo).fastpathEncMapStringInt64R, (*decFnInfo).fastpathDecMapStringInt64R) - fn(map[string]float32(nil), (*encFnInfo).fastpathEncMapStringFloat32R, (*decFnInfo).fastpathDecMapStringFloat32R) - fn(map[string]float64(nil), (*encFnInfo).fastpathEncMapStringFloat64R, (*decFnInfo).fastpathDecMapStringFloat64R) - fn(map[string]bool(nil), (*encFnInfo).fastpathEncMapStringBoolR, (*decFnInfo).fastpathDecMapStringBoolR) - fn(map[float32]interface{}(nil), (*encFnInfo).fastpathEncMapFloat32IntfR, (*decFnInfo).fastpathDecMapFloat32IntfR) - fn(map[float32]string(nil), (*encFnInfo).fastpathEncMapFloat32StringR, (*decFnInfo).fastpathDecMapFloat32StringR) - fn(map[float32]uint(nil), (*encFnInfo).fastpathEncMapFloat32UintR, (*decFnInfo).fastpathDecMapFloat32UintR) - fn(map[float32]uint8(nil), (*encFnInfo).fastpathEncMapFloat32Uint8R, (*decFnInfo).fastpathDecMapFloat32Uint8R) - fn(map[float32]uint16(nil), (*encFnInfo).fastpathEncMapFloat32Uint16R, (*decFnInfo).fastpathDecMapFloat32Uint16R) - fn(map[float32]uint32(nil), (*encFnInfo).fastpathEncMapFloat32Uint32R, (*decFnInfo).fastpathDecMapFloat32Uint32R) - fn(map[float32]uint64(nil), (*encFnInfo).fastpathEncMapFloat32Uint64R, (*decFnInfo).fastpathDecMapFloat32Uint64R) - fn(map[float32]uintptr(nil), (*encFnInfo).fastpathEncMapFloat32UintptrR, (*decFnInfo).fastpathDecMapFloat32UintptrR) - fn(map[float32]int(nil), (*encFnInfo).fastpathEncMapFloat32IntR, (*decFnInfo).fastpathDecMapFloat32IntR) - fn(map[float32]int8(nil), (*encFnInfo).fastpathEncMapFloat32Int8R, (*decFnInfo).fastpathDecMapFloat32Int8R) - fn(map[float32]int16(nil), (*encFnInfo).fastpathEncMapFloat32Int16R, (*decFnInfo).fastpathDecMapFloat32Int16R) - fn(map[float32]int32(nil), (*encFnInfo).fastpathEncMapFloat32Int32R, (*decFnInfo).fastpathDecMapFloat32Int32R) - fn(map[float32]int64(nil), (*encFnInfo).fastpathEncMapFloat32Int64R, (*decFnInfo).fastpathDecMapFloat32Int64R) - fn(map[float32]float32(nil), (*encFnInfo).fastpathEncMapFloat32Float32R, (*decFnInfo).fastpathDecMapFloat32Float32R) - fn(map[float32]float64(nil), (*encFnInfo).fastpathEncMapFloat32Float64R, (*decFnInfo).fastpathDecMapFloat32Float64R) - fn(map[float32]bool(nil), (*encFnInfo).fastpathEncMapFloat32BoolR, (*decFnInfo).fastpathDecMapFloat32BoolR) - fn(map[float64]interface{}(nil), (*encFnInfo).fastpathEncMapFloat64IntfR, (*decFnInfo).fastpathDecMapFloat64IntfR) - fn(map[float64]string(nil), (*encFnInfo).fastpathEncMapFloat64StringR, (*decFnInfo).fastpathDecMapFloat64StringR) - fn(map[float64]uint(nil), (*encFnInfo).fastpathEncMapFloat64UintR, (*decFnInfo).fastpathDecMapFloat64UintR) - fn(map[float64]uint8(nil), (*encFnInfo).fastpathEncMapFloat64Uint8R, (*decFnInfo).fastpathDecMapFloat64Uint8R) - fn(map[float64]uint16(nil), (*encFnInfo).fastpathEncMapFloat64Uint16R, (*decFnInfo).fastpathDecMapFloat64Uint16R) - fn(map[float64]uint32(nil), (*encFnInfo).fastpathEncMapFloat64Uint32R, (*decFnInfo).fastpathDecMapFloat64Uint32R) - fn(map[float64]uint64(nil), (*encFnInfo).fastpathEncMapFloat64Uint64R, (*decFnInfo).fastpathDecMapFloat64Uint64R) - fn(map[float64]uintptr(nil), (*encFnInfo).fastpathEncMapFloat64UintptrR, (*decFnInfo).fastpathDecMapFloat64UintptrR) - fn(map[float64]int(nil), (*encFnInfo).fastpathEncMapFloat64IntR, (*decFnInfo).fastpathDecMapFloat64IntR) - fn(map[float64]int8(nil), (*encFnInfo).fastpathEncMapFloat64Int8R, (*decFnInfo).fastpathDecMapFloat64Int8R) - fn(map[float64]int16(nil), (*encFnInfo).fastpathEncMapFloat64Int16R, (*decFnInfo).fastpathDecMapFloat64Int16R) - fn(map[float64]int32(nil), (*encFnInfo).fastpathEncMapFloat64Int32R, (*decFnInfo).fastpathDecMapFloat64Int32R) - fn(map[float64]int64(nil), (*encFnInfo).fastpathEncMapFloat64Int64R, (*decFnInfo).fastpathDecMapFloat64Int64R) - fn(map[float64]float32(nil), (*encFnInfo).fastpathEncMapFloat64Float32R, (*decFnInfo).fastpathDecMapFloat64Float32R) - fn(map[float64]float64(nil), (*encFnInfo).fastpathEncMapFloat64Float64R, (*decFnInfo).fastpathDecMapFloat64Float64R) - fn(map[float64]bool(nil), (*encFnInfo).fastpathEncMapFloat64BoolR, (*decFnInfo).fastpathDecMapFloat64BoolR) - fn(map[uint]interface{}(nil), (*encFnInfo).fastpathEncMapUintIntfR, (*decFnInfo).fastpathDecMapUintIntfR) - fn(map[uint]string(nil), (*encFnInfo).fastpathEncMapUintStringR, (*decFnInfo).fastpathDecMapUintStringR) - fn(map[uint]uint(nil), (*encFnInfo).fastpathEncMapUintUintR, (*decFnInfo).fastpathDecMapUintUintR) - fn(map[uint]uint8(nil), (*encFnInfo).fastpathEncMapUintUint8R, (*decFnInfo).fastpathDecMapUintUint8R) - fn(map[uint]uint16(nil), (*encFnInfo).fastpathEncMapUintUint16R, (*decFnInfo).fastpathDecMapUintUint16R) - fn(map[uint]uint32(nil), (*encFnInfo).fastpathEncMapUintUint32R, (*decFnInfo).fastpathDecMapUintUint32R) - fn(map[uint]uint64(nil), (*encFnInfo).fastpathEncMapUintUint64R, (*decFnInfo).fastpathDecMapUintUint64R) - fn(map[uint]uintptr(nil), (*encFnInfo).fastpathEncMapUintUintptrR, (*decFnInfo).fastpathDecMapUintUintptrR) - fn(map[uint]int(nil), (*encFnInfo).fastpathEncMapUintIntR, (*decFnInfo).fastpathDecMapUintIntR) - fn(map[uint]int8(nil), (*encFnInfo).fastpathEncMapUintInt8R, (*decFnInfo).fastpathDecMapUintInt8R) - fn(map[uint]int16(nil), (*encFnInfo).fastpathEncMapUintInt16R, (*decFnInfo).fastpathDecMapUintInt16R) - fn(map[uint]int32(nil), (*encFnInfo).fastpathEncMapUintInt32R, (*decFnInfo).fastpathDecMapUintInt32R) - fn(map[uint]int64(nil), (*encFnInfo).fastpathEncMapUintInt64R, (*decFnInfo).fastpathDecMapUintInt64R) - fn(map[uint]float32(nil), (*encFnInfo).fastpathEncMapUintFloat32R, (*decFnInfo).fastpathDecMapUintFloat32R) - fn(map[uint]float64(nil), (*encFnInfo).fastpathEncMapUintFloat64R, (*decFnInfo).fastpathDecMapUintFloat64R) - fn(map[uint]bool(nil), (*encFnInfo).fastpathEncMapUintBoolR, (*decFnInfo).fastpathDecMapUintBoolR) - fn(map[uint8]interface{}(nil), (*encFnInfo).fastpathEncMapUint8IntfR, (*decFnInfo).fastpathDecMapUint8IntfR) - fn(map[uint8]string(nil), (*encFnInfo).fastpathEncMapUint8StringR, (*decFnInfo).fastpathDecMapUint8StringR) - fn(map[uint8]uint(nil), (*encFnInfo).fastpathEncMapUint8UintR, (*decFnInfo).fastpathDecMapUint8UintR) - fn(map[uint8]uint8(nil), (*encFnInfo).fastpathEncMapUint8Uint8R, (*decFnInfo).fastpathDecMapUint8Uint8R) - fn(map[uint8]uint16(nil), (*encFnInfo).fastpathEncMapUint8Uint16R, (*decFnInfo).fastpathDecMapUint8Uint16R) - fn(map[uint8]uint32(nil), (*encFnInfo).fastpathEncMapUint8Uint32R, (*decFnInfo).fastpathDecMapUint8Uint32R) - fn(map[uint8]uint64(nil), (*encFnInfo).fastpathEncMapUint8Uint64R, (*decFnInfo).fastpathDecMapUint8Uint64R) - fn(map[uint8]uintptr(nil), (*encFnInfo).fastpathEncMapUint8UintptrR, (*decFnInfo).fastpathDecMapUint8UintptrR) - fn(map[uint8]int(nil), (*encFnInfo).fastpathEncMapUint8IntR, (*decFnInfo).fastpathDecMapUint8IntR) - fn(map[uint8]int8(nil), (*encFnInfo).fastpathEncMapUint8Int8R, (*decFnInfo).fastpathDecMapUint8Int8R) - fn(map[uint8]int16(nil), (*encFnInfo).fastpathEncMapUint8Int16R, (*decFnInfo).fastpathDecMapUint8Int16R) - fn(map[uint8]int32(nil), (*encFnInfo).fastpathEncMapUint8Int32R, (*decFnInfo).fastpathDecMapUint8Int32R) - fn(map[uint8]int64(nil), (*encFnInfo).fastpathEncMapUint8Int64R, (*decFnInfo).fastpathDecMapUint8Int64R) - fn(map[uint8]float32(nil), (*encFnInfo).fastpathEncMapUint8Float32R, (*decFnInfo).fastpathDecMapUint8Float32R) - fn(map[uint8]float64(nil), (*encFnInfo).fastpathEncMapUint8Float64R, (*decFnInfo).fastpathDecMapUint8Float64R) - fn(map[uint8]bool(nil), (*encFnInfo).fastpathEncMapUint8BoolR, (*decFnInfo).fastpathDecMapUint8BoolR) - fn(map[uint16]interface{}(nil), (*encFnInfo).fastpathEncMapUint16IntfR, (*decFnInfo).fastpathDecMapUint16IntfR) - fn(map[uint16]string(nil), (*encFnInfo).fastpathEncMapUint16StringR, (*decFnInfo).fastpathDecMapUint16StringR) - fn(map[uint16]uint(nil), (*encFnInfo).fastpathEncMapUint16UintR, (*decFnInfo).fastpathDecMapUint16UintR) - fn(map[uint16]uint8(nil), (*encFnInfo).fastpathEncMapUint16Uint8R, (*decFnInfo).fastpathDecMapUint16Uint8R) - fn(map[uint16]uint16(nil), (*encFnInfo).fastpathEncMapUint16Uint16R, (*decFnInfo).fastpathDecMapUint16Uint16R) - fn(map[uint16]uint32(nil), (*encFnInfo).fastpathEncMapUint16Uint32R, (*decFnInfo).fastpathDecMapUint16Uint32R) - fn(map[uint16]uint64(nil), (*encFnInfo).fastpathEncMapUint16Uint64R, (*decFnInfo).fastpathDecMapUint16Uint64R) - fn(map[uint16]uintptr(nil), (*encFnInfo).fastpathEncMapUint16UintptrR, (*decFnInfo).fastpathDecMapUint16UintptrR) - fn(map[uint16]int(nil), (*encFnInfo).fastpathEncMapUint16IntR, (*decFnInfo).fastpathDecMapUint16IntR) - fn(map[uint16]int8(nil), (*encFnInfo).fastpathEncMapUint16Int8R, (*decFnInfo).fastpathDecMapUint16Int8R) - fn(map[uint16]int16(nil), (*encFnInfo).fastpathEncMapUint16Int16R, (*decFnInfo).fastpathDecMapUint16Int16R) - fn(map[uint16]int32(nil), (*encFnInfo).fastpathEncMapUint16Int32R, (*decFnInfo).fastpathDecMapUint16Int32R) - fn(map[uint16]int64(nil), (*encFnInfo).fastpathEncMapUint16Int64R, (*decFnInfo).fastpathDecMapUint16Int64R) - fn(map[uint16]float32(nil), (*encFnInfo).fastpathEncMapUint16Float32R, (*decFnInfo).fastpathDecMapUint16Float32R) - fn(map[uint16]float64(nil), (*encFnInfo).fastpathEncMapUint16Float64R, (*decFnInfo).fastpathDecMapUint16Float64R) - fn(map[uint16]bool(nil), (*encFnInfo).fastpathEncMapUint16BoolR, (*decFnInfo).fastpathDecMapUint16BoolR) - fn(map[uint32]interface{}(nil), (*encFnInfo).fastpathEncMapUint32IntfR, (*decFnInfo).fastpathDecMapUint32IntfR) - fn(map[uint32]string(nil), (*encFnInfo).fastpathEncMapUint32StringR, (*decFnInfo).fastpathDecMapUint32StringR) - fn(map[uint32]uint(nil), (*encFnInfo).fastpathEncMapUint32UintR, (*decFnInfo).fastpathDecMapUint32UintR) - fn(map[uint32]uint8(nil), (*encFnInfo).fastpathEncMapUint32Uint8R, (*decFnInfo).fastpathDecMapUint32Uint8R) - fn(map[uint32]uint16(nil), (*encFnInfo).fastpathEncMapUint32Uint16R, (*decFnInfo).fastpathDecMapUint32Uint16R) - fn(map[uint32]uint32(nil), (*encFnInfo).fastpathEncMapUint32Uint32R, (*decFnInfo).fastpathDecMapUint32Uint32R) - fn(map[uint32]uint64(nil), (*encFnInfo).fastpathEncMapUint32Uint64R, (*decFnInfo).fastpathDecMapUint32Uint64R) - fn(map[uint32]uintptr(nil), (*encFnInfo).fastpathEncMapUint32UintptrR, (*decFnInfo).fastpathDecMapUint32UintptrR) - fn(map[uint32]int(nil), (*encFnInfo).fastpathEncMapUint32IntR, (*decFnInfo).fastpathDecMapUint32IntR) - fn(map[uint32]int8(nil), (*encFnInfo).fastpathEncMapUint32Int8R, (*decFnInfo).fastpathDecMapUint32Int8R) - fn(map[uint32]int16(nil), (*encFnInfo).fastpathEncMapUint32Int16R, (*decFnInfo).fastpathDecMapUint32Int16R) - fn(map[uint32]int32(nil), (*encFnInfo).fastpathEncMapUint32Int32R, (*decFnInfo).fastpathDecMapUint32Int32R) - fn(map[uint32]int64(nil), (*encFnInfo).fastpathEncMapUint32Int64R, (*decFnInfo).fastpathDecMapUint32Int64R) - fn(map[uint32]float32(nil), (*encFnInfo).fastpathEncMapUint32Float32R, (*decFnInfo).fastpathDecMapUint32Float32R) - fn(map[uint32]float64(nil), (*encFnInfo).fastpathEncMapUint32Float64R, (*decFnInfo).fastpathDecMapUint32Float64R) - fn(map[uint32]bool(nil), (*encFnInfo).fastpathEncMapUint32BoolR, (*decFnInfo).fastpathDecMapUint32BoolR) - fn(map[uint64]interface{}(nil), (*encFnInfo).fastpathEncMapUint64IntfR, (*decFnInfo).fastpathDecMapUint64IntfR) - fn(map[uint64]string(nil), (*encFnInfo).fastpathEncMapUint64StringR, (*decFnInfo).fastpathDecMapUint64StringR) - fn(map[uint64]uint(nil), (*encFnInfo).fastpathEncMapUint64UintR, (*decFnInfo).fastpathDecMapUint64UintR) - fn(map[uint64]uint8(nil), (*encFnInfo).fastpathEncMapUint64Uint8R, (*decFnInfo).fastpathDecMapUint64Uint8R) - fn(map[uint64]uint16(nil), (*encFnInfo).fastpathEncMapUint64Uint16R, (*decFnInfo).fastpathDecMapUint64Uint16R) - fn(map[uint64]uint32(nil), (*encFnInfo).fastpathEncMapUint64Uint32R, (*decFnInfo).fastpathDecMapUint64Uint32R) - fn(map[uint64]uint64(nil), (*encFnInfo).fastpathEncMapUint64Uint64R, (*decFnInfo).fastpathDecMapUint64Uint64R) - fn(map[uint64]uintptr(nil), (*encFnInfo).fastpathEncMapUint64UintptrR, (*decFnInfo).fastpathDecMapUint64UintptrR) - fn(map[uint64]int(nil), (*encFnInfo).fastpathEncMapUint64IntR, (*decFnInfo).fastpathDecMapUint64IntR) - fn(map[uint64]int8(nil), (*encFnInfo).fastpathEncMapUint64Int8R, (*decFnInfo).fastpathDecMapUint64Int8R) - fn(map[uint64]int16(nil), (*encFnInfo).fastpathEncMapUint64Int16R, (*decFnInfo).fastpathDecMapUint64Int16R) - fn(map[uint64]int32(nil), (*encFnInfo).fastpathEncMapUint64Int32R, (*decFnInfo).fastpathDecMapUint64Int32R) - fn(map[uint64]int64(nil), (*encFnInfo).fastpathEncMapUint64Int64R, (*decFnInfo).fastpathDecMapUint64Int64R) - fn(map[uint64]float32(nil), (*encFnInfo).fastpathEncMapUint64Float32R, (*decFnInfo).fastpathDecMapUint64Float32R) - fn(map[uint64]float64(nil), (*encFnInfo).fastpathEncMapUint64Float64R, (*decFnInfo).fastpathDecMapUint64Float64R) - fn(map[uint64]bool(nil), (*encFnInfo).fastpathEncMapUint64BoolR, (*decFnInfo).fastpathDecMapUint64BoolR) - fn(map[uintptr]interface{}(nil), (*encFnInfo).fastpathEncMapUintptrIntfR, (*decFnInfo).fastpathDecMapUintptrIntfR) - fn(map[uintptr]string(nil), (*encFnInfo).fastpathEncMapUintptrStringR, (*decFnInfo).fastpathDecMapUintptrStringR) - fn(map[uintptr]uint(nil), (*encFnInfo).fastpathEncMapUintptrUintR, (*decFnInfo).fastpathDecMapUintptrUintR) - fn(map[uintptr]uint8(nil), (*encFnInfo).fastpathEncMapUintptrUint8R, (*decFnInfo).fastpathDecMapUintptrUint8R) - fn(map[uintptr]uint16(nil), (*encFnInfo).fastpathEncMapUintptrUint16R, (*decFnInfo).fastpathDecMapUintptrUint16R) - fn(map[uintptr]uint32(nil), (*encFnInfo).fastpathEncMapUintptrUint32R, (*decFnInfo).fastpathDecMapUintptrUint32R) - fn(map[uintptr]uint64(nil), (*encFnInfo).fastpathEncMapUintptrUint64R, (*decFnInfo).fastpathDecMapUintptrUint64R) - fn(map[uintptr]uintptr(nil), (*encFnInfo).fastpathEncMapUintptrUintptrR, (*decFnInfo).fastpathDecMapUintptrUintptrR) - fn(map[uintptr]int(nil), (*encFnInfo).fastpathEncMapUintptrIntR, (*decFnInfo).fastpathDecMapUintptrIntR) - fn(map[uintptr]int8(nil), (*encFnInfo).fastpathEncMapUintptrInt8R, (*decFnInfo).fastpathDecMapUintptrInt8R) - fn(map[uintptr]int16(nil), (*encFnInfo).fastpathEncMapUintptrInt16R, (*decFnInfo).fastpathDecMapUintptrInt16R) - fn(map[uintptr]int32(nil), (*encFnInfo).fastpathEncMapUintptrInt32R, (*decFnInfo).fastpathDecMapUintptrInt32R) - fn(map[uintptr]int64(nil), (*encFnInfo).fastpathEncMapUintptrInt64R, (*decFnInfo).fastpathDecMapUintptrInt64R) - fn(map[uintptr]float32(nil), (*encFnInfo).fastpathEncMapUintptrFloat32R, (*decFnInfo).fastpathDecMapUintptrFloat32R) - fn(map[uintptr]float64(nil), (*encFnInfo).fastpathEncMapUintptrFloat64R, (*decFnInfo).fastpathDecMapUintptrFloat64R) - fn(map[uintptr]bool(nil), (*encFnInfo).fastpathEncMapUintptrBoolR, (*decFnInfo).fastpathDecMapUintptrBoolR) - fn(map[int]interface{}(nil), (*encFnInfo).fastpathEncMapIntIntfR, (*decFnInfo).fastpathDecMapIntIntfR) - fn(map[int]string(nil), (*encFnInfo).fastpathEncMapIntStringR, (*decFnInfo).fastpathDecMapIntStringR) - fn(map[int]uint(nil), (*encFnInfo).fastpathEncMapIntUintR, (*decFnInfo).fastpathDecMapIntUintR) - fn(map[int]uint8(nil), (*encFnInfo).fastpathEncMapIntUint8R, (*decFnInfo).fastpathDecMapIntUint8R) - fn(map[int]uint16(nil), (*encFnInfo).fastpathEncMapIntUint16R, (*decFnInfo).fastpathDecMapIntUint16R) - fn(map[int]uint32(nil), (*encFnInfo).fastpathEncMapIntUint32R, (*decFnInfo).fastpathDecMapIntUint32R) - fn(map[int]uint64(nil), (*encFnInfo).fastpathEncMapIntUint64R, (*decFnInfo).fastpathDecMapIntUint64R) - fn(map[int]uintptr(nil), (*encFnInfo).fastpathEncMapIntUintptrR, (*decFnInfo).fastpathDecMapIntUintptrR) - fn(map[int]int(nil), (*encFnInfo).fastpathEncMapIntIntR, (*decFnInfo).fastpathDecMapIntIntR) - fn(map[int]int8(nil), (*encFnInfo).fastpathEncMapIntInt8R, (*decFnInfo).fastpathDecMapIntInt8R) - fn(map[int]int16(nil), (*encFnInfo).fastpathEncMapIntInt16R, (*decFnInfo).fastpathDecMapIntInt16R) - fn(map[int]int32(nil), (*encFnInfo).fastpathEncMapIntInt32R, (*decFnInfo).fastpathDecMapIntInt32R) - fn(map[int]int64(nil), (*encFnInfo).fastpathEncMapIntInt64R, (*decFnInfo).fastpathDecMapIntInt64R) - fn(map[int]float32(nil), (*encFnInfo).fastpathEncMapIntFloat32R, (*decFnInfo).fastpathDecMapIntFloat32R) - fn(map[int]float64(nil), (*encFnInfo).fastpathEncMapIntFloat64R, (*decFnInfo).fastpathDecMapIntFloat64R) - fn(map[int]bool(nil), (*encFnInfo).fastpathEncMapIntBoolR, (*decFnInfo).fastpathDecMapIntBoolR) - fn(map[int8]interface{}(nil), (*encFnInfo).fastpathEncMapInt8IntfR, (*decFnInfo).fastpathDecMapInt8IntfR) - fn(map[int8]string(nil), (*encFnInfo).fastpathEncMapInt8StringR, (*decFnInfo).fastpathDecMapInt8StringR) - fn(map[int8]uint(nil), (*encFnInfo).fastpathEncMapInt8UintR, (*decFnInfo).fastpathDecMapInt8UintR) - fn(map[int8]uint8(nil), (*encFnInfo).fastpathEncMapInt8Uint8R, (*decFnInfo).fastpathDecMapInt8Uint8R) - fn(map[int8]uint16(nil), (*encFnInfo).fastpathEncMapInt8Uint16R, (*decFnInfo).fastpathDecMapInt8Uint16R) - fn(map[int8]uint32(nil), (*encFnInfo).fastpathEncMapInt8Uint32R, (*decFnInfo).fastpathDecMapInt8Uint32R) - fn(map[int8]uint64(nil), (*encFnInfo).fastpathEncMapInt8Uint64R, (*decFnInfo).fastpathDecMapInt8Uint64R) - fn(map[int8]uintptr(nil), (*encFnInfo).fastpathEncMapInt8UintptrR, (*decFnInfo).fastpathDecMapInt8UintptrR) - fn(map[int8]int(nil), (*encFnInfo).fastpathEncMapInt8IntR, (*decFnInfo).fastpathDecMapInt8IntR) - fn(map[int8]int8(nil), (*encFnInfo).fastpathEncMapInt8Int8R, (*decFnInfo).fastpathDecMapInt8Int8R) - fn(map[int8]int16(nil), (*encFnInfo).fastpathEncMapInt8Int16R, (*decFnInfo).fastpathDecMapInt8Int16R) - fn(map[int8]int32(nil), (*encFnInfo).fastpathEncMapInt8Int32R, (*decFnInfo).fastpathDecMapInt8Int32R) - fn(map[int8]int64(nil), (*encFnInfo).fastpathEncMapInt8Int64R, (*decFnInfo).fastpathDecMapInt8Int64R) - fn(map[int8]float32(nil), (*encFnInfo).fastpathEncMapInt8Float32R, (*decFnInfo).fastpathDecMapInt8Float32R) - fn(map[int8]float64(nil), (*encFnInfo).fastpathEncMapInt8Float64R, (*decFnInfo).fastpathDecMapInt8Float64R) - fn(map[int8]bool(nil), (*encFnInfo).fastpathEncMapInt8BoolR, (*decFnInfo).fastpathDecMapInt8BoolR) - fn(map[int16]interface{}(nil), (*encFnInfo).fastpathEncMapInt16IntfR, (*decFnInfo).fastpathDecMapInt16IntfR) - fn(map[int16]string(nil), (*encFnInfo).fastpathEncMapInt16StringR, (*decFnInfo).fastpathDecMapInt16StringR) - fn(map[int16]uint(nil), (*encFnInfo).fastpathEncMapInt16UintR, (*decFnInfo).fastpathDecMapInt16UintR) - fn(map[int16]uint8(nil), (*encFnInfo).fastpathEncMapInt16Uint8R, (*decFnInfo).fastpathDecMapInt16Uint8R) - fn(map[int16]uint16(nil), (*encFnInfo).fastpathEncMapInt16Uint16R, (*decFnInfo).fastpathDecMapInt16Uint16R) - fn(map[int16]uint32(nil), (*encFnInfo).fastpathEncMapInt16Uint32R, (*decFnInfo).fastpathDecMapInt16Uint32R) - fn(map[int16]uint64(nil), (*encFnInfo).fastpathEncMapInt16Uint64R, (*decFnInfo).fastpathDecMapInt16Uint64R) - fn(map[int16]uintptr(nil), (*encFnInfo).fastpathEncMapInt16UintptrR, (*decFnInfo).fastpathDecMapInt16UintptrR) - fn(map[int16]int(nil), (*encFnInfo).fastpathEncMapInt16IntR, (*decFnInfo).fastpathDecMapInt16IntR) - fn(map[int16]int8(nil), (*encFnInfo).fastpathEncMapInt16Int8R, (*decFnInfo).fastpathDecMapInt16Int8R) - fn(map[int16]int16(nil), (*encFnInfo).fastpathEncMapInt16Int16R, (*decFnInfo).fastpathDecMapInt16Int16R) - fn(map[int16]int32(nil), (*encFnInfo).fastpathEncMapInt16Int32R, (*decFnInfo).fastpathDecMapInt16Int32R) - fn(map[int16]int64(nil), (*encFnInfo).fastpathEncMapInt16Int64R, (*decFnInfo).fastpathDecMapInt16Int64R) - fn(map[int16]float32(nil), (*encFnInfo).fastpathEncMapInt16Float32R, (*decFnInfo).fastpathDecMapInt16Float32R) - fn(map[int16]float64(nil), (*encFnInfo).fastpathEncMapInt16Float64R, (*decFnInfo).fastpathDecMapInt16Float64R) - fn(map[int16]bool(nil), (*encFnInfo).fastpathEncMapInt16BoolR, (*decFnInfo).fastpathDecMapInt16BoolR) - fn(map[int32]interface{}(nil), (*encFnInfo).fastpathEncMapInt32IntfR, (*decFnInfo).fastpathDecMapInt32IntfR) - fn(map[int32]string(nil), (*encFnInfo).fastpathEncMapInt32StringR, (*decFnInfo).fastpathDecMapInt32StringR) - fn(map[int32]uint(nil), (*encFnInfo).fastpathEncMapInt32UintR, (*decFnInfo).fastpathDecMapInt32UintR) - fn(map[int32]uint8(nil), (*encFnInfo).fastpathEncMapInt32Uint8R, (*decFnInfo).fastpathDecMapInt32Uint8R) - fn(map[int32]uint16(nil), (*encFnInfo).fastpathEncMapInt32Uint16R, (*decFnInfo).fastpathDecMapInt32Uint16R) - fn(map[int32]uint32(nil), (*encFnInfo).fastpathEncMapInt32Uint32R, (*decFnInfo).fastpathDecMapInt32Uint32R) - fn(map[int32]uint64(nil), (*encFnInfo).fastpathEncMapInt32Uint64R, (*decFnInfo).fastpathDecMapInt32Uint64R) - fn(map[int32]uintptr(nil), (*encFnInfo).fastpathEncMapInt32UintptrR, (*decFnInfo).fastpathDecMapInt32UintptrR) - fn(map[int32]int(nil), (*encFnInfo).fastpathEncMapInt32IntR, (*decFnInfo).fastpathDecMapInt32IntR) - fn(map[int32]int8(nil), (*encFnInfo).fastpathEncMapInt32Int8R, (*decFnInfo).fastpathDecMapInt32Int8R) - fn(map[int32]int16(nil), (*encFnInfo).fastpathEncMapInt32Int16R, (*decFnInfo).fastpathDecMapInt32Int16R) - fn(map[int32]int32(nil), (*encFnInfo).fastpathEncMapInt32Int32R, (*decFnInfo).fastpathDecMapInt32Int32R) - fn(map[int32]int64(nil), (*encFnInfo).fastpathEncMapInt32Int64R, (*decFnInfo).fastpathDecMapInt32Int64R) - fn(map[int32]float32(nil), (*encFnInfo).fastpathEncMapInt32Float32R, (*decFnInfo).fastpathDecMapInt32Float32R) - fn(map[int32]float64(nil), (*encFnInfo).fastpathEncMapInt32Float64R, (*decFnInfo).fastpathDecMapInt32Float64R) - fn(map[int32]bool(nil), (*encFnInfo).fastpathEncMapInt32BoolR, (*decFnInfo).fastpathDecMapInt32BoolR) - fn(map[int64]interface{}(nil), (*encFnInfo).fastpathEncMapInt64IntfR, (*decFnInfo).fastpathDecMapInt64IntfR) - fn(map[int64]string(nil), (*encFnInfo).fastpathEncMapInt64StringR, (*decFnInfo).fastpathDecMapInt64StringR) - fn(map[int64]uint(nil), (*encFnInfo).fastpathEncMapInt64UintR, (*decFnInfo).fastpathDecMapInt64UintR) - fn(map[int64]uint8(nil), (*encFnInfo).fastpathEncMapInt64Uint8R, (*decFnInfo).fastpathDecMapInt64Uint8R) - fn(map[int64]uint16(nil), (*encFnInfo).fastpathEncMapInt64Uint16R, (*decFnInfo).fastpathDecMapInt64Uint16R) - fn(map[int64]uint32(nil), (*encFnInfo).fastpathEncMapInt64Uint32R, (*decFnInfo).fastpathDecMapInt64Uint32R) - fn(map[int64]uint64(nil), (*encFnInfo).fastpathEncMapInt64Uint64R, (*decFnInfo).fastpathDecMapInt64Uint64R) - fn(map[int64]uintptr(nil), (*encFnInfo).fastpathEncMapInt64UintptrR, (*decFnInfo).fastpathDecMapInt64UintptrR) - fn(map[int64]int(nil), (*encFnInfo).fastpathEncMapInt64IntR, (*decFnInfo).fastpathDecMapInt64IntR) - fn(map[int64]int8(nil), (*encFnInfo).fastpathEncMapInt64Int8R, (*decFnInfo).fastpathDecMapInt64Int8R) - fn(map[int64]int16(nil), (*encFnInfo).fastpathEncMapInt64Int16R, (*decFnInfo).fastpathDecMapInt64Int16R) - fn(map[int64]int32(nil), (*encFnInfo).fastpathEncMapInt64Int32R, (*decFnInfo).fastpathDecMapInt64Int32R) - fn(map[int64]int64(nil), (*encFnInfo).fastpathEncMapInt64Int64R, (*decFnInfo).fastpathDecMapInt64Int64R) - fn(map[int64]float32(nil), (*encFnInfo).fastpathEncMapInt64Float32R, (*decFnInfo).fastpathDecMapInt64Float32R) - fn(map[int64]float64(nil), (*encFnInfo).fastpathEncMapInt64Float64R, (*decFnInfo).fastpathDecMapInt64Float64R) - fn(map[int64]bool(nil), (*encFnInfo).fastpathEncMapInt64BoolR, (*decFnInfo).fastpathDecMapInt64BoolR) - fn(map[bool]interface{}(nil), (*encFnInfo).fastpathEncMapBoolIntfR, (*decFnInfo).fastpathDecMapBoolIntfR) - fn(map[bool]string(nil), (*encFnInfo).fastpathEncMapBoolStringR, (*decFnInfo).fastpathDecMapBoolStringR) - fn(map[bool]uint(nil), (*encFnInfo).fastpathEncMapBoolUintR, (*decFnInfo).fastpathDecMapBoolUintR) - fn(map[bool]uint8(nil), (*encFnInfo).fastpathEncMapBoolUint8R, (*decFnInfo).fastpathDecMapBoolUint8R) - fn(map[bool]uint16(nil), (*encFnInfo).fastpathEncMapBoolUint16R, (*decFnInfo).fastpathDecMapBoolUint16R) - fn(map[bool]uint32(nil), (*encFnInfo).fastpathEncMapBoolUint32R, (*decFnInfo).fastpathDecMapBoolUint32R) - fn(map[bool]uint64(nil), (*encFnInfo).fastpathEncMapBoolUint64R, (*decFnInfo).fastpathDecMapBoolUint64R) - fn(map[bool]uintptr(nil), (*encFnInfo).fastpathEncMapBoolUintptrR, (*decFnInfo).fastpathDecMapBoolUintptrR) - fn(map[bool]int(nil), (*encFnInfo).fastpathEncMapBoolIntR, (*decFnInfo).fastpathDecMapBoolIntR) - fn(map[bool]int8(nil), (*encFnInfo).fastpathEncMapBoolInt8R, (*decFnInfo).fastpathDecMapBoolInt8R) - fn(map[bool]int16(nil), (*encFnInfo).fastpathEncMapBoolInt16R, (*decFnInfo).fastpathDecMapBoolInt16R) - fn(map[bool]int32(nil), (*encFnInfo).fastpathEncMapBoolInt32R, (*decFnInfo).fastpathDecMapBoolInt32R) - fn(map[bool]int64(nil), (*encFnInfo).fastpathEncMapBoolInt64R, (*decFnInfo).fastpathDecMapBoolInt64R) - fn(map[bool]float32(nil), (*encFnInfo).fastpathEncMapBoolFloat32R, (*decFnInfo).fastpathDecMapBoolFloat32R) - fn(map[bool]float64(nil), (*encFnInfo).fastpathEncMapBoolFloat64R, (*decFnInfo).fastpathDecMapBoolFloat64R) - fn(map[bool]bool(nil), (*encFnInfo).fastpathEncMapBoolBoolR, (*decFnInfo).fastpathDecMapBoolBoolR) - - sort.Sort(fastpathAslice(fastpathAV[:])) -} - -// -- encode - -// -- -- fast path type switch -func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } - switch v := iv.(type) { - - case []interface{}: - fastpathTV.EncSliceIntfV(v, fastpathCheckNilTrue, e) - case *[]interface{}: - fastpathTV.EncSliceIntfV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(v, fastpathCheckNilTrue, e) - case *map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]string: - fastpathTV.EncMapIntfStringV(v, fastpathCheckNilTrue, e) - case *map[interface{}]string: - fastpathTV.EncMapIntfStringV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint: - fastpathTV.EncMapIntfUintV(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint: - fastpathTV.EncMapIntfUintV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(v, fastpathCheckNilTrue, e) - case *map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int: - fastpathTV.EncMapIntfIntV(v, fastpathCheckNilTrue, e) - case *map[interface{}]int: - fastpathTV.EncMapIntfIntV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(v, fastpathCheckNilTrue, e) - case *map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(*v, fastpathCheckNilTrue, e) - - case []string: - fastpathTV.EncSliceStringV(v, fastpathCheckNilTrue, e) - case *[]string: - fastpathTV.EncSliceStringV(*v, fastpathCheckNilTrue, e) - - case map[string]interface{}: - fastpathTV.EncMapStringIntfV(v, fastpathCheckNilTrue, e) - case *map[string]interface{}: - fastpathTV.EncMapStringIntfV(*v, fastpathCheckNilTrue, e) - - case map[string]string: - fastpathTV.EncMapStringStringV(v, fastpathCheckNilTrue, e) - case *map[string]string: - fastpathTV.EncMapStringStringV(*v, fastpathCheckNilTrue, e) - - case map[string]uint: - fastpathTV.EncMapStringUintV(v, fastpathCheckNilTrue, e) - case *map[string]uint: - fastpathTV.EncMapStringUintV(*v, fastpathCheckNilTrue, e) - - case map[string]uint8: - fastpathTV.EncMapStringUint8V(v, fastpathCheckNilTrue, e) - case *map[string]uint8: - fastpathTV.EncMapStringUint8V(*v, fastpathCheckNilTrue, e) - - case map[string]uint16: - fastpathTV.EncMapStringUint16V(v, fastpathCheckNilTrue, e) - case *map[string]uint16: - fastpathTV.EncMapStringUint16V(*v, fastpathCheckNilTrue, e) - - case map[string]uint32: - fastpathTV.EncMapStringUint32V(v, fastpathCheckNilTrue, e) - case *map[string]uint32: - fastpathTV.EncMapStringUint32V(*v, fastpathCheckNilTrue, e) - - case map[string]uint64: - fastpathTV.EncMapStringUint64V(v, fastpathCheckNilTrue, e) - case *map[string]uint64: - fastpathTV.EncMapStringUint64V(*v, fastpathCheckNilTrue, e) - - case map[string]uintptr: - fastpathTV.EncMapStringUintptrV(v, fastpathCheckNilTrue, e) - case *map[string]uintptr: - fastpathTV.EncMapStringUintptrV(*v, fastpathCheckNilTrue, e) - - case map[string]int: - fastpathTV.EncMapStringIntV(v, fastpathCheckNilTrue, e) - case *map[string]int: - fastpathTV.EncMapStringIntV(*v, fastpathCheckNilTrue, e) - - case map[string]int8: - fastpathTV.EncMapStringInt8V(v, fastpathCheckNilTrue, e) - case *map[string]int8: - fastpathTV.EncMapStringInt8V(*v, fastpathCheckNilTrue, e) - - case map[string]int16: - fastpathTV.EncMapStringInt16V(v, fastpathCheckNilTrue, e) - case *map[string]int16: - fastpathTV.EncMapStringInt16V(*v, fastpathCheckNilTrue, e) - - case map[string]int32: - fastpathTV.EncMapStringInt32V(v, fastpathCheckNilTrue, e) - case *map[string]int32: - fastpathTV.EncMapStringInt32V(*v, fastpathCheckNilTrue, e) - - case map[string]int64: - fastpathTV.EncMapStringInt64V(v, fastpathCheckNilTrue, e) - case *map[string]int64: - fastpathTV.EncMapStringInt64V(*v, fastpathCheckNilTrue, e) - - case map[string]float32: - fastpathTV.EncMapStringFloat32V(v, fastpathCheckNilTrue, e) - case *map[string]float32: - fastpathTV.EncMapStringFloat32V(*v, fastpathCheckNilTrue, e) - - case map[string]float64: - fastpathTV.EncMapStringFloat64V(v, fastpathCheckNilTrue, e) - case *map[string]float64: - fastpathTV.EncMapStringFloat64V(*v, fastpathCheckNilTrue, e) - - case map[string]bool: - fastpathTV.EncMapStringBoolV(v, fastpathCheckNilTrue, e) - case *map[string]bool: - fastpathTV.EncMapStringBoolV(*v, fastpathCheckNilTrue, e) - - case []float32: - fastpathTV.EncSliceFloat32V(v, fastpathCheckNilTrue, e) - case *[]float32: - fastpathTV.EncSliceFloat32V(*v, fastpathCheckNilTrue, e) - - case map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(v, fastpathCheckNilTrue, e) - case *map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(*v, fastpathCheckNilTrue, e) - - case map[float32]string: - fastpathTV.EncMapFloat32StringV(v, fastpathCheckNilTrue, e) - case *map[float32]string: - fastpathTV.EncMapFloat32StringV(*v, fastpathCheckNilTrue, e) - - case map[float32]uint: - fastpathTV.EncMapFloat32UintV(v, fastpathCheckNilTrue, e) - case *map[float32]uint: - fastpathTV.EncMapFloat32UintV(*v, fastpathCheckNilTrue, e) - - case map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(v, fastpathCheckNilTrue, e) - case *map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(v, fastpathCheckNilTrue, e) - case *map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(v, fastpathCheckNilTrue, e) - case *map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(v, fastpathCheckNilTrue, e) - case *map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(v, fastpathCheckNilTrue, e) - case *map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[float32]int: - fastpathTV.EncMapFloat32IntV(v, fastpathCheckNilTrue, e) - case *map[float32]int: - fastpathTV.EncMapFloat32IntV(*v, fastpathCheckNilTrue, e) - - case map[float32]int8: - fastpathTV.EncMapFloat32Int8V(v, fastpathCheckNilTrue, e) - case *map[float32]int8: - fastpathTV.EncMapFloat32Int8V(*v, fastpathCheckNilTrue, e) - - case map[float32]int16: - fastpathTV.EncMapFloat32Int16V(v, fastpathCheckNilTrue, e) - case *map[float32]int16: - fastpathTV.EncMapFloat32Int16V(*v, fastpathCheckNilTrue, e) - - case map[float32]int32: - fastpathTV.EncMapFloat32Int32V(v, fastpathCheckNilTrue, e) - case *map[float32]int32: - fastpathTV.EncMapFloat32Int32V(*v, fastpathCheckNilTrue, e) - - case map[float32]int64: - fastpathTV.EncMapFloat32Int64V(v, fastpathCheckNilTrue, e) - case *map[float32]int64: - fastpathTV.EncMapFloat32Int64V(*v, fastpathCheckNilTrue, e) - - case map[float32]float32: - fastpathTV.EncMapFloat32Float32V(v, fastpathCheckNilTrue, e) - case *map[float32]float32: - fastpathTV.EncMapFloat32Float32V(*v, fastpathCheckNilTrue, e) - - case map[float32]float64: - fastpathTV.EncMapFloat32Float64V(v, fastpathCheckNilTrue, e) - case *map[float32]float64: - fastpathTV.EncMapFloat32Float64V(*v, fastpathCheckNilTrue, e) - - case map[float32]bool: - fastpathTV.EncMapFloat32BoolV(v, fastpathCheckNilTrue, e) - case *map[float32]bool: - fastpathTV.EncMapFloat32BoolV(*v, fastpathCheckNilTrue, e) - - case []float64: - fastpathTV.EncSliceFloat64V(v, fastpathCheckNilTrue, e) - case *[]float64: - fastpathTV.EncSliceFloat64V(*v, fastpathCheckNilTrue, e) - - case map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(v, fastpathCheckNilTrue, e) - case *map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(*v, fastpathCheckNilTrue, e) - - case map[float64]string: - fastpathTV.EncMapFloat64StringV(v, fastpathCheckNilTrue, e) - case *map[float64]string: - fastpathTV.EncMapFloat64StringV(*v, fastpathCheckNilTrue, e) - - case map[float64]uint: - fastpathTV.EncMapFloat64UintV(v, fastpathCheckNilTrue, e) - case *map[float64]uint: - fastpathTV.EncMapFloat64UintV(*v, fastpathCheckNilTrue, e) - - case map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(v, fastpathCheckNilTrue, e) - case *map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(v, fastpathCheckNilTrue, e) - case *map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(v, fastpathCheckNilTrue, e) - case *map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(v, fastpathCheckNilTrue, e) - case *map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(v, fastpathCheckNilTrue, e) - case *map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[float64]int: - fastpathTV.EncMapFloat64IntV(v, fastpathCheckNilTrue, e) - case *map[float64]int: - fastpathTV.EncMapFloat64IntV(*v, fastpathCheckNilTrue, e) - - case map[float64]int8: - fastpathTV.EncMapFloat64Int8V(v, fastpathCheckNilTrue, e) - case *map[float64]int8: - fastpathTV.EncMapFloat64Int8V(*v, fastpathCheckNilTrue, e) - - case map[float64]int16: - fastpathTV.EncMapFloat64Int16V(v, fastpathCheckNilTrue, e) - case *map[float64]int16: - fastpathTV.EncMapFloat64Int16V(*v, fastpathCheckNilTrue, e) - - case map[float64]int32: - fastpathTV.EncMapFloat64Int32V(v, fastpathCheckNilTrue, e) - case *map[float64]int32: - fastpathTV.EncMapFloat64Int32V(*v, fastpathCheckNilTrue, e) - - case map[float64]int64: - fastpathTV.EncMapFloat64Int64V(v, fastpathCheckNilTrue, e) - case *map[float64]int64: - fastpathTV.EncMapFloat64Int64V(*v, fastpathCheckNilTrue, e) - - case map[float64]float32: - fastpathTV.EncMapFloat64Float32V(v, fastpathCheckNilTrue, e) - case *map[float64]float32: - fastpathTV.EncMapFloat64Float32V(*v, fastpathCheckNilTrue, e) - - case map[float64]float64: - fastpathTV.EncMapFloat64Float64V(v, fastpathCheckNilTrue, e) - case *map[float64]float64: - fastpathTV.EncMapFloat64Float64V(*v, fastpathCheckNilTrue, e) - - case map[float64]bool: - fastpathTV.EncMapFloat64BoolV(v, fastpathCheckNilTrue, e) - case *map[float64]bool: - fastpathTV.EncMapFloat64BoolV(*v, fastpathCheckNilTrue, e) - - case []uint: - fastpathTV.EncSliceUintV(v, fastpathCheckNilTrue, e) - case *[]uint: - fastpathTV.EncSliceUintV(*v, fastpathCheckNilTrue, e) - - case map[uint]interface{}: - fastpathTV.EncMapUintIntfV(v, fastpathCheckNilTrue, e) - case *map[uint]interface{}: - fastpathTV.EncMapUintIntfV(*v, fastpathCheckNilTrue, e) - - case map[uint]string: - fastpathTV.EncMapUintStringV(v, fastpathCheckNilTrue, e) - case *map[uint]string: - fastpathTV.EncMapUintStringV(*v, fastpathCheckNilTrue, e) - - case map[uint]uint: - fastpathTV.EncMapUintUintV(v, fastpathCheckNilTrue, e) - case *map[uint]uint: - fastpathTV.EncMapUintUintV(*v, fastpathCheckNilTrue, e) - - case map[uint]uint8: - fastpathTV.EncMapUintUint8V(v, fastpathCheckNilTrue, e) - case *map[uint]uint8: - fastpathTV.EncMapUintUint8V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint16: - fastpathTV.EncMapUintUint16V(v, fastpathCheckNilTrue, e) - case *map[uint]uint16: - fastpathTV.EncMapUintUint16V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint32: - fastpathTV.EncMapUintUint32V(v, fastpathCheckNilTrue, e) - case *map[uint]uint32: - fastpathTV.EncMapUintUint32V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint64: - fastpathTV.EncMapUintUint64V(v, fastpathCheckNilTrue, e) - case *map[uint]uint64: - fastpathTV.EncMapUintUint64V(*v, fastpathCheckNilTrue, e) - - case map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(v, fastpathCheckNilTrue, e) - case *map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint]int: - fastpathTV.EncMapUintIntV(v, fastpathCheckNilTrue, e) - case *map[uint]int: - fastpathTV.EncMapUintIntV(*v, fastpathCheckNilTrue, e) - - case map[uint]int8: - fastpathTV.EncMapUintInt8V(v, fastpathCheckNilTrue, e) - case *map[uint]int8: - fastpathTV.EncMapUintInt8V(*v, fastpathCheckNilTrue, e) - - case map[uint]int16: - fastpathTV.EncMapUintInt16V(v, fastpathCheckNilTrue, e) - case *map[uint]int16: - fastpathTV.EncMapUintInt16V(*v, fastpathCheckNilTrue, e) - - case map[uint]int32: - fastpathTV.EncMapUintInt32V(v, fastpathCheckNilTrue, e) - case *map[uint]int32: - fastpathTV.EncMapUintInt32V(*v, fastpathCheckNilTrue, e) - - case map[uint]int64: - fastpathTV.EncMapUintInt64V(v, fastpathCheckNilTrue, e) - case *map[uint]int64: - fastpathTV.EncMapUintInt64V(*v, fastpathCheckNilTrue, e) - - case map[uint]float32: - fastpathTV.EncMapUintFloat32V(v, fastpathCheckNilTrue, e) - case *map[uint]float32: - fastpathTV.EncMapUintFloat32V(*v, fastpathCheckNilTrue, e) - - case map[uint]float64: - fastpathTV.EncMapUintFloat64V(v, fastpathCheckNilTrue, e) - case *map[uint]float64: - fastpathTV.EncMapUintFloat64V(*v, fastpathCheckNilTrue, e) - - case map[uint]bool: - fastpathTV.EncMapUintBoolV(v, fastpathCheckNilTrue, e) - case *map[uint]bool: - fastpathTV.EncMapUintBoolV(*v, fastpathCheckNilTrue, e) - - case map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(v, fastpathCheckNilTrue, e) - case *map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint8]string: - fastpathTV.EncMapUint8StringV(v, fastpathCheckNilTrue, e) - case *map[uint8]string: - fastpathTV.EncMapUint8StringV(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint: - fastpathTV.EncMapUint8UintV(v, fastpathCheckNilTrue, e) - case *map[uint8]uint: - fastpathTV.EncMapUint8UintV(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint8]int: - fastpathTV.EncMapUint8IntV(v, fastpathCheckNilTrue, e) - case *map[uint8]int: - fastpathTV.EncMapUint8IntV(*v, fastpathCheckNilTrue, e) - - case map[uint8]int8: - fastpathTV.EncMapUint8Int8V(v, fastpathCheckNilTrue, e) - case *map[uint8]int8: - fastpathTV.EncMapUint8Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int16: - fastpathTV.EncMapUint8Int16V(v, fastpathCheckNilTrue, e) - case *map[uint8]int16: - fastpathTV.EncMapUint8Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int32: - fastpathTV.EncMapUint8Int32V(v, fastpathCheckNilTrue, e) - case *map[uint8]int32: - fastpathTV.EncMapUint8Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int64: - fastpathTV.EncMapUint8Int64V(v, fastpathCheckNilTrue, e) - case *map[uint8]int64: - fastpathTV.EncMapUint8Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]float32: - fastpathTV.EncMapUint8Float32V(v, fastpathCheckNilTrue, e) - case *map[uint8]float32: - fastpathTV.EncMapUint8Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]float64: - fastpathTV.EncMapUint8Float64V(v, fastpathCheckNilTrue, e) - case *map[uint8]float64: - fastpathTV.EncMapUint8Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]bool: - fastpathTV.EncMapUint8BoolV(v, fastpathCheckNilTrue, e) - case *map[uint8]bool: - fastpathTV.EncMapUint8BoolV(*v, fastpathCheckNilTrue, e) - - case []uint16: - fastpathTV.EncSliceUint16V(v, fastpathCheckNilTrue, e) - case *[]uint16: - fastpathTV.EncSliceUint16V(*v, fastpathCheckNilTrue, e) - - case map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(v, fastpathCheckNilTrue, e) - case *map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint16]string: - fastpathTV.EncMapUint16StringV(v, fastpathCheckNilTrue, e) - case *map[uint16]string: - fastpathTV.EncMapUint16StringV(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint: - fastpathTV.EncMapUint16UintV(v, fastpathCheckNilTrue, e) - case *map[uint16]uint: - fastpathTV.EncMapUint16UintV(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint16]int: - fastpathTV.EncMapUint16IntV(v, fastpathCheckNilTrue, e) - case *map[uint16]int: - fastpathTV.EncMapUint16IntV(*v, fastpathCheckNilTrue, e) - - case map[uint16]int8: - fastpathTV.EncMapUint16Int8V(v, fastpathCheckNilTrue, e) - case *map[uint16]int8: - fastpathTV.EncMapUint16Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int16: - fastpathTV.EncMapUint16Int16V(v, fastpathCheckNilTrue, e) - case *map[uint16]int16: - fastpathTV.EncMapUint16Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int32: - fastpathTV.EncMapUint16Int32V(v, fastpathCheckNilTrue, e) - case *map[uint16]int32: - fastpathTV.EncMapUint16Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int64: - fastpathTV.EncMapUint16Int64V(v, fastpathCheckNilTrue, e) - case *map[uint16]int64: - fastpathTV.EncMapUint16Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]float32: - fastpathTV.EncMapUint16Float32V(v, fastpathCheckNilTrue, e) - case *map[uint16]float32: - fastpathTV.EncMapUint16Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]float64: - fastpathTV.EncMapUint16Float64V(v, fastpathCheckNilTrue, e) - case *map[uint16]float64: - fastpathTV.EncMapUint16Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]bool: - fastpathTV.EncMapUint16BoolV(v, fastpathCheckNilTrue, e) - case *map[uint16]bool: - fastpathTV.EncMapUint16BoolV(*v, fastpathCheckNilTrue, e) - - case []uint32: - fastpathTV.EncSliceUint32V(v, fastpathCheckNilTrue, e) - case *[]uint32: - fastpathTV.EncSliceUint32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(v, fastpathCheckNilTrue, e) - case *map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint32]string: - fastpathTV.EncMapUint32StringV(v, fastpathCheckNilTrue, e) - case *map[uint32]string: - fastpathTV.EncMapUint32StringV(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint: - fastpathTV.EncMapUint32UintV(v, fastpathCheckNilTrue, e) - case *map[uint32]uint: - fastpathTV.EncMapUint32UintV(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint32]int: - fastpathTV.EncMapUint32IntV(v, fastpathCheckNilTrue, e) - case *map[uint32]int: - fastpathTV.EncMapUint32IntV(*v, fastpathCheckNilTrue, e) - - case map[uint32]int8: - fastpathTV.EncMapUint32Int8V(v, fastpathCheckNilTrue, e) - case *map[uint32]int8: - fastpathTV.EncMapUint32Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int16: - fastpathTV.EncMapUint32Int16V(v, fastpathCheckNilTrue, e) - case *map[uint32]int16: - fastpathTV.EncMapUint32Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int32: - fastpathTV.EncMapUint32Int32V(v, fastpathCheckNilTrue, e) - case *map[uint32]int32: - fastpathTV.EncMapUint32Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int64: - fastpathTV.EncMapUint32Int64V(v, fastpathCheckNilTrue, e) - case *map[uint32]int64: - fastpathTV.EncMapUint32Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]float32: - fastpathTV.EncMapUint32Float32V(v, fastpathCheckNilTrue, e) - case *map[uint32]float32: - fastpathTV.EncMapUint32Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]float64: - fastpathTV.EncMapUint32Float64V(v, fastpathCheckNilTrue, e) - case *map[uint32]float64: - fastpathTV.EncMapUint32Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]bool: - fastpathTV.EncMapUint32BoolV(v, fastpathCheckNilTrue, e) - case *map[uint32]bool: - fastpathTV.EncMapUint32BoolV(*v, fastpathCheckNilTrue, e) - - case []uint64: - fastpathTV.EncSliceUint64V(v, fastpathCheckNilTrue, e) - case *[]uint64: - fastpathTV.EncSliceUint64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(v, fastpathCheckNilTrue, e) - case *map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint64]string: - fastpathTV.EncMapUint64StringV(v, fastpathCheckNilTrue, e) - case *map[uint64]string: - fastpathTV.EncMapUint64StringV(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint: - fastpathTV.EncMapUint64UintV(v, fastpathCheckNilTrue, e) - case *map[uint64]uint: - fastpathTV.EncMapUint64UintV(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint64]int: - fastpathTV.EncMapUint64IntV(v, fastpathCheckNilTrue, e) - case *map[uint64]int: - fastpathTV.EncMapUint64IntV(*v, fastpathCheckNilTrue, e) - - case map[uint64]int8: - fastpathTV.EncMapUint64Int8V(v, fastpathCheckNilTrue, e) - case *map[uint64]int8: - fastpathTV.EncMapUint64Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int16: - fastpathTV.EncMapUint64Int16V(v, fastpathCheckNilTrue, e) - case *map[uint64]int16: - fastpathTV.EncMapUint64Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int32: - fastpathTV.EncMapUint64Int32V(v, fastpathCheckNilTrue, e) - case *map[uint64]int32: - fastpathTV.EncMapUint64Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int64: - fastpathTV.EncMapUint64Int64V(v, fastpathCheckNilTrue, e) - case *map[uint64]int64: - fastpathTV.EncMapUint64Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]float32: - fastpathTV.EncMapUint64Float32V(v, fastpathCheckNilTrue, e) - case *map[uint64]float32: - fastpathTV.EncMapUint64Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]float64: - fastpathTV.EncMapUint64Float64V(v, fastpathCheckNilTrue, e) - case *map[uint64]float64: - fastpathTV.EncMapUint64Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]bool: - fastpathTV.EncMapUint64BoolV(v, fastpathCheckNilTrue, e) - case *map[uint64]bool: - fastpathTV.EncMapUint64BoolV(*v, fastpathCheckNilTrue, e) - - case []uintptr: - fastpathTV.EncSliceUintptrV(v, fastpathCheckNilTrue, e) - case *[]uintptr: - fastpathTV.EncSliceUintptrV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(v, fastpathCheckNilTrue, e) - case *map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]string: - fastpathTV.EncMapUintptrStringV(v, fastpathCheckNilTrue, e) - case *map[uintptr]string: - fastpathTV.EncMapUintptrStringV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(v, fastpathCheckNilTrue, e) - case *map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int: - fastpathTV.EncMapUintptrIntV(v, fastpathCheckNilTrue, e) - case *map[uintptr]int: - fastpathTV.EncMapUintptrIntV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(v, fastpathCheckNilTrue, e) - case *map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(*v, fastpathCheckNilTrue, e) - - case []int: - fastpathTV.EncSliceIntV(v, fastpathCheckNilTrue, e) - case *[]int: - fastpathTV.EncSliceIntV(*v, fastpathCheckNilTrue, e) - - case map[int]interface{}: - fastpathTV.EncMapIntIntfV(v, fastpathCheckNilTrue, e) - case *map[int]interface{}: - fastpathTV.EncMapIntIntfV(*v, fastpathCheckNilTrue, e) - - case map[int]string: - fastpathTV.EncMapIntStringV(v, fastpathCheckNilTrue, e) - case *map[int]string: - fastpathTV.EncMapIntStringV(*v, fastpathCheckNilTrue, e) - - case map[int]uint: - fastpathTV.EncMapIntUintV(v, fastpathCheckNilTrue, e) - case *map[int]uint: - fastpathTV.EncMapIntUintV(*v, fastpathCheckNilTrue, e) - - case map[int]uint8: - fastpathTV.EncMapIntUint8V(v, fastpathCheckNilTrue, e) - case *map[int]uint8: - fastpathTV.EncMapIntUint8V(*v, fastpathCheckNilTrue, e) - - case map[int]uint16: - fastpathTV.EncMapIntUint16V(v, fastpathCheckNilTrue, e) - case *map[int]uint16: - fastpathTV.EncMapIntUint16V(*v, fastpathCheckNilTrue, e) - - case map[int]uint32: - fastpathTV.EncMapIntUint32V(v, fastpathCheckNilTrue, e) - case *map[int]uint32: - fastpathTV.EncMapIntUint32V(*v, fastpathCheckNilTrue, e) - - case map[int]uint64: - fastpathTV.EncMapIntUint64V(v, fastpathCheckNilTrue, e) - case *map[int]uint64: - fastpathTV.EncMapIntUint64V(*v, fastpathCheckNilTrue, e) - - case map[int]uintptr: - fastpathTV.EncMapIntUintptrV(v, fastpathCheckNilTrue, e) - case *map[int]uintptr: - fastpathTV.EncMapIntUintptrV(*v, fastpathCheckNilTrue, e) - - case map[int]int: - fastpathTV.EncMapIntIntV(v, fastpathCheckNilTrue, e) - case *map[int]int: - fastpathTV.EncMapIntIntV(*v, fastpathCheckNilTrue, e) - - case map[int]int8: - fastpathTV.EncMapIntInt8V(v, fastpathCheckNilTrue, e) - case *map[int]int8: - fastpathTV.EncMapIntInt8V(*v, fastpathCheckNilTrue, e) - - case map[int]int16: - fastpathTV.EncMapIntInt16V(v, fastpathCheckNilTrue, e) - case *map[int]int16: - fastpathTV.EncMapIntInt16V(*v, fastpathCheckNilTrue, e) - - case map[int]int32: - fastpathTV.EncMapIntInt32V(v, fastpathCheckNilTrue, e) - case *map[int]int32: - fastpathTV.EncMapIntInt32V(*v, fastpathCheckNilTrue, e) - - case map[int]int64: - fastpathTV.EncMapIntInt64V(v, fastpathCheckNilTrue, e) - case *map[int]int64: - fastpathTV.EncMapIntInt64V(*v, fastpathCheckNilTrue, e) - - case map[int]float32: - fastpathTV.EncMapIntFloat32V(v, fastpathCheckNilTrue, e) - case *map[int]float32: - fastpathTV.EncMapIntFloat32V(*v, fastpathCheckNilTrue, e) - - case map[int]float64: - fastpathTV.EncMapIntFloat64V(v, fastpathCheckNilTrue, e) - case *map[int]float64: - fastpathTV.EncMapIntFloat64V(*v, fastpathCheckNilTrue, e) - - case map[int]bool: - fastpathTV.EncMapIntBoolV(v, fastpathCheckNilTrue, e) - case *map[int]bool: - fastpathTV.EncMapIntBoolV(*v, fastpathCheckNilTrue, e) - - case []int8: - fastpathTV.EncSliceInt8V(v, fastpathCheckNilTrue, e) - case *[]int8: - fastpathTV.EncSliceInt8V(*v, fastpathCheckNilTrue, e) - - case map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(v, fastpathCheckNilTrue, e) - case *map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(*v, fastpathCheckNilTrue, e) - - case map[int8]string: - fastpathTV.EncMapInt8StringV(v, fastpathCheckNilTrue, e) - case *map[int8]string: - fastpathTV.EncMapInt8StringV(*v, fastpathCheckNilTrue, e) - - case map[int8]uint: - fastpathTV.EncMapInt8UintV(v, fastpathCheckNilTrue, e) - case *map[int8]uint: - fastpathTV.EncMapInt8UintV(*v, fastpathCheckNilTrue, e) - - case map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(v, fastpathCheckNilTrue, e) - case *map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(v, fastpathCheckNilTrue, e) - case *map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(v, fastpathCheckNilTrue, e) - case *map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(v, fastpathCheckNilTrue, e) - case *map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(v, fastpathCheckNilTrue, e) - case *map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int8]int: - fastpathTV.EncMapInt8IntV(v, fastpathCheckNilTrue, e) - case *map[int8]int: - fastpathTV.EncMapInt8IntV(*v, fastpathCheckNilTrue, e) - - case map[int8]int8: - fastpathTV.EncMapInt8Int8V(v, fastpathCheckNilTrue, e) - case *map[int8]int8: - fastpathTV.EncMapInt8Int8V(*v, fastpathCheckNilTrue, e) - - case map[int8]int16: - fastpathTV.EncMapInt8Int16V(v, fastpathCheckNilTrue, e) - case *map[int8]int16: - fastpathTV.EncMapInt8Int16V(*v, fastpathCheckNilTrue, e) - - case map[int8]int32: - fastpathTV.EncMapInt8Int32V(v, fastpathCheckNilTrue, e) - case *map[int8]int32: - fastpathTV.EncMapInt8Int32V(*v, fastpathCheckNilTrue, e) - - case map[int8]int64: - fastpathTV.EncMapInt8Int64V(v, fastpathCheckNilTrue, e) - case *map[int8]int64: - fastpathTV.EncMapInt8Int64V(*v, fastpathCheckNilTrue, e) - - case map[int8]float32: - fastpathTV.EncMapInt8Float32V(v, fastpathCheckNilTrue, e) - case *map[int8]float32: - fastpathTV.EncMapInt8Float32V(*v, fastpathCheckNilTrue, e) - - case map[int8]float64: - fastpathTV.EncMapInt8Float64V(v, fastpathCheckNilTrue, e) - case *map[int8]float64: - fastpathTV.EncMapInt8Float64V(*v, fastpathCheckNilTrue, e) - - case map[int8]bool: - fastpathTV.EncMapInt8BoolV(v, fastpathCheckNilTrue, e) - case *map[int8]bool: - fastpathTV.EncMapInt8BoolV(*v, fastpathCheckNilTrue, e) - - case []int16: - fastpathTV.EncSliceInt16V(v, fastpathCheckNilTrue, e) - case *[]int16: - fastpathTV.EncSliceInt16V(*v, fastpathCheckNilTrue, e) - - case map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(v, fastpathCheckNilTrue, e) - case *map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(*v, fastpathCheckNilTrue, e) - - case map[int16]string: - fastpathTV.EncMapInt16StringV(v, fastpathCheckNilTrue, e) - case *map[int16]string: - fastpathTV.EncMapInt16StringV(*v, fastpathCheckNilTrue, e) - - case map[int16]uint: - fastpathTV.EncMapInt16UintV(v, fastpathCheckNilTrue, e) - case *map[int16]uint: - fastpathTV.EncMapInt16UintV(*v, fastpathCheckNilTrue, e) - - case map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(v, fastpathCheckNilTrue, e) - case *map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(v, fastpathCheckNilTrue, e) - case *map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(v, fastpathCheckNilTrue, e) - case *map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(v, fastpathCheckNilTrue, e) - case *map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(v, fastpathCheckNilTrue, e) - case *map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int16]int: - fastpathTV.EncMapInt16IntV(v, fastpathCheckNilTrue, e) - case *map[int16]int: - fastpathTV.EncMapInt16IntV(*v, fastpathCheckNilTrue, e) - - case map[int16]int8: - fastpathTV.EncMapInt16Int8V(v, fastpathCheckNilTrue, e) - case *map[int16]int8: - fastpathTV.EncMapInt16Int8V(*v, fastpathCheckNilTrue, e) - - case map[int16]int16: - fastpathTV.EncMapInt16Int16V(v, fastpathCheckNilTrue, e) - case *map[int16]int16: - fastpathTV.EncMapInt16Int16V(*v, fastpathCheckNilTrue, e) - - case map[int16]int32: - fastpathTV.EncMapInt16Int32V(v, fastpathCheckNilTrue, e) - case *map[int16]int32: - fastpathTV.EncMapInt16Int32V(*v, fastpathCheckNilTrue, e) - - case map[int16]int64: - fastpathTV.EncMapInt16Int64V(v, fastpathCheckNilTrue, e) - case *map[int16]int64: - fastpathTV.EncMapInt16Int64V(*v, fastpathCheckNilTrue, e) - - case map[int16]float32: - fastpathTV.EncMapInt16Float32V(v, fastpathCheckNilTrue, e) - case *map[int16]float32: - fastpathTV.EncMapInt16Float32V(*v, fastpathCheckNilTrue, e) - - case map[int16]float64: - fastpathTV.EncMapInt16Float64V(v, fastpathCheckNilTrue, e) - case *map[int16]float64: - fastpathTV.EncMapInt16Float64V(*v, fastpathCheckNilTrue, e) - - case map[int16]bool: - fastpathTV.EncMapInt16BoolV(v, fastpathCheckNilTrue, e) - case *map[int16]bool: - fastpathTV.EncMapInt16BoolV(*v, fastpathCheckNilTrue, e) - - case []int32: - fastpathTV.EncSliceInt32V(v, fastpathCheckNilTrue, e) - case *[]int32: - fastpathTV.EncSliceInt32V(*v, fastpathCheckNilTrue, e) - - case map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(v, fastpathCheckNilTrue, e) - case *map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(*v, fastpathCheckNilTrue, e) - - case map[int32]string: - fastpathTV.EncMapInt32StringV(v, fastpathCheckNilTrue, e) - case *map[int32]string: - fastpathTV.EncMapInt32StringV(*v, fastpathCheckNilTrue, e) - - case map[int32]uint: - fastpathTV.EncMapInt32UintV(v, fastpathCheckNilTrue, e) - case *map[int32]uint: - fastpathTV.EncMapInt32UintV(*v, fastpathCheckNilTrue, e) - - case map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(v, fastpathCheckNilTrue, e) - case *map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(v, fastpathCheckNilTrue, e) - case *map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(v, fastpathCheckNilTrue, e) - case *map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(v, fastpathCheckNilTrue, e) - case *map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(v, fastpathCheckNilTrue, e) - case *map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int32]int: - fastpathTV.EncMapInt32IntV(v, fastpathCheckNilTrue, e) - case *map[int32]int: - fastpathTV.EncMapInt32IntV(*v, fastpathCheckNilTrue, e) - - case map[int32]int8: - fastpathTV.EncMapInt32Int8V(v, fastpathCheckNilTrue, e) - case *map[int32]int8: - fastpathTV.EncMapInt32Int8V(*v, fastpathCheckNilTrue, e) - - case map[int32]int16: - fastpathTV.EncMapInt32Int16V(v, fastpathCheckNilTrue, e) - case *map[int32]int16: - fastpathTV.EncMapInt32Int16V(*v, fastpathCheckNilTrue, e) - - case map[int32]int32: - fastpathTV.EncMapInt32Int32V(v, fastpathCheckNilTrue, e) - case *map[int32]int32: - fastpathTV.EncMapInt32Int32V(*v, fastpathCheckNilTrue, e) - - case map[int32]int64: - fastpathTV.EncMapInt32Int64V(v, fastpathCheckNilTrue, e) - case *map[int32]int64: - fastpathTV.EncMapInt32Int64V(*v, fastpathCheckNilTrue, e) - - case map[int32]float32: - fastpathTV.EncMapInt32Float32V(v, fastpathCheckNilTrue, e) - case *map[int32]float32: - fastpathTV.EncMapInt32Float32V(*v, fastpathCheckNilTrue, e) - - case map[int32]float64: - fastpathTV.EncMapInt32Float64V(v, fastpathCheckNilTrue, e) - case *map[int32]float64: - fastpathTV.EncMapInt32Float64V(*v, fastpathCheckNilTrue, e) - - case map[int32]bool: - fastpathTV.EncMapInt32BoolV(v, fastpathCheckNilTrue, e) - case *map[int32]bool: - fastpathTV.EncMapInt32BoolV(*v, fastpathCheckNilTrue, e) - - case []int64: - fastpathTV.EncSliceInt64V(v, fastpathCheckNilTrue, e) - case *[]int64: - fastpathTV.EncSliceInt64V(*v, fastpathCheckNilTrue, e) - - case map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(v, fastpathCheckNilTrue, e) - case *map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(*v, fastpathCheckNilTrue, e) - - case map[int64]string: - fastpathTV.EncMapInt64StringV(v, fastpathCheckNilTrue, e) - case *map[int64]string: - fastpathTV.EncMapInt64StringV(*v, fastpathCheckNilTrue, e) - - case map[int64]uint: - fastpathTV.EncMapInt64UintV(v, fastpathCheckNilTrue, e) - case *map[int64]uint: - fastpathTV.EncMapInt64UintV(*v, fastpathCheckNilTrue, e) - - case map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(v, fastpathCheckNilTrue, e) - case *map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(v, fastpathCheckNilTrue, e) - case *map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(v, fastpathCheckNilTrue, e) - case *map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(v, fastpathCheckNilTrue, e) - case *map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(v, fastpathCheckNilTrue, e) - case *map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int64]int: - fastpathTV.EncMapInt64IntV(v, fastpathCheckNilTrue, e) - case *map[int64]int: - fastpathTV.EncMapInt64IntV(*v, fastpathCheckNilTrue, e) - - case map[int64]int8: - fastpathTV.EncMapInt64Int8V(v, fastpathCheckNilTrue, e) - case *map[int64]int8: - fastpathTV.EncMapInt64Int8V(*v, fastpathCheckNilTrue, e) - - case map[int64]int16: - fastpathTV.EncMapInt64Int16V(v, fastpathCheckNilTrue, e) - case *map[int64]int16: - fastpathTV.EncMapInt64Int16V(*v, fastpathCheckNilTrue, e) - - case map[int64]int32: - fastpathTV.EncMapInt64Int32V(v, fastpathCheckNilTrue, e) - case *map[int64]int32: - fastpathTV.EncMapInt64Int32V(*v, fastpathCheckNilTrue, e) - - case map[int64]int64: - fastpathTV.EncMapInt64Int64V(v, fastpathCheckNilTrue, e) - case *map[int64]int64: - fastpathTV.EncMapInt64Int64V(*v, fastpathCheckNilTrue, e) - - case map[int64]float32: - fastpathTV.EncMapInt64Float32V(v, fastpathCheckNilTrue, e) - case *map[int64]float32: - fastpathTV.EncMapInt64Float32V(*v, fastpathCheckNilTrue, e) - - case map[int64]float64: - fastpathTV.EncMapInt64Float64V(v, fastpathCheckNilTrue, e) - case *map[int64]float64: - fastpathTV.EncMapInt64Float64V(*v, fastpathCheckNilTrue, e) - - case map[int64]bool: - fastpathTV.EncMapInt64BoolV(v, fastpathCheckNilTrue, e) - case *map[int64]bool: - fastpathTV.EncMapInt64BoolV(*v, fastpathCheckNilTrue, e) - - case []bool: - fastpathTV.EncSliceBoolV(v, fastpathCheckNilTrue, e) - case *[]bool: - fastpathTV.EncSliceBoolV(*v, fastpathCheckNilTrue, e) - - case map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(v, fastpathCheckNilTrue, e) - case *map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(*v, fastpathCheckNilTrue, e) - - case map[bool]string: - fastpathTV.EncMapBoolStringV(v, fastpathCheckNilTrue, e) - case *map[bool]string: - fastpathTV.EncMapBoolStringV(*v, fastpathCheckNilTrue, e) - - case map[bool]uint: - fastpathTV.EncMapBoolUintV(v, fastpathCheckNilTrue, e) - case *map[bool]uint: - fastpathTV.EncMapBoolUintV(*v, fastpathCheckNilTrue, e) - - case map[bool]uint8: - fastpathTV.EncMapBoolUint8V(v, fastpathCheckNilTrue, e) - case *map[bool]uint8: - fastpathTV.EncMapBoolUint8V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint16: - fastpathTV.EncMapBoolUint16V(v, fastpathCheckNilTrue, e) - case *map[bool]uint16: - fastpathTV.EncMapBoolUint16V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint32: - fastpathTV.EncMapBoolUint32V(v, fastpathCheckNilTrue, e) - case *map[bool]uint32: - fastpathTV.EncMapBoolUint32V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint64: - fastpathTV.EncMapBoolUint64V(v, fastpathCheckNilTrue, e) - case *map[bool]uint64: - fastpathTV.EncMapBoolUint64V(*v, fastpathCheckNilTrue, e) - - case map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(v, fastpathCheckNilTrue, e) - case *map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(*v, fastpathCheckNilTrue, e) - - case map[bool]int: - fastpathTV.EncMapBoolIntV(v, fastpathCheckNilTrue, e) - case *map[bool]int: - fastpathTV.EncMapBoolIntV(*v, fastpathCheckNilTrue, e) - - case map[bool]int8: - fastpathTV.EncMapBoolInt8V(v, fastpathCheckNilTrue, e) - case *map[bool]int8: - fastpathTV.EncMapBoolInt8V(*v, fastpathCheckNilTrue, e) - - case map[bool]int16: - fastpathTV.EncMapBoolInt16V(v, fastpathCheckNilTrue, e) - case *map[bool]int16: - fastpathTV.EncMapBoolInt16V(*v, fastpathCheckNilTrue, e) - - case map[bool]int32: - fastpathTV.EncMapBoolInt32V(v, fastpathCheckNilTrue, e) - case *map[bool]int32: - fastpathTV.EncMapBoolInt32V(*v, fastpathCheckNilTrue, e) - - case map[bool]int64: - fastpathTV.EncMapBoolInt64V(v, fastpathCheckNilTrue, e) - case *map[bool]int64: - fastpathTV.EncMapBoolInt64V(*v, fastpathCheckNilTrue, e) - - case map[bool]float32: - fastpathTV.EncMapBoolFloat32V(v, fastpathCheckNilTrue, e) - case *map[bool]float32: - fastpathTV.EncMapBoolFloat32V(*v, fastpathCheckNilTrue, e) - - case map[bool]float64: - fastpathTV.EncMapBoolFloat64V(v, fastpathCheckNilTrue, e) - case *map[bool]float64: - fastpathTV.EncMapBoolFloat64V(*v, fastpathCheckNilTrue, e) - - case map[bool]bool: - fastpathTV.EncMapBoolBoolV(v, fastpathCheckNilTrue, e) - case *map[bool]bool: - fastpathTV.EncMapBoolBoolV(*v, fastpathCheckNilTrue, e) - - default: - _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) - return false - } - return true -} - -func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } - switch v := iv.(type) { - - case []interface{}: - fastpathTV.EncSliceIntfV(v, fastpathCheckNilTrue, e) - case *[]interface{}: - fastpathTV.EncSliceIntfV(*v, fastpathCheckNilTrue, e) - - case []string: - fastpathTV.EncSliceStringV(v, fastpathCheckNilTrue, e) - case *[]string: - fastpathTV.EncSliceStringV(*v, fastpathCheckNilTrue, e) - - case []float32: - fastpathTV.EncSliceFloat32V(v, fastpathCheckNilTrue, e) - case *[]float32: - fastpathTV.EncSliceFloat32V(*v, fastpathCheckNilTrue, e) - - case []float64: - fastpathTV.EncSliceFloat64V(v, fastpathCheckNilTrue, e) - case *[]float64: - fastpathTV.EncSliceFloat64V(*v, fastpathCheckNilTrue, e) - - case []uint: - fastpathTV.EncSliceUintV(v, fastpathCheckNilTrue, e) - case *[]uint: - fastpathTV.EncSliceUintV(*v, fastpathCheckNilTrue, e) - - case []uint16: - fastpathTV.EncSliceUint16V(v, fastpathCheckNilTrue, e) - case *[]uint16: - fastpathTV.EncSliceUint16V(*v, fastpathCheckNilTrue, e) - - case []uint32: - fastpathTV.EncSliceUint32V(v, fastpathCheckNilTrue, e) - case *[]uint32: - fastpathTV.EncSliceUint32V(*v, fastpathCheckNilTrue, e) - - case []uint64: - fastpathTV.EncSliceUint64V(v, fastpathCheckNilTrue, e) - case *[]uint64: - fastpathTV.EncSliceUint64V(*v, fastpathCheckNilTrue, e) - - case []uintptr: - fastpathTV.EncSliceUintptrV(v, fastpathCheckNilTrue, e) - case *[]uintptr: - fastpathTV.EncSliceUintptrV(*v, fastpathCheckNilTrue, e) - - case []int: - fastpathTV.EncSliceIntV(v, fastpathCheckNilTrue, e) - case *[]int: - fastpathTV.EncSliceIntV(*v, fastpathCheckNilTrue, e) - - case []int8: - fastpathTV.EncSliceInt8V(v, fastpathCheckNilTrue, e) - case *[]int8: - fastpathTV.EncSliceInt8V(*v, fastpathCheckNilTrue, e) - - case []int16: - fastpathTV.EncSliceInt16V(v, fastpathCheckNilTrue, e) - case *[]int16: - fastpathTV.EncSliceInt16V(*v, fastpathCheckNilTrue, e) - - case []int32: - fastpathTV.EncSliceInt32V(v, fastpathCheckNilTrue, e) - case *[]int32: - fastpathTV.EncSliceInt32V(*v, fastpathCheckNilTrue, e) - - case []int64: - fastpathTV.EncSliceInt64V(v, fastpathCheckNilTrue, e) - case *[]int64: - fastpathTV.EncSliceInt64V(*v, fastpathCheckNilTrue, e) - - case []bool: - fastpathTV.EncSliceBoolV(v, fastpathCheckNilTrue, e) - case *[]bool: - fastpathTV.EncSliceBoolV(*v, fastpathCheckNilTrue, e) - - default: - _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) - return false - } - return true -} - -func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { - if !fastpathEnabled { - return false - } - switch v := iv.(type) { - - case map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(v, fastpathCheckNilTrue, e) - case *map[interface{}]interface{}: - fastpathTV.EncMapIntfIntfV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]string: - fastpathTV.EncMapIntfStringV(v, fastpathCheckNilTrue, e) - case *map[interface{}]string: - fastpathTV.EncMapIntfStringV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint: - fastpathTV.EncMapIntfUintV(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint: - fastpathTV.EncMapIntfUintV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint8: - fastpathTV.EncMapIntfUint8V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint16: - fastpathTV.EncMapIntfUint16V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint32: - fastpathTV.EncMapIntfUint32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]uint64: - fastpathTV.EncMapIntfUint64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(v, fastpathCheckNilTrue, e) - case *map[interface{}]uintptr: - fastpathTV.EncMapIntfUintptrV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int: - fastpathTV.EncMapIntfIntV(v, fastpathCheckNilTrue, e) - case *map[interface{}]int: - fastpathTV.EncMapIntfIntV(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int8: - fastpathTV.EncMapIntfInt8V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int16: - fastpathTV.EncMapIntfInt16V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int32: - fastpathTV.EncMapIntfInt32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]int64: - fastpathTV.EncMapIntfInt64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(v, fastpathCheckNilTrue, e) - case *map[interface{}]float32: - fastpathTV.EncMapIntfFloat32V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(v, fastpathCheckNilTrue, e) - case *map[interface{}]float64: - fastpathTV.EncMapIntfFloat64V(*v, fastpathCheckNilTrue, e) - - case map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(v, fastpathCheckNilTrue, e) - case *map[interface{}]bool: - fastpathTV.EncMapIntfBoolV(*v, fastpathCheckNilTrue, e) - - case map[string]interface{}: - fastpathTV.EncMapStringIntfV(v, fastpathCheckNilTrue, e) - case *map[string]interface{}: - fastpathTV.EncMapStringIntfV(*v, fastpathCheckNilTrue, e) - - case map[string]string: - fastpathTV.EncMapStringStringV(v, fastpathCheckNilTrue, e) - case *map[string]string: - fastpathTV.EncMapStringStringV(*v, fastpathCheckNilTrue, e) - - case map[string]uint: - fastpathTV.EncMapStringUintV(v, fastpathCheckNilTrue, e) - case *map[string]uint: - fastpathTV.EncMapStringUintV(*v, fastpathCheckNilTrue, e) - - case map[string]uint8: - fastpathTV.EncMapStringUint8V(v, fastpathCheckNilTrue, e) - case *map[string]uint8: - fastpathTV.EncMapStringUint8V(*v, fastpathCheckNilTrue, e) - - case map[string]uint16: - fastpathTV.EncMapStringUint16V(v, fastpathCheckNilTrue, e) - case *map[string]uint16: - fastpathTV.EncMapStringUint16V(*v, fastpathCheckNilTrue, e) - - case map[string]uint32: - fastpathTV.EncMapStringUint32V(v, fastpathCheckNilTrue, e) - case *map[string]uint32: - fastpathTV.EncMapStringUint32V(*v, fastpathCheckNilTrue, e) - - case map[string]uint64: - fastpathTV.EncMapStringUint64V(v, fastpathCheckNilTrue, e) - case *map[string]uint64: - fastpathTV.EncMapStringUint64V(*v, fastpathCheckNilTrue, e) - - case map[string]uintptr: - fastpathTV.EncMapStringUintptrV(v, fastpathCheckNilTrue, e) - case *map[string]uintptr: - fastpathTV.EncMapStringUintptrV(*v, fastpathCheckNilTrue, e) - - case map[string]int: - fastpathTV.EncMapStringIntV(v, fastpathCheckNilTrue, e) - case *map[string]int: - fastpathTV.EncMapStringIntV(*v, fastpathCheckNilTrue, e) - - case map[string]int8: - fastpathTV.EncMapStringInt8V(v, fastpathCheckNilTrue, e) - case *map[string]int8: - fastpathTV.EncMapStringInt8V(*v, fastpathCheckNilTrue, e) - - case map[string]int16: - fastpathTV.EncMapStringInt16V(v, fastpathCheckNilTrue, e) - case *map[string]int16: - fastpathTV.EncMapStringInt16V(*v, fastpathCheckNilTrue, e) - - case map[string]int32: - fastpathTV.EncMapStringInt32V(v, fastpathCheckNilTrue, e) - case *map[string]int32: - fastpathTV.EncMapStringInt32V(*v, fastpathCheckNilTrue, e) - - case map[string]int64: - fastpathTV.EncMapStringInt64V(v, fastpathCheckNilTrue, e) - case *map[string]int64: - fastpathTV.EncMapStringInt64V(*v, fastpathCheckNilTrue, e) - - case map[string]float32: - fastpathTV.EncMapStringFloat32V(v, fastpathCheckNilTrue, e) - case *map[string]float32: - fastpathTV.EncMapStringFloat32V(*v, fastpathCheckNilTrue, e) - - case map[string]float64: - fastpathTV.EncMapStringFloat64V(v, fastpathCheckNilTrue, e) - case *map[string]float64: - fastpathTV.EncMapStringFloat64V(*v, fastpathCheckNilTrue, e) - - case map[string]bool: - fastpathTV.EncMapStringBoolV(v, fastpathCheckNilTrue, e) - case *map[string]bool: - fastpathTV.EncMapStringBoolV(*v, fastpathCheckNilTrue, e) - - case map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(v, fastpathCheckNilTrue, e) - case *map[float32]interface{}: - fastpathTV.EncMapFloat32IntfV(*v, fastpathCheckNilTrue, e) - - case map[float32]string: - fastpathTV.EncMapFloat32StringV(v, fastpathCheckNilTrue, e) - case *map[float32]string: - fastpathTV.EncMapFloat32StringV(*v, fastpathCheckNilTrue, e) - - case map[float32]uint: - fastpathTV.EncMapFloat32UintV(v, fastpathCheckNilTrue, e) - case *map[float32]uint: - fastpathTV.EncMapFloat32UintV(*v, fastpathCheckNilTrue, e) - - case map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(v, fastpathCheckNilTrue, e) - case *map[float32]uint8: - fastpathTV.EncMapFloat32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(v, fastpathCheckNilTrue, e) - case *map[float32]uint16: - fastpathTV.EncMapFloat32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(v, fastpathCheckNilTrue, e) - case *map[float32]uint32: - fastpathTV.EncMapFloat32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(v, fastpathCheckNilTrue, e) - case *map[float32]uint64: - fastpathTV.EncMapFloat32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(v, fastpathCheckNilTrue, e) - case *map[float32]uintptr: - fastpathTV.EncMapFloat32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[float32]int: - fastpathTV.EncMapFloat32IntV(v, fastpathCheckNilTrue, e) - case *map[float32]int: - fastpathTV.EncMapFloat32IntV(*v, fastpathCheckNilTrue, e) - - case map[float32]int8: - fastpathTV.EncMapFloat32Int8V(v, fastpathCheckNilTrue, e) - case *map[float32]int8: - fastpathTV.EncMapFloat32Int8V(*v, fastpathCheckNilTrue, e) - - case map[float32]int16: - fastpathTV.EncMapFloat32Int16V(v, fastpathCheckNilTrue, e) - case *map[float32]int16: - fastpathTV.EncMapFloat32Int16V(*v, fastpathCheckNilTrue, e) - - case map[float32]int32: - fastpathTV.EncMapFloat32Int32V(v, fastpathCheckNilTrue, e) - case *map[float32]int32: - fastpathTV.EncMapFloat32Int32V(*v, fastpathCheckNilTrue, e) - - case map[float32]int64: - fastpathTV.EncMapFloat32Int64V(v, fastpathCheckNilTrue, e) - case *map[float32]int64: - fastpathTV.EncMapFloat32Int64V(*v, fastpathCheckNilTrue, e) - - case map[float32]float32: - fastpathTV.EncMapFloat32Float32V(v, fastpathCheckNilTrue, e) - case *map[float32]float32: - fastpathTV.EncMapFloat32Float32V(*v, fastpathCheckNilTrue, e) - - case map[float32]float64: - fastpathTV.EncMapFloat32Float64V(v, fastpathCheckNilTrue, e) - case *map[float32]float64: - fastpathTV.EncMapFloat32Float64V(*v, fastpathCheckNilTrue, e) - - case map[float32]bool: - fastpathTV.EncMapFloat32BoolV(v, fastpathCheckNilTrue, e) - case *map[float32]bool: - fastpathTV.EncMapFloat32BoolV(*v, fastpathCheckNilTrue, e) - - case map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(v, fastpathCheckNilTrue, e) - case *map[float64]interface{}: - fastpathTV.EncMapFloat64IntfV(*v, fastpathCheckNilTrue, e) - - case map[float64]string: - fastpathTV.EncMapFloat64StringV(v, fastpathCheckNilTrue, e) - case *map[float64]string: - fastpathTV.EncMapFloat64StringV(*v, fastpathCheckNilTrue, e) - - case map[float64]uint: - fastpathTV.EncMapFloat64UintV(v, fastpathCheckNilTrue, e) - case *map[float64]uint: - fastpathTV.EncMapFloat64UintV(*v, fastpathCheckNilTrue, e) - - case map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(v, fastpathCheckNilTrue, e) - case *map[float64]uint8: - fastpathTV.EncMapFloat64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(v, fastpathCheckNilTrue, e) - case *map[float64]uint16: - fastpathTV.EncMapFloat64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(v, fastpathCheckNilTrue, e) - case *map[float64]uint32: - fastpathTV.EncMapFloat64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(v, fastpathCheckNilTrue, e) - case *map[float64]uint64: - fastpathTV.EncMapFloat64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(v, fastpathCheckNilTrue, e) - case *map[float64]uintptr: - fastpathTV.EncMapFloat64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[float64]int: - fastpathTV.EncMapFloat64IntV(v, fastpathCheckNilTrue, e) - case *map[float64]int: - fastpathTV.EncMapFloat64IntV(*v, fastpathCheckNilTrue, e) - - case map[float64]int8: - fastpathTV.EncMapFloat64Int8V(v, fastpathCheckNilTrue, e) - case *map[float64]int8: - fastpathTV.EncMapFloat64Int8V(*v, fastpathCheckNilTrue, e) - - case map[float64]int16: - fastpathTV.EncMapFloat64Int16V(v, fastpathCheckNilTrue, e) - case *map[float64]int16: - fastpathTV.EncMapFloat64Int16V(*v, fastpathCheckNilTrue, e) - - case map[float64]int32: - fastpathTV.EncMapFloat64Int32V(v, fastpathCheckNilTrue, e) - case *map[float64]int32: - fastpathTV.EncMapFloat64Int32V(*v, fastpathCheckNilTrue, e) - - case map[float64]int64: - fastpathTV.EncMapFloat64Int64V(v, fastpathCheckNilTrue, e) - case *map[float64]int64: - fastpathTV.EncMapFloat64Int64V(*v, fastpathCheckNilTrue, e) - - case map[float64]float32: - fastpathTV.EncMapFloat64Float32V(v, fastpathCheckNilTrue, e) - case *map[float64]float32: - fastpathTV.EncMapFloat64Float32V(*v, fastpathCheckNilTrue, e) - - case map[float64]float64: - fastpathTV.EncMapFloat64Float64V(v, fastpathCheckNilTrue, e) - case *map[float64]float64: - fastpathTV.EncMapFloat64Float64V(*v, fastpathCheckNilTrue, e) - - case map[float64]bool: - fastpathTV.EncMapFloat64BoolV(v, fastpathCheckNilTrue, e) - case *map[float64]bool: - fastpathTV.EncMapFloat64BoolV(*v, fastpathCheckNilTrue, e) - - case map[uint]interface{}: - fastpathTV.EncMapUintIntfV(v, fastpathCheckNilTrue, e) - case *map[uint]interface{}: - fastpathTV.EncMapUintIntfV(*v, fastpathCheckNilTrue, e) - - case map[uint]string: - fastpathTV.EncMapUintStringV(v, fastpathCheckNilTrue, e) - case *map[uint]string: - fastpathTV.EncMapUintStringV(*v, fastpathCheckNilTrue, e) - - case map[uint]uint: - fastpathTV.EncMapUintUintV(v, fastpathCheckNilTrue, e) - case *map[uint]uint: - fastpathTV.EncMapUintUintV(*v, fastpathCheckNilTrue, e) - - case map[uint]uint8: - fastpathTV.EncMapUintUint8V(v, fastpathCheckNilTrue, e) - case *map[uint]uint8: - fastpathTV.EncMapUintUint8V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint16: - fastpathTV.EncMapUintUint16V(v, fastpathCheckNilTrue, e) - case *map[uint]uint16: - fastpathTV.EncMapUintUint16V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint32: - fastpathTV.EncMapUintUint32V(v, fastpathCheckNilTrue, e) - case *map[uint]uint32: - fastpathTV.EncMapUintUint32V(*v, fastpathCheckNilTrue, e) - - case map[uint]uint64: - fastpathTV.EncMapUintUint64V(v, fastpathCheckNilTrue, e) - case *map[uint]uint64: - fastpathTV.EncMapUintUint64V(*v, fastpathCheckNilTrue, e) - - case map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(v, fastpathCheckNilTrue, e) - case *map[uint]uintptr: - fastpathTV.EncMapUintUintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint]int: - fastpathTV.EncMapUintIntV(v, fastpathCheckNilTrue, e) - case *map[uint]int: - fastpathTV.EncMapUintIntV(*v, fastpathCheckNilTrue, e) - - case map[uint]int8: - fastpathTV.EncMapUintInt8V(v, fastpathCheckNilTrue, e) - case *map[uint]int8: - fastpathTV.EncMapUintInt8V(*v, fastpathCheckNilTrue, e) - - case map[uint]int16: - fastpathTV.EncMapUintInt16V(v, fastpathCheckNilTrue, e) - case *map[uint]int16: - fastpathTV.EncMapUintInt16V(*v, fastpathCheckNilTrue, e) - - case map[uint]int32: - fastpathTV.EncMapUintInt32V(v, fastpathCheckNilTrue, e) - case *map[uint]int32: - fastpathTV.EncMapUintInt32V(*v, fastpathCheckNilTrue, e) - - case map[uint]int64: - fastpathTV.EncMapUintInt64V(v, fastpathCheckNilTrue, e) - case *map[uint]int64: - fastpathTV.EncMapUintInt64V(*v, fastpathCheckNilTrue, e) - - case map[uint]float32: - fastpathTV.EncMapUintFloat32V(v, fastpathCheckNilTrue, e) - case *map[uint]float32: - fastpathTV.EncMapUintFloat32V(*v, fastpathCheckNilTrue, e) - - case map[uint]float64: - fastpathTV.EncMapUintFloat64V(v, fastpathCheckNilTrue, e) - case *map[uint]float64: - fastpathTV.EncMapUintFloat64V(*v, fastpathCheckNilTrue, e) - - case map[uint]bool: - fastpathTV.EncMapUintBoolV(v, fastpathCheckNilTrue, e) - case *map[uint]bool: - fastpathTV.EncMapUintBoolV(*v, fastpathCheckNilTrue, e) - - case map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(v, fastpathCheckNilTrue, e) - case *map[uint8]interface{}: - fastpathTV.EncMapUint8IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint8]string: - fastpathTV.EncMapUint8StringV(v, fastpathCheckNilTrue, e) - case *map[uint8]string: - fastpathTV.EncMapUint8StringV(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint: - fastpathTV.EncMapUint8UintV(v, fastpathCheckNilTrue, e) - case *map[uint8]uint: - fastpathTV.EncMapUint8UintV(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint8: - fastpathTV.EncMapUint8Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint16: - fastpathTV.EncMapUint8Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint32: - fastpathTV.EncMapUint8Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint8]uint64: - fastpathTV.EncMapUint8Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint8]uintptr: - fastpathTV.EncMapUint8UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint8]int: - fastpathTV.EncMapUint8IntV(v, fastpathCheckNilTrue, e) - case *map[uint8]int: - fastpathTV.EncMapUint8IntV(*v, fastpathCheckNilTrue, e) - - case map[uint8]int8: - fastpathTV.EncMapUint8Int8V(v, fastpathCheckNilTrue, e) - case *map[uint8]int8: - fastpathTV.EncMapUint8Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int16: - fastpathTV.EncMapUint8Int16V(v, fastpathCheckNilTrue, e) - case *map[uint8]int16: - fastpathTV.EncMapUint8Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int32: - fastpathTV.EncMapUint8Int32V(v, fastpathCheckNilTrue, e) - case *map[uint8]int32: - fastpathTV.EncMapUint8Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]int64: - fastpathTV.EncMapUint8Int64V(v, fastpathCheckNilTrue, e) - case *map[uint8]int64: - fastpathTV.EncMapUint8Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]float32: - fastpathTV.EncMapUint8Float32V(v, fastpathCheckNilTrue, e) - case *map[uint8]float32: - fastpathTV.EncMapUint8Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint8]float64: - fastpathTV.EncMapUint8Float64V(v, fastpathCheckNilTrue, e) - case *map[uint8]float64: - fastpathTV.EncMapUint8Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint8]bool: - fastpathTV.EncMapUint8BoolV(v, fastpathCheckNilTrue, e) - case *map[uint8]bool: - fastpathTV.EncMapUint8BoolV(*v, fastpathCheckNilTrue, e) - - case map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(v, fastpathCheckNilTrue, e) - case *map[uint16]interface{}: - fastpathTV.EncMapUint16IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint16]string: - fastpathTV.EncMapUint16StringV(v, fastpathCheckNilTrue, e) - case *map[uint16]string: - fastpathTV.EncMapUint16StringV(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint: - fastpathTV.EncMapUint16UintV(v, fastpathCheckNilTrue, e) - case *map[uint16]uint: - fastpathTV.EncMapUint16UintV(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint8: - fastpathTV.EncMapUint16Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint16: - fastpathTV.EncMapUint16Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint32: - fastpathTV.EncMapUint16Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint16]uint64: - fastpathTV.EncMapUint16Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint16]uintptr: - fastpathTV.EncMapUint16UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint16]int: - fastpathTV.EncMapUint16IntV(v, fastpathCheckNilTrue, e) - case *map[uint16]int: - fastpathTV.EncMapUint16IntV(*v, fastpathCheckNilTrue, e) - - case map[uint16]int8: - fastpathTV.EncMapUint16Int8V(v, fastpathCheckNilTrue, e) - case *map[uint16]int8: - fastpathTV.EncMapUint16Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int16: - fastpathTV.EncMapUint16Int16V(v, fastpathCheckNilTrue, e) - case *map[uint16]int16: - fastpathTV.EncMapUint16Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int32: - fastpathTV.EncMapUint16Int32V(v, fastpathCheckNilTrue, e) - case *map[uint16]int32: - fastpathTV.EncMapUint16Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]int64: - fastpathTV.EncMapUint16Int64V(v, fastpathCheckNilTrue, e) - case *map[uint16]int64: - fastpathTV.EncMapUint16Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]float32: - fastpathTV.EncMapUint16Float32V(v, fastpathCheckNilTrue, e) - case *map[uint16]float32: - fastpathTV.EncMapUint16Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint16]float64: - fastpathTV.EncMapUint16Float64V(v, fastpathCheckNilTrue, e) - case *map[uint16]float64: - fastpathTV.EncMapUint16Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint16]bool: - fastpathTV.EncMapUint16BoolV(v, fastpathCheckNilTrue, e) - case *map[uint16]bool: - fastpathTV.EncMapUint16BoolV(*v, fastpathCheckNilTrue, e) - - case map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(v, fastpathCheckNilTrue, e) - case *map[uint32]interface{}: - fastpathTV.EncMapUint32IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint32]string: - fastpathTV.EncMapUint32StringV(v, fastpathCheckNilTrue, e) - case *map[uint32]string: - fastpathTV.EncMapUint32StringV(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint: - fastpathTV.EncMapUint32UintV(v, fastpathCheckNilTrue, e) - case *map[uint32]uint: - fastpathTV.EncMapUint32UintV(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint8: - fastpathTV.EncMapUint32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint16: - fastpathTV.EncMapUint32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint32: - fastpathTV.EncMapUint32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint32]uint64: - fastpathTV.EncMapUint32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint32]uintptr: - fastpathTV.EncMapUint32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint32]int: - fastpathTV.EncMapUint32IntV(v, fastpathCheckNilTrue, e) - case *map[uint32]int: - fastpathTV.EncMapUint32IntV(*v, fastpathCheckNilTrue, e) - - case map[uint32]int8: - fastpathTV.EncMapUint32Int8V(v, fastpathCheckNilTrue, e) - case *map[uint32]int8: - fastpathTV.EncMapUint32Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int16: - fastpathTV.EncMapUint32Int16V(v, fastpathCheckNilTrue, e) - case *map[uint32]int16: - fastpathTV.EncMapUint32Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int32: - fastpathTV.EncMapUint32Int32V(v, fastpathCheckNilTrue, e) - case *map[uint32]int32: - fastpathTV.EncMapUint32Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]int64: - fastpathTV.EncMapUint32Int64V(v, fastpathCheckNilTrue, e) - case *map[uint32]int64: - fastpathTV.EncMapUint32Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]float32: - fastpathTV.EncMapUint32Float32V(v, fastpathCheckNilTrue, e) - case *map[uint32]float32: - fastpathTV.EncMapUint32Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint32]float64: - fastpathTV.EncMapUint32Float64V(v, fastpathCheckNilTrue, e) - case *map[uint32]float64: - fastpathTV.EncMapUint32Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint32]bool: - fastpathTV.EncMapUint32BoolV(v, fastpathCheckNilTrue, e) - case *map[uint32]bool: - fastpathTV.EncMapUint32BoolV(*v, fastpathCheckNilTrue, e) - - case map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(v, fastpathCheckNilTrue, e) - case *map[uint64]interface{}: - fastpathTV.EncMapUint64IntfV(*v, fastpathCheckNilTrue, e) - - case map[uint64]string: - fastpathTV.EncMapUint64StringV(v, fastpathCheckNilTrue, e) - case *map[uint64]string: - fastpathTV.EncMapUint64StringV(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint: - fastpathTV.EncMapUint64UintV(v, fastpathCheckNilTrue, e) - case *map[uint64]uint: - fastpathTV.EncMapUint64UintV(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint8: - fastpathTV.EncMapUint64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint16: - fastpathTV.EncMapUint64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint32: - fastpathTV.EncMapUint64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(v, fastpathCheckNilTrue, e) - case *map[uint64]uint64: - fastpathTV.EncMapUint64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(v, fastpathCheckNilTrue, e) - case *map[uint64]uintptr: - fastpathTV.EncMapUint64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[uint64]int: - fastpathTV.EncMapUint64IntV(v, fastpathCheckNilTrue, e) - case *map[uint64]int: - fastpathTV.EncMapUint64IntV(*v, fastpathCheckNilTrue, e) - - case map[uint64]int8: - fastpathTV.EncMapUint64Int8V(v, fastpathCheckNilTrue, e) - case *map[uint64]int8: - fastpathTV.EncMapUint64Int8V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int16: - fastpathTV.EncMapUint64Int16V(v, fastpathCheckNilTrue, e) - case *map[uint64]int16: - fastpathTV.EncMapUint64Int16V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int32: - fastpathTV.EncMapUint64Int32V(v, fastpathCheckNilTrue, e) - case *map[uint64]int32: - fastpathTV.EncMapUint64Int32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]int64: - fastpathTV.EncMapUint64Int64V(v, fastpathCheckNilTrue, e) - case *map[uint64]int64: - fastpathTV.EncMapUint64Int64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]float32: - fastpathTV.EncMapUint64Float32V(v, fastpathCheckNilTrue, e) - case *map[uint64]float32: - fastpathTV.EncMapUint64Float32V(*v, fastpathCheckNilTrue, e) - - case map[uint64]float64: - fastpathTV.EncMapUint64Float64V(v, fastpathCheckNilTrue, e) - case *map[uint64]float64: - fastpathTV.EncMapUint64Float64V(*v, fastpathCheckNilTrue, e) - - case map[uint64]bool: - fastpathTV.EncMapUint64BoolV(v, fastpathCheckNilTrue, e) - case *map[uint64]bool: - fastpathTV.EncMapUint64BoolV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(v, fastpathCheckNilTrue, e) - case *map[uintptr]interface{}: - fastpathTV.EncMapUintptrIntfV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]string: - fastpathTV.EncMapUintptrStringV(v, fastpathCheckNilTrue, e) - case *map[uintptr]string: - fastpathTV.EncMapUintptrStringV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint: - fastpathTV.EncMapUintptrUintV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint8: - fastpathTV.EncMapUintptrUint8V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint16: - fastpathTV.EncMapUintptrUint16V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint32: - fastpathTV.EncMapUintptrUint32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]uint64: - fastpathTV.EncMapUintptrUint64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(v, fastpathCheckNilTrue, e) - case *map[uintptr]uintptr: - fastpathTV.EncMapUintptrUintptrV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int: - fastpathTV.EncMapUintptrIntV(v, fastpathCheckNilTrue, e) - case *map[uintptr]int: - fastpathTV.EncMapUintptrIntV(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int8: - fastpathTV.EncMapUintptrInt8V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int16: - fastpathTV.EncMapUintptrInt16V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int32: - fastpathTV.EncMapUintptrInt32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]int64: - fastpathTV.EncMapUintptrInt64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(v, fastpathCheckNilTrue, e) - case *map[uintptr]float32: - fastpathTV.EncMapUintptrFloat32V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(v, fastpathCheckNilTrue, e) - case *map[uintptr]float64: - fastpathTV.EncMapUintptrFloat64V(*v, fastpathCheckNilTrue, e) - - case map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(v, fastpathCheckNilTrue, e) - case *map[uintptr]bool: - fastpathTV.EncMapUintptrBoolV(*v, fastpathCheckNilTrue, e) - - case map[int]interface{}: - fastpathTV.EncMapIntIntfV(v, fastpathCheckNilTrue, e) - case *map[int]interface{}: - fastpathTV.EncMapIntIntfV(*v, fastpathCheckNilTrue, e) - - case map[int]string: - fastpathTV.EncMapIntStringV(v, fastpathCheckNilTrue, e) - case *map[int]string: - fastpathTV.EncMapIntStringV(*v, fastpathCheckNilTrue, e) - - case map[int]uint: - fastpathTV.EncMapIntUintV(v, fastpathCheckNilTrue, e) - case *map[int]uint: - fastpathTV.EncMapIntUintV(*v, fastpathCheckNilTrue, e) - - case map[int]uint8: - fastpathTV.EncMapIntUint8V(v, fastpathCheckNilTrue, e) - case *map[int]uint8: - fastpathTV.EncMapIntUint8V(*v, fastpathCheckNilTrue, e) - - case map[int]uint16: - fastpathTV.EncMapIntUint16V(v, fastpathCheckNilTrue, e) - case *map[int]uint16: - fastpathTV.EncMapIntUint16V(*v, fastpathCheckNilTrue, e) - - case map[int]uint32: - fastpathTV.EncMapIntUint32V(v, fastpathCheckNilTrue, e) - case *map[int]uint32: - fastpathTV.EncMapIntUint32V(*v, fastpathCheckNilTrue, e) - - case map[int]uint64: - fastpathTV.EncMapIntUint64V(v, fastpathCheckNilTrue, e) - case *map[int]uint64: - fastpathTV.EncMapIntUint64V(*v, fastpathCheckNilTrue, e) - - case map[int]uintptr: - fastpathTV.EncMapIntUintptrV(v, fastpathCheckNilTrue, e) - case *map[int]uintptr: - fastpathTV.EncMapIntUintptrV(*v, fastpathCheckNilTrue, e) - - case map[int]int: - fastpathTV.EncMapIntIntV(v, fastpathCheckNilTrue, e) - case *map[int]int: - fastpathTV.EncMapIntIntV(*v, fastpathCheckNilTrue, e) - - case map[int]int8: - fastpathTV.EncMapIntInt8V(v, fastpathCheckNilTrue, e) - case *map[int]int8: - fastpathTV.EncMapIntInt8V(*v, fastpathCheckNilTrue, e) - - case map[int]int16: - fastpathTV.EncMapIntInt16V(v, fastpathCheckNilTrue, e) - case *map[int]int16: - fastpathTV.EncMapIntInt16V(*v, fastpathCheckNilTrue, e) - - case map[int]int32: - fastpathTV.EncMapIntInt32V(v, fastpathCheckNilTrue, e) - case *map[int]int32: - fastpathTV.EncMapIntInt32V(*v, fastpathCheckNilTrue, e) - - case map[int]int64: - fastpathTV.EncMapIntInt64V(v, fastpathCheckNilTrue, e) - case *map[int]int64: - fastpathTV.EncMapIntInt64V(*v, fastpathCheckNilTrue, e) - - case map[int]float32: - fastpathTV.EncMapIntFloat32V(v, fastpathCheckNilTrue, e) - case *map[int]float32: - fastpathTV.EncMapIntFloat32V(*v, fastpathCheckNilTrue, e) - - case map[int]float64: - fastpathTV.EncMapIntFloat64V(v, fastpathCheckNilTrue, e) - case *map[int]float64: - fastpathTV.EncMapIntFloat64V(*v, fastpathCheckNilTrue, e) - - case map[int]bool: - fastpathTV.EncMapIntBoolV(v, fastpathCheckNilTrue, e) - case *map[int]bool: - fastpathTV.EncMapIntBoolV(*v, fastpathCheckNilTrue, e) - - case map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(v, fastpathCheckNilTrue, e) - case *map[int8]interface{}: - fastpathTV.EncMapInt8IntfV(*v, fastpathCheckNilTrue, e) - - case map[int8]string: - fastpathTV.EncMapInt8StringV(v, fastpathCheckNilTrue, e) - case *map[int8]string: - fastpathTV.EncMapInt8StringV(*v, fastpathCheckNilTrue, e) - - case map[int8]uint: - fastpathTV.EncMapInt8UintV(v, fastpathCheckNilTrue, e) - case *map[int8]uint: - fastpathTV.EncMapInt8UintV(*v, fastpathCheckNilTrue, e) - - case map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(v, fastpathCheckNilTrue, e) - case *map[int8]uint8: - fastpathTV.EncMapInt8Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(v, fastpathCheckNilTrue, e) - case *map[int8]uint16: - fastpathTV.EncMapInt8Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(v, fastpathCheckNilTrue, e) - case *map[int8]uint32: - fastpathTV.EncMapInt8Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(v, fastpathCheckNilTrue, e) - case *map[int8]uint64: - fastpathTV.EncMapInt8Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(v, fastpathCheckNilTrue, e) - case *map[int8]uintptr: - fastpathTV.EncMapInt8UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int8]int: - fastpathTV.EncMapInt8IntV(v, fastpathCheckNilTrue, e) - case *map[int8]int: - fastpathTV.EncMapInt8IntV(*v, fastpathCheckNilTrue, e) - - case map[int8]int8: - fastpathTV.EncMapInt8Int8V(v, fastpathCheckNilTrue, e) - case *map[int8]int8: - fastpathTV.EncMapInt8Int8V(*v, fastpathCheckNilTrue, e) - - case map[int8]int16: - fastpathTV.EncMapInt8Int16V(v, fastpathCheckNilTrue, e) - case *map[int8]int16: - fastpathTV.EncMapInt8Int16V(*v, fastpathCheckNilTrue, e) - - case map[int8]int32: - fastpathTV.EncMapInt8Int32V(v, fastpathCheckNilTrue, e) - case *map[int8]int32: - fastpathTV.EncMapInt8Int32V(*v, fastpathCheckNilTrue, e) - - case map[int8]int64: - fastpathTV.EncMapInt8Int64V(v, fastpathCheckNilTrue, e) - case *map[int8]int64: - fastpathTV.EncMapInt8Int64V(*v, fastpathCheckNilTrue, e) - - case map[int8]float32: - fastpathTV.EncMapInt8Float32V(v, fastpathCheckNilTrue, e) - case *map[int8]float32: - fastpathTV.EncMapInt8Float32V(*v, fastpathCheckNilTrue, e) - - case map[int8]float64: - fastpathTV.EncMapInt8Float64V(v, fastpathCheckNilTrue, e) - case *map[int8]float64: - fastpathTV.EncMapInt8Float64V(*v, fastpathCheckNilTrue, e) - - case map[int8]bool: - fastpathTV.EncMapInt8BoolV(v, fastpathCheckNilTrue, e) - case *map[int8]bool: - fastpathTV.EncMapInt8BoolV(*v, fastpathCheckNilTrue, e) - - case map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(v, fastpathCheckNilTrue, e) - case *map[int16]interface{}: - fastpathTV.EncMapInt16IntfV(*v, fastpathCheckNilTrue, e) - - case map[int16]string: - fastpathTV.EncMapInt16StringV(v, fastpathCheckNilTrue, e) - case *map[int16]string: - fastpathTV.EncMapInt16StringV(*v, fastpathCheckNilTrue, e) - - case map[int16]uint: - fastpathTV.EncMapInt16UintV(v, fastpathCheckNilTrue, e) - case *map[int16]uint: - fastpathTV.EncMapInt16UintV(*v, fastpathCheckNilTrue, e) - - case map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(v, fastpathCheckNilTrue, e) - case *map[int16]uint8: - fastpathTV.EncMapInt16Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(v, fastpathCheckNilTrue, e) - case *map[int16]uint16: - fastpathTV.EncMapInt16Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(v, fastpathCheckNilTrue, e) - case *map[int16]uint32: - fastpathTV.EncMapInt16Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(v, fastpathCheckNilTrue, e) - case *map[int16]uint64: - fastpathTV.EncMapInt16Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(v, fastpathCheckNilTrue, e) - case *map[int16]uintptr: - fastpathTV.EncMapInt16UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int16]int: - fastpathTV.EncMapInt16IntV(v, fastpathCheckNilTrue, e) - case *map[int16]int: - fastpathTV.EncMapInt16IntV(*v, fastpathCheckNilTrue, e) - - case map[int16]int8: - fastpathTV.EncMapInt16Int8V(v, fastpathCheckNilTrue, e) - case *map[int16]int8: - fastpathTV.EncMapInt16Int8V(*v, fastpathCheckNilTrue, e) - - case map[int16]int16: - fastpathTV.EncMapInt16Int16V(v, fastpathCheckNilTrue, e) - case *map[int16]int16: - fastpathTV.EncMapInt16Int16V(*v, fastpathCheckNilTrue, e) - - case map[int16]int32: - fastpathTV.EncMapInt16Int32V(v, fastpathCheckNilTrue, e) - case *map[int16]int32: - fastpathTV.EncMapInt16Int32V(*v, fastpathCheckNilTrue, e) - - case map[int16]int64: - fastpathTV.EncMapInt16Int64V(v, fastpathCheckNilTrue, e) - case *map[int16]int64: - fastpathTV.EncMapInt16Int64V(*v, fastpathCheckNilTrue, e) - - case map[int16]float32: - fastpathTV.EncMapInt16Float32V(v, fastpathCheckNilTrue, e) - case *map[int16]float32: - fastpathTV.EncMapInt16Float32V(*v, fastpathCheckNilTrue, e) - - case map[int16]float64: - fastpathTV.EncMapInt16Float64V(v, fastpathCheckNilTrue, e) - case *map[int16]float64: - fastpathTV.EncMapInt16Float64V(*v, fastpathCheckNilTrue, e) - - case map[int16]bool: - fastpathTV.EncMapInt16BoolV(v, fastpathCheckNilTrue, e) - case *map[int16]bool: - fastpathTV.EncMapInt16BoolV(*v, fastpathCheckNilTrue, e) - - case map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(v, fastpathCheckNilTrue, e) - case *map[int32]interface{}: - fastpathTV.EncMapInt32IntfV(*v, fastpathCheckNilTrue, e) - - case map[int32]string: - fastpathTV.EncMapInt32StringV(v, fastpathCheckNilTrue, e) - case *map[int32]string: - fastpathTV.EncMapInt32StringV(*v, fastpathCheckNilTrue, e) - - case map[int32]uint: - fastpathTV.EncMapInt32UintV(v, fastpathCheckNilTrue, e) - case *map[int32]uint: - fastpathTV.EncMapInt32UintV(*v, fastpathCheckNilTrue, e) - - case map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(v, fastpathCheckNilTrue, e) - case *map[int32]uint8: - fastpathTV.EncMapInt32Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(v, fastpathCheckNilTrue, e) - case *map[int32]uint16: - fastpathTV.EncMapInt32Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(v, fastpathCheckNilTrue, e) - case *map[int32]uint32: - fastpathTV.EncMapInt32Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(v, fastpathCheckNilTrue, e) - case *map[int32]uint64: - fastpathTV.EncMapInt32Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(v, fastpathCheckNilTrue, e) - case *map[int32]uintptr: - fastpathTV.EncMapInt32UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int32]int: - fastpathTV.EncMapInt32IntV(v, fastpathCheckNilTrue, e) - case *map[int32]int: - fastpathTV.EncMapInt32IntV(*v, fastpathCheckNilTrue, e) - - case map[int32]int8: - fastpathTV.EncMapInt32Int8V(v, fastpathCheckNilTrue, e) - case *map[int32]int8: - fastpathTV.EncMapInt32Int8V(*v, fastpathCheckNilTrue, e) - - case map[int32]int16: - fastpathTV.EncMapInt32Int16V(v, fastpathCheckNilTrue, e) - case *map[int32]int16: - fastpathTV.EncMapInt32Int16V(*v, fastpathCheckNilTrue, e) - - case map[int32]int32: - fastpathTV.EncMapInt32Int32V(v, fastpathCheckNilTrue, e) - case *map[int32]int32: - fastpathTV.EncMapInt32Int32V(*v, fastpathCheckNilTrue, e) - - case map[int32]int64: - fastpathTV.EncMapInt32Int64V(v, fastpathCheckNilTrue, e) - case *map[int32]int64: - fastpathTV.EncMapInt32Int64V(*v, fastpathCheckNilTrue, e) - - case map[int32]float32: - fastpathTV.EncMapInt32Float32V(v, fastpathCheckNilTrue, e) - case *map[int32]float32: - fastpathTV.EncMapInt32Float32V(*v, fastpathCheckNilTrue, e) - - case map[int32]float64: - fastpathTV.EncMapInt32Float64V(v, fastpathCheckNilTrue, e) - case *map[int32]float64: - fastpathTV.EncMapInt32Float64V(*v, fastpathCheckNilTrue, e) - - case map[int32]bool: - fastpathTV.EncMapInt32BoolV(v, fastpathCheckNilTrue, e) - case *map[int32]bool: - fastpathTV.EncMapInt32BoolV(*v, fastpathCheckNilTrue, e) - - case map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(v, fastpathCheckNilTrue, e) - case *map[int64]interface{}: - fastpathTV.EncMapInt64IntfV(*v, fastpathCheckNilTrue, e) - - case map[int64]string: - fastpathTV.EncMapInt64StringV(v, fastpathCheckNilTrue, e) - case *map[int64]string: - fastpathTV.EncMapInt64StringV(*v, fastpathCheckNilTrue, e) - - case map[int64]uint: - fastpathTV.EncMapInt64UintV(v, fastpathCheckNilTrue, e) - case *map[int64]uint: - fastpathTV.EncMapInt64UintV(*v, fastpathCheckNilTrue, e) - - case map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(v, fastpathCheckNilTrue, e) - case *map[int64]uint8: - fastpathTV.EncMapInt64Uint8V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(v, fastpathCheckNilTrue, e) - case *map[int64]uint16: - fastpathTV.EncMapInt64Uint16V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(v, fastpathCheckNilTrue, e) - case *map[int64]uint32: - fastpathTV.EncMapInt64Uint32V(*v, fastpathCheckNilTrue, e) - - case map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(v, fastpathCheckNilTrue, e) - case *map[int64]uint64: - fastpathTV.EncMapInt64Uint64V(*v, fastpathCheckNilTrue, e) - - case map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(v, fastpathCheckNilTrue, e) - case *map[int64]uintptr: - fastpathTV.EncMapInt64UintptrV(*v, fastpathCheckNilTrue, e) - - case map[int64]int: - fastpathTV.EncMapInt64IntV(v, fastpathCheckNilTrue, e) - case *map[int64]int: - fastpathTV.EncMapInt64IntV(*v, fastpathCheckNilTrue, e) - - case map[int64]int8: - fastpathTV.EncMapInt64Int8V(v, fastpathCheckNilTrue, e) - case *map[int64]int8: - fastpathTV.EncMapInt64Int8V(*v, fastpathCheckNilTrue, e) - - case map[int64]int16: - fastpathTV.EncMapInt64Int16V(v, fastpathCheckNilTrue, e) - case *map[int64]int16: - fastpathTV.EncMapInt64Int16V(*v, fastpathCheckNilTrue, e) - - case map[int64]int32: - fastpathTV.EncMapInt64Int32V(v, fastpathCheckNilTrue, e) - case *map[int64]int32: - fastpathTV.EncMapInt64Int32V(*v, fastpathCheckNilTrue, e) - - case map[int64]int64: - fastpathTV.EncMapInt64Int64V(v, fastpathCheckNilTrue, e) - case *map[int64]int64: - fastpathTV.EncMapInt64Int64V(*v, fastpathCheckNilTrue, e) - - case map[int64]float32: - fastpathTV.EncMapInt64Float32V(v, fastpathCheckNilTrue, e) - case *map[int64]float32: - fastpathTV.EncMapInt64Float32V(*v, fastpathCheckNilTrue, e) - - case map[int64]float64: - fastpathTV.EncMapInt64Float64V(v, fastpathCheckNilTrue, e) - case *map[int64]float64: - fastpathTV.EncMapInt64Float64V(*v, fastpathCheckNilTrue, e) - - case map[int64]bool: - fastpathTV.EncMapInt64BoolV(v, fastpathCheckNilTrue, e) - case *map[int64]bool: - fastpathTV.EncMapInt64BoolV(*v, fastpathCheckNilTrue, e) - - case map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(v, fastpathCheckNilTrue, e) - case *map[bool]interface{}: - fastpathTV.EncMapBoolIntfV(*v, fastpathCheckNilTrue, e) - - case map[bool]string: - fastpathTV.EncMapBoolStringV(v, fastpathCheckNilTrue, e) - case *map[bool]string: - fastpathTV.EncMapBoolStringV(*v, fastpathCheckNilTrue, e) - - case map[bool]uint: - fastpathTV.EncMapBoolUintV(v, fastpathCheckNilTrue, e) - case *map[bool]uint: - fastpathTV.EncMapBoolUintV(*v, fastpathCheckNilTrue, e) - - case map[bool]uint8: - fastpathTV.EncMapBoolUint8V(v, fastpathCheckNilTrue, e) - case *map[bool]uint8: - fastpathTV.EncMapBoolUint8V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint16: - fastpathTV.EncMapBoolUint16V(v, fastpathCheckNilTrue, e) - case *map[bool]uint16: - fastpathTV.EncMapBoolUint16V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint32: - fastpathTV.EncMapBoolUint32V(v, fastpathCheckNilTrue, e) - case *map[bool]uint32: - fastpathTV.EncMapBoolUint32V(*v, fastpathCheckNilTrue, e) - - case map[bool]uint64: - fastpathTV.EncMapBoolUint64V(v, fastpathCheckNilTrue, e) - case *map[bool]uint64: - fastpathTV.EncMapBoolUint64V(*v, fastpathCheckNilTrue, e) - - case map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(v, fastpathCheckNilTrue, e) - case *map[bool]uintptr: - fastpathTV.EncMapBoolUintptrV(*v, fastpathCheckNilTrue, e) - - case map[bool]int: - fastpathTV.EncMapBoolIntV(v, fastpathCheckNilTrue, e) - case *map[bool]int: - fastpathTV.EncMapBoolIntV(*v, fastpathCheckNilTrue, e) - - case map[bool]int8: - fastpathTV.EncMapBoolInt8V(v, fastpathCheckNilTrue, e) - case *map[bool]int8: - fastpathTV.EncMapBoolInt8V(*v, fastpathCheckNilTrue, e) - - case map[bool]int16: - fastpathTV.EncMapBoolInt16V(v, fastpathCheckNilTrue, e) - case *map[bool]int16: - fastpathTV.EncMapBoolInt16V(*v, fastpathCheckNilTrue, e) - - case map[bool]int32: - fastpathTV.EncMapBoolInt32V(v, fastpathCheckNilTrue, e) - case *map[bool]int32: - fastpathTV.EncMapBoolInt32V(*v, fastpathCheckNilTrue, e) - - case map[bool]int64: - fastpathTV.EncMapBoolInt64V(v, fastpathCheckNilTrue, e) - case *map[bool]int64: - fastpathTV.EncMapBoolInt64V(*v, fastpathCheckNilTrue, e) - - case map[bool]float32: - fastpathTV.EncMapBoolFloat32V(v, fastpathCheckNilTrue, e) - case *map[bool]float32: - fastpathTV.EncMapBoolFloat32V(*v, fastpathCheckNilTrue, e) - - case map[bool]float64: - fastpathTV.EncMapBoolFloat64V(v, fastpathCheckNilTrue, e) - case *map[bool]float64: - fastpathTV.EncMapBoolFloat64V(*v, fastpathCheckNilTrue, e) - - case map[bool]bool: - fastpathTV.EncMapBoolBoolV(v, fastpathCheckNilTrue, e) - case *map[bool]bool: - fastpathTV.EncMapBoolBoolV(*v, fastpathCheckNilTrue, e) - - default: - _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) - return false - } - return true -} - -// -- -- fast path functions - -func (f *encFnInfo) fastpathEncSliceIntfR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceIntfV(rv.Interface().([]interface{}), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceIntfV(rv.Interface().([]interface{}), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceIntfV(v []interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - e.encode(v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceIntfV(v []interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - e.encode(v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceStringR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceStringV(rv.Interface().([]string), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceStringV(rv.Interface().([]string), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceStringV(v []string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeString(c_UTF8, v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceStringV(v []string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeString(c_UTF8, v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceFloat32R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceFloat32V(rv.Interface().([]float32), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceFloat32V(rv.Interface().([]float32), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceFloat32V(v []float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeFloat32(v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceFloat32V(v []float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeFloat32(v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceFloat64R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceFloat64V(rv.Interface().([]float64), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceFloat64V(rv.Interface().([]float64), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceFloat64V(v []float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeFloat64(v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceFloat64V(v []float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeFloat64(v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceUintR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUintV(rv.Interface().([]uint), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceUintV(rv.Interface().([]uint), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceUintV(v []uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceUintV(v []uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceUint16R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint16V(rv.Interface().([]uint16), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceUint16V(rv.Interface().([]uint16), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceUint16V(v []uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceUint16V(v []uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceUint32R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint32V(rv.Interface().([]uint32), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceUint32V(rv.Interface().([]uint32), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceUint32V(v []uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceUint32V(v []uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceUint64R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUint64V(rv.Interface().([]uint64), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceUint64V(rv.Interface().([]uint64), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceUint64V(v []uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceUint64V(v []uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeUint(uint64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceUintptrR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceUintptrV(rv.Interface().([]uintptr), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceUintptrV(rv.Interface().([]uintptr), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceUintptrV(v []uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - e.encode(v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceUintptrV(v []uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - e.encode(v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceIntR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceIntV(rv.Interface().([]int), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceIntV(rv.Interface().([]int), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceIntV(v []int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceIntV(v []int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceInt8R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt8V(rv.Interface().([]int8), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceInt8V(rv.Interface().([]int8), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceInt8V(v []int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceInt8V(v []int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceInt16R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt16V(rv.Interface().([]int16), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceInt16V(rv.Interface().([]int16), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceInt16V(v []int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceInt16V(v []int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceInt32R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt32V(rv.Interface().([]int32), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceInt32V(rv.Interface().([]int32), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceInt32V(v []int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceInt32V(v []int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceInt64R(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceInt64V(rv.Interface().([]int64), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceInt64V(rv.Interface().([]int64), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceInt64V(v []int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceInt64V(v []int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeInt(int64(v2)) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncSliceBoolR(rv reflect.Value) { - if f.ti.mbs { - fastpathTV.EncAsMapSliceBoolV(rv.Interface().([]bool), fastpathCheckNilFalse, f.e) - } else { - fastpathTV.EncSliceBoolV(rv.Interface().([]bool), fastpathCheckNilFalse, f.e) - } -} -func (_ fastpathT) EncSliceBoolV(v []bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeArrayStart(len(v)) - for _, v2 := range v { - if cr != nil { - cr.sendContainerState(containerArrayElem) - } - ee.EncodeBool(v2) - } - if cr != nil { - cr.sendContainerState(containerArrayEnd) - } -} - -func (_ fastpathT) EncAsMapSliceBoolV(v []bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - if len(v)%2 == 1 { - e.errorf("mapBySlice requires even slice length, but got %v", len(v)) - return - } - ee.EncodeMapStart(len(v) / 2) - for j, v2 := range v { - if cr != nil { - if j%2 == 0 { - cr.sendContainerState(containerMapKey) - } else { - cr.sendContainerState(containerMapValue) - } - } - ee.EncodeBool(v2) - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfIntfR(rv reflect.Value) { - fastpathTV.EncMapIntfIntfV(rv.Interface().(map[interface{}]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfIntfV(v map[interface{}]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfStringR(rv reflect.Value) { - fastpathTV.EncMapIntfStringV(rv.Interface().(map[interface{}]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfStringV(v map[interface{}]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUintR(rv reflect.Value) { - fastpathTV.EncMapIntfUintV(rv.Interface().(map[interface{}]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUintV(v map[interface{}]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUint8R(rv reflect.Value) { - fastpathTV.EncMapIntfUint8V(rv.Interface().(map[interface{}]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUint8V(v map[interface{}]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUint16R(rv reflect.Value) { - fastpathTV.EncMapIntfUint16V(rv.Interface().(map[interface{}]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUint16V(v map[interface{}]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUint32R(rv reflect.Value) { - fastpathTV.EncMapIntfUint32V(rv.Interface().(map[interface{}]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUint32V(v map[interface{}]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUint64R(rv reflect.Value) { - fastpathTV.EncMapIntfUint64V(rv.Interface().(map[interface{}]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUint64V(v map[interface{}]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfUintptrR(rv reflect.Value) { - fastpathTV.EncMapIntfUintptrV(rv.Interface().(map[interface{}]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfUintptrV(v map[interface{}]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfIntR(rv reflect.Value) { - fastpathTV.EncMapIntfIntV(rv.Interface().(map[interface{}]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfIntV(v map[interface{}]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfInt8R(rv reflect.Value) { - fastpathTV.EncMapIntfInt8V(rv.Interface().(map[interface{}]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfInt8V(v map[interface{}]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfInt16R(rv reflect.Value) { - fastpathTV.EncMapIntfInt16V(rv.Interface().(map[interface{}]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfInt16V(v map[interface{}]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfInt32R(rv reflect.Value) { - fastpathTV.EncMapIntfInt32V(rv.Interface().(map[interface{}]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfInt32V(v map[interface{}]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfInt64R(rv reflect.Value) { - fastpathTV.EncMapIntfInt64V(rv.Interface().(map[interface{}]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfInt64V(v map[interface{}]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfFloat32R(rv reflect.Value) { - fastpathTV.EncMapIntfFloat32V(rv.Interface().(map[interface{}]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfFloat32V(v map[interface{}]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfFloat64R(rv reflect.Value) { - fastpathTV.EncMapIntfFloat64V(rv.Interface().(map[interface{}]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfFloat64V(v map[interface{}]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntfBoolR(rv reflect.Value) { - fastpathTV.EncMapIntfBoolV(rv.Interface().(map[interface{}]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntfBoolV(v map[interface{}]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - var mksv []byte = make([]byte, 0, len(v)*16) // temporary byte slice for the encoding - e2 := NewEncoderBytes(&mksv, e.hh) - v2 := make([]bytesI, len(v)) - var i, l int - var vp *bytesI - for k2, _ := range v { - l = len(mksv) - e2.MustEncode(k2) - vp = &v2[i] - vp.v = mksv[l:] - vp.i = k2 - i++ - } - sort.Sort(bytesISlice(v2)) - for j := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.asis(v2[j].v) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[v2[j].i]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringIntfR(rv reflect.Value) { - fastpathTV.EncMapStringIntfV(rv.Interface().(map[string]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringIntfV(v map[string]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringStringR(rv reflect.Value) { - fastpathTV.EncMapStringStringV(rv.Interface().(map[string]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringStringV(v map[string]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUintR(rv reflect.Value) { - fastpathTV.EncMapStringUintV(rv.Interface().(map[string]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUintV(v map[string]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUint8R(rv reflect.Value) { - fastpathTV.EncMapStringUint8V(rv.Interface().(map[string]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUint8V(v map[string]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUint16R(rv reflect.Value) { - fastpathTV.EncMapStringUint16V(rv.Interface().(map[string]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUint16V(v map[string]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUint32R(rv reflect.Value) { - fastpathTV.EncMapStringUint32V(rv.Interface().(map[string]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUint32V(v map[string]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUint64R(rv reflect.Value) { - fastpathTV.EncMapStringUint64V(rv.Interface().(map[string]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUint64V(v map[string]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringUintptrR(rv reflect.Value) { - fastpathTV.EncMapStringUintptrV(rv.Interface().(map[string]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringUintptrV(v map[string]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringIntR(rv reflect.Value) { - fastpathTV.EncMapStringIntV(rv.Interface().(map[string]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringIntV(v map[string]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringInt8R(rv reflect.Value) { - fastpathTV.EncMapStringInt8V(rv.Interface().(map[string]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringInt8V(v map[string]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringInt16R(rv reflect.Value) { - fastpathTV.EncMapStringInt16V(rv.Interface().(map[string]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringInt16V(v map[string]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringInt32R(rv reflect.Value) { - fastpathTV.EncMapStringInt32V(rv.Interface().(map[string]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringInt32V(v map[string]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringInt64R(rv reflect.Value) { - fastpathTV.EncMapStringInt64V(rv.Interface().(map[string]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringInt64V(v map[string]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[string(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringFloat32R(rv reflect.Value) { - fastpathTV.EncMapStringFloat32V(rv.Interface().(map[string]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringFloat32V(v map[string]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringFloat64R(rv reflect.Value) { - fastpathTV.EncMapStringFloat64V(rv.Interface().(map[string]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringFloat64V(v map[string]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapStringBoolR(rv reflect.Value) { - fastpathTV.EncMapStringBoolV(rv.Interface().(map[string]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapStringBoolV(v map[string]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - asSymbols := e.h.AsSymbols&AsSymbolMapStringKeysFlag != 0 - if e.h.Canonical { - v2 := make([]string, len(v)) - var i int - for k, _ := range v { - v2[i] = string(k) - i++ - } - sort.Sort(stringSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[string(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - if asSymbols { - ee.EncodeSymbol(k2) - } else { - ee.EncodeString(c_UTF8, k2) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32IntfR(rv reflect.Value) { - fastpathTV.EncMapFloat32IntfV(rv.Interface().(map[float32]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32IntfV(v map[float32]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32StringR(rv reflect.Value) { - fastpathTV.EncMapFloat32StringV(rv.Interface().(map[float32]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32StringV(v map[float32]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32UintR(rv reflect.Value) { - fastpathTV.EncMapFloat32UintV(rv.Interface().(map[float32]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32UintV(v map[float32]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Uint8R(rv reflect.Value) { - fastpathTV.EncMapFloat32Uint8V(rv.Interface().(map[float32]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Uint8V(v map[float32]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Uint16R(rv reflect.Value) { - fastpathTV.EncMapFloat32Uint16V(rv.Interface().(map[float32]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Uint16V(v map[float32]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Uint32R(rv reflect.Value) { - fastpathTV.EncMapFloat32Uint32V(rv.Interface().(map[float32]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Uint32V(v map[float32]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Uint64R(rv reflect.Value) { - fastpathTV.EncMapFloat32Uint64V(rv.Interface().(map[float32]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Uint64V(v map[float32]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32UintptrR(rv reflect.Value) { - fastpathTV.EncMapFloat32UintptrV(rv.Interface().(map[float32]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32UintptrV(v map[float32]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32IntR(rv reflect.Value) { - fastpathTV.EncMapFloat32IntV(rv.Interface().(map[float32]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32IntV(v map[float32]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Int8R(rv reflect.Value) { - fastpathTV.EncMapFloat32Int8V(rv.Interface().(map[float32]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Int8V(v map[float32]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Int16R(rv reflect.Value) { - fastpathTV.EncMapFloat32Int16V(rv.Interface().(map[float32]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Int16V(v map[float32]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Int32R(rv reflect.Value) { - fastpathTV.EncMapFloat32Int32V(rv.Interface().(map[float32]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Int32V(v map[float32]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Int64R(rv reflect.Value) { - fastpathTV.EncMapFloat32Int64V(rv.Interface().(map[float32]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Int64V(v map[float32]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Float32R(rv reflect.Value) { - fastpathTV.EncMapFloat32Float32V(rv.Interface().(map[float32]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Float32V(v map[float32]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32Float64R(rv reflect.Value) { - fastpathTV.EncMapFloat32Float64V(rv.Interface().(map[float32]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32Float64V(v map[float32]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat32BoolR(rv reflect.Value) { - fastpathTV.EncMapFloat32BoolV(rv.Interface().(map[float32]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat32BoolV(v map[float32]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(float32(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[float32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat32(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64IntfR(rv reflect.Value) { - fastpathTV.EncMapFloat64IntfV(rv.Interface().(map[float64]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64IntfV(v map[float64]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64StringR(rv reflect.Value) { - fastpathTV.EncMapFloat64StringV(rv.Interface().(map[float64]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64StringV(v map[float64]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64UintR(rv reflect.Value) { - fastpathTV.EncMapFloat64UintV(rv.Interface().(map[float64]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64UintV(v map[float64]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Uint8R(rv reflect.Value) { - fastpathTV.EncMapFloat64Uint8V(rv.Interface().(map[float64]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Uint8V(v map[float64]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Uint16R(rv reflect.Value) { - fastpathTV.EncMapFloat64Uint16V(rv.Interface().(map[float64]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Uint16V(v map[float64]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Uint32R(rv reflect.Value) { - fastpathTV.EncMapFloat64Uint32V(rv.Interface().(map[float64]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Uint32V(v map[float64]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Uint64R(rv reflect.Value) { - fastpathTV.EncMapFloat64Uint64V(rv.Interface().(map[float64]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Uint64V(v map[float64]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64UintptrR(rv reflect.Value) { - fastpathTV.EncMapFloat64UintptrV(rv.Interface().(map[float64]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64UintptrV(v map[float64]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64IntR(rv reflect.Value) { - fastpathTV.EncMapFloat64IntV(rv.Interface().(map[float64]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64IntV(v map[float64]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Int8R(rv reflect.Value) { - fastpathTV.EncMapFloat64Int8V(rv.Interface().(map[float64]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Int8V(v map[float64]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Int16R(rv reflect.Value) { - fastpathTV.EncMapFloat64Int16V(rv.Interface().(map[float64]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Int16V(v map[float64]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Int32R(rv reflect.Value) { - fastpathTV.EncMapFloat64Int32V(rv.Interface().(map[float64]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Int32V(v map[float64]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Int64R(rv reflect.Value) { - fastpathTV.EncMapFloat64Int64V(rv.Interface().(map[float64]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Int64V(v map[float64]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[float64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Float32R(rv reflect.Value) { - fastpathTV.EncMapFloat64Float32V(rv.Interface().(map[float64]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Float32V(v map[float64]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64Float64R(rv reflect.Value) { - fastpathTV.EncMapFloat64Float64V(rv.Interface().(map[float64]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64Float64V(v map[float64]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapFloat64BoolR(rv reflect.Value) { - fastpathTV.EncMapFloat64BoolV(rv.Interface().(map[float64]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapFloat64BoolV(v map[float64]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]float64, len(v)) - var i int - for k, _ := range v { - v2[i] = float64(k) - i++ - } - sort.Sort(floatSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(float64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[float64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeFloat64(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintIntfR(rv reflect.Value) { - fastpathTV.EncMapUintIntfV(rv.Interface().(map[uint]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintIntfV(v map[uint]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintStringR(rv reflect.Value) { - fastpathTV.EncMapUintStringV(rv.Interface().(map[uint]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintStringV(v map[uint]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUintR(rv reflect.Value) { - fastpathTV.EncMapUintUintV(rv.Interface().(map[uint]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUintV(v map[uint]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUint8R(rv reflect.Value) { - fastpathTV.EncMapUintUint8V(rv.Interface().(map[uint]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUint8V(v map[uint]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUint16R(rv reflect.Value) { - fastpathTV.EncMapUintUint16V(rv.Interface().(map[uint]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUint16V(v map[uint]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUint32R(rv reflect.Value) { - fastpathTV.EncMapUintUint32V(rv.Interface().(map[uint]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUint32V(v map[uint]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUint64R(rv reflect.Value) { - fastpathTV.EncMapUintUint64V(rv.Interface().(map[uint]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUint64V(v map[uint]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintUintptrR(rv reflect.Value) { - fastpathTV.EncMapUintUintptrV(rv.Interface().(map[uint]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintUintptrV(v map[uint]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintIntR(rv reflect.Value) { - fastpathTV.EncMapUintIntV(rv.Interface().(map[uint]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintIntV(v map[uint]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintInt8R(rv reflect.Value) { - fastpathTV.EncMapUintInt8V(rv.Interface().(map[uint]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintInt8V(v map[uint]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintInt16R(rv reflect.Value) { - fastpathTV.EncMapUintInt16V(rv.Interface().(map[uint]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintInt16V(v map[uint]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintInt32R(rv reflect.Value) { - fastpathTV.EncMapUintInt32V(rv.Interface().(map[uint]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintInt32V(v map[uint]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintInt64R(rv reflect.Value) { - fastpathTV.EncMapUintInt64V(rv.Interface().(map[uint]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintInt64V(v map[uint]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintFloat32R(rv reflect.Value) { - fastpathTV.EncMapUintFloat32V(rv.Interface().(map[uint]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintFloat32V(v map[uint]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintFloat64R(rv reflect.Value) { - fastpathTV.EncMapUintFloat64V(rv.Interface().(map[uint]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintFloat64V(v map[uint]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintBoolR(rv reflect.Value) { - fastpathTV.EncMapUintBoolV(rv.Interface().(map[uint]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintBoolV(v map[uint]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uint(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8IntfR(rv reflect.Value) { - fastpathTV.EncMapUint8IntfV(rv.Interface().(map[uint8]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8IntfV(v map[uint8]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8StringR(rv reflect.Value) { - fastpathTV.EncMapUint8StringV(rv.Interface().(map[uint8]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8StringV(v map[uint8]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8UintR(rv reflect.Value) { - fastpathTV.EncMapUint8UintV(rv.Interface().(map[uint8]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8UintV(v map[uint8]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Uint8R(rv reflect.Value) { - fastpathTV.EncMapUint8Uint8V(rv.Interface().(map[uint8]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Uint8V(v map[uint8]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Uint16R(rv reflect.Value) { - fastpathTV.EncMapUint8Uint16V(rv.Interface().(map[uint8]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Uint16V(v map[uint8]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Uint32R(rv reflect.Value) { - fastpathTV.EncMapUint8Uint32V(rv.Interface().(map[uint8]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Uint32V(v map[uint8]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Uint64R(rv reflect.Value) { - fastpathTV.EncMapUint8Uint64V(rv.Interface().(map[uint8]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Uint64V(v map[uint8]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8UintptrR(rv reflect.Value) { - fastpathTV.EncMapUint8UintptrV(rv.Interface().(map[uint8]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8UintptrV(v map[uint8]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8IntR(rv reflect.Value) { - fastpathTV.EncMapUint8IntV(rv.Interface().(map[uint8]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8IntV(v map[uint8]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Int8R(rv reflect.Value) { - fastpathTV.EncMapUint8Int8V(rv.Interface().(map[uint8]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Int8V(v map[uint8]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Int16R(rv reflect.Value) { - fastpathTV.EncMapUint8Int16V(rv.Interface().(map[uint8]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Int16V(v map[uint8]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Int32R(rv reflect.Value) { - fastpathTV.EncMapUint8Int32V(rv.Interface().(map[uint8]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Int32V(v map[uint8]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Int64R(rv reflect.Value) { - fastpathTV.EncMapUint8Int64V(rv.Interface().(map[uint8]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Int64V(v map[uint8]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Float32R(rv reflect.Value) { - fastpathTV.EncMapUint8Float32V(rv.Interface().(map[uint8]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Float32V(v map[uint8]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8Float64R(rv reflect.Value) { - fastpathTV.EncMapUint8Float64V(rv.Interface().(map[uint8]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8Float64V(v map[uint8]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint8BoolR(rv reflect.Value) { - fastpathTV.EncMapUint8BoolV(rv.Interface().(map[uint8]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint8BoolV(v map[uint8]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uint8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16IntfR(rv reflect.Value) { - fastpathTV.EncMapUint16IntfV(rv.Interface().(map[uint16]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16IntfV(v map[uint16]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16StringR(rv reflect.Value) { - fastpathTV.EncMapUint16StringV(rv.Interface().(map[uint16]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16StringV(v map[uint16]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16UintR(rv reflect.Value) { - fastpathTV.EncMapUint16UintV(rv.Interface().(map[uint16]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16UintV(v map[uint16]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Uint8R(rv reflect.Value) { - fastpathTV.EncMapUint16Uint8V(rv.Interface().(map[uint16]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Uint8V(v map[uint16]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Uint16R(rv reflect.Value) { - fastpathTV.EncMapUint16Uint16V(rv.Interface().(map[uint16]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Uint16V(v map[uint16]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Uint32R(rv reflect.Value) { - fastpathTV.EncMapUint16Uint32V(rv.Interface().(map[uint16]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Uint32V(v map[uint16]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Uint64R(rv reflect.Value) { - fastpathTV.EncMapUint16Uint64V(rv.Interface().(map[uint16]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Uint64V(v map[uint16]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16UintptrR(rv reflect.Value) { - fastpathTV.EncMapUint16UintptrV(rv.Interface().(map[uint16]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16UintptrV(v map[uint16]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16IntR(rv reflect.Value) { - fastpathTV.EncMapUint16IntV(rv.Interface().(map[uint16]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16IntV(v map[uint16]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Int8R(rv reflect.Value) { - fastpathTV.EncMapUint16Int8V(rv.Interface().(map[uint16]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Int8V(v map[uint16]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Int16R(rv reflect.Value) { - fastpathTV.EncMapUint16Int16V(rv.Interface().(map[uint16]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Int16V(v map[uint16]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Int32R(rv reflect.Value) { - fastpathTV.EncMapUint16Int32V(rv.Interface().(map[uint16]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Int32V(v map[uint16]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Int64R(rv reflect.Value) { - fastpathTV.EncMapUint16Int64V(rv.Interface().(map[uint16]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Int64V(v map[uint16]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Float32R(rv reflect.Value) { - fastpathTV.EncMapUint16Float32V(rv.Interface().(map[uint16]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Float32V(v map[uint16]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16Float64R(rv reflect.Value) { - fastpathTV.EncMapUint16Float64V(rv.Interface().(map[uint16]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16Float64V(v map[uint16]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint16BoolR(rv reflect.Value) { - fastpathTV.EncMapUint16BoolV(rv.Interface().(map[uint16]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint16BoolV(v map[uint16]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uint16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32IntfR(rv reflect.Value) { - fastpathTV.EncMapUint32IntfV(rv.Interface().(map[uint32]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32IntfV(v map[uint32]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32StringR(rv reflect.Value) { - fastpathTV.EncMapUint32StringV(rv.Interface().(map[uint32]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32StringV(v map[uint32]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32UintR(rv reflect.Value) { - fastpathTV.EncMapUint32UintV(rv.Interface().(map[uint32]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32UintV(v map[uint32]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Uint8R(rv reflect.Value) { - fastpathTV.EncMapUint32Uint8V(rv.Interface().(map[uint32]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Uint8V(v map[uint32]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Uint16R(rv reflect.Value) { - fastpathTV.EncMapUint32Uint16V(rv.Interface().(map[uint32]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Uint16V(v map[uint32]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Uint32R(rv reflect.Value) { - fastpathTV.EncMapUint32Uint32V(rv.Interface().(map[uint32]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Uint32V(v map[uint32]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Uint64R(rv reflect.Value) { - fastpathTV.EncMapUint32Uint64V(rv.Interface().(map[uint32]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Uint64V(v map[uint32]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32UintptrR(rv reflect.Value) { - fastpathTV.EncMapUint32UintptrV(rv.Interface().(map[uint32]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32UintptrV(v map[uint32]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32IntR(rv reflect.Value) { - fastpathTV.EncMapUint32IntV(rv.Interface().(map[uint32]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32IntV(v map[uint32]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Int8R(rv reflect.Value) { - fastpathTV.EncMapUint32Int8V(rv.Interface().(map[uint32]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Int8V(v map[uint32]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Int16R(rv reflect.Value) { - fastpathTV.EncMapUint32Int16V(rv.Interface().(map[uint32]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Int16V(v map[uint32]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Int32R(rv reflect.Value) { - fastpathTV.EncMapUint32Int32V(rv.Interface().(map[uint32]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Int32V(v map[uint32]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Int64R(rv reflect.Value) { - fastpathTV.EncMapUint32Int64V(rv.Interface().(map[uint32]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Int64V(v map[uint32]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Float32R(rv reflect.Value) { - fastpathTV.EncMapUint32Float32V(rv.Interface().(map[uint32]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Float32V(v map[uint32]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32Float64R(rv reflect.Value) { - fastpathTV.EncMapUint32Float64V(rv.Interface().(map[uint32]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32Float64V(v map[uint32]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint32BoolR(rv reflect.Value) { - fastpathTV.EncMapUint32BoolV(rv.Interface().(map[uint32]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint32BoolV(v map[uint32]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uint32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64IntfR(rv reflect.Value) { - fastpathTV.EncMapUint64IntfV(rv.Interface().(map[uint64]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64IntfV(v map[uint64]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64StringR(rv reflect.Value) { - fastpathTV.EncMapUint64StringV(rv.Interface().(map[uint64]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64StringV(v map[uint64]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64UintR(rv reflect.Value) { - fastpathTV.EncMapUint64UintV(rv.Interface().(map[uint64]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64UintV(v map[uint64]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Uint8R(rv reflect.Value) { - fastpathTV.EncMapUint64Uint8V(rv.Interface().(map[uint64]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Uint8V(v map[uint64]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Uint16R(rv reflect.Value) { - fastpathTV.EncMapUint64Uint16V(rv.Interface().(map[uint64]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Uint16V(v map[uint64]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Uint32R(rv reflect.Value) { - fastpathTV.EncMapUint64Uint32V(rv.Interface().(map[uint64]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Uint32V(v map[uint64]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Uint64R(rv reflect.Value) { - fastpathTV.EncMapUint64Uint64V(rv.Interface().(map[uint64]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Uint64V(v map[uint64]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64UintptrR(rv reflect.Value) { - fastpathTV.EncMapUint64UintptrV(rv.Interface().(map[uint64]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64UintptrV(v map[uint64]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64IntR(rv reflect.Value) { - fastpathTV.EncMapUint64IntV(rv.Interface().(map[uint64]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64IntV(v map[uint64]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Int8R(rv reflect.Value) { - fastpathTV.EncMapUint64Int8V(rv.Interface().(map[uint64]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Int8V(v map[uint64]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Int16R(rv reflect.Value) { - fastpathTV.EncMapUint64Int16V(rv.Interface().(map[uint64]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Int16V(v map[uint64]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Int32R(rv reflect.Value) { - fastpathTV.EncMapUint64Int32V(rv.Interface().(map[uint64]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Int32V(v map[uint64]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Int64R(rv reflect.Value) { - fastpathTV.EncMapUint64Int64V(rv.Interface().(map[uint64]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Int64V(v map[uint64]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uint64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Float32R(rv reflect.Value) { - fastpathTV.EncMapUint64Float32V(rv.Interface().(map[uint64]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Float32V(v map[uint64]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64Float64R(rv reflect.Value) { - fastpathTV.EncMapUint64Float64V(rv.Interface().(map[uint64]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64Float64V(v map[uint64]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUint64BoolR(rv reflect.Value) { - fastpathTV.EncMapUint64BoolV(rv.Interface().(map[uint64]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUint64BoolV(v map[uint64]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(uint64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uint64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeUint(uint64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrIntfR(rv reflect.Value) { - fastpathTV.EncMapUintptrIntfV(rv.Interface().(map[uintptr]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrIntfV(v map[uintptr]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrStringR(rv reflect.Value) { - fastpathTV.EncMapUintptrStringV(rv.Interface().(map[uintptr]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrStringV(v map[uintptr]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUintR(rv reflect.Value) { - fastpathTV.EncMapUintptrUintV(rv.Interface().(map[uintptr]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUintV(v map[uintptr]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUint8R(rv reflect.Value) { - fastpathTV.EncMapUintptrUint8V(rv.Interface().(map[uintptr]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUint8V(v map[uintptr]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUint16R(rv reflect.Value) { - fastpathTV.EncMapUintptrUint16V(rv.Interface().(map[uintptr]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUint16V(v map[uintptr]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUint32R(rv reflect.Value) { - fastpathTV.EncMapUintptrUint32V(rv.Interface().(map[uintptr]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUint32V(v map[uintptr]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUint64R(rv reflect.Value) { - fastpathTV.EncMapUintptrUint64V(rv.Interface().(map[uintptr]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUint64V(v map[uintptr]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrUintptrR(rv reflect.Value) { - fastpathTV.EncMapUintptrUintptrV(rv.Interface().(map[uintptr]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrUintptrV(v map[uintptr]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrIntR(rv reflect.Value) { - fastpathTV.EncMapUintptrIntV(rv.Interface().(map[uintptr]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrIntV(v map[uintptr]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrInt8R(rv reflect.Value) { - fastpathTV.EncMapUintptrInt8V(rv.Interface().(map[uintptr]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrInt8V(v map[uintptr]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrInt16R(rv reflect.Value) { - fastpathTV.EncMapUintptrInt16V(rv.Interface().(map[uintptr]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrInt16V(v map[uintptr]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrInt32R(rv reflect.Value) { - fastpathTV.EncMapUintptrInt32V(rv.Interface().(map[uintptr]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrInt32V(v map[uintptr]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrInt64R(rv reflect.Value) { - fastpathTV.EncMapUintptrInt64V(rv.Interface().(map[uintptr]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrInt64V(v map[uintptr]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[uintptr(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrFloat32R(rv reflect.Value) { - fastpathTV.EncMapUintptrFloat32V(rv.Interface().(map[uintptr]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrFloat32V(v map[uintptr]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrFloat64R(rv reflect.Value) { - fastpathTV.EncMapUintptrFloat64V(rv.Interface().(map[uintptr]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrFloat64V(v map[uintptr]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapUintptrBoolR(rv reflect.Value) { - fastpathTV.EncMapUintptrBoolV(rv.Interface().(map[uintptr]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapUintptrBoolV(v map[uintptr]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]uint64, len(v)) - var i int - for k, _ := range v { - v2[i] = uint64(k) - i++ - } - sort.Sort(uintSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(uintptr(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[uintptr(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - e.encode(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntIntfR(rv reflect.Value) { - fastpathTV.EncMapIntIntfV(rv.Interface().(map[int]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntIntfV(v map[int]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntStringR(rv reflect.Value) { - fastpathTV.EncMapIntStringV(rv.Interface().(map[int]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntStringV(v map[int]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUintR(rv reflect.Value) { - fastpathTV.EncMapIntUintV(rv.Interface().(map[int]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUintV(v map[int]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUint8R(rv reflect.Value) { - fastpathTV.EncMapIntUint8V(rv.Interface().(map[int]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUint8V(v map[int]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUint16R(rv reflect.Value) { - fastpathTV.EncMapIntUint16V(rv.Interface().(map[int]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUint16V(v map[int]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUint32R(rv reflect.Value) { - fastpathTV.EncMapIntUint32V(rv.Interface().(map[int]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUint32V(v map[int]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUint64R(rv reflect.Value) { - fastpathTV.EncMapIntUint64V(rv.Interface().(map[int]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUint64V(v map[int]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntUintptrR(rv reflect.Value) { - fastpathTV.EncMapIntUintptrV(rv.Interface().(map[int]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntUintptrV(v map[int]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntIntR(rv reflect.Value) { - fastpathTV.EncMapIntIntV(rv.Interface().(map[int]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntIntV(v map[int]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntInt8R(rv reflect.Value) { - fastpathTV.EncMapIntInt8V(rv.Interface().(map[int]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntInt8V(v map[int]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntInt16R(rv reflect.Value) { - fastpathTV.EncMapIntInt16V(rv.Interface().(map[int]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntInt16V(v map[int]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntInt32R(rv reflect.Value) { - fastpathTV.EncMapIntInt32V(rv.Interface().(map[int]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntInt32V(v map[int]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntInt64R(rv reflect.Value) { - fastpathTV.EncMapIntInt64V(rv.Interface().(map[int]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntInt64V(v map[int]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntFloat32R(rv reflect.Value) { - fastpathTV.EncMapIntFloat32V(rv.Interface().(map[int]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntFloat32V(v map[int]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntFloat64R(rv reflect.Value) { - fastpathTV.EncMapIntFloat64V(rv.Interface().(map[int]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntFloat64V(v map[int]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapIntBoolR(rv reflect.Value) { - fastpathTV.EncMapIntBoolV(rv.Interface().(map[int]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapIntBoolV(v map[int]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[int(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8IntfR(rv reflect.Value) { - fastpathTV.EncMapInt8IntfV(rv.Interface().(map[int8]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8IntfV(v map[int8]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8StringR(rv reflect.Value) { - fastpathTV.EncMapInt8StringV(rv.Interface().(map[int8]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8StringV(v map[int8]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8UintR(rv reflect.Value) { - fastpathTV.EncMapInt8UintV(rv.Interface().(map[int8]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8UintV(v map[int8]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Uint8R(rv reflect.Value) { - fastpathTV.EncMapInt8Uint8V(rv.Interface().(map[int8]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Uint8V(v map[int8]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Uint16R(rv reflect.Value) { - fastpathTV.EncMapInt8Uint16V(rv.Interface().(map[int8]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Uint16V(v map[int8]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Uint32R(rv reflect.Value) { - fastpathTV.EncMapInt8Uint32V(rv.Interface().(map[int8]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Uint32V(v map[int8]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Uint64R(rv reflect.Value) { - fastpathTV.EncMapInt8Uint64V(rv.Interface().(map[int8]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Uint64V(v map[int8]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8UintptrR(rv reflect.Value) { - fastpathTV.EncMapInt8UintptrV(rv.Interface().(map[int8]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8UintptrV(v map[int8]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8IntR(rv reflect.Value) { - fastpathTV.EncMapInt8IntV(rv.Interface().(map[int8]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8IntV(v map[int8]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Int8R(rv reflect.Value) { - fastpathTV.EncMapInt8Int8V(rv.Interface().(map[int8]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Int8V(v map[int8]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Int16R(rv reflect.Value) { - fastpathTV.EncMapInt8Int16V(rv.Interface().(map[int8]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Int16V(v map[int8]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Int32R(rv reflect.Value) { - fastpathTV.EncMapInt8Int32V(rv.Interface().(map[int8]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Int32V(v map[int8]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Int64R(rv reflect.Value) { - fastpathTV.EncMapInt8Int64V(rv.Interface().(map[int8]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Int64V(v map[int8]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int8(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Float32R(rv reflect.Value) { - fastpathTV.EncMapInt8Float32V(rv.Interface().(map[int8]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Float32V(v map[int8]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8Float64R(rv reflect.Value) { - fastpathTV.EncMapInt8Float64V(rv.Interface().(map[int8]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8Float64V(v map[int8]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt8BoolR(rv reflect.Value) { - fastpathTV.EncMapInt8BoolV(rv.Interface().(map[int8]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt8BoolV(v map[int8]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int8(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[int8(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16IntfR(rv reflect.Value) { - fastpathTV.EncMapInt16IntfV(rv.Interface().(map[int16]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16IntfV(v map[int16]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16StringR(rv reflect.Value) { - fastpathTV.EncMapInt16StringV(rv.Interface().(map[int16]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16StringV(v map[int16]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16UintR(rv reflect.Value) { - fastpathTV.EncMapInt16UintV(rv.Interface().(map[int16]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16UintV(v map[int16]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Uint8R(rv reflect.Value) { - fastpathTV.EncMapInt16Uint8V(rv.Interface().(map[int16]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Uint8V(v map[int16]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Uint16R(rv reflect.Value) { - fastpathTV.EncMapInt16Uint16V(rv.Interface().(map[int16]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Uint16V(v map[int16]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Uint32R(rv reflect.Value) { - fastpathTV.EncMapInt16Uint32V(rv.Interface().(map[int16]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Uint32V(v map[int16]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Uint64R(rv reflect.Value) { - fastpathTV.EncMapInt16Uint64V(rv.Interface().(map[int16]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Uint64V(v map[int16]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16UintptrR(rv reflect.Value) { - fastpathTV.EncMapInt16UintptrV(rv.Interface().(map[int16]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16UintptrV(v map[int16]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16IntR(rv reflect.Value) { - fastpathTV.EncMapInt16IntV(rv.Interface().(map[int16]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16IntV(v map[int16]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Int8R(rv reflect.Value) { - fastpathTV.EncMapInt16Int8V(rv.Interface().(map[int16]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Int8V(v map[int16]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Int16R(rv reflect.Value) { - fastpathTV.EncMapInt16Int16V(rv.Interface().(map[int16]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Int16V(v map[int16]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Int32R(rv reflect.Value) { - fastpathTV.EncMapInt16Int32V(rv.Interface().(map[int16]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Int32V(v map[int16]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Int64R(rv reflect.Value) { - fastpathTV.EncMapInt16Int64V(rv.Interface().(map[int16]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Int64V(v map[int16]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int16(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Float32R(rv reflect.Value) { - fastpathTV.EncMapInt16Float32V(rv.Interface().(map[int16]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Float32V(v map[int16]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16Float64R(rv reflect.Value) { - fastpathTV.EncMapInt16Float64V(rv.Interface().(map[int16]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16Float64V(v map[int16]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt16BoolR(rv reflect.Value) { - fastpathTV.EncMapInt16BoolV(rv.Interface().(map[int16]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt16BoolV(v map[int16]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int16(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[int16(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32IntfR(rv reflect.Value) { - fastpathTV.EncMapInt32IntfV(rv.Interface().(map[int32]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32IntfV(v map[int32]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32StringR(rv reflect.Value) { - fastpathTV.EncMapInt32StringV(rv.Interface().(map[int32]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32StringV(v map[int32]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32UintR(rv reflect.Value) { - fastpathTV.EncMapInt32UintV(rv.Interface().(map[int32]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32UintV(v map[int32]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Uint8R(rv reflect.Value) { - fastpathTV.EncMapInt32Uint8V(rv.Interface().(map[int32]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Uint8V(v map[int32]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Uint16R(rv reflect.Value) { - fastpathTV.EncMapInt32Uint16V(rv.Interface().(map[int32]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Uint16V(v map[int32]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Uint32R(rv reflect.Value) { - fastpathTV.EncMapInt32Uint32V(rv.Interface().(map[int32]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Uint32V(v map[int32]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Uint64R(rv reflect.Value) { - fastpathTV.EncMapInt32Uint64V(rv.Interface().(map[int32]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Uint64V(v map[int32]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32UintptrR(rv reflect.Value) { - fastpathTV.EncMapInt32UintptrV(rv.Interface().(map[int32]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32UintptrV(v map[int32]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32IntR(rv reflect.Value) { - fastpathTV.EncMapInt32IntV(rv.Interface().(map[int32]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32IntV(v map[int32]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Int8R(rv reflect.Value) { - fastpathTV.EncMapInt32Int8V(rv.Interface().(map[int32]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Int8V(v map[int32]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Int16R(rv reflect.Value) { - fastpathTV.EncMapInt32Int16V(rv.Interface().(map[int32]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Int16V(v map[int32]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Int32R(rv reflect.Value) { - fastpathTV.EncMapInt32Int32V(rv.Interface().(map[int32]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Int32V(v map[int32]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Int64R(rv reflect.Value) { - fastpathTV.EncMapInt32Int64V(rv.Interface().(map[int32]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Int64V(v map[int32]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int32(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Float32R(rv reflect.Value) { - fastpathTV.EncMapInt32Float32V(rv.Interface().(map[int32]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Float32V(v map[int32]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32Float64R(rv reflect.Value) { - fastpathTV.EncMapInt32Float64V(rv.Interface().(map[int32]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32Float64V(v map[int32]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt32BoolR(rv reflect.Value) { - fastpathTV.EncMapInt32BoolV(rv.Interface().(map[int32]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt32BoolV(v map[int32]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int32(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[int32(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64IntfR(rv reflect.Value) { - fastpathTV.EncMapInt64IntfV(rv.Interface().(map[int64]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64IntfV(v map[int64]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64StringR(rv reflect.Value) { - fastpathTV.EncMapInt64StringV(rv.Interface().(map[int64]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64StringV(v map[int64]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64UintR(rv reflect.Value) { - fastpathTV.EncMapInt64UintV(rv.Interface().(map[int64]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64UintV(v map[int64]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Uint8R(rv reflect.Value) { - fastpathTV.EncMapInt64Uint8V(rv.Interface().(map[int64]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Uint8V(v map[int64]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Uint16R(rv reflect.Value) { - fastpathTV.EncMapInt64Uint16V(rv.Interface().(map[int64]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Uint16V(v map[int64]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Uint32R(rv reflect.Value) { - fastpathTV.EncMapInt64Uint32V(rv.Interface().(map[int64]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Uint32V(v map[int64]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Uint64R(rv reflect.Value) { - fastpathTV.EncMapInt64Uint64V(rv.Interface().(map[int64]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Uint64V(v map[int64]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64UintptrR(rv reflect.Value) { - fastpathTV.EncMapInt64UintptrV(rv.Interface().(map[int64]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64UintptrV(v map[int64]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64IntR(rv reflect.Value) { - fastpathTV.EncMapInt64IntV(rv.Interface().(map[int64]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64IntV(v map[int64]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Int8R(rv reflect.Value) { - fastpathTV.EncMapInt64Int8V(rv.Interface().(map[int64]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Int8V(v map[int64]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Int16R(rv reflect.Value) { - fastpathTV.EncMapInt64Int16V(rv.Interface().(map[int64]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Int16V(v map[int64]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Int32R(rv reflect.Value) { - fastpathTV.EncMapInt64Int32V(rv.Interface().(map[int64]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Int32V(v map[int64]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Int64R(rv reflect.Value) { - fastpathTV.EncMapInt64Int64V(rv.Interface().(map[int64]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Int64V(v map[int64]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[int64(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Float32R(rv reflect.Value) { - fastpathTV.EncMapInt64Float32V(rv.Interface().(map[int64]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Float32V(v map[int64]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64Float64R(rv reflect.Value) { - fastpathTV.EncMapInt64Float64V(rv.Interface().(map[int64]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64Float64V(v map[int64]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapInt64BoolR(rv reflect.Value) { - fastpathTV.EncMapInt64BoolV(rv.Interface().(map[int64]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapInt64BoolV(v map[int64]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]int64, len(v)) - var i int - for k, _ := range v { - v2[i] = int64(k) - i++ - } - sort.Sort(intSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(int64(k2))) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[int64(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeInt(int64(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolIntfR(rv reflect.Value) { - fastpathTV.EncMapBoolIntfV(rv.Interface().(map[bool]interface{}), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolIntfV(v map[bool]interface{}, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolStringR(rv reflect.Value) { - fastpathTV.EncMapBoolStringV(rv.Interface().(map[bool]string), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolStringV(v map[bool]string, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeString(c_UTF8, v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUintR(rv reflect.Value) { - fastpathTV.EncMapBoolUintV(rv.Interface().(map[bool]uint), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUintV(v map[bool]uint, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUint8R(rv reflect.Value) { - fastpathTV.EncMapBoolUint8V(rv.Interface().(map[bool]uint8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUint8V(v map[bool]uint8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUint16R(rv reflect.Value) { - fastpathTV.EncMapBoolUint16V(rv.Interface().(map[bool]uint16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUint16V(v map[bool]uint16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUint32R(rv reflect.Value) { - fastpathTV.EncMapBoolUint32V(rv.Interface().(map[bool]uint32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUint32V(v map[bool]uint32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUint64R(rv reflect.Value) { - fastpathTV.EncMapBoolUint64V(rv.Interface().(map[bool]uint64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUint64V(v map[bool]uint64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeUint(uint64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolUintptrR(rv reflect.Value) { - fastpathTV.EncMapBoolUintptrV(rv.Interface().(map[bool]uintptr), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolUintptrV(v map[bool]uintptr, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - e.encode(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolIntR(rv reflect.Value) { - fastpathTV.EncMapBoolIntV(rv.Interface().(map[bool]int), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolIntV(v map[bool]int, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolInt8R(rv reflect.Value) { - fastpathTV.EncMapBoolInt8V(rv.Interface().(map[bool]int8), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolInt8V(v map[bool]int8, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolInt16R(rv reflect.Value) { - fastpathTV.EncMapBoolInt16V(rv.Interface().(map[bool]int16), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolInt16V(v map[bool]int16, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolInt32R(rv reflect.Value) { - fastpathTV.EncMapBoolInt32V(rv.Interface().(map[bool]int32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolInt32V(v map[bool]int32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolInt64R(rv reflect.Value) { - fastpathTV.EncMapBoolInt64V(rv.Interface().(map[bool]int64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolInt64V(v map[bool]int64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v[bool(k2)])) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeInt(int64(v2)) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolFloat32R(rv reflect.Value) { - fastpathTV.EncMapBoolFloat32V(rv.Interface().(map[bool]float32), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolFloat32V(v map[bool]float32, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat32(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolFloat64R(rv reflect.Value) { - fastpathTV.EncMapBoolFloat64V(rv.Interface().(map[bool]float64), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolFloat64V(v map[bool]float64, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeFloat64(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -func (f *encFnInfo) fastpathEncMapBoolBoolR(rv reflect.Value) { - fastpathTV.EncMapBoolBoolV(rv.Interface().(map[bool]bool), fastpathCheckNilFalse, f.e) -} -func (_ fastpathT) EncMapBoolBoolV(v map[bool]bool, checkNil bool, e *Encoder) { - ee := e.e - cr := e.cr - if checkNil && v == nil { - ee.EncodeNil() - return - } - ee.EncodeMapStart(len(v)) - if e.h.Canonical { - v2 := make([]bool, len(v)) - var i int - for k, _ := range v { - v2[i] = bool(k) - i++ - } - sort.Sort(boolSlice(v2)) - for _, k2 := range v2 { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(bool(k2)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v[bool(k2)]) - } - } else { - for k2, v2 := range v { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - ee.EncodeBool(k2) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - ee.EncodeBool(v2) - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } -} - -// -- decode - -// -- -- fast path type switch -func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { - if !fastpathEnabled { - return false - } - switch v := iv.(type) { - - case []interface{}: - fastpathTV.DecSliceIntfV(v, fastpathCheckNilFalse, false, d) - case *[]interface{}: - v2, changed2 := fastpathTV.DecSliceIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]interface{}: - fastpathTV.DecMapIntfIntfV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]interface{}: - v2, changed2 := fastpathTV.DecMapIntfIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]string: - fastpathTV.DecMapIntfStringV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]string: - v2, changed2 := fastpathTV.DecMapIntfStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uint: - fastpathTV.DecMapIntfUintV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uint: - v2, changed2 := fastpathTV.DecMapIntfUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uint8: - fastpathTV.DecMapIntfUint8V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uint8: - v2, changed2 := fastpathTV.DecMapIntfUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uint16: - fastpathTV.DecMapIntfUint16V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uint16: - v2, changed2 := fastpathTV.DecMapIntfUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uint32: - fastpathTV.DecMapIntfUint32V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uint32: - v2, changed2 := fastpathTV.DecMapIntfUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uint64: - fastpathTV.DecMapIntfUint64V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uint64: - v2, changed2 := fastpathTV.DecMapIntfUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]uintptr: - fastpathTV.DecMapIntfUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]uintptr: - v2, changed2 := fastpathTV.DecMapIntfUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]int: - fastpathTV.DecMapIntfIntV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]int: - v2, changed2 := fastpathTV.DecMapIntfIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]int8: - fastpathTV.DecMapIntfInt8V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]int8: - v2, changed2 := fastpathTV.DecMapIntfInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]int16: - fastpathTV.DecMapIntfInt16V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]int16: - v2, changed2 := fastpathTV.DecMapIntfInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]int32: - fastpathTV.DecMapIntfInt32V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]int32: - v2, changed2 := fastpathTV.DecMapIntfInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]int64: - fastpathTV.DecMapIntfInt64V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]int64: - v2, changed2 := fastpathTV.DecMapIntfInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]float32: - fastpathTV.DecMapIntfFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]float32: - v2, changed2 := fastpathTV.DecMapIntfFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]float64: - fastpathTV.DecMapIntfFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]float64: - v2, changed2 := fastpathTV.DecMapIntfFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[interface{}]bool: - fastpathTV.DecMapIntfBoolV(v, fastpathCheckNilFalse, false, d) - case *map[interface{}]bool: - v2, changed2 := fastpathTV.DecMapIntfBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []string: - fastpathTV.DecSliceStringV(v, fastpathCheckNilFalse, false, d) - case *[]string: - v2, changed2 := fastpathTV.DecSliceStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]interface{}: - fastpathTV.DecMapStringIntfV(v, fastpathCheckNilFalse, false, d) - case *map[string]interface{}: - v2, changed2 := fastpathTV.DecMapStringIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]string: - fastpathTV.DecMapStringStringV(v, fastpathCheckNilFalse, false, d) - case *map[string]string: - v2, changed2 := fastpathTV.DecMapStringStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uint: - fastpathTV.DecMapStringUintV(v, fastpathCheckNilFalse, false, d) - case *map[string]uint: - v2, changed2 := fastpathTV.DecMapStringUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uint8: - fastpathTV.DecMapStringUint8V(v, fastpathCheckNilFalse, false, d) - case *map[string]uint8: - v2, changed2 := fastpathTV.DecMapStringUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uint16: - fastpathTV.DecMapStringUint16V(v, fastpathCheckNilFalse, false, d) - case *map[string]uint16: - v2, changed2 := fastpathTV.DecMapStringUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uint32: - fastpathTV.DecMapStringUint32V(v, fastpathCheckNilFalse, false, d) - case *map[string]uint32: - v2, changed2 := fastpathTV.DecMapStringUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uint64: - fastpathTV.DecMapStringUint64V(v, fastpathCheckNilFalse, false, d) - case *map[string]uint64: - v2, changed2 := fastpathTV.DecMapStringUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]uintptr: - fastpathTV.DecMapStringUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[string]uintptr: - v2, changed2 := fastpathTV.DecMapStringUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]int: - fastpathTV.DecMapStringIntV(v, fastpathCheckNilFalse, false, d) - case *map[string]int: - v2, changed2 := fastpathTV.DecMapStringIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]int8: - fastpathTV.DecMapStringInt8V(v, fastpathCheckNilFalse, false, d) - case *map[string]int8: - v2, changed2 := fastpathTV.DecMapStringInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]int16: - fastpathTV.DecMapStringInt16V(v, fastpathCheckNilFalse, false, d) - case *map[string]int16: - v2, changed2 := fastpathTV.DecMapStringInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]int32: - fastpathTV.DecMapStringInt32V(v, fastpathCheckNilFalse, false, d) - case *map[string]int32: - v2, changed2 := fastpathTV.DecMapStringInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]int64: - fastpathTV.DecMapStringInt64V(v, fastpathCheckNilFalse, false, d) - case *map[string]int64: - v2, changed2 := fastpathTV.DecMapStringInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]float32: - fastpathTV.DecMapStringFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[string]float32: - v2, changed2 := fastpathTV.DecMapStringFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]float64: - fastpathTV.DecMapStringFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[string]float64: - v2, changed2 := fastpathTV.DecMapStringFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[string]bool: - fastpathTV.DecMapStringBoolV(v, fastpathCheckNilFalse, false, d) - case *map[string]bool: - v2, changed2 := fastpathTV.DecMapStringBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []float32: - fastpathTV.DecSliceFloat32V(v, fastpathCheckNilFalse, false, d) - case *[]float32: - v2, changed2 := fastpathTV.DecSliceFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]interface{}: - fastpathTV.DecMapFloat32IntfV(v, fastpathCheckNilFalse, false, d) - case *map[float32]interface{}: - v2, changed2 := fastpathTV.DecMapFloat32IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]string: - fastpathTV.DecMapFloat32StringV(v, fastpathCheckNilFalse, false, d) - case *map[float32]string: - v2, changed2 := fastpathTV.DecMapFloat32StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uint: - fastpathTV.DecMapFloat32UintV(v, fastpathCheckNilFalse, false, d) - case *map[float32]uint: - v2, changed2 := fastpathTV.DecMapFloat32UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uint8: - fastpathTV.DecMapFloat32Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[float32]uint8: - v2, changed2 := fastpathTV.DecMapFloat32Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uint16: - fastpathTV.DecMapFloat32Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[float32]uint16: - v2, changed2 := fastpathTV.DecMapFloat32Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uint32: - fastpathTV.DecMapFloat32Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[float32]uint32: - v2, changed2 := fastpathTV.DecMapFloat32Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uint64: - fastpathTV.DecMapFloat32Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[float32]uint64: - v2, changed2 := fastpathTV.DecMapFloat32Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]uintptr: - fastpathTV.DecMapFloat32UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[float32]uintptr: - v2, changed2 := fastpathTV.DecMapFloat32UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]int: - fastpathTV.DecMapFloat32IntV(v, fastpathCheckNilFalse, false, d) - case *map[float32]int: - v2, changed2 := fastpathTV.DecMapFloat32IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]int8: - fastpathTV.DecMapFloat32Int8V(v, fastpathCheckNilFalse, false, d) - case *map[float32]int8: - v2, changed2 := fastpathTV.DecMapFloat32Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]int16: - fastpathTV.DecMapFloat32Int16V(v, fastpathCheckNilFalse, false, d) - case *map[float32]int16: - v2, changed2 := fastpathTV.DecMapFloat32Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]int32: - fastpathTV.DecMapFloat32Int32V(v, fastpathCheckNilFalse, false, d) - case *map[float32]int32: - v2, changed2 := fastpathTV.DecMapFloat32Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]int64: - fastpathTV.DecMapFloat32Int64V(v, fastpathCheckNilFalse, false, d) - case *map[float32]int64: - v2, changed2 := fastpathTV.DecMapFloat32Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]float32: - fastpathTV.DecMapFloat32Float32V(v, fastpathCheckNilFalse, false, d) - case *map[float32]float32: - v2, changed2 := fastpathTV.DecMapFloat32Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]float64: - fastpathTV.DecMapFloat32Float64V(v, fastpathCheckNilFalse, false, d) - case *map[float32]float64: - v2, changed2 := fastpathTV.DecMapFloat32Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float32]bool: - fastpathTV.DecMapFloat32BoolV(v, fastpathCheckNilFalse, false, d) - case *map[float32]bool: - v2, changed2 := fastpathTV.DecMapFloat32BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []float64: - fastpathTV.DecSliceFloat64V(v, fastpathCheckNilFalse, false, d) - case *[]float64: - v2, changed2 := fastpathTV.DecSliceFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]interface{}: - fastpathTV.DecMapFloat64IntfV(v, fastpathCheckNilFalse, false, d) - case *map[float64]interface{}: - v2, changed2 := fastpathTV.DecMapFloat64IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]string: - fastpathTV.DecMapFloat64StringV(v, fastpathCheckNilFalse, false, d) - case *map[float64]string: - v2, changed2 := fastpathTV.DecMapFloat64StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uint: - fastpathTV.DecMapFloat64UintV(v, fastpathCheckNilFalse, false, d) - case *map[float64]uint: - v2, changed2 := fastpathTV.DecMapFloat64UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uint8: - fastpathTV.DecMapFloat64Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[float64]uint8: - v2, changed2 := fastpathTV.DecMapFloat64Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uint16: - fastpathTV.DecMapFloat64Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[float64]uint16: - v2, changed2 := fastpathTV.DecMapFloat64Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uint32: - fastpathTV.DecMapFloat64Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[float64]uint32: - v2, changed2 := fastpathTV.DecMapFloat64Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uint64: - fastpathTV.DecMapFloat64Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[float64]uint64: - v2, changed2 := fastpathTV.DecMapFloat64Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]uintptr: - fastpathTV.DecMapFloat64UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[float64]uintptr: - v2, changed2 := fastpathTV.DecMapFloat64UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]int: - fastpathTV.DecMapFloat64IntV(v, fastpathCheckNilFalse, false, d) - case *map[float64]int: - v2, changed2 := fastpathTV.DecMapFloat64IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]int8: - fastpathTV.DecMapFloat64Int8V(v, fastpathCheckNilFalse, false, d) - case *map[float64]int8: - v2, changed2 := fastpathTV.DecMapFloat64Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]int16: - fastpathTV.DecMapFloat64Int16V(v, fastpathCheckNilFalse, false, d) - case *map[float64]int16: - v2, changed2 := fastpathTV.DecMapFloat64Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]int32: - fastpathTV.DecMapFloat64Int32V(v, fastpathCheckNilFalse, false, d) - case *map[float64]int32: - v2, changed2 := fastpathTV.DecMapFloat64Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]int64: - fastpathTV.DecMapFloat64Int64V(v, fastpathCheckNilFalse, false, d) - case *map[float64]int64: - v2, changed2 := fastpathTV.DecMapFloat64Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]float32: - fastpathTV.DecMapFloat64Float32V(v, fastpathCheckNilFalse, false, d) - case *map[float64]float32: - v2, changed2 := fastpathTV.DecMapFloat64Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]float64: - fastpathTV.DecMapFloat64Float64V(v, fastpathCheckNilFalse, false, d) - case *map[float64]float64: - v2, changed2 := fastpathTV.DecMapFloat64Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[float64]bool: - fastpathTV.DecMapFloat64BoolV(v, fastpathCheckNilFalse, false, d) - case *map[float64]bool: - v2, changed2 := fastpathTV.DecMapFloat64BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []uint: - fastpathTV.DecSliceUintV(v, fastpathCheckNilFalse, false, d) - case *[]uint: - v2, changed2 := fastpathTV.DecSliceUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]interface{}: - fastpathTV.DecMapUintIntfV(v, fastpathCheckNilFalse, false, d) - case *map[uint]interface{}: - v2, changed2 := fastpathTV.DecMapUintIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]string: - fastpathTV.DecMapUintStringV(v, fastpathCheckNilFalse, false, d) - case *map[uint]string: - v2, changed2 := fastpathTV.DecMapUintStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uint: - fastpathTV.DecMapUintUintV(v, fastpathCheckNilFalse, false, d) - case *map[uint]uint: - v2, changed2 := fastpathTV.DecMapUintUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uint8: - fastpathTV.DecMapUintUint8V(v, fastpathCheckNilFalse, false, d) - case *map[uint]uint8: - v2, changed2 := fastpathTV.DecMapUintUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uint16: - fastpathTV.DecMapUintUint16V(v, fastpathCheckNilFalse, false, d) - case *map[uint]uint16: - v2, changed2 := fastpathTV.DecMapUintUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uint32: - fastpathTV.DecMapUintUint32V(v, fastpathCheckNilFalse, false, d) - case *map[uint]uint32: - v2, changed2 := fastpathTV.DecMapUintUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uint64: - fastpathTV.DecMapUintUint64V(v, fastpathCheckNilFalse, false, d) - case *map[uint]uint64: - v2, changed2 := fastpathTV.DecMapUintUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]uintptr: - fastpathTV.DecMapUintUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uint]uintptr: - v2, changed2 := fastpathTV.DecMapUintUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]int: - fastpathTV.DecMapUintIntV(v, fastpathCheckNilFalse, false, d) - case *map[uint]int: - v2, changed2 := fastpathTV.DecMapUintIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]int8: - fastpathTV.DecMapUintInt8V(v, fastpathCheckNilFalse, false, d) - case *map[uint]int8: - v2, changed2 := fastpathTV.DecMapUintInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]int16: - fastpathTV.DecMapUintInt16V(v, fastpathCheckNilFalse, false, d) - case *map[uint]int16: - v2, changed2 := fastpathTV.DecMapUintInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]int32: - fastpathTV.DecMapUintInt32V(v, fastpathCheckNilFalse, false, d) - case *map[uint]int32: - v2, changed2 := fastpathTV.DecMapUintInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]int64: - fastpathTV.DecMapUintInt64V(v, fastpathCheckNilFalse, false, d) - case *map[uint]int64: - v2, changed2 := fastpathTV.DecMapUintInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]float32: - fastpathTV.DecMapUintFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[uint]float32: - v2, changed2 := fastpathTV.DecMapUintFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]float64: - fastpathTV.DecMapUintFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[uint]float64: - v2, changed2 := fastpathTV.DecMapUintFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint]bool: - fastpathTV.DecMapUintBoolV(v, fastpathCheckNilFalse, false, d) - case *map[uint]bool: - v2, changed2 := fastpathTV.DecMapUintBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]interface{}: - fastpathTV.DecMapUint8IntfV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]interface{}: - v2, changed2 := fastpathTV.DecMapUint8IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]string: - fastpathTV.DecMapUint8StringV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]string: - v2, changed2 := fastpathTV.DecMapUint8StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uint: - fastpathTV.DecMapUint8UintV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uint: - v2, changed2 := fastpathTV.DecMapUint8UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uint8: - fastpathTV.DecMapUint8Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uint8: - v2, changed2 := fastpathTV.DecMapUint8Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uint16: - fastpathTV.DecMapUint8Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uint16: - v2, changed2 := fastpathTV.DecMapUint8Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uint32: - fastpathTV.DecMapUint8Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uint32: - v2, changed2 := fastpathTV.DecMapUint8Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uint64: - fastpathTV.DecMapUint8Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uint64: - v2, changed2 := fastpathTV.DecMapUint8Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]uintptr: - fastpathTV.DecMapUint8UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]uintptr: - v2, changed2 := fastpathTV.DecMapUint8UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]int: - fastpathTV.DecMapUint8IntV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]int: - v2, changed2 := fastpathTV.DecMapUint8IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]int8: - fastpathTV.DecMapUint8Int8V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]int8: - v2, changed2 := fastpathTV.DecMapUint8Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]int16: - fastpathTV.DecMapUint8Int16V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]int16: - v2, changed2 := fastpathTV.DecMapUint8Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]int32: - fastpathTV.DecMapUint8Int32V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]int32: - v2, changed2 := fastpathTV.DecMapUint8Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]int64: - fastpathTV.DecMapUint8Int64V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]int64: - v2, changed2 := fastpathTV.DecMapUint8Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]float32: - fastpathTV.DecMapUint8Float32V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]float32: - v2, changed2 := fastpathTV.DecMapUint8Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]float64: - fastpathTV.DecMapUint8Float64V(v, fastpathCheckNilFalse, false, d) - case *map[uint8]float64: - v2, changed2 := fastpathTV.DecMapUint8Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint8]bool: - fastpathTV.DecMapUint8BoolV(v, fastpathCheckNilFalse, false, d) - case *map[uint8]bool: - v2, changed2 := fastpathTV.DecMapUint8BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []uint16: - fastpathTV.DecSliceUint16V(v, fastpathCheckNilFalse, false, d) - case *[]uint16: - v2, changed2 := fastpathTV.DecSliceUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]interface{}: - fastpathTV.DecMapUint16IntfV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]interface{}: - v2, changed2 := fastpathTV.DecMapUint16IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]string: - fastpathTV.DecMapUint16StringV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]string: - v2, changed2 := fastpathTV.DecMapUint16StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uint: - fastpathTV.DecMapUint16UintV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uint: - v2, changed2 := fastpathTV.DecMapUint16UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uint8: - fastpathTV.DecMapUint16Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uint8: - v2, changed2 := fastpathTV.DecMapUint16Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uint16: - fastpathTV.DecMapUint16Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uint16: - v2, changed2 := fastpathTV.DecMapUint16Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uint32: - fastpathTV.DecMapUint16Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uint32: - v2, changed2 := fastpathTV.DecMapUint16Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uint64: - fastpathTV.DecMapUint16Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uint64: - v2, changed2 := fastpathTV.DecMapUint16Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]uintptr: - fastpathTV.DecMapUint16UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]uintptr: - v2, changed2 := fastpathTV.DecMapUint16UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]int: - fastpathTV.DecMapUint16IntV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]int: - v2, changed2 := fastpathTV.DecMapUint16IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]int8: - fastpathTV.DecMapUint16Int8V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]int8: - v2, changed2 := fastpathTV.DecMapUint16Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]int16: - fastpathTV.DecMapUint16Int16V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]int16: - v2, changed2 := fastpathTV.DecMapUint16Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]int32: - fastpathTV.DecMapUint16Int32V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]int32: - v2, changed2 := fastpathTV.DecMapUint16Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]int64: - fastpathTV.DecMapUint16Int64V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]int64: - v2, changed2 := fastpathTV.DecMapUint16Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]float32: - fastpathTV.DecMapUint16Float32V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]float32: - v2, changed2 := fastpathTV.DecMapUint16Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]float64: - fastpathTV.DecMapUint16Float64V(v, fastpathCheckNilFalse, false, d) - case *map[uint16]float64: - v2, changed2 := fastpathTV.DecMapUint16Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint16]bool: - fastpathTV.DecMapUint16BoolV(v, fastpathCheckNilFalse, false, d) - case *map[uint16]bool: - v2, changed2 := fastpathTV.DecMapUint16BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []uint32: - fastpathTV.DecSliceUint32V(v, fastpathCheckNilFalse, false, d) - case *[]uint32: - v2, changed2 := fastpathTV.DecSliceUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]interface{}: - fastpathTV.DecMapUint32IntfV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]interface{}: - v2, changed2 := fastpathTV.DecMapUint32IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]string: - fastpathTV.DecMapUint32StringV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]string: - v2, changed2 := fastpathTV.DecMapUint32StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uint: - fastpathTV.DecMapUint32UintV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uint: - v2, changed2 := fastpathTV.DecMapUint32UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uint8: - fastpathTV.DecMapUint32Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uint8: - v2, changed2 := fastpathTV.DecMapUint32Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uint16: - fastpathTV.DecMapUint32Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uint16: - v2, changed2 := fastpathTV.DecMapUint32Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uint32: - fastpathTV.DecMapUint32Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uint32: - v2, changed2 := fastpathTV.DecMapUint32Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uint64: - fastpathTV.DecMapUint32Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uint64: - v2, changed2 := fastpathTV.DecMapUint32Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]uintptr: - fastpathTV.DecMapUint32UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]uintptr: - v2, changed2 := fastpathTV.DecMapUint32UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]int: - fastpathTV.DecMapUint32IntV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]int: - v2, changed2 := fastpathTV.DecMapUint32IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]int8: - fastpathTV.DecMapUint32Int8V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]int8: - v2, changed2 := fastpathTV.DecMapUint32Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]int16: - fastpathTV.DecMapUint32Int16V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]int16: - v2, changed2 := fastpathTV.DecMapUint32Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]int32: - fastpathTV.DecMapUint32Int32V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]int32: - v2, changed2 := fastpathTV.DecMapUint32Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]int64: - fastpathTV.DecMapUint32Int64V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]int64: - v2, changed2 := fastpathTV.DecMapUint32Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]float32: - fastpathTV.DecMapUint32Float32V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]float32: - v2, changed2 := fastpathTV.DecMapUint32Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]float64: - fastpathTV.DecMapUint32Float64V(v, fastpathCheckNilFalse, false, d) - case *map[uint32]float64: - v2, changed2 := fastpathTV.DecMapUint32Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint32]bool: - fastpathTV.DecMapUint32BoolV(v, fastpathCheckNilFalse, false, d) - case *map[uint32]bool: - v2, changed2 := fastpathTV.DecMapUint32BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []uint64: - fastpathTV.DecSliceUint64V(v, fastpathCheckNilFalse, false, d) - case *[]uint64: - v2, changed2 := fastpathTV.DecSliceUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]interface{}: - fastpathTV.DecMapUint64IntfV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]interface{}: - v2, changed2 := fastpathTV.DecMapUint64IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]string: - fastpathTV.DecMapUint64StringV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]string: - v2, changed2 := fastpathTV.DecMapUint64StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uint: - fastpathTV.DecMapUint64UintV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uint: - v2, changed2 := fastpathTV.DecMapUint64UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uint8: - fastpathTV.DecMapUint64Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uint8: - v2, changed2 := fastpathTV.DecMapUint64Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uint16: - fastpathTV.DecMapUint64Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uint16: - v2, changed2 := fastpathTV.DecMapUint64Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uint32: - fastpathTV.DecMapUint64Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uint32: - v2, changed2 := fastpathTV.DecMapUint64Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uint64: - fastpathTV.DecMapUint64Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uint64: - v2, changed2 := fastpathTV.DecMapUint64Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]uintptr: - fastpathTV.DecMapUint64UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]uintptr: - v2, changed2 := fastpathTV.DecMapUint64UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]int: - fastpathTV.DecMapUint64IntV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]int: - v2, changed2 := fastpathTV.DecMapUint64IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]int8: - fastpathTV.DecMapUint64Int8V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]int8: - v2, changed2 := fastpathTV.DecMapUint64Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]int16: - fastpathTV.DecMapUint64Int16V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]int16: - v2, changed2 := fastpathTV.DecMapUint64Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]int32: - fastpathTV.DecMapUint64Int32V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]int32: - v2, changed2 := fastpathTV.DecMapUint64Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]int64: - fastpathTV.DecMapUint64Int64V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]int64: - v2, changed2 := fastpathTV.DecMapUint64Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]float32: - fastpathTV.DecMapUint64Float32V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]float32: - v2, changed2 := fastpathTV.DecMapUint64Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]float64: - fastpathTV.DecMapUint64Float64V(v, fastpathCheckNilFalse, false, d) - case *map[uint64]float64: - v2, changed2 := fastpathTV.DecMapUint64Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uint64]bool: - fastpathTV.DecMapUint64BoolV(v, fastpathCheckNilFalse, false, d) - case *map[uint64]bool: - v2, changed2 := fastpathTV.DecMapUint64BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []uintptr: - fastpathTV.DecSliceUintptrV(v, fastpathCheckNilFalse, false, d) - case *[]uintptr: - v2, changed2 := fastpathTV.DecSliceUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]interface{}: - fastpathTV.DecMapUintptrIntfV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]interface{}: - v2, changed2 := fastpathTV.DecMapUintptrIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]string: - fastpathTV.DecMapUintptrStringV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]string: - v2, changed2 := fastpathTV.DecMapUintptrStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uint: - fastpathTV.DecMapUintptrUintV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uint: - v2, changed2 := fastpathTV.DecMapUintptrUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uint8: - fastpathTV.DecMapUintptrUint8V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uint8: - v2, changed2 := fastpathTV.DecMapUintptrUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uint16: - fastpathTV.DecMapUintptrUint16V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uint16: - v2, changed2 := fastpathTV.DecMapUintptrUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uint32: - fastpathTV.DecMapUintptrUint32V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uint32: - v2, changed2 := fastpathTV.DecMapUintptrUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uint64: - fastpathTV.DecMapUintptrUint64V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uint64: - v2, changed2 := fastpathTV.DecMapUintptrUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]uintptr: - fastpathTV.DecMapUintptrUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]uintptr: - v2, changed2 := fastpathTV.DecMapUintptrUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]int: - fastpathTV.DecMapUintptrIntV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]int: - v2, changed2 := fastpathTV.DecMapUintptrIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]int8: - fastpathTV.DecMapUintptrInt8V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]int8: - v2, changed2 := fastpathTV.DecMapUintptrInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]int16: - fastpathTV.DecMapUintptrInt16V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]int16: - v2, changed2 := fastpathTV.DecMapUintptrInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]int32: - fastpathTV.DecMapUintptrInt32V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]int32: - v2, changed2 := fastpathTV.DecMapUintptrInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]int64: - fastpathTV.DecMapUintptrInt64V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]int64: - v2, changed2 := fastpathTV.DecMapUintptrInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]float32: - fastpathTV.DecMapUintptrFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]float32: - v2, changed2 := fastpathTV.DecMapUintptrFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]float64: - fastpathTV.DecMapUintptrFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]float64: - v2, changed2 := fastpathTV.DecMapUintptrFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[uintptr]bool: - fastpathTV.DecMapUintptrBoolV(v, fastpathCheckNilFalse, false, d) - case *map[uintptr]bool: - v2, changed2 := fastpathTV.DecMapUintptrBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []int: - fastpathTV.DecSliceIntV(v, fastpathCheckNilFalse, false, d) - case *[]int: - v2, changed2 := fastpathTV.DecSliceIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]interface{}: - fastpathTV.DecMapIntIntfV(v, fastpathCheckNilFalse, false, d) - case *map[int]interface{}: - v2, changed2 := fastpathTV.DecMapIntIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]string: - fastpathTV.DecMapIntStringV(v, fastpathCheckNilFalse, false, d) - case *map[int]string: - v2, changed2 := fastpathTV.DecMapIntStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uint: - fastpathTV.DecMapIntUintV(v, fastpathCheckNilFalse, false, d) - case *map[int]uint: - v2, changed2 := fastpathTV.DecMapIntUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uint8: - fastpathTV.DecMapIntUint8V(v, fastpathCheckNilFalse, false, d) - case *map[int]uint8: - v2, changed2 := fastpathTV.DecMapIntUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uint16: - fastpathTV.DecMapIntUint16V(v, fastpathCheckNilFalse, false, d) - case *map[int]uint16: - v2, changed2 := fastpathTV.DecMapIntUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uint32: - fastpathTV.DecMapIntUint32V(v, fastpathCheckNilFalse, false, d) - case *map[int]uint32: - v2, changed2 := fastpathTV.DecMapIntUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uint64: - fastpathTV.DecMapIntUint64V(v, fastpathCheckNilFalse, false, d) - case *map[int]uint64: - v2, changed2 := fastpathTV.DecMapIntUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]uintptr: - fastpathTV.DecMapIntUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[int]uintptr: - v2, changed2 := fastpathTV.DecMapIntUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]int: - fastpathTV.DecMapIntIntV(v, fastpathCheckNilFalse, false, d) - case *map[int]int: - v2, changed2 := fastpathTV.DecMapIntIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]int8: - fastpathTV.DecMapIntInt8V(v, fastpathCheckNilFalse, false, d) - case *map[int]int8: - v2, changed2 := fastpathTV.DecMapIntInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]int16: - fastpathTV.DecMapIntInt16V(v, fastpathCheckNilFalse, false, d) - case *map[int]int16: - v2, changed2 := fastpathTV.DecMapIntInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]int32: - fastpathTV.DecMapIntInt32V(v, fastpathCheckNilFalse, false, d) - case *map[int]int32: - v2, changed2 := fastpathTV.DecMapIntInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]int64: - fastpathTV.DecMapIntInt64V(v, fastpathCheckNilFalse, false, d) - case *map[int]int64: - v2, changed2 := fastpathTV.DecMapIntInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]float32: - fastpathTV.DecMapIntFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[int]float32: - v2, changed2 := fastpathTV.DecMapIntFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]float64: - fastpathTV.DecMapIntFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[int]float64: - v2, changed2 := fastpathTV.DecMapIntFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int]bool: - fastpathTV.DecMapIntBoolV(v, fastpathCheckNilFalse, false, d) - case *map[int]bool: - v2, changed2 := fastpathTV.DecMapIntBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []int8: - fastpathTV.DecSliceInt8V(v, fastpathCheckNilFalse, false, d) - case *[]int8: - v2, changed2 := fastpathTV.DecSliceInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]interface{}: - fastpathTV.DecMapInt8IntfV(v, fastpathCheckNilFalse, false, d) - case *map[int8]interface{}: - v2, changed2 := fastpathTV.DecMapInt8IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]string: - fastpathTV.DecMapInt8StringV(v, fastpathCheckNilFalse, false, d) - case *map[int8]string: - v2, changed2 := fastpathTV.DecMapInt8StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uint: - fastpathTV.DecMapInt8UintV(v, fastpathCheckNilFalse, false, d) - case *map[int8]uint: - v2, changed2 := fastpathTV.DecMapInt8UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uint8: - fastpathTV.DecMapInt8Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[int8]uint8: - v2, changed2 := fastpathTV.DecMapInt8Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uint16: - fastpathTV.DecMapInt8Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[int8]uint16: - v2, changed2 := fastpathTV.DecMapInt8Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uint32: - fastpathTV.DecMapInt8Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[int8]uint32: - v2, changed2 := fastpathTV.DecMapInt8Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uint64: - fastpathTV.DecMapInt8Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[int8]uint64: - v2, changed2 := fastpathTV.DecMapInt8Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]uintptr: - fastpathTV.DecMapInt8UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[int8]uintptr: - v2, changed2 := fastpathTV.DecMapInt8UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]int: - fastpathTV.DecMapInt8IntV(v, fastpathCheckNilFalse, false, d) - case *map[int8]int: - v2, changed2 := fastpathTV.DecMapInt8IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]int8: - fastpathTV.DecMapInt8Int8V(v, fastpathCheckNilFalse, false, d) - case *map[int8]int8: - v2, changed2 := fastpathTV.DecMapInt8Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]int16: - fastpathTV.DecMapInt8Int16V(v, fastpathCheckNilFalse, false, d) - case *map[int8]int16: - v2, changed2 := fastpathTV.DecMapInt8Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]int32: - fastpathTV.DecMapInt8Int32V(v, fastpathCheckNilFalse, false, d) - case *map[int8]int32: - v2, changed2 := fastpathTV.DecMapInt8Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]int64: - fastpathTV.DecMapInt8Int64V(v, fastpathCheckNilFalse, false, d) - case *map[int8]int64: - v2, changed2 := fastpathTV.DecMapInt8Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]float32: - fastpathTV.DecMapInt8Float32V(v, fastpathCheckNilFalse, false, d) - case *map[int8]float32: - v2, changed2 := fastpathTV.DecMapInt8Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]float64: - fastpathTV.DecMapInt8Float64V(v, fastpathCheckNilFalse, false, d) - case *map[int8]float64: - v2, changed2 := fastpathTV.DecMapInt8Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int8]bool: - fastpathTV.DecMapInt8BoolV(v, fastpathCheckNilFalse, false, d) - case *map[int8]bool: - v2, changed2 := fastpathTV.DecMapInt8BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []int16: - fastpathTV.DecSliceInt16V(v, fastpathCheckNilFalse, false, d) - case *[]int16: - v2, changed2 := fastpathTV.DecSliceInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]interface{}: - fastpathTV.DecMapInt16IntfV(v, fastpathCheckNilFalse, false, d) - case *map[int16]interface{}: - v2, changed2 := fastpathTV.DecMapInt16IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]string: - fastpathTV.DecMapInt16StringV(v, fastpathCheckNilFalse, false, d) - case *map[int16]string: - v2, changed2 := fastpathTV.DecMapInt16StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uint: - fastpathTV.DecMapInt16UintV(v, fastpathCheckNilFalse, false, d) - case *map[int16]uint: - v2, changed2 := fastpathTV.DecMapInt16UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uint8: - fastpathTV.DecMapInt16Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[int16]uint8: - v2, changed2 := fastpathTV.DecMapInt16Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uint16: - fastpathTV.DecMapInt16Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[int16]uint16: - v2, changed2 := fastpathTV.DecMapInt16Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uint32: - fastpathTV.DecMapInt16Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[int16]uint32: - v2, changed2 := fastpathTV.DecMapInt16Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uint64: - fastpathTV.DecMapInt16Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[int16]uint64: - v2, changed2 := fastpathTV.DecMapInt16Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]uintptr: - fastpathTV.DecMapInt16UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[int16]uintptr: - v2, changed2 := fastpathTV.DecMapInt16UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]int: - fastpathTV.DecMapInt16IntV(v, fastpathCheckNilFalse, false, d) - case *map[int16]int: - v2, changed2 := fastpathTV.DecMapInt16IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]int8: - fastpathTV.DecMapInt16Int8V(v, fastpathCheckNilFalse, false, d) - case *map[int16]int8: - v2, changed2 := fastpathTV.DecMapInt16Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]int16: - fastpathTV.DecMapInt16Int16V(v, fastpathCheckNilFalse, false, d) - case *map[int16]int16: - v2, changed2 := fastpathTV.DecMapInt16Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]int32: - fastpathTV.DecMapInt16Int32V(v, fastpathCheckNilFalse, false, d) - case *map[int16]int32: - v2, changed2 := fastpathTV.DecMapInt16Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]int64: - fastpathTV.DecMapInt16Int64V(v, fastpathCheckNilFalse, false, d) - case *map[int16]int64: - v2, changed2 := fastpathTV.DecMapInt16Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]float32: - fastpathTV.DecMapInt16Float32V(v, fastpathCheckNilFalse, false, d) - case *map[int16]float32: - v2, changed2 := fastpathTV.DecMapInt16Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]float64: - fastpathTV.DecMapInt16Float64V(v, fastpathCheckNilFalse, false, d) - case *map[int16]float64: - v2, changed2 := fastpathTV.DecMapInt16Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int16]bool: - fastpathTV.DecMapInt16BoolV(v, fastpathCheckNilFalse, false, d) - case *map[int16]bool: - v2, changed2 := fastpathTV.DecMapInt16BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []int32: - fastpathTV.DecSliceInt32V(v, fastpathCheckNilFalse, false, d) - case *[]int32: - v2, changed2 := fastpathTV.DecSliceInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]interface{}: - fastpathTV.DecMapInt32IntfV(v, fastpathCheckNilFalse, false, d) - case *map[int32]interface{}: - v2, changed2 := fastpathTV.DecMapInt32IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]string: - fastpathTV.DecMapInt32StringV(v, fastpathCheckNilFalse, false, d) - case *map[int32]string: - v2, changed2 := fastpathTV.DecMapInt32StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uint: - fastpathTV.DecMapInt32UintV(v, fastpathCheckNilFalse, false, d) - case *map[int32]uint: - v2, changed2 := fastpathTV.DecMapInt32UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uint8: - fastpathTV.DecMapInt32Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[int32]uint8: - v2, changed2 := fastpathTV.DecMapInt32Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uint16: - fastpathTV.DecMapInt32Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[int32]uint16: - v2, changed2 := fastpathTV.DecMapInt32Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uint32: - fastpathTV.DecMapInt32Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[int32]uint32: - v2, changed2 := fastpathTV.DecMapInt32Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uint64: - fastpathTV.DecMapInt32Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[int32]uint64: - v2, changed2 := fastpathTV.DecMapInt32Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]uintptr: - fastpathTV.DecMapInt32UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[int32]uintptr: - v2, changed2 := fastpathTV.DecMapInt32UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]int: - fastpathTV.DecMapInt32IntV(v, fastpathCheckNilFalse, false, d) - case *map[int32]int: - v2, changed2 := fastpathTV.DecMapInt32IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]int8: - fastpathTV.DecMapInt32Int8V(v, fastpathCheckNilFalse, false, d) - case *map[int32]int8: - v2, changed2 := fastpathTV.DecMapInt32Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]int16: - fastpathTV.DecMapInt32Int16V(v, fastpathCheckNilFalse, false, d) - case *map[int32]int16: - v2, changed2 := fastpathTV.DecMapInt32Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]int32: - fastpathTV.DecMapInt32Int32V(v, fastpathCheckNilFalse, false, d) - case *map[int32]int32: - v2, changed2 := fastpathTV.DecMapInt32Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]int64: - fastpathTV.DecMapInt32Int64V(v, fastpathCheckNilFalse, false, d) - case *map[int32]int64: - v2, changed2 := fastpathTV.DecMapInt32Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]float32: - fastpathTV.DecMapInt32Float32V(v, fastpathCheckNilFalse, false, d) - case *map[int32]float32: - v2, changed2 := fastpathTV.DecMapInt32Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]float64: - fastpathTV.DecMapInt32Float64V(v, fastpathCheckNilFalse, false, d) - case *map[int32]float64: - v2, changed2 := fastpathTV.DecMapInt32Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int32]bool: - fastpathTV.DecMapInt32BoolV(v, fastpathCheckNilFalse, false, d) - case *map[int32]bool: - v2, changed2 := fastpathTV.DecMapInt32BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []int64: - fastpathTV.DecSliceInt64V(v, fastpathCheckNilFalse, false, d) - case *[]int64: - v2, changed2 := fastpathTV.DecSliceInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]interface{}: - fastpathTV.DecMapInt64IntfV(v, fastpathCheckNilFalse, false, d) - case *map[int64]interface{}: - v2, changed2 := fastpathTV.DecMapInt64IntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]string: - fastpathTV.DecMapInt64StringV(v, fastpathCheckNilFalse, false, d) - case *map[int64]string: - v2, changed2 := fastpathTV.DecMapInt64StringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uint: - fastpathTV.DecMapInt64UintV(v, fastpathCheckNilFalse, false, d) - case *map[int64]uint: - v2, changed2 := fastpathTV.DecMapInt64UintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uint8: - fastpathTV.DecMapInt64Uint8V(v, fastpathCheckNilFalse, false, d) - case *map[int64]uint8: - v2, changed2 := fastpathTV.DecMapInt64Uint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uint16: - fastpathTV.DecMapInt64Uint16V(v, fastpathCheckNilFalse, false, d) - case *map[int64]uint16: - v2, changed2 := fastpathTV.DecMapInt64Uint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uint32: - fastpathTV.DecMapInt64Uint32V(v, fastpathCheckNilFalse, false, d) - case *map[int64]uint32: - v2, changed2 := fastpathTV.DecMapInt64Uint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uint64: - fastpathTV.DecMapInt64Uint64V(v, fastpathCheckNilFalse, false, d) - case *map[int64]uint64: - v2, changed2 := fastpathTV.DecMapInt64Uint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]uintptr: - fastpathTV.DecMapInt64UintptrV(v, fastpathCheckNilFalse, false, d) - case *map[int64]uintptr: - v2, changed2 := fastpathTV.DecMapInt64UintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]int: - fastpathTV.DecMapInt64IntV(v, fastpathCheckNilFalse, false, d) - case *map[int64]int: - v2, changed2 := fastpathTV.DecMapInt64IntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]int8: - fastpathTV.DecMapInt64Int8V(v, fastpathCheckNilFalse, false, d) - case *map[int64]int8: - v2, changed2 := fastpathTV.DecMapInt64Int8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]int16: - fastpathTV.DecMapInt64Int16V(v, fastpathCheckNilFalse, false, d) - case *map[int64]int16: - v2, changed2 := fastpathTV.DecMapInt64Int16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]int32: - fastpathTV.DecMapInt64Int32V(v, fastpathCheckNilFalse, false, d) - case *map[int64]int32: - v2, changed2 := fastpathTV.DecMapInt64Int32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]int64: - fastpathTV.DecMapInt64Int64V(v, fastpathCheckNilFalse, false, d) - case *map[int64]int64: - v2, changed2 := fastpathTV.DecMapInt64Int64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]float32: - fastpathTV.DecMapInt64Float32V(v, fastpathCheckNilFalse, false, d) - case *map[int64]float32: - v2, changed2 := fastpathTV.DecMapInt64Float32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]float64: - fastpathTV.DecMapInt64Float64V(v, fastpathCheckNilFalse, false, d) - case *map[int64]float64: - v2, changed2 := fastpathTV.DecMapInt64Float64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[int64]bool: - fastpathTV.DecMapInt64BoolV(v, fastpathCheckNilFalse, false, d) - case *map[int64]bool: - v2, changed2 := fastpathTV.DecMapInt64BoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case []bool: - fastpathTV.DecSliceBoolV(v, fastpathCheckNilFalse, false, d) - case *[]bool: - v2, changed2 := fastpathTV.DecSliceBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]interface{}: - fastpathTV.DecMapBoolIntfV(v, fastpathCheckNilFalse, false, d) - case *map[bool]interface{}: - v2, changed2 := fastpathTV.DecMapBoolIntfV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]string: - fastpathTV.DecMapBoolStringV(v, fastpathCheckNilFalse, false, d) - case *map[bool]string: - v2, changed2 := fastpathTV.DecMapBoolStringV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uint: - fastpathTV.DecMapBoolUintV(v, fastpathCheckNilFalse, false, d) - case *map[bool]uint: - v2, changed2 := fastpathTV.DecMapBoolUintV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uint8: - fastpathTV.DecMapBoolUint8V(v, fastpathCheckNilFalse, false, d) - case *map[bool]uint8: - v2, changed2 := fastpathTV.DecMapBoolUint8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uint16: - fastpathTV.DecMapBoolUint16V(v, fastpathCheckNilFalse, false, d) - case *map[bool]uint16: - v2, changed2 := fastpathTV.DecMapBoolUint16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uint32: - fastpathTV.DecMapBoolUint32V(v, fastpathCheckNilFalse, false, d) - case *map[bool]uint32: - v2, changed2 := fastpathTV.DecMapBoolUint32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uint64: - fastpathTV.DecMapBoolUint64V(v, fastpathCheckNilFalse, false, d) - case *map[bool]uint64: - v2, changed2 := fastpathTV.DecMapBoolUint64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]uintptr: - fastpathTV.DecMapBoolUintptrV(v, fastpathCheckNilFalse, false, d) - case *map[bool]uintptr: - v2, changed2 := fastpathTV.DecMapBoolUintptrV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]int: - fastpathTV.DecMapBoolIntV(v, fastpathCheckNilFalse, false, d) - case *map[bool]int: - v2, changed2 := fastpathTV.DecMapBoolIntV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]int8: - fastpathTV.DecMapBoolInt8V(v, fastpathCheckNilFalse, false, d) - case *map[bool]int8: - v2, changed2 := fastpathTV.DecMapBoolInt8V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]int16: - fastpathTV.DecMapBoolInt16V(v, fastpathCheckNilFalse, false, d) - case *map[bool]int16: - v2, changed2 := fastpathTV.DecMapBoolInt16V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]int32: - fastpathTV.DecMapBoolInt32V(v, fastpathCheckNilFalse, false, d) - case *map[bool]int32: - v2, changed2 := fastpathTV.DecMapBoolInt32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]int64: - fastpathTV.DecMapBoolInt64V(v, fastpathCheckNilFalse, false, d) - case *map[bool]int64: - v2, changed2 := fastpathTV.DecMapBoolInt64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]float32: - fastpathTV.DecMapBoolFloat32V(v, fastpathCheckNilFalse, false, d) - case *map[bool]float32: - v2, changed2 := fastpathTV.DecMapBoolFloat32V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]float64: - fastpathTV.DecMapBoolFloat64V(v, fastpathCheckNilFalse, false, d) - case *map[bool]float64: - v2, changed2 := fastpathTV.DecMapBoolFloat64V(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - case map[bool]bool: - fastpathTV.DecMapBoolBoolV(v, fastpathCheckNilFalse, false, d) - case *map[bool]bool: - v2, changed2 := fastpathTV.DecMapBoolBoolV(*v, fastpathCheckNilFalse, true, d) - if changed2 { - *v = v2 - } - - default: - _ = v // TODO: workaround https://github.com/golang/go/issues/12927 (remove after go 1.6 release) - return false - } - return true -} - -// -- -- fast path functions - -func (f *decFnInfo) fastpathDecSliceIntfR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]interface{}) - v, changed := fastpathTV.DecSliceIntfV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]interface{}) - fastpathTV.DecSliceIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceIntfX(vp *[]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecSliceIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceIntfV(v []interface{}, checkNil bool, canChange bool, d *Decoder) (_ []interface{}, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []interface{}{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 16) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]interface{}, xlen) - } - } else { - v = make([]interface{}, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - d.decode(&v[j]) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, nil) - slh.ElemContainerState(j) - d.decode(&v[j]) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []interface{}{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]interface{}, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, nil) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - d.decode(&v[j]) - - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceStringR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]string) - v, changed := fastpathTV.DecSliceStringV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]string) - fastpathTV.DecSliceStringV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceStringX(vp *[]string, checkNil bool, d *Decoder) { - v, changed := f.DecSliceStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceStringV(v []string, checkNil bool, canChange bool, d *Decoder) (_ []string, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []string{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 16) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]string, xlen) - } - } else { - v = make([]string, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = dd.DecodeString() - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, "") - slh.ElemContainerState(j) - v[j] = dd.DecodeString() - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []string{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]string, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, "") - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = dd.DecodeString() - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceFloat32R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]float32) - v, changed := fastpathTV.DecSliceFloat32V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]float32) - fastpathTV.DecSliceFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceFloat32X(vp *[]float32, checkNil bool, d *Decoder) { - v, changed := f.DecSliceFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceFloat32V(v []float32, checkNil bool, canChange bool, d *Decoder) (_ []float32, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []float32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]float32, xlen) - } - } else { - v = make([]float32, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = float32(dd.DecodeFloat(true)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = float32(dd.DecodeFloat(true)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []float32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]float32, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = float32(dd.DecodeFloat(true)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceFloat64R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]float64) - v, changed := fastpathTV.DecSliceFloat64V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]float64) - fastpathTV.DecSliceFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceFloat64X(vp *[]float64, checkNil bool, d *Decoder) { - v, changed := f.DecSliceFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceFloat64V(v []float64, checkNil bool, canChange bool, d *Decoder) (_ []float64, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []float64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]float64, xlen) - } - } else { - v = make([]float64, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = dd.DecodeFloat(false) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = dd.DecodeFloat(false) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []float64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]float64, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = dd.DecodeFloat(false) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceUintR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]uint) - v, changed := fastpathTV.DecSliceUintV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]uint) - fastpathTV.DecSliceUintV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceUintX(vp *[]uint, checkNil bool, d *Decoder) { - v, changed := f.DecSliceUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceUintV(v []uint, checkNil bool, canChange bool, d *Decoder) (_ []uint, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []uint{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]uint, xlen) - } - } else { - v = make([]uint, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = uint(dd.DecodeUint(uintBitsize)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = uint(dd.DecodeUint(uintBitsize)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []uint{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]uint, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = uint(dd.DecodeUint(uintBitsize)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceUint16R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]uint16) - v, changed := fastpathTV.DecSliceUint16V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]uint16) - fastpathTV.DecSliceUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceUint16X(vp *[]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecSliceUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceUint16V(v []uint16, checkNil bool, canChange bool, d *Decoder) (_ []uint16, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []uint16{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 2) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]uint16, xlen) - } - } else { - v = make([]uint16, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = uint16(dd.DecodeUint(16)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = uint16(dd.DecodeUint(16)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []uint16{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]uint16, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = uint16(dd.DecodeUint(16)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceUint32R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]uint32) - v, changed := fastpathTV.DecSliceUint32V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]uint32) - fastpathTV.DecSliceUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceUint32X(vp *[]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecSliceUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceUint32V(v []uint32, checkNil bool, canChange bool, d *Decoder) (_ []uint32, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []uint32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]uint32, xlen) - } - } else { - v = make([]uint32, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = uint32(dd.DecodeUint(32)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = uint32(dd.DecodeUint(32)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []uint32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]uint32, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = uint32(dd.DecodeUint(32)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceUint64R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]uint64) - v, changed := fastpathTV.DecSliceUint64V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]uint64) - fastpathTV.DecSliceUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceUint64X(vp *[]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecSliceUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceUint64V(v []uint64, checkNil bool, canChange bool, d *Decoder) (_ []uint64, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []uint64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]uint64, xlen) - } - } else { - v = make([]uint64, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = dd.DecodeUint(64) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = dd.DecodeUint(64) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []uint64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]uint64, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = dd.DecodeUint(64) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceUintptrR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]uintptr) - v, changed := fastpathTV.DecSliceUintptrV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]uintptr) - fastpathTV.DecSliceUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceUintptrX(vp *[]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecSliceUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceUintptrV(v []uintptr, checkNil bool, canChange bool, d *Decoder) (_ []uintptr, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []uintptr{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]uintptr, xlen) - } - } else { - v = make([]uintptr, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = uintptr(dd.DecodeUint(uintBitsize)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = uintptr(dd.DecodeUint(uintBitsize)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []uintptr{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]uintptr, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = uintptr(dd.DecodeUint(uintBitsize)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceIntR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]int) - v, changed := fastpathTV.DecSliceIntV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]int) - fastpathTV.DecSliceIntV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceIntX(vp *[]int, checkNil bool, d *Decoder) { - v, changed := f.DecSliceIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceIntV(v []int, checkNil bool, canChange bool, d *Decoder) (_ []int, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []int{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]int, xlen) - } - } else { - v = make([]int, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = int(dd.DecodeInt(intBitsize)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = int(dd.DecodeInt(intBitsize)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []int{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]int, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = int(dd.DecodeInt(intBitsize)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceInt8R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]int8) - v, changed := fastpathTV.DecSliceInt8V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]int8) - fastpathTV.DecSliceInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceInt8X(vp *[]int8, checkNil bool, d *Decoder) { - v, changed := f.DecSliceInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceInt8V(v []int8, checkNil bool, canChange bool, d *Decoder) (_ []int8, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []int8{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 1) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]int8, xlen) - } - } else { - v = make([]int8, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = int8(dd.DecodeInt(8)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = int8(dd.DecodeInt(8)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []int8{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]int8, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = int8(dd.DecodeInt(8)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceInt16R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]int16) - v, changed := fastpathTV.DecSliceInt16V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]int16) - fastpathTV.DecSliceInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceInt16X(vp *[]int16, checkNil bool, d *Decoder) { - v, changed := f.DecSliceInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceInt16V(v []int16, checkNil bool, canChange bool, d *Decoder) (_ []int16, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []int16{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 2) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]int16, xlen) - } - } else { - v = make([]int16, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = int16(dd.DecodeInt(16)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = int16(dd.DecodeInt(16)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []int16{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]int16, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = int16(dd.DecodeInt(16)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceInt32R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]int32) - v, changed := fastpathTV.DecSliceInt32V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]int32) - fastpathTV.DecSliceInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceInt32X(vp *[]int32, checkNil bool, d *Decoder) { - v, changed := f.DecSliceInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceInt32V(v []int32, checkNil bool, canChange bool, d *Decoder) (_ []int32, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []int32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 4) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]int32, xlen) - } - } else { - v = make([]int32, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = int32(dd.DecodeInt(32)) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = int32(dd.DecodeInt(32)) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []int32{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]int32, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = int32(dd.DecodeInt(32)) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceInt64R(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]int64) - v, changed := fastpathTV.DecSliceInt64V(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]int64) - fastpathTV.DecSliceInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceInt64X(vp *[]int64, checkNil bool, d *Decoder) { - v, changed := f.DecSliceInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceInt64V(v []int64, checkNil bool, canChange bool, d *Decoder) (_ []int64, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []int64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 8) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]int64, xlen) - } - } else { - v = make([]int64, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = dd.DecodeInt(64) - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, 0) - slh.ElemContainerState(j) - v[j] = dd.DecodeInt(64) - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []int64{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]int64, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, 0) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = dd.DecodeInt(64) - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecSliceBoolR(rv reflect.Value) { - array := f.seq == seqTypeArray - if !array && rv.CanAddr() { - vp := rv.Addr().Interface().(*[]bool) - v, changed := fastpathTV.DecSliceBoolV(*vp, fastpathCheckNilFalse, !array, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().([]bool) - fastpathTV.DecSliceBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} - -func (f fastpathT) DecSliceBoolX(vp *[]bool, checkNil bool, d *Decoder) { - v, changed := f.DecSliceBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecSliceBoolV(v []bool, checkNil bool, canChange bool, d *Decoder) (_ []bool, changed bool) { - dd := d.d - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - slh, containerLenS := d.decSliceHelperStart() - if containerLenS == 0 { - if canChange { - if v == nil { - v = []bool{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - - if containerLenS > 0 { - x2read := containerLenS - var xtrunc bool - if containerLenS > cap(v) { - if canChange { - var xlen int - xlen, xtrunc = decInferLen(containerLenS, d.h.MaxInitLen, 1) - if xtrunc { - if xlen <= cap(v) { - v = v[:xlen] - } else { - v = make([]bool, xlen) - } - } else { - v = make([]bool, xlen) - } - changed = true - } else { - d.arrayCannotExpand(len(v), containerLenS) - } - x2read = len(v) - } else if containerLenS != len(v) { - if canChange { - v = v[:containerLenS] - changed = true - } - } - j := 0 - for ; j < x2read; j++ { - slh.ElemContainerState(j) - v[j] = dd.DecodeBool() - } - if xtrunc { - for ; j < containerLenS; j++ { - v = append(v, false) - slh.ElemContainerState(j) - v[j] = dd.DecodeBool() - } - } else if !canChange { - for ; j < containerLenS; j++ { - slh.ElemContainerState(j) - d.swallow() - } - } - } else { - breakFound := dd.CheckBreak() - if breakFound { - if canChange { - if v == nil { - v = []bool{} - } else if len(v) != 0 { - v = v[:0] - } - changed = true - } - slh.End() - return v, changed - } - if cap(v) == 0 { - v = make([]bool, 1, 4) - changed = true - } - j := 0 - for ; !breakFound; j++ { - if j >= len(v) { - if canChange { - v = append(v, false) - changed = true - } else { - d.arrayCannotExpand(len(v), j+1) - } - } - slh.ElemContainerState(j) - if j < len(v) { - v[j] = dd.DecodeBool() - } else { - d.swallow() - } - breakFound = dd.CheckBreak() - } - if canChange && j < len(v) { - v = v[:j] - changed = true - } - } - slh.End() - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]interface{}) - v, changed := fastpathTV.DecMapIntfIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]interface{}) - fastpathTV.DecMapIntfIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfIntfX(vp *map[interface{}]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfIntfV(v map[interface{}]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) - v = make(map[interface{}]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk interface{} - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]string) - v, changed := fastpathTV.DecMapIntfStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]string) - fastpathTV.DecMapIntfStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfStringX(vp *map[interface{}]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfStringV(v map[interface{}]string, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) - v = make(map[interface{}]string, xlen) - changed = true - } - - var mk interface{} - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uint) - v, changed := fastpathTV.DecMapIntfUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uint) - fastpathTV.DecMapIntfUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUintX(vp *map[interface{}]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUintV(v map[interface{}]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]uint, xlen) - changed = true - } - - var mk interface{} - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uint8) - v, changed := fastpathTV.DecMapIntfUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uint8) - fastpathTV.DecMapIntfUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUint8X(vp *map[interface{}]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUint8V(v map[interface{}]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[interface{}]uint8, xlen) - changed = true - } - - var mk interface{} - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uint16) - v, changed := fastpathTV.DecMapIntfUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uint16) - fastpathTV.DecMapIntfUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUint16X(vp *map[interface{}]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUint16V(v map[interface{}]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[interface{}]uint16, xlen) - changed = true - } - - var mk interface{} - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uint32) - v, changed := fastpathTV.DecMapIntfUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uint32) - fastpathTV.DecMapIntfUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUint32X(vp *map[interface{}]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUint32V(v map[interface{}]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[interface{}]uint32, xlen) - changed = true - } - - var mk interface{} - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uint64) - v, changed := fastpathTV.DecMapIntfUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uint64) - fastpathTV.DecMapIntfUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUint64X(vp *map[interface{}]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUint64V(v map[interface{}]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]uint64, xlen) - changed = true - } - - var mk interface{} - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]uintptr) - v, changed := fastpathTV.DecMapIntfUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]uintptr) - fastpathTV.DecMapIntfUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfUintptrX(vp *map[interface{}]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfUintptrV(v map[interface{}]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]uintptr, xlen) - changed = true - } - - var mk interface{} - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]int) - v, changed := fastpathTV.DecMapIntfIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]int) - fastpathTV.DecMapIntfIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfIntX(vp *map[interface{}]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfIntV(v map[interface{}]int, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]int, xlen) - changed = true - } - - var mk interface{} - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]int8) - v, changed := fastpathTV.DecMapIntfInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]int8) - fastpathTV.DecMapIntfInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfInt8X(vp *map[interface{}]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfInt8V(v map[interface{}]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[interface{}]int8, xlen) - changed = true - } - - var mk interface{} - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]int16) - v, changed := fastpathTV.DecMapIntfInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]int16) - fastpathTV.DecMapIntfInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfInt16X(vp *map[interface{}]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfInt16V(v map[interface{}]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[interface{}]int16, xlen) - changed = true - } - - var mk interface{} - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]int32) - v, changed := fastpathTV.DecMapIntfInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]int32) - fastpathTV.DecMapIntfInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfInt32X(vp *map[interface{}]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfInt32V(v map[interface{}]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[interface{}]int32, xlen) - changed = true - } - - var mk interface{} - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]int64) - v, changed := fastpathTV.DecMapIntfInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]int64) - fastpathTV.DecMapIntfInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfInt64X(vp *map[interface{}]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfInt64V(v map[interface{}]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]int64, xlen) - changed = true - } - - var mk interface{} - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]float32) - v, changed := fastpathTV.DecMapIntfFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]float32) - fastpathTV.DecMapIntfFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfFloat32X(vp *map[interface{}]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfFloat32V(v map[interface{}]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[interface{}]float32, xlen) - changed = true - } - - var mk interface{} - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]float64) - v, changed := fastpathTV.DecMapIntfFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]float64) - fastpathTV.DecMapIntfFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfFloat64X(vp *map[interface{}]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfFloat64V(v map[interface{}]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[interface{}]float64, xlen) - changed = true - } - - var mk interface{} - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntfBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[interface{}]bool) - v, changed := fastpathTV.DecMapIntfBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[interface{}]bool) - fastpathTV.DecMapIntfBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntfBoolX(vp *map[interface{}]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntfBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntfBoolV(v map[interface{}]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[interface{}]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[interface{}]bool, xlen) - changed = true - } - - var mk interface{} - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = nil - d.decode(&mk) - if bv, bok := mk.([]byte); bok { - mk = d.string(bv) - } - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]interface{}) - v, changed := fastpathTV.DecMapStringIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]interface{}) - fastpathTV.DecMapStringIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringIntfX(vp *map[string]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringIntfV(v map[string]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[string]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) - v = make(map[string]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk string - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]string) - v, changed := fastpathTV.DecMapStringStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]string) - fastpathTV.DecMapStringStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringStringX(vp *map[string]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringStringV(v map[string]string, checkNil bool, canChange bool, - d *Decoder) (_ map[string]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 32) - v = make(map[string]string, xlen) - changed = true - } - - var mk string - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uint) - v, changed := fastpathTV.DecMapStringUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uint) - fastpathTV.DecMapStringUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUintX(vp *map[string]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUintV(v map[string]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]uint, xlen) - changed = true - } - - var mk string - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uint8) - v, changed := fastpathTV.DecMapStringUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uint8) - fastpathTV.DecMapStringUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUint8X(vp *map[string]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUint8V(v map[string]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[string]uint8, xlen) - changed = true - } - - var mk string - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uint16) - v, changed := fastpathTV.DecMapStringUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uint16) - fastpathTV.DecMapStringUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUint16X(vp *map[string]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUint16V(v map[string]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[string]uint16, xlen) - changed = true - } - - var mk string - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uint32) - v, changed := fastpathTV.DecMapStringUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uint32) - fastpathTV.DecMapStringUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUint32X(vp *map[string]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUint32V(v map[string]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[string]uint32, xlen) - changed = true - } - - var mk string - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uint64) - v, changed := fastpathTV.DecMapStringUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uint64) - fastpathTV.DecMapStringUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUint64X(vp *map[string]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUint64V(v map[string]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]uint64, xlen) - changed = true - } - - var mk string - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]uintptr) - v, changed := fastpathTV.DecMapStringUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]uintptr) - fastpathTV.DecMapStringUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringUintptrX(vp *map[string]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringUintptrV(v map[string]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[string]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]uintptr, xlen) - changed = true - } - - var mk string - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]int) - v, changed := fastpathTV.DecMapStringIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]int) - fastpathTV.DecMapStringIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringIntX(vp *map[string]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringIntV(v map[string]int, checkNil bool, canChange bool, - d *Decoder) (_ map[string]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]int, xlen) - changed = true - } - - var mk string - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]int8) - v, changed := fastpathTV.DecMapStringInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]int8) - fastpathTV.DecMapStringInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringInt8X(vp *map[string]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringInt8V(v map[string]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[string]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[string]int8, xlen) - changed = true - } - - var mk string - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]int16) - v, changed := fastpathTV.DecMapStringInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]int16) - fastpathTV.DecMapStringInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringInt16X(vp *map[string]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringInt16V(v map[string]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[string]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[string]int16, xlen) - changed = true - } - - var mk string - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]int32) - v, changed := fastpathTV.DecMapStringInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]int32) - fastpathTV.DecMapStringInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringInt32X(vp *map[string]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringInt32V(v map[string]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[string]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[string]int32, xlen) - changed = true - } - - var mk string - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]int64) - v, changed := fastpathTV.DecMapStringInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]int64) - fastpathTV.DecMapStringInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringInt64X(vp *map[string]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringInt64V(v map[string]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[string]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]int64, xlen) - changed = true - } - - var mk string - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]float32) - v, changed := fastpathTV.DecMapStringFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]float32) - fastpathTV.DecMapStringFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringFloat32X(vp *map[string]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringFloat32V(v map[string]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[string]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[string]float32, xlen) - changed = true - } - - var mk string - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]float64) - v, changed := fastpathTV.DecMapStringFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]float64) - fastpathTV.DecMapStringFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringFloat64X(vp *map[string]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringFloat64V(v map[string]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[string]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[string]float64, xlen) - changed = true - } - - var mk string - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapStringBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[string]bool) - v, changed := fastpathTV.DecMapStringBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[string]bool) - fastpathTV.DecMapStringBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapStringBoolX(vp *map[string]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapStringBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapStringBoolV(v map[string]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[string]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[string]bool, xlen) - changed = true - } - - var mk string - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeString() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]interface{}) - v, changed := fastpathTV.DecMapFloat32IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]interface{}) - fastpathTV.DecMapFloat32IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32IntfX(vp *map[float32]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32IntfV(v map[float32]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[float32]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk float32 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]string) - v, changed := fastpathTV.DecMapFloat32StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]string) - fastpathTV.DecMapFloat32StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32StringX(vp *map[float32]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32StringV(v map[float32]string, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[float32]string, xlen) - changed = true - } - - var mk float32 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uint) - v, changed := fastpathTV.DecMapFloat32UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uint) - fastpathTV.DecMapFloat32UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32UintX(vp *map[float32]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32UintV(v map[float32]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]uint, xlen) - changed = true - } - - var mk float32 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uint8) - v, changed := fastpathTV.DecMapFloat32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uint8) - fastpathTV.DecMapFloat32Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Uint8X(vp *map[float32]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Uint8V(v map[float32]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[float32]uint8, xlen) - changed = true - } - - var mk float32 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uint16) - v, changed := fastpathTV.DecMapFloat32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uint16) - fastpathTV.DecMapFloat32Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Uint16X(vp *map[float32]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Uint16V(v map[float32]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[float32]uint16, xlen) - changed = true - } - - var mk float32 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uint32) - v, changed := fastpathTV.DecMapFloat32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uint32) - fastpathTV.DecMapFloat32Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Uint32X(vp *map[float32]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Uint32V(v map[float32]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[float32]uint32, xlen) - changed = true - } - - var mk float32 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uint64) - v, changed := fastpathTV.DecMapFloat32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uint64) - fastpathTV.DecMapFloat32Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Uint64X(vp *map[float32]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Uint64V(v map[float32]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]uint64, xlen) - changed = true - } - - var mk float32 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]uintptr) - v, changed := fastpathTV.DecMapFloat32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]uintptr) - fastpathTV.DecMapFloat32UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32UintptrX(vp *map[float32]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32UintptrV(v map[float32]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]uintptr, xlen) - changed = true - } - - var mk float32 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]int) - v, changed := fastpathTV.DecMapFloat32IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]int) - fastpathTV.DecMapFloat32IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32IntX(vp *map[float32]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32IntV(v map[float32]int, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]int, xlen) - changed = true - } - - var mk float32 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]int8) - v, changed := fastpathTV.DecMapFloat32Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]int8) - fastpathTV.DecMapFloat32Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Int8X(vp *map[float32]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Int8V(v map[float32]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[float32]int8, xlen) - changed = true - } - - var mk float32 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]int16) - v, changed := fastpathTV.DecMapFloat32Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]int16) - fastpathTV.DecMapFloat32Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Int16X(vp *map[float32]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Int16V(v map[float32]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[float32]int16, xlen) - changed = true - } - - var mk float32 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]int32) - v, changed := fastpathTV.DecMapFloat32Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]int32) - fastpathTV.DecMapFloat32Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Int32X(vp *map[float32]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Int32V(v map[float32]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[float32]int32, xlen) - changed = true - } - - var mk float32 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]int64) - v, changed := fastpathTV.DecMapFloat32Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]int64) - fastpathTV.DecMapFloat32Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Int64X(vp *map[float32]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Int64V(v map[float32]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]int64, xlen) - changed = true - } - - var mk float32 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]float32) - v, changed := fastpathTV.DecMapFloat32Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]float32) - fastpathTV.DecMapFloat32Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Float32X(vp *map[float32]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Float32V(v map[float32]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[float32]float32, xlen) - changed = true - } - - var mk float32 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]float64) - v, changed := fastpathTV.DecMapFloat32Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]float64) - fastpathTV.DecMapFloat32Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32Float64X(vp *map[float32]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32Float64V(v map[float32]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float32]float64, xlen) - changed = true - } - - var mk float32 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat32BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float32]bool) - v, changed := fastpathTV.DecMapFloat32BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float32]bool) - fastpathTV.DecMapFloat32BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat32BoolX(vp *map[float32]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat32BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat32BoolV(v map[float32]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[float32]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[float32]bool, xlen) - changed = true - } - - var mk float32 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = float32(dd.DecodeFloat(true)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]interface{}) - v, changed := fastpathTV.DecMapFloat64IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]interface{}) - fastpathTV.DecMapFloat64IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64IntfX(vp *map[float64]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64IntfV(v map[float64]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[float64]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk float64 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]string) - v, changed := fastpathTV.DecMapFloat64StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]string) - fastpathTV.DecMapFloat64StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64StringX(vp *map[float64]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64StringV(v map[float64]string, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[float64]string, xlen) - changed = true - } - - var mk float64 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uint) - v, changed := fastpathTV.DecMapFloat64UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uint) - fastpathTV.DecMapFloat64UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64UintX(vp *map[float64]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64UintV(v map[float64]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]uint, xlen) - changed = true - } - - var mk float64 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uint8) - v, changed := fastpathTV.DecMapFloat64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uint8) - fastpathTV.DecMapFloat64Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Uint8X(vp *map[float64]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Uint8V(v map[float64]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[float64]uint8, xlen) - changed = true - } - - var mk float64 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uint16) - v, changed := fastpathTV.DecMapFloat64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uint16) - fastpathTV.DecMapFloat64Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Uint16X(vp *map[float64]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Uint16V(v map[float64]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[float64]uint16, xlen) - changed = true - } - - var mk float64 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uint32) - v, changed := fastpathTV.DecMapFloat64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uint32) - fastpathTV.DecMapFloat64Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Uint32X(vp *map[float64]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Uint32V(v map[float64]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float64]uint32, xlen) - changed = true - } - - var mk float64 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uint64) - v, changed := fastpathTV.DecMapFloat64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uint64) - fastpathTV.DecMapFloat64Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Uint64X(vp *map[float64]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Uint64V(v map[float64]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]uint64, xlen) - changed = true - } - - var mk float64 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]uintptr) - v, changed := fastpathTV.DecMapFloat64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]uintptr) - fastpathTV.DecMapFloat64UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64UintptrX(vp *map[float64]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64UintptrV(v map[float64]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]uintptr, xlen) - changed = true - } - - var mk float64 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]int) - v, changed := fastpathTV.DecMapFloat64IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]int) - fastpathTV.DecMapFloat64IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64IntX(vp *map[float64]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64IntV(v map[float64]int, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]int, xlen) - changed = true - } - - var mk float64 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]int8) - v, changed := fastpathTV.DecMapFloat64Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]int8) - fastpathTV.DecMapFloat64Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Int8X(vp *map[float64]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Int8V(v map[float64]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[float64]int8, xlen) - changed = true - } - - var mk float64 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]int16) - v, changed := fastpathTV.DecMapFloat64Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]int16) - fastpathTV.DecMapFloat64Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Int16X(vp *map[float64]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Int16V(v map[float64]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[float64]int16, xlen) - changed = true - } - - var mk float64 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]int32) - v, changed := fastpathTV.DecMapFloat64Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]int32) - fastpathTV.DecMapFloat64Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Int32X(vp *map[float64]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Int32V(v map[float64]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float64]int32, xlen) - changed = true - } - - var mk float64 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]int64) - v, changed := fastpathTV.DecMapFloat64Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]int64) - fastpathTV.DecMapFloat64Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Int64X(vp *map[float64]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Int64V(v map[float64]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]int64, xlen) - changed = true - } - - var mk float64 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]float32) - v, changed := fastpathTV.DecMapFloat64Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]float32) - fastpathTV.DecMapFloat64Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Float32X(vp *map[float64]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Float32V(v map[float64]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[float64]float32, xlen) - changed = true - } - - var mk float64 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]float64) - v, changed := fastpathTV.DecMapFloat64Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]float64) - fastpathTV.DecMapFloat64Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64Float64X(vp *map[float64]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64Float64V(v map[float64]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[float64]float64, xlen) - changed = true - } - - var mk float64 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapFloat64BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[float64]bool) - v, changed := fastpathTV.DecMapFloat64BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[float64]bool) - fastpathTV.DecMapFloat64BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapFloat64BoolX(vp *map[float64]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapFloat64BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapFloat64BoolV(v map[float64]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[float64]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[float64]bool, xlen) - changed = true - } - - var mk float64 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeFloat(false) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]interface{}) - v, changed := fastpathTV.DecMapUintIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]interface{}) - fastpathTV.DecMapUintIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintIntfX(vp *map[uint]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintIntfV(v map[uint]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uint]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uint - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]string) - v, changed := fastpathTV.DecMapUintStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]string) - fastpathTV.DecMapUintStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintStringX(vp *map[uint]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintStringV(v map[uint]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uint]string, xlen) - changed = true - } - - var mk uint - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uint) - v, changed := fastpathTV.DecMapUintUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uint) - fastpathTV.DecMapUintUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUintX(vp *map[uint]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUintV(v map[uint]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]uint, xlen) - changed = true - } - - var mk uint - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uint8) - v, changed := fastpathTV.DecMapUintUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uint8) - fastpathTV.DecMapUintUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUint8X(vp *map[uint]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUint8V(v map[uint]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint]uint8, xlen) - changed = true - } - - var mk uint - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uint16) - v, changed := fastpathTV.DecMapUintUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uint16) - fastpathTV.DecMapUintUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUint16X(vp *map[uint]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUint16V(v map[uint]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint]uint16, xlen) - changed = true - } - - var mk uint - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uint32) - v, changed := fastpathTV.DecMapUintUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uint32) - fastpathTV.DecMapUintUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUint32X(vp *map[uint]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUint32V(v map[uint]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint]uint32, xlen) - changed = true - } - - var mk uint - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uint64) - v, changed := fastpathTV.DecMapUintUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uint64) - fastpathTV.DecMapUintUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUint64X(vp *map[uint]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUint64V(v map[uint]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]uint64, xlen) - changed = true - } - - var mk uint - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]uintptr) - v, changed := fastpathTV.DecMapUintUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]uintptr) - fastpathTV.DecMapUintUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintUintptrX(vp *map[uint]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintUintptrV(v map[uint]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]uintptr, xlen) - changed = true - } - - var mk uint - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]int) - v, changed := fastpathTV.DecMapUintIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]int) - fastpathTV.DecMapUintIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintIntX(vp *map[uint]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintIntV(v map[uint]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]int, xlen) - changed = true - } - - var mk uint - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]int8) - v, changed := fastpathTV.DecMapUintInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]int8) - fastpathTV.DecMapUintInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintInt8X(vp *map[uint]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintInt8V(v map[uint]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint]int8, xlen) - changed = true - } - - var mk uint - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]int16) - v, changed := fastpathTV.DecMapUintInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]int16) - fastpathTV.DecMapUintInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintInt16X(vp *map[uint]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintInt16V(v map[uint]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint]int16, xlen) - changed = true - } - - var mk uint - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]int32) - v, changed := fastpathTV.DecMapUintInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]int32) - fastpathTV.DecMapUintInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintInt32X(vp *map[uint]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintInt32V(v map[uint]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint]int32, xlen) - changed = true - } - - var mk uint - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]int64) - v, changed := fastpathTV.DecMapUintInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]int64) - fastpathTV.DecMapUintInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintInt64X(vp *map[uint]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintInt64V(v map[uint]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]int64, xlen) - changed = true - } - - var mk uint - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]float32) - v, changed := fastpathTV.DecMapUintFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]float32) - fastpathTV.DecMapUintFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintFloat32X(vp *map[uint]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintFloat32V(v map[uint]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint]float32, xlen) - changed = true - } - - var mk uint - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]float64) - v, changed := fastpathTV.DecMapUintFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]float64) - fastpathTV.DecMapUintFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintFloat64X(vp *map[uint]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintFloat64V(v map[uint]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint]float64, xlen) - changed = true - } - - var mk uint - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint]bool) - v, changed := fastpathTV.DecMapUintBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint]bool) - fastpathTV.DecMapUintBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintBoolX(vp *map[uint]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintBoolV(v map[uint]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uint]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint]bool, xlen) - changed = true - } - - var mk uint - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]interface{}) - v, changed := fastpathTV.DecMapUint8IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]interface{}) - fastpathTV.DecMapUint8IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8IntfX(vp *map[uint8]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8IntfV(v map[uint8]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[uint8]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uint8 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]string) - v, changed := fastpathTV.DecMapUint8StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]string) - fastpathTV.DecMapUint8StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8StringX(vp *map[uint8]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8StringV(v map[uint8]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[uint8]string, xlen) - changed = true - } - - var mk uint8 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uint) - v, changed := fastpathTV.DecMapUint8UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uint) - fastpathTV.DecMapUint8UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8UintX(vp *map[uint8]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8UintV(v map[uint8]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]uint, xlen) - changed = true - } - - var mk uint8 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uint8) - v, changed := fastpathTV.DecMapUint8Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uint8) - fastpathTV.DecMapUint8Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Uint8X(vp *map[uint8]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Uint8V(v map[uint8]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[uint8]uint8, xlen) - changed = true - } - - var mk uint8 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uint16) - v, changed := fastpathTV.DecMapUint8Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uint16) - fastpathTV.DecMapUint8Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Uint16X(vp *map[uint8]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Uint16V(v map[uint8]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[uint8]uint16, xlen) - changed = true - } - - var mk uint8 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uint32) - v, changed := fastpathTV.DecMapUint8Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uint32) - fastpathTV.DecMapUint8Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Uint32X(vp *map[uint8]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Uint32V(v map[uint8]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint8]uint32, xlen) - changed = true - } - - var mk uint8 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uint64) - v, changed := fastpathTV.DecMapUint8Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uint64) - fastpathTV.DecMapUint8Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Uint64X(vp *map[uint8]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Uint64V(v map[uint8]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]uint64, xlen) - changed = true - } - - var mk uint8 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]uintptr) - v, changed := fastpathTV.DecMapUint8UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]uintptr) - fastpathTV.DecMapUint8UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8UintptrX(vp *map[uint8]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8UintptrV(v map[uint8]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]uintptr, xlen) - changed = true - } - - var mk uint8 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]int) - v, changed := fastpathTV.DecMapUint8IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]int) - fastpathTV.DecMapUint8IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8IntX(vp *map[uint8]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8IntV(v map[uint8]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]int, xlen) - changed = true - } - - var mk uint8 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]int8) - v, changed := fastpathTV.DecMapUint8Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]int8) - fastpathTV.DecMapUint8Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Int8X(vp *map[uint8]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Int8V(v map[uint8]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[uint8]int8, xlen) - changed = true - } - - var mk uint8 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]int16) - v, changed := fastpathTV.DecMapUint8Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]int16) - fastpathTV.DecMapUint8Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Int16X(vp *map[uint8]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Int16V(v map[uint8]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[uint8]int16, xlen) - changed = true - } - - var mk uint8 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]int32) - v, changed := fastpathTV.DecMapUint8Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]int32) - fastpathTV.DecMapUint8Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Int32X(vp *map[uint8]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Int32V(v map[uint8]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint8]int32, xlen) - changed = true - } - - var mk uint8 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]int64) - v, changed := fastpathTV.DecMapUint8Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]int64) - fastpathTV.DecMapUint8Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Int64X(vp *map[uint8]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Int64V(v map[uint8]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]int64, xlen) - changed = true - } - - var mk uint8 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]float32) - v, changed := fastpathTV.DecMapUint8Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]float32) - fastpathTV.DecMapUint8Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Float32X(vp *map[uint8]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Float32V(v map[uint8]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint8]float32, xlen) - changed = true - } - - var mk uint8 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]float64) - v, changed := fastpathTV.DecMapUint8Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]float64) - fastpathTV.DecMapUint8Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8Float64X(vp *map[uint8]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8Float64V(v map[uint8]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint8]float64, xlen) - changed = true - } - - var mk uint8 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint8BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint8]bool) - v, changed := fastpathTV.DecMapUint8BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint8]bool) - fastpathTV.DecMapUint8BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint8BoolX(vp *map[uint8]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint8BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint8BoolV(v map[uint8]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uint8]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[uint8]bool, xlen) - changed = true - } - - var mk uint8 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint8(dd.DecodeUint(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]interface{}) - v, changed := fastpathTV.DecMapUint16IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]interface{}) - fastpathTV.DecMapUint16IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16IntfX(vp *map[uint16]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16IntfV(v map[uint16]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[uint16]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uint16 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]string) - v, changed := fastpathTV.DecMapUint16StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]string) - fastpathTV.DecMapUint16StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16StringX(vp *map[uint16]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16StringV(v map[uint16]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[uint16]string, xlen) - changed = true - } - - var mk uint16 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uint) - v, changed := fastpathTV.DecMapUint16UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uint) - fastpathTV.DecMapUint16UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16UintX(vp *map[uint16]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16UintV(v map[uint16]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]uint, xlen) - changed = true - } - - var mk uint16 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uint8) - v, changed := fastpathTV.DecMapUint16Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uint8) - fastpathTV.DecMapUint16Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Uint8X(vp *map[uint16]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Uint8V(v map[uint16]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[uint16]uint8, xlen) - changed = true - } - - var mk uint16 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uint16) - v, changed := fastpathTV.DecMapUint16Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uint16) - fastpathTV.DecMapUint16Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Uint16X(vp *map[uint16]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Uint16V(v map[uint16]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) - v = make(map[uint16]uint16, xlen) - changed = true - } - - var mk uint16 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uint32) - v, changed := fastpathTV.DecMapUint16Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uint32) - fastpathTV.DecMapUint16Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Uint32X(vp *map[uint16]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Uint32V(v map[uint16]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[uint16]uint32, xlen) - changed = true - } - - var mk uint16 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uint64) - v, changed := fastpathTV.DecMapUint16Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uint64) - fastpathTV.DecMapUint16Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Uint64X(vp *map[uint16]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Uint64V(v map[uint16]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]uint64, xlen) - changed = true - } - - var mk uint16 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]uintptr) - v, changed := fastpathTV.DecMapUint16UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]uintptr) - fastpathTV.DecMapUint16UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16UintptrX(vp *map[uint16]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16UintptrV(v map[uint16]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]uintptr, xlen) - changed = true - } - - var mk uint16 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]int) - v, changed := fastpathTV.DecMapUint16IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]int) - fastpathTV.DecMapUint16IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16IntX(vp *map[uint16]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16IntV(v map[uint16]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]int, xlen) - changed = true - } - - var mk uint16 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]int8) - v, changed := fastpathTV.DecMapUint16Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]int8) - fastpathTV.DecMapUint16Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Int8X(vp *map[uint16]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Int8V(v map[uint16]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[uint16]int8, xlen) - changed = true - } - - var mk uint16 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]int16) - v, changed := fastpathTV.DecMapUint16Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]int16) - fastpathTV.DecMapUint16Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Int16X(vp *map[uint16]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Int16V(v map[uint16]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) - v = make(map[uint16]int16, xlen) - changed = true - } - - var mk uint16 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]int32) - v, changed := fastpathTV.DecMapUint16Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]int32) - fastpathTV.DecMapUint16Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Int32X(vp *map[uint16]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Int32V(v map[uint16]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[uint16]int32, xlen) - changed = true - } - - var mk uint16 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]int64) - v, changed := fastpathTV.DecMapUint16Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]int64) - fastpathTV.DecMapUint16Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Int64X(vp *map[uint16]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Int64V(v map[uint16]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]int64, xlen) - changed = true - } - - var mk uint16 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]float32) - v, changed := fastpathTV.DecMapUint16Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]float32) - fastpathTV.DecMapUint16Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Float32X(vp *map[uint16]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Float32V(v map[uint16]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[uint16]float32, xlen) - changed = true - } - - var mk uint16 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]float64) - v, changed := fastpathTV.DecMapUint16Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]float64) - fastpathTV.DecMapUint16Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16Float64X(vp *map[uint16]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16Float64V(v map[uint16]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint16]float64, xlen) - changed = true - } - - var mk uint16 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint16BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint16]bool) - v, changed := fastpathTV.DecMapUint16BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint16]bool) - fastpathTV.DecMapUint16BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint16BoolX(vp *map[uint16]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint16BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint16BoolV(v map[uint16]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uint16]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[uint16]bool, xlen) - changed = true - } - - var mk uint16 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint16(dd.DecodeUint(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]interface{}) - v, changed := fastpathTV.DecMapUint32IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]interface{}) - fastpathTV.DecMapUint32IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32IntfX(vp *map[uint32]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32IntfV(v map[uint32]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[uint32]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uint32 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]string) - v, changed := fastpathTV.DecMapUint32StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]string) - fastpathTV.DecMapUint32StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32StringX(vp *map[uint32]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32StringV(v map[uint32]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[uint32]string, xlen) - changed = true - } - - var mk uint32 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uint) - v, changed := fastpathTV.DecMapUint32UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uint) - fastpathTV.DecMapUint32UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32UintX(vp *map[uint32]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32UintV(v map[uint32]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]uint, xlen) - changed = true - } - - var mk uint32 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uint8) - v, changed := fastpathTV.DecMapUint32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uint8) - fastpathTV.DecMapUint32Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Uint8X(vp *map[uint32]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Uint8V(v map[uint32]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint32]uint8, xlen) - changed = true - } - - var mk uint32 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uint16) - v, changed := fastpathTV.DecMapUint32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uint16) - fastpathTV.DecMapUint32Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Uint16X(vp *map[uint32]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Uint16V(v map[uint32]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[uint32]uint16, xlen) - changed = true - } - - var mk uint32 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uint32) - v, changed := fastpathTV.DecMapUint32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uint32) - fastpathTV.DecMapUint32Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Uint32X(vp *map[uint32]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Uint32V(v map[uint32]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[uint32]uint32, xlen) - changed = true - } - - var mk uint32 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uint64) - v, changed := fastpathTV.DecMapUint32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uint64) - fastpathTV.DecMapUint32Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Uint64X(vp *map[uint32]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Uint64V(v map[uint32]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]uint64, xlen) - changed = true - } - - var mk uint32 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]uintptr) - v, changed := fastpathTV.DecMapUint32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]uintptr) - fastpathTV.DecMapUint32UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32UintptrX(vp *map[uint32]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32UintptrV(v map[uint32]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]uintptr, xlen) - changed = true - } - - var mk uint32 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]int) - v, changed := fastpathTV.DecMapUint32IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]int) - fastpathTV.DecMapUint32IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32IntX(vp *map[uint32]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32IntV(v map[uint32]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]int, xlen) - changed = true - } - - var mk uint32 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]int8) - v, changed := fastpathTV.DecMapUint32Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]int8) - fastpathTV.DecMapUint32Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Int8X(vp *map[uint32]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Int8V(v map[uint32]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint32]int8, xlen) - changed = true - } - - var mk uint32 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]int16) - v, changed := fastpathTV.DecMapUint32Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]int16) - fastpathTV.DecMapUint32Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Int16X(vp *map[uint32]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Int16V(v map[uint32]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[uint32]int16, xlen) - changed = true - } - - var mk uint32 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]int32) - v, changed := fastpathTV.DecMapUint32Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]int32) - fastpathTV.DecMapUint32Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Int32X(vp *map[uint32]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Int32V(v map[uint32]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[uint32]int32, xlen) - changed = true - } - - var mk uint32 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]int64) - v, changed := fastpathTV.DecMapUint32Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]int64) - fastpathTV.DecMapUint32Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Int64X(vp *map[uint32]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Int64V(v map[uint32]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]int64, xlen) - changed = true - } - - var mk uint32 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]float32) - v, changed := fastpathTV.DecMapUint32Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]float32) - fastpathTV.DecMapUint32Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Float32X(vp *map[uint32]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Float32V(v map[uint32]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[uint32]float32, xlen) - changed = true - } - - var mk uint32 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]float64) - v, changed := fastpathTV.DecMapUint32Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]float64) - fastpathTV.DecMapUint32Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32Float64X(vp *map[uint32]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32Float64V(v map[uint32]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint32]float64, xlen) - changed = true - } - - var mk uint32 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint32BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint32]bool) - v, changed := fastpathTV.DecMapUint32BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint32]bool) - fastpathTV.DecMapUint32BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint32BoolX(vp *map[uint32]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint32BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint32BoolV(v map[uint32]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uint32]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[uint32]bool, xlen) - changed = true - } - - var mk uint32 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uint32(dd.DecodeUint(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]interface{}) - v, changed := fastpathTV.DecMapUint64IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]interface{}) - fastpathTV.DecMapUint64IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64IntfX(vp *map[uint64]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64IntfV(v map[uint64]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uint64]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uint64 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]string) - v, changed := fastpathTV.DecMapUint64StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]string) - fastpathTV.DecMapUint64StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64StringX(vp *map[uint64]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64StringV(v map[uint64]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uint64]string, xlen) - changed = true - } - - var mk uint64 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uint) - v, changed := fastpathTV.DecMapUint64UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uint) - fastpathTV.DecMapUint64UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64UintX(vp *map[uint64]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64UintV(v map[uint64]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]uint, xlen) - changed = true - } - - var mk uint64 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uint8) - v, changed := fastpathTV.DecMapUint64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uint8) - fastpathTV.DecMapUint64Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Uint8X(vp *map[uint64]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Uint8V(v map[uint64]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint64]uint8, xlen) - changed = true - } - - var mk uint64 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uint16) - v, changed := fastpathTV.DecMapUint64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uint16) - fastpathTV.DecMapUint64Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Uint16X(vp *map[uint64]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Uint16V(v map[uint64]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint64]uint16, xlen) - changed = true - } - - var mk uint64 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uint32) - v, changed := fastpathTV.DecMapUint64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uint32) - fastpathTV.DecMapUint64Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Uint32X(vp *map[uint64]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Uint32V(v map[uint64]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint64]uint32, xlen) - changed = true - } - - var mk uint64 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uint64) - v, changed := fastpathTV.DecMapUint64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uint64) - fastpathTV.DecMapUint64Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Uint64X(vp *map[uint64]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Uint64V(v map[uint64]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]uint64, xlen) - changed = true - } - - var mk uint64 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]uintptr) - v, changed := fastpathTV.DecMapUint64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]uintptr) - fastpathTV.DecMapUint64UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64UintptrX(vp *map[uint64]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64UintptrV(v map[uint64]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]uintptr, xlen) - changed = true - } - - var mk uint64 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]int) - v, changed := fastpathTV.DecMapUint64IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]int) - fastpathTV.DecMapUint64IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64IntX(vp *map[uint64]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64IntV(v map[uint64]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]int, xlen) - changed = true - } - - var mk uint64 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]int8) - v, changed := fastpathTV.DecMapUint64Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]int8) - fastpathTV.DecMapUint64Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Int8X(vp *map[uint64]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Int8V(v map[uint64]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint64]int8, xlen) - changed = true - } - - var mk uint64 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]int16) - v, changed := fastpathTV.DecMapUint64Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]int16) - fastpathTV.DecMapUint64Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Int16X(vp *map[uint64]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Int16V(v map[uint64]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uint64]int16, xlen) - changed = true - } - - var mk uint64 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]int32) - v, changed := fastpathTV.DecMapUint64Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]int32) - fastpathTV.DecMapUint64Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Int32X(vp *map[uint64]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Int32V(v map[uint64]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint64]int32, xlen) - changed = true - } - - var mk uint64 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]int64) - v, changed := fastpathTV.DecMapUint64Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]int64) - fastpathTV.DecMapUint64Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Int64X(vp *map[uint64]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Int64V(v map[uint64]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]int64, xlen) - changed = true - } - - var mk uint64 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]float32) - v, changed := fastpathTV.DecMapUint64Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]float32) - fastpathTV.DecMapUint64Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Float32X(vp *map[uint64]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Float32V(v map[uint64]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uint64]float32, xlen) - changed = true - } - - var mk uint64 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]float64) - v, changed := fastpathTV.DecMapUint64Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]float64) - fastpathTV.DecMapUint64Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64Float64X(vp *map[uint64]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64Float64V(v map[uint64]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uint64]float64, xlen) - changed = true - } - - var mk uint64 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUint64BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uint64]bool) - v, changed := fastpathTV.DecMapUint64BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uint64]bool) - fastpathTV.DecMapUint64BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUint64BoolX(vp *map[uint64]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUint64BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUint64BoolV(v map[uint64]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uint64]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uint64]bool, xlen) - changed = true - } - - var mk uint64 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeUint(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]interface{}) - v, changed := fastpathTV.DecMapUintptrIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]interface{}) - fastpathTV.DecMapUintptrIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrIntfX(vp *map[uintptr]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrIntfV(v map[uintptr]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uintptr]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk uintptr - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]string) - v, changed := fastpathTV.DecMapUintptrStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]string) - fastpathTV.DecMapUintptrStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrStringX(vp *map[uintptr]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrStringV(v map[uintptr]string, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[uintptr]string, xlen) - changed = true - } - - var mk uintptr - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uint) - v, changed := fastpathTV.DecMapUintptrUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uint) - fastpathTV.DecMapUintptrUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUintX(vp *map[uintptr]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUintV(v map[uintptr]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]uint, xlen) - changed = true - } - - var mk uintptr - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uint8) - v, changed := fastpathTV.DecMapUintptrUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uint8) - fastpathTV.DecMapUintptrUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUint8X(vp *map[uintptr]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUint8V(v map[uintptr]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uintptr]uint8, xlen) - changed = true - } - - var mk uintptr - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uint16) - v, changed := fastpathTV.DecMapUintptrUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uint16) - fastpathTV.DecMapUintptrUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUint16X(vp *map[uintptr]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUint16V(v map[uintptr]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uintptr]uint16, xlen) - changed = true - } - - var mk uintptr - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uint32) - v, changed := fastpathTV.DecMapUintptrUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uint32) - fastpathTV.DecMapUintptrUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUint32X(vp *map[uintptr]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUint32V(v map[uintptr]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uintptr]uint32, xlen) - changed = true - } - - var mk uintptr - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uint64) - v, changed := fastpathTV.DecMapUintptrUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uint64) - fastpathTV.DecMapUintptrUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUint64X(vp *map[uintptr]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUint64V(v map[uintptr]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]uint64, xlen) - changed = true - } - - var mk uintptr - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]uintptr) - v, changed := fastpathTV.DecMapUintptrUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]uintptr) - fastpathTV.DecMapUintptrUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrUintptrX(vp *map[uintptr]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrUintptrV(v map[uintptr]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]uintptr, xlen) - changed = true - } - - var mk uintptr - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]int) - v, changed := fastpathTV.DecMapUintptrIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]int) - fastpathTV.DecMapUintptrIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrIntX(vp *map[uintptr]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrIntV(v map[uintptr]int, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]int, xlen) - changed = true - } - - var mk uintptr - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]int8) - v, changed := fastpathTV.DecMapUintptrInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]int8) - fastpathTV.DecMapUintptrInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrInt8X(vp *map[uintptr]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrInt8V(v map[uintptr]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uintptr]int8, xlen) - changed = true - } - - var mk uintptr - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]int16) - v, changed := fastpathTV.DecMapUintptrInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]int16) - fastpathTV.DecMapUintptrInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrInt16X(vp *map[uintptr]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrInt16V(v map[uintptr]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[uintptr]int16, xlen) - changed = true - } - - var mk uintptr - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]int32) - v, changed := fastpathTV.DecMapUintptrInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]int32) - fastpathTV.DecMapUintptrInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrInt32X(vp *map[uintptr]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrInt32V(v map[uintptr]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uintptr]int32, xlen) - changed = true - } - - var mk uintptr - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]int64) - v, changed := fastpathTV.DecMapUintptrInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]int64) - fastpathTV.DecMapUintptrInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrInt64X(vp *map[uintptr]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrInt64V(v map[uintptr]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]int64, xlen) - changed = true - } - - var mk uintptr - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]float32) - v, changed := fastpathTV.DecMapUintptrFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]float32) - fastpathTV.DecMapUintptrFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrFloat32X(vp *map[uintptr]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrFloat32V(v map[uintptr]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[uintptr]float32, xlen) - changed = true - } - - var mk uintptr - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]float64) - v, changed := fastpathTV.DecMapUintptrFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]float64) - fastpathTV.DecMapUintptrFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrFloat64X(vp *map[uintptr]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrFloat64V(v map[uintptr]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[uintptr]float64, xlen) - changed = true - } - - var mk uintptr - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapUintptrBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[uintptr]bool) - v, changed := fastpathTV.DecMapUintptrBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[uintptr]bool) - fastpathTV.DecMapUintptrBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapUintptrBoolX(vp *map[uintptr]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapUintptrBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapUintptrBoolV(v map[uintptr]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[uintptr]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[uintptr]bool, xlen) - changed = true - } - - var mk uintptr - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = uintptr(dd.DecodeUint(uintBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]interface{}) - v, changed := fastpathTV.DecMapIntIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]interface{}) - fastpathTV.DecMapIntIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntIntfX(vp *map[int]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntIntfV(v map[int]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[int]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[int]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk int - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]string) - v, changed := fastpathTV.DecMapIntStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]string) - fastpathTV.DecMapIntStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntStringX(vp *map[int]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntStringV(v map[int]string, checkNil bool, canChange bool, - d *Decoder) (_ map[int]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[int]string, xlen) - changed = true - } - - var mk int - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uint) - v, changed := fastpathTV.DecMapIntUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uint) - fastpathTV.DecMapIntUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUintX(vp *map[int]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUintV(v map[int]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]uint, xlen) - changed = true - } - - var mk int - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uint8) - v, changed := fastpathTV.DecMapIntUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uint8) - fastpathTV.DecMapIntUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUint8X(vp *map[int]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUint8V(v map[int]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int]uint8, xlen) - changed = true - } - - var mk int - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uint16) - v, changed := fastpathTV.DecMapIntUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uint16) - fastpathTV.DecMapIntUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUint16X(vp *map[int]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUint16V(v map[int]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int]uint16, xlen) - changed = true - } - - var mk int - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uint32) - v, changed := fastpathTV.DecMapIntUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uint32) - fastpathTV.DecMapIntUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUint32X(vp *map[int]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUint32V(v map[int]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int]uint32, xlen) - changed = true - } - - var mk int - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uint64) - v, changed := fastpathTV.DecMapIntUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uint64) - fastpathTV.DecMapIntUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUint64X(vp *map[int]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUint64V(v map[int]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]uint64, xlen) - changed = true - } - - var mk int - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]uintptr) - v, changed := fastpathTV.DecMapIntUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]uintptr) - fastpathTV.DecMapIntUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntUintptrX(vp *map[int]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntUintptrV(v map[int]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[int]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]uintptr, xlen) - changed = true - } - - var mk int - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]int) - v, changed := fastpathTV.DecMapIntIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]int) - fastpathTV.DecMapIntIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntIntX(vp *map[int]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntIntV(v map[int]int, checkNil bool, canChange bool, - d *Decoder) (_ map[int]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]int, xlen) - changed = true - } - - var mk int - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]int8) - v, changed := fastpathTV.DecMapIntInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]int8) - fastpathTV.DecMapIntInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntInt8X(vp *map[int]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntInt8V(v map[int]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[int]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int]int8, xlen) - changed = true - } - - var mk int - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]int16) - v, changed := fastpathTV.DecMapIntInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]int16) - fastpathTV.DecMapIntInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntInt16X(vp *map[int]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntInt16V(v map[int]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[int]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int]int16, xlen) - changed = true - } - - var mk int - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]int32) - v, changed := fastpathTV.DecMapIntInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]int32) - fastpathTV.DecMapIntInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntInt32X(vp *map[int]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntInt32V(v map[int]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[int]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int]int32, xlen) - changed = true - } - - var mk int - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]int64) - v, changed := fastpathTV.DecMapIntInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]int64) - fastpathTV.DecMapIntInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntInt64X(vp *map[int]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntInt64V(v map[int]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[int]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]int64, xlen) - changed = true - } - - var mk int - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]float32) - v, changed := fastpathTV.DecMapIntFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]float32) - fastpathTV.DecMapIntFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntFloat32X(vp *map[int]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntFloat32V(v map[int]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[int]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int]float32, xlen) - changed = true - } - - var mk int - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]float64) - v, changed := fastpathTV.DecMapIntFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]float64) - fastpathTV.DecMapIntFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntFloat64X(vp *map[int]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntFloat64V(v map[int]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[int]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int]float64, xlen) - changed = true - } - - var mk int - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapIntBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int]bool) - v, changed := fastpathTV.DecMapIntBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int]bool) - fastpathTV.DecMapIntBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapIntBoolX(vp *map[int]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapIntBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapIntBoolV(v map[int]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[int]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int]bool, xlen) - changed = true - } - - var mk int - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int(dd.DecodeInt(intBitsize)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]interface{}) - v, changed := fastpathTV.DecMapInt8IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]interface{}) - fastpathTV.DecMapInt8IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8IntfX(vp *map[int8]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8IntfV(v map[int8]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[int8]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk int8 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]string) - v, changed := fastpathTV.DecMapInt8StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]string) - fastpathTV.DecMapInt8StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8StringX(vp *map[int8]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8StringV(v map[int8]string, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[int8]string, xlen) - changed = true - } - - var mk int8 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uint) - v, changed := fastpathTV.DecMapInt8UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uint) - fastpathTV.DecMapInt8UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8UintX(vp *map[int8]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8UintV(v map[int8]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]uint, xlen) - changed = true - } - - var mk int8 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uint8) - v, changed := fastpathTV.DecMapInt8Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uint8) - fastpathTV.DecMapInt8Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Uint8X(vp *map[int8]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Uint8V(v map[int8]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[int8]uint8, xlen) - changed = true - } - - var mk int8 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uint16) - v, changed := fastpathTV.DecMapInt8Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uint16) - fastpathTV.DecMapInt8Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Uint16X(vp *map[int8]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Uint16V(v map[int8]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[int8]uint16, xlen) - changed = true - } - - var mk int8 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uint32) - v, changed := fastpathTV.DecMapInt8Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uint32) - fastpathTV.DecMapInt8Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Uint32X(vp *map[int8]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Uint32V(v map[int8]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int8]uint32, xlen) - changed = true - } - - var mk int8 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uint64) - v, changed := fastpathTV.DecMapInt8Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uint64) - fastpathTV.DecMapInt8Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Uint64X(vp *map[int8]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Uint64V(v map[int8]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]uint64, xlen) - changed = true - } - - var mk int8 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]uintptr) - v, changed := fastpathTV.DecMapInt8UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]uintptr) - fastpathTV.DecMapInt8UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8UintptrX(vp *map[int8]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8UintptrV(v map[int8]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]uintptr, xlen) - changed = true - } - - var mk int8 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]int) - v, changed := fastpathTV.DecMapInt8IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]int) - fastpathTV.DecMapInt8IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8IntX(vp *map[int8]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8IntV(v map[int8]int, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]int, xlen) - changed = true - } - - var mk int8 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]int8) - v, changed := fastpathTV.DecMapInt8Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]int8) - fastpathTV.DecMapInt8Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Int8X(vp *map[int8]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Int8V(v map[int8]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[int8]int8, xlen) - changed = true - } - - var mk int8 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]int16) - v, changed := fastpathTV.DecMapInt8Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]int16) - fastpathTV.DecMapInt8Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Int16X(vp *map[int8]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Int16V(v map[int8]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[int8]int16, xlen) - changed = true - } - - var mk int8 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]int32) - v, changed := fastpathTV.DecMapInt8Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]int32) - fastpathTV.DecMapInt8Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Int32X(vp *map[int8]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Int32V(v map[int8]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int8]int32, xlen) - changed = true - } - - var mk int8 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]int64) - v, changed := fastpathTV.DecMapInt8Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]int64) - fastpathTV.DecMapInt8Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Int64X(vp *map[int8]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Int64V(v map[int8]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]int64, xlen) - changed = true - } - - var mk int8 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]float32) - v, changed := fastpathTV.DecMapInt8Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]float32) - fastpathTV.DecMapInt8Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Float32X(vp *map[int8]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Float32V(v map[int8]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int8]float32, xlen) - changed = true - } - - var mk int8 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]float64) - v, changed := fastpathTV.DecMapInt8Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]float64) - fastpathTV.DecMapInt8Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8Float64X(vp *map[int8]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8Float64V(v map[int8]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int8]float64, xlen) - changed = true - } - - var mk int8 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt8BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int8]bool) - v, changed := fastpathTV.DecMapInt8BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int8]bool) - fastpathTV.DecMapInt8BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt8BoolX(vp *map[int8]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt8BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt8BoolV(v map[int8]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[int8]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[int8]bool, xlen) - changed = true - } - - var mk int8 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int8(dd.DecodeInt(8)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]interface{}) - v, changed := fastpathTV.DecMapInt16IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]interface{}) - fastpathTV.DecMapInt16IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16IntfX(vp *map[int16]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16IntfV(v map[int16]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[int16]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk int16 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]string) - v, changed := fastpathTV.DecMapInt16StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]string) - fastpathTV.DecMapInt16StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16StringX(vp *map[int16]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16StringV(v map[int16]string, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 18) - v = make(map[int16]string, xlen) - changed = true - } - - var mk int16 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uint) - v, changed := fastpathTV.DecMapInt16UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uint) - fastpathTV.DecMapInt16UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16UintX(vp *map[int16]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16UintV(v map[int16]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]uint, xlen) - changed = true - } - - var mk int16 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uint8) - v, changed := fastpathTV.DecMapInt16Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uint8) - fastpathTV.DecMapInt16Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Uint8X(vp *map[int16]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Uint8V(v map[int16]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[int16]uint8, xlen) - changed = true - } - - var mk int16 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uint16) - v, changed := fastpathTV.DecMapInt16Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uint16) - fastpathTV.DecMapInt16Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Uint16X(vp *map[int16]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Uint16V(v map[int16]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) - v = make(map[int16]uint16, xlen) - changed = true - } - - var mk int16 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uint32) - v, changed := fastpathTV.DecMapInt16Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uint32) - fastpathTV.DecMapInt16Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Uint32X(vp *map[int16]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Uint32V(v map[int16]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[int16]uint32, xlen) - changed = true - } - - var mk int16 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uint64) - v, changed := fastpathTV.DecMapInt16Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uint64) - fastpathTV.DecMapInt16Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Uint64X(vp *map[int16]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Uint64V(v map[int16]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]uint64, xlen) - changed = true - } - - var mk int16 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]uintptr) - v, changed := fastpathTV.DecMapInt16UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]uintptr) - fastpathTV.DecMapInt16UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16UintptrX(vp *map[int16]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16UintptrV(v map[int16]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]uintptr, xlen) - changed = true - } - - var mk int16 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]int) - v, changed := fastpathTV.DecMapInt16IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]int) - fastpathTV.DecMapInt16IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16IntX(vp *map[int16]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16IntV(v map[int16]int, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]int, xlen) - changed = true - } - - var mk int16 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]int8) - v, changed := fastpathTV.DecMapInt16Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]int8) - fastpathTV.DecMapInt16Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Int8X(vp *map[int16]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Int8V(v map[int16]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[int16]int8, xlen) - changed = true - } - - var mk int16 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]int16) - v, changed := fastpathTV.DecMapInt16Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]int16) - fastpathTV.DecMapInt16Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Int16X(vp *map[int16]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Int16V(v map[int16]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 4) - v = make(map[int16]int16, xlen) - changed = true - } - - var mk int16 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]int32) - v, changed := fastpathTV.DecMapInt16Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]int32) - fastpathTV.DecMapInt16Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Int32X(vp *map[int16]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Int32V(v map[int16]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[int16]int32, xlen) - changed = true - } - - var mk int16 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]int64) - v, changed := fastpathTV.DecMapInt16Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]int64) - fastpathTV.DecMapInt16Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Int64X(vp *map[int16]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Int64V(v map[int16]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]int64, xlen) - changed = true - } - - var mk int16 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]float32) - v, changed := fastpathTV.DecMapInt16Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]float32) - fastpathTV.DecMapInt16Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Float32X(vp *map[int16]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Float32V(v map[int16]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[int16]float32, xlen) - changed = true - } - - var mk int16 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]float64) - v, changed := fastpathTV.DecMapInt16Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]float64) - fastpathTV.DecMapInt16Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16Float64X(vp *map[int16]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16Float64V(v map[int16]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int16]float64, xlen) - changed = true - } - - var mk int16 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt16BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int16]bool) - v, changed := fastpathTV.DecMapInt16BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int16]bool) - fastpathTV.DecMapInt16BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt16BoolX(vp *map[int16]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt16BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt16BoolV(v map[int16]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[int16]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[int16]bool, xlen) - changed = true - } - - var mk int16 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int16(dd.DecodeInt(16)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]interface{}) - v, changed := fastpathTV.DecMapInt32IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]interface{}) - fastpathTV.DecMapInt32IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32IntfX(vp *map[int32]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32IntfV(v map[int32]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[int32]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk int32 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]string) - v, changed := fastpathTV.DecMapInt32StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]string) - fastpathTV.DecMapInt32StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32StringX(vp *map[int32]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32StringV(v map[int32]string, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 20) - v = make(map[int32]string, xlen) - changed = true - } - - var mk int32 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uint) - v, changed := fastpathTV.DecMapInt32UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uint) - fastpathTV.DecMapInt32UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32UintX(vp *map[int32]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32UintV(v map[int32]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]uint, xlen) - changed = true - } - - var mk int32 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uint8) - v, changed := fastpathTV.DecMapInt32Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uint8) - fastpathTV.DecMapInt32Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Uint8X(vp *map[int32]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Uint8V(v map[int32]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int32]uint8, xlen) - changed = true - } - - var mk int32 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uint16) - v, changed := fastpathTV.DecMapInt32Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uint16) - fastpathTV.DecMapInt32Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Uint16X(vp *map[int32]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Uint16V(v map[int32]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[int32]uint16, xlen) - changed = true - } - - var mk int32 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uint32) - v, changed := fastpathTV.DecMapInt32Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uint32) - fastpathTV.DecMapInt32Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Uint32X(vp *map[int32]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Uint32V(v map[int32]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[int32]uint32, xlen) - changed = true - } - - var mk int32 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uint64) - v, changed := fastpathTV.DecMapInt32Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uint64) - fastpathTV.DecMapInt32Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Uint64X(vp *map[int32]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Uint64V(v map[int32]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]uint64, xlen) - changed = true - } - - var mk int32 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]uintptr) - v, changed := fastpathTV.DecMapInt32UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]uintptr) - fastpathTV.DecMapInt32UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32UintptrX(vp *map[int32]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32UintptrV(v map[int32]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]uintptr, xlen) - changed = true - } - - var mk int32 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]int) - v, changed := fastpathTV.DecMapInt32IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]int) - fastpathTV.DecMapInt32IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32IntX(vp *map[int32]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32IntV(v map[int32]int, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]int, xlen) - changed = true - } - - var mk int32 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]int8) - v, changed := fastpathTV.DecMapInt32Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]int8) - fastpathTV.DecMapInt32Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Int8X(vp *map[int32]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Int8V(v map[int32]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int32]int8, xlen) - changed = true - } - - var mk int32 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]int16) - v, changed := fastpathTV.DecMapInt32Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]int16) - fastpathTV.DecMapInt32Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Int16X(vp *map[int32]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Int16V(v map[int32]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 6) - v = make(map[int32]int16, xlen) - changed = true - } - - var mk int32 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]int32) - v, changed := fastpathTV.DecMapInt32Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]int32) - fastpathTV.DecMapInt32Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Int32X(vp *map[int32]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Int32V(v map[int32]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[int32]int32, xlen) - changed = true - } - - var mk int32 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]int64) - v, changed := fastpathTV.DecMapInt32Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]int64) - fastpathTV.DecMapInt32Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Int64X(vp *map[int32]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Int64V(v map[int32]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]int64, xlen) - changed = true - } - - var mk int32 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]float32) - v, changed := fastpathTV.DecMapInt32Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]float32) - fastpathTV.DecMapInt32Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Float32X(vp *map[int32]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Float32V(v map[int32]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 8) - v = make(map[int32]float32, xlen) - changed = true - } - - var mk int32 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]float64) - v, changed := fastpathTV.DecMapInt32Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]float64) - fastpathTV.DecMapInt32Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32Float64X(vp *map[int32]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32Float64V(v map[int32]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int32]float64, xlen) - changed = true - } - - var mk int32 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt32BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int32]bool) - v, changed := fastpathTV.DecMapInt32BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int32]bool) - fastpathTV.DecMapInt32BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt32BoolX(vp *map[int32]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt32BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt32BoolV(v map[int32]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[int32]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[int32]bool, xlen) - changed = true - } - - var mk int32 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = int32(dd.DecodeInt(32)) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64IntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]interface{}) - v, changed := fastpathTV.DecMapInt64IntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]interface{}) - fastpathTV.DecMapInt64IntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64IntfX(vp *map[int64]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64IntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64IntfV(v map[int64]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[int64]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk int64 - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64StringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]string) - v, changed := fastpathTV.DecMapInt64StringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]string) - fastpathTV.DecMapInt64StringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64StringX(vp *map[int64]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64StringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64StringV(v map[int64]string, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 24) - v = make(map[int64]string, xlen) - changed = true - } - - var mk int64 - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64UintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uint) - v, changed := fastpathTV.DecMapInt64UintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uint) - fastpathTV.DecMapInt64UintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64UintX(vp *map[int64]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64UintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64UintV(v map[int64]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]uint, xlen) - changed = true - } - - var mk int64 - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Uint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uint8) - v, changed := fastpathTV.DecMapInt64Uint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uint8) - fastpathTV.DecMapInt64Uint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Uint8X(vp *map[int64]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Uint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Uint8V(v map[int64]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int64]uint8, xlen) - changed = true - } - - var mk int64 - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Uint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uint16) - v, changed := fastpathTV.DecMapInt64Uint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uint16) - fastpathTV.DecMapInt64Uint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Uint16X(vp *map[int64]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Uint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Uint16V(v map[int64]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int64]uint16, xlen) - changed = true - } - - var mk int64 - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Uint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uint32) - v, changed := fastpathTV.DecMapInt64Uint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uint32) - fastpathTV.DecMapInt64Uint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Uint32X(vp *map[int64]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Uint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Uint32V(v map[int64]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int64]uint32, xlen) - changed = true - } - - var mk int64 - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Uint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uint64) - v, changed := fastpathTV.DecMapInt64Uint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uint64) - fastpathTV.DecMapInt64Uint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Uint64X(vp *map[int64]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Uint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Uint64V(v map[int64]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]uint64, xlen) - changed = true - } - - var mk int64 - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64UintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]uintptr) - v, changed := fastpathTV.DecMapInt64UintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]uintptr) - fastpathTV.DecMapInt64UintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64UintptrX(vp *map[int64]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64UintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64UintptrV(v map[int64]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]uintptr, xlen) - changed = true - } - - var mk int64 - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64IntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]int) - v, changed := fastpathTV.DecMapInt64IntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]int) - fastpathTV.DecMapInt64IntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64IntX(vp *map[int64]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64IntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64IntV(v map[int64]int, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]int, xlen) - changed = true - } - - var mk int64 - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Int8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]int8) - v, changed := fastpathTV.DecMapInt64Int8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]int8) - fastpathTV.DecMapInt64Int8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Int8X(vp *map[int64]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Int8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Int8V(v map[int64]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int64]int8, xlen) - changed = true - } - - var mk int64 - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Int16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]int16) - v, changed := fastpathTV.DecMapInt64Int16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]int16) - fastpathTV.DecMapInt64Int16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Int16X(vp *map[int64]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Int16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Int16V(v map[int64]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 10) - v = make(map[int64]int16, xlen) - changed = true - } - - var mk int64 - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Int32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]int32) - v, changed := fastpathTV.DecMapInt64Int32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]int32) - fastpathTV.DecMapInt64Int32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Int32X(vp *map[int64]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Int32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Int32V(v map[int64]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int64]int32, xlen) - changed = true - } - - var mk int64 - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Int64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]int64) - v, changed := fastpathTV.DecMapInt64Int64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]int64) - fastpathTV.DecMapInt64Int64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Int64X(vp *map[int64]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Int64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Int64V(v map[int64]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]int64, xlen) - changed = true - } - - var mk int64 - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Float32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]float32) - v, changed := fastpathTV.DecMapInt64Float32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]float32) - fastpathTV.DecMapInt64Float32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Float32X(vp *map[int64]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Float32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Float32V(v map[int64]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 12) - v = make(map[int64]float32, xlen) - changed = true - } - - var mk int64 - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64Float64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]float64) - v, changed := fastpathTV.DecMapInt64Float64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]float64) - fastpathTV.DecMapInt64Float64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64Float64X(vp *map[int64]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64Float64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64Float64V(v map[int64]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 16) - v = make(map[int64]float64, xlen) - changed = true - } - - var mk int64 - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapInt64BoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[int64]bool) - v, changed := fastpathTV.DecMapInt64BoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[int64]bool) - fastpathTV.DecMapInt64BoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapInt64BoolX(vp *map[int64]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapInt64BoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapInt64BoolV(v map[int64]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[int64]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[int64]bool, xlen) - changed = true - } - - var mk int64 - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeInt(64) - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolIntfR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]interface{}) - v, changed := fastpathTV.DecMapBoolIntfV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]interface{}) - fastpathTV.DecMapBoolIntfV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolIntfX(vp *map[bool]interface{}, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolIntfV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolIntfV(v map[bool]interface{}, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]interface{}, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[bool]interface{}, xlen) - changed = true - } - mapGet := !d.h.MapValueReset && !d.h.InterfaceReset - var mk bool - var mv interface{} - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - if mapGet { - mv = v[mk] - } else { - mv = nil - } - d.decode(&mv) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolStringR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]string) - v, changed := fastpathTV.DecMapBoolStringV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]string) - fastpathTV.DecMapBoolStringV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolStringX(vp *map[bool]string, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolStringV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolStringV(v map[bool]string, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]string, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 17) - v = make(map[bool]string, xlen) - changed = true - } - - var mk bool - var mv string - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeString() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUintR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uint) - v, changed := fastpathTV.DecMapBoolUintV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uint) - fastpathTV.DecMapBoolUintV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUintX(vp *map[bool]uint, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUintV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUintV(v map[bool]uint, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uint, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]uint, xlen) - changed = true - } - - var mk bool - var mv uint - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUint8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uint8) - v, changed := fastpathTV.DecMapBoolUint8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uint8) - fastpathTV.DecMapBoolUint8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUint8X(vp *map[bool]uint8, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUint8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUint8V(v map[bool]uint8, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uint8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[bool]uint8, xlen) - changed = true - } - - var mk bool - var mv uint8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint8(dd.DecodeUint(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUint16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uint16) - v, changed := fastpathTV.DecMapBoolUint16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uint16) - fastpathTV.DecMapBoolUint16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUint16X(vp *map[bool]uint16, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUint16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUint16V(v map[bool]uint16, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uint16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[bool]uint16, xlen) - changed = true - } - - var mk bool - var mv uint16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint16(dd.DecodeUint(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUint32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uint32) - v, changed := fastpathTV.DecMapBoolUint32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uint32) - fastpathTV.DecMapBoolUint32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUint32X(vp *map[bool]uint32, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUint32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUint32V(v map[bool]uint32, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uint32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[bool]uint32, xlen) - changed = true - } - - var mk bool - var mv uint32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uint32(dd.DecodeUint(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUint64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uint64) - v, changed := fastpathTV.DecMapBoolUint64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uint64) - fastpathTV.DecMapBoolUint64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUint64X(vp *map[bool]uint64, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUint64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUint64V(v map[bool]uint64, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uint64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]uint64, xlen) - changed = true - } - - var mk bool - var mv uint64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeUint(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolUintptrR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]uintptr) - v, changed := fastpathTV.DecMapBoolUintptrV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]uintptr) - fastpathTV.DecMapBoolUintptrV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolUintptrX(vp *map[bool]uintptr, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolUintptrV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolUintptrV(v map[bool]uintptr, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]uintptr, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]uintptr, xlen) - changed = true - } - - var mk bool - var mv uintptr - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = uintptr(dd.DecodeUint(uintBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolIntR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]int) - v, changed := fastpathTV.DecMapBoolIntV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]int) - fastpathTV.DecMapBoolIntV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolIntX(vp *map[bool]int, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolIntV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolIntV(v map[bool]int, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]int, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]int, xlen) - changed = true - } - - var mk bool - var mv int - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int(dd.DecodeInt(intBitsize)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolInt8R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]int8) - v, changed := fastpathTV.DecMapBoolInt8V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]int8) - fastpathTV.DecMapBoolInt8V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolInt8X(vp *map[bool]int8, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolInt8V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolInt8V(v map[bool]int8, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]int8, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[bool]int8, xlen) - changed = true - } - - var mk bool - var mv int8 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int8(dd.DecodeInt(8)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolInt16R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]int16) - v, changed := fastpathTV.DecMapBoolInt16V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]int16) - fastpathTV.DecMapBoolInt16V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolInt16X(vp *map[bool]int16, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolInt16V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolInt16V(v map[bool]int16, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]int16, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 3) - v = make(map[bool]int16, xlen) - changed = true - } - - var mk bool - var mv int16 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int16(dd.DecodeInt(16)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolInt32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]int32) - v, changed := fastpathTV.DecMapBoolInt32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]int32) - fastpathTV.DecMapBoolInt32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolInt32X(vp *map[bool]int32, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolInt32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolInt32V(v map[bool]int32, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]int32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[bool]int32, xlen) - changed = true - } - - var mk bool - var mv int32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = int32(dd.DecodeInt(32)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolInt64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]int64) - v, changed := fastpathTV.DecMapBoolInt64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]int64) - fastpathTV.DecMapBoolInt64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolInt64X(vp *map[bool]int64, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolInt64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolInt64V(v map[bool]int64, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]int64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]int64, xlen) - changed = true - } - - var mk bool - var mv int64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeInt(64) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolFloat32R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]float32) - v, changed := fastpathTV.DecMapBoolFloat32V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]float32) - fastpathTV.DecMapBoolFloat32V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolFloat32X(vp *map[bool]float32, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolFloat32V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolFloat32V(v map[bool]float32, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]float32, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 5) - v = make(map[bool]float32, xlen) - changed = true - } - - var mk bool - var mv float32 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = float32(dd.DecodeFloat(true)) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolFloat64R(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]float64) - v, changed := fastpathTV.DecMapBoolFloat64V(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]float64) - fastpathTV.DecMapBoolFloat64V(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolFloat64X(vp *map[bool]float64, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolFloat64V(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolFloat64V(v map[bool]float64, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]float64, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 9) - v = make(map[bool]float64, xlen) - changed = true - } - - var mk bool - var mv float64 - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeFloat(false) - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} - -func (f *decFnInfo) fastpathDecMapBoolBoolR(rv reflect.Value) { - if rv.CanAddr() { - vp := rv.Addr().Interface().(*map[bool]bool) - v, changed := fastpathTV.DecMapBoolBoolV(*vp, fastpathCheckNilFalse, true, f.d) - if changed { - *vp = v - } - } else { - v := rv.Interface().(map[bool]bool) - fastpathTV.DecMapBoolBoolV(v, fastpathCheckNilFalse, false, f.d) - } -} -func (f fastpathT) DecMapBoolBoolX(vp *map[bool]bool, checkNil bool, d *Decoder) { - v, changed := f.DecMapBoolBoolV(*vp, checkNil, true, d) - if changed { - *vp = v - } -} -func (_ fastpathT) DecMapBoolBoolV(v map[bool]bool, checkNil bool, canChange bool, - d *Decoder) (_ map[bool]bool, changed bool) { - dd := d.d - cr := d.cr - - if checkNil && dd.TryDecodeAsNil() { - if v != nil { - changed = true - } - return nil, changed - } - - containerLen := dd.ReadMapStart() - if canChange && v == nil { - xlen, _ := decInferLen(containerLen, d.h.MaxInitLen, 2) - v = make(map[bool]bool, xlen) - changed = true - } - - var mk bool - var mv bool - if containerLen > 0 { - for j := 0; j < containerLen; j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } else if containerLen < 0 { - for j := 0; !dd.CheckBreak(); j++ { - if cr != nil { - cr.sendContainerState(containerMapKey) - } - mk = dd.DecodeBool() - if cr != nil { - cr.sendContainerState(containerMapValue) - } - mv = dd.DecodeBool() - if v != nil { - v[mk] = mv - } - } - } - if cr != nil { - cr.sendContainerState(containerMapEnd) - } - return v, changed -} diff --git a/vendor/github.com/ugorji/go/codec/fast-path.not.go b/vendor/github.com/ugorji/go/codec/fast-path.not.go deleted file mode 100644 index d6f5f0c911be..000000000000 --- a/vendor/github.com/ugorji/go/codec/fast-path.not.go +++ /dev/null @@ -1,32 +0,0 @@ -// +build notfastpath - -package codec - -import "reflect" - -// The generated fast-path code is very large, and adds a few seconds to the build time. -// This causes test execution, execution of small tools which use codec, etc -// to take a long time. -// -// To mitigate, we now support the notfastpath tag. -// This tag disables fastpath during build, allowing for faster build, test execution, -// short-program runs, etc. - -func fastpathDecodeTypeSwitch(iv interface{}, d *Decoder) bool { return false } -func fastpathEncodeTypeSwitch(iv interface{}, e *Encoder) bool { return false } -func fastpathEncodeTypeSwitchSlice(iv interface{}, e *Encoder) bool { return false } -func fastpathEncodeTypeSwitchMap(iv interface{}, e *Encoder) bool { return false } - -type fastpathT struct{} -type fastpathE struct { - rtid uintptr - rt reflect.Type - encfn func(*encFnInfo, reflect.Value) - decfn func(*decFnInfo, reflect.Value) -} -type fastpathA [0]fastpathE - -func (x fastpathA) index(rtid uintptr) int { return -1 } - -var fastpathAV fastpathA -var fastpathTV fastpathT diff --git a/vendor/github.com/ugorji/go/codec/gen-helper.generated.go b/vendor/github.com/ugorji/go/codec/gen-helper.generated.go deleted file mode 100644 index 22bce776bb2b..000000000000 --- a/vendor/github.com/ugorji/go/codec/gen-helper.generated.go +++ /dev/null @@ -1,233 +0,0 @@ -// //+build ignore - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED from gen-helper.go.tmpl -// ************************************************************ - -package codec - -import ( - "encoding" - "reflect" -) - -// This file is used to generate helper code for codecgen. -// The values here i.e. genHelper(En|De)coder are not to be used directly by -// library users. They WILL change continously and without notice. -// -// To help enforce this, we create an unexported type with exported members. -// The only way to get the type is via the one exported type that we control (somewhat). -// -// When static codecs are created for types, they will use this value -// to perform encoding or decoding of primitives or known slice or map types. - -// GenHelperEncoder is exported so that it can be used externally by codecgen. -// Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. -func GenHelperEncoder(e *Encoder) (genHelperEncoder, encDriver) { - return genHelperEncoder{e: e}, e.e -} - -// GenHelperDecoder is exported so that it can be used externally by codecgen. -// Library users: DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE. -func GenHelperDecoder(d *Decoder) (genHelperDecoder, decDriver) { - return genHelperDecoder{d: d}, d.d -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -type genHelperEncoder struct { - e *Encoder - F fastpathT -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -type genHelperDecoder struct { - d *Decoder - F fastpathT -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncBasicHandle() *BasicHandle { - return f.e.h -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncBinary() bool { - return f.e.be // f.e.hh.isBinaryEncoding() -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncFallback(iv interface{}) { - // println(">>>>>>>>> EncFallback") - f.e.encodeI(iv, false, false) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncTextMarshal(iv encoding.TextMarshaler) { - bs, fnerr := iv.MarshalText() - f.e.marshal(bs, fnerr, false, c_UTF8) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncJSONMarshal(iv jsonMarshaler) { - bs, fnerr := iv.MarshalJSON() - f.e.marshal(bs, fnerr, true, c_UTF8) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncBinaryMarshal(iv encoding.BinaryMarshaler) { - bs, fnerr := iv.MarshalBinary() - f.e.marshal(bs, fnerr, false, c_RAW) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) TimeRtidIfBinc() uintptr { - if _, ok := f.e.hh.(*BincHandle); ok { - return timeTypId - } - return 0 -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) IsJSONHandle() bool { - return f.e.js -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) HasExtensions() bool { - return len(f.e.h.extHandle) != 0 -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncExt(v interface{}) (r bool) { - rt := reflect.TypeOf(v) - if rt.Kind() == reflect.Ptr { - rt = rt.Elem() - } - rtid := reflect.ValueOf(rt).Pointer() - if xfFn := f.e.h.getExt(rtid); xfFn != nil { - f.e.e.EncodeExt(v, xfFn.tag, xfFn.ext, f.e) - return true - } - return false -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperEncoder) EncSendContainerState(c containerState) { - if f.e.cr != nil { - f.e.cr.sendContainerState(c) - } -} - -// ---------------- DECODER FOLLOWS ----------------- - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecBasicHandle() *BasicHandle { - return f.d.h -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecBinary() bool { - return f.d.be // f.d.hh.isBinaryEncoding() -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecSwallow() { - f.d.swallow() -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecScratchBuffer() []byte { - return f.d.b[:] -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecFallback(iv interface{}, chkPtr bool) { - // println(">>>>>>>>> DecFallback") - f.d.decodeI(iv, chkPtr, false, false, false) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecSliceHelperStart() (decSliceHelper, int) { - return f.d.decSliceHelperStart() -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecStructFieldNotFound(index int, name string) { - f.d.structFieldNotFound(index, name) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecArrayCannotExpand(sliceLen, streamLen int) { - f.d.arrayCannotExpand(sliceLen, streamLen) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecTextUnmarshal(tm encoding.TextUnmarshaler) { - fnerr := tm.UnmarshalText(f.d.d.DecodeBytes(f.d.b[:], true, true)) - if fnerr != nil { - panic(fnerr) - } -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecJSONUnmarshal(tm jsonUnmarshaler) { - // bs := f.dd.DecodeBytes(f.d.b[:], true, true) - // grab the bytes to be read, as UnmarshalJSON needs the full JSON so as to unmarshal it itself. - fnerr := tm.UnmarshalJSON(f.d.nextValueBytes()) - if fnerr != nil { - panic(fnerr) - } -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecBinaryUnmarshal(bm encoding.BinaryUnmarshaler) { - fnerr := bm.UnmarshalBinary(f.d.d.DecodeBytes(nil, false, true)) - if fnerr != nil { - panic(fnerr) - } -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) TimeRtidIfBinc() uintptr { - if _, ok := f.d.hh.(*BincHandle); ok { - return timeTypId - } - return 0 -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) IsJSONHandle() bool { - return f.d.js -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) HasExtensions() bool { - return len(f.d.h.extHandle) != 0 -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecExt(v interface{}) (r bool) { - rt := reflect.TypeOf(v).Elem() - rtid := reflect.ValueOf(rt).Pointer() - if xfFn := f.d.h.getExt(rtid); xfFn != nil { - f.d.d.DecodeExt(v, xfFn.tag, xfFn.ext) - return true - } - return false -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecInferLen(clen, maxlen, unit int) (rvlen int, truncated bool) { - return decInferLen(clen, maxlen, unit) -} - -// FOR USE BY CODECGEN ONLY. IT *WILL* CHANGE WITHOUT NOTICE. *DO NOT USE* -func (f genHelperDecoder) DecSendContainerState(c containerState) { - if f.d.cr != nil { - f.d.cr.sendContainerState(c) - } -} diff --git a/vendor/github.com/ugorji/go/codec/gen.generated.go b/vendor/github.com/ugorji/go/codec/gen.generated.go deleted file mode 100644 index 2ace97b78cd7..000000000000 --- a/vendor/github.com/ugorji/go/codec/gen.generated.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// DO NOT EDIT. THIS FILE IS AUTO-GENERATED FROM gen-dec-(map|array).go.tmpl - -const genDecMapTmpl = ` -{{var "v"}} := *{{ .Varname }} -{{var "l"}} := r.ReadMapStart() -{{var "bh"}} := z.DecBasicHandle() -if {{var "v"}} == nil { - {{var "rl"}}, _ := z.DecInferLen({{var "l"}}, {{var "bh"}}.MaxInitLen, {{ .Size }}) - {{var "v"}} = make(map[{{ .KTyp }}]{{ .Typ }}, {{var "rl"}}) - *{{ .Varname }} = {{var "v"}} -} -var {{var "mk"}} {{ .KTyp }} -var {{var "mv"}} {{ .Typ }} -var {{var "mg"}} {{if decElemKindPtr}}, {{var "ms"}}, {{var "mok"}}{{end}} bool -if {{var "bh"}}.MapValueReset { - {{if decElemKindPtr}}{{var "mg"}} = true - {{else if decElemKindIntf}}if !{{var "bh"}}.InterfaceReset { {{var "mg"}} = true } - {{else if not decElemKindImmutable}}{{var "mg"}} = true - {{end}} } -if {{var "l"}} > 0 { -for {{var "j"}} := 0; {{var "j"}} < {{var "l"}}; {{var "j"}}++ { - z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) - {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} -{{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { - {{var "mk"}} = string({{var "bv"}}) - }{{ end }}{{if decElemKindPtr}} - {{var "ms"}} = true{{end}} - if {{var "mg"}} { - {{if decElemKindPtr}}{{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{var "mk"}}] - if {{var "mok"}} { - {{var "ms"}} = false - } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} - } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} - z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) - {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} - if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { - {{var "v"}}[{{var "mk"}}] = {{var "mv"}} - } -} -} else if {{var "l"}} < 0 { -for {{var "j"}} := 0; !r.CheckBreak(); {{var "j"}}++ { - z.DecSendContainerState(codecSelfer_containerMapKey{{ .Sfx }}) - {{ $x := printf "%vmk%v" .TempVar .Rand }}{{ decLineVarK $x }} -{{ if eq .KTyp "interface{}" }}{{/* // special case if a byte array. */}}if {{var "bv"}}, {{var "bok"}} := {{var "mk"}}.([]byte); {{var "bok"}} { - {{var "mk"}} = string({{var "bv"}}) - }{{ end }}{{if decElemKindPtr}} - {{var "ms"}} = true {{ end }} - if {{var "mg"}} { - {{if decElemKindPtr}}{{var "mv"}}, {{var "mok"}} = {{var "v"}}[{{var "mk"}}] - if {{var "mok"}} { - {{var "ms"}} = false - } {{else}}{{var "mv"}} = {{var "v"}}[{{var "mk"}}] {{end}} - } {{if not decElemKindImmutable}}else { {{var "mv"}} = {{decElemZero}} }{{end}} - z.DecSendContainerState(codecSelfer_containerMapValue{{ .Sfx }}) - {{ $x := printf "%vmv%v" .TempVar .Rand }}{{ decLineVar $x }} - if {{if decElemKindPtr}} {{var "ms"}} && {{end}} {{var "v"}} != nil { - {{var "v"}}[{{var "mk"}}] = {{var "mv"}} - } -} -} // else len==0: TODO: Should we clear map entries? -z.DecSendContainerState(codecSelfer_containerMapEnd{{ .Sfx }}) -` - -const genDecListTmpl = ` -{{var "v"}} := {{if not isArray}}*{{end}}{{ .Varname }} -{{var "h"}}, {{var "l"}} := z.DecSliceHelperStart() {{/* // helper, containerLenS */}}{{if not isArray}} -var {{var "c"}} bool {{/* // changed */}} -_ = {{var "c"}}{{end}} -if {{var "l"}} == 0 { - {{if isSlice }}if {{var "v"}} == nil { - {{var "v"}} = []{{ .Typ }}{} - {{var "c"}} = true - } else if len({{var "v"}}) != 0 { - {{var "v"}} = {{var "v"}}[:0] - {{var "c"}} = true - } {{end}} {{if isChan }}if {{var "v"}} == nil { - {{var "v"}} = make({{ .CTyp }}, 0) - {{var "c"}} = true - } {{end}} -} else if {{var "l"}} > 0 { - {{if isChan }}if {{var "v"}} == nil { - {{var "rl"}}, _ = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) - {{var "v"}} = make({{ .CTyp }}, {{var "rl"}}) - {{var "c"}} = true - } - for {{var "r"}} := 0; {{var "r"}} < {{var "l"}}; {{var "r"}}++ { - {{var "h"}}.ElemContainerState({{var "r"}}) - var {{var "t"}} {{ .Typ }} - {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} - {{var "v"}} <- {{var "t"}} - } - {{ else }} var {{var "rr"}}, {{var "rl"}} int {{/* // num2read, length of slice/array/chan */}} - var {{var "rt"}} bool {{/* truncated */}} - _, _ = {{var "rl"}}, {{var "rt"}} - {{var "rr"}} = {{var "l"}} // len({{var "v"}}) - if {{var "l"}} > cap({{var "v"}}) { - {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "l"}}) - {{ else }}{{if not .Immutable }} - {{var "rg"}} := len({{var "v"}}) > 0 - {{var "v2"}} := {{var "v"}} {{end}} - {{var "rl"}}, {{var "rt"}} = z.DecInferLen({{var "l"}}, z.DecBasicHandle().MaxInitLen, {{ .Size }}) - if {{var "rt"}} { - if {{var "rl"}} <= cap({{var "v"}}) { - {{var "v"}} = {{var "v"}}[:{{var "rl"}}] - } else { - {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) - } - } else { - {{var "v"}} = make([]{{ .Typ }}, {{var "rl"}}) - } - {{var "c"}} = true - {{var "rr"}} = len({{var "v"}}) {{if not .Immutable }} - if {{var "rg"}} { copy({{var "v"}}, {{var "v2"}}) } {{end}} {{end}}{{/* end not Immutable, isArray */}} - } {{if isSlice }} else if {{var "l"}} != len({{var "v"}}) { - {{var "v"}} = {{var "v"}}[:{{var "l"}}] - {{var "c"}} = true - } {{end}} {{/* end isSlice:47 */}} - {{var "j"}} := 0 - for ; {{var "j"}} < {{var "rr"}} ; {{var "j"}}++ { - {{var "h"}}.ElemContainerState({{var "j"}}) - {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} - } - {{if isArray }}for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { - {{var "h"}}.ElemContainerState({{var "j"}}) - z.DecSwallow() - } - {{ else }}if {{var "rt"}} { - for ; {{var "j"}} < {{var "l"}} ; {{var "j"}}++ { - {{var "v"}} = append({{var "v"}}, {{ zero}}) - {{var "h"}}.ElemContainerState({{var "j"}}) - {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} - } - } {{end}} {{/* end isArray:56 */}} - {{end}} {{/* end isChan:16 */}} -} else { {{/* len < 0 */}} - {{var "j"}} := 0 - for ; !r.CheckBreak(); {{var "j"}}++ { - {{if isChan }} - {{var "h"}}.ElemContainerState({{var "j"}}) - var {{var "t"}} {{ .Typ }} - {{ $x := printf "%st%s" .TempVar .Rand }}{{ decLineVar $x }} - {{var "v"}} <- {{var "t"}} - {{ else }} - if {{var "j"}} >= len({{var "v"}}) { - {{if isArray }}z.DecArrayCannotExpand(len({{var "v"}}), {{var "j"}}+1) - {{ else }}{{var "v"}} = append({{var "v"}}, {{zero}})// var {{var "z"}} {{ .Typ }} - {{var "c"}} = true {{end}} - } - {{var "h"}}.ElemContainerState({{var "j"}}) - if {{var "j"}} < len({{var "v"}}) { - {{ $x := printf "%[1]vv%[2]v[%[1]vj%[2]v]" .TempVar .Rand }}{{ decLineVar $x }} - } else { - z.DecSwallow() - } - {{end}} - } - {{if isSlice }}if {{var "j"}} < len({{var "v"}}) { - {{var "v"}} = {{var "v"}}[:{{var "j"}}] - {{var "c"}} = true - } else if {{var "j"}} == 0 && {{var "v"}} == nil { - {{var "v"}} = []{{ .Typ }}{} - {{var "c"}} = true - }{{end}} -} -{{var "h"}}.End() -{{if not isArray }}if {{var "c"}} { - *{{ .Varname }} = {{var "v"}} -}{{end}} -` - diff --git a/vendor/github.com/ugorji/go/codec/gen.go b/vendor/github.com/ugorji/go/codec/gen.go deleted file mode 100644 index ac8cc6ddc988..000000000000 --- a/vendor/github.com/ugorji/go/codec/gen.go +++ /dev/null @@ -1,1995 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "bytes" - "encoding/base64" - "errors" - "fmt" - "go/format" - "io" - "io/ioutil" - "math/rand" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "sync" - "text/template" - "time" - "unicode" - "unicode/utf8" -) - -// --------------------------------------------------- -// codecgen supports the full cycle of reflection-based codec: -// - RawExt -// - Builtins -// - Extensions -// - (Binary|Text|JSON)(Unm|M)arshal -// - generic by-kind -// -// This means that, for dynamic things, we MUST use reflection to at least get the reflect.Type. -// In those areas, we try to only do reflection or interface-conversion when NECESSARY: -// - Extensions, only if Extensions are configured. -// -// However, codecgen doesn't support the following: -// - Canonical option. (codecgen IGNORES it currently) -// This is just because it has not been implemented. -// -// During encode/decode, Selfer takes precedence. -// A type implementing Selfer will know how to encode/decode itself statically. -// -// The following field types are supported: -// array: [n]T -// slice: []T -// map: map[K]V -// primitive: [u]int[n], float(32|64), bool, string -// struct -// -// --------------------------------------------------- -// Note that a Selfer cannot call (e|d).(En|De)code on itself, -// as this will cause a circular reference, as (En|De)code will call Selfer methods. -// Any type that implements Selfer must implement completely and not fallback to (En|De)code. -// -// In addition, code in this file manages the generation of fast-path implementations of -// encode/decode of slices/maps of primitive keys/values. -// -// Users MUST re-generate their implementations whenever the code shape changes. -// The generated code will panic if it was generated with a version older than the supporting library. -// --------------------------------------------------- -// -// codec framework is very feature rich. -// When encoding or decoding into an interface, it depends on the runtime type of the interface. -// The type of the interface may be a named type, an extension, etc. -// Consequently, we fallback to runtime codec for encoding/decoding interfaces. -// In addition, we fallback for any value which cannot be guaranteed at runtime. -// This allows us support ANY value, including any named types, specifically those which -// do not implement our interfaces (e.g. Selfer). -// -// This explains some slowness compared to other code generation codecs (e.g. msgp). -// This reduction in speed is only seen when your refers to interfaces, -// e.g. type T struct { A interface{}; B []interface{}; C map[string]interface{} } -// -// codecgen will panic if the file was generated with an old version of the library in use. -// -// Note: -// It was a concious decision to have gen.go always explicitly call EncodeNil or TryDecodeAsNil. -// This way, there isn't a function call overhead just to see that we should not enter a block of code. - -// GenVersion is the current version of codecgen. -// -// NOTE: Increment this value each time codecgen changes fundamentally. -// Fundamental changes are: -// - helper methods change (signature change, new ones added, some removed, etc) -// - codecgen command line changes -// -// v1: Initial Version -// v2: -// v3: Changes for Kubernetes: -// changes in signature of some unpublished helper methods and codecgen cmdline arguments. -// v4: Removed separator support from (en|de)cDriver, and refactored codec(gen) -// v5: changes to support faster json decoding. Let encoder/decoder maintain state of collections. -const GenVersion = 5 - -const ( - genCodecPkg = "codec1978" - genTempVarPfx = "yy" - genTopLevelVarName = "x" - - // ignore canBeNil parameter, and always set to true. - // This is because nil can appear anywhere, so we should always check. - genAnythingCanBeNil = true - - // if genUseOneFunctionForDecStructMap, make a single codecDecodeSelferFromMap function; - // else make codecDecodeSelferFromMap{LenPrefix,CheckBreak} so that conditionals - // are not executed a lot. - // - // From testing, it didn't make much difference in runtime, so keep as true (one function only) - genUseOneFunctionForDecStructMap = true -) - -type genStructMapStyle uint8 - -const ( - genStructMapStyleConsolidated genStructMapStyle = iota - genStructMapStyleLenPrefix - genStructMapStyleCheckBreak -) - -var ( - genAllTypesSamePkgErr = errors.New("All types must be in the same package") - genExpectArrayOrMapErr = errors.New("unexpected type. Expecting array/map/slice") - genBase64enc = base64.NewEncoding("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789__") - genQNameRegex = regexp.MustCompile(`[A-Za-z_.]+`) - genCheckVendor bool -) - -// genRunner holds some state used during a Gen run. -type genRunner struct { - w io.Writer // output - c uint64 // counter used for generating varsfx - t []reflect.Type // list of types to run selfer on - - tc reflect.Type // currently running selfer on this type - te map[uintptr]bool // types for which the encoder has been created - td map[uintptr]bool // types for which the decoder has been created - cp string // codec import path - - im map[string]reflect.Type // imports to add - imn map[string]string // package names of imports to add - imc uint64 // counter for import numbers - - is map[reflect.Type]struct{} // types seen during import search - bp string // base PkgPath, for which we are generating for - - cpfx string // codec package prefix - unsafe bool // is unsafe to be used in generated code? - - tm map[reflect.Type]struct{} // types for which enc/dec must be generated - ts []reflect.Type // types for which enc/dec must be generated - - xs string // top level variable/constant suffix - hn string // fn helper type name - - ti *TypeInfos - // rr *rand.Rand // random generator for file-specific types -} - -// Gen will write a complete go file containing Selfer implementations for each -// type passed. All the types must be in the same package. -// -// Library users: *DO NOT USE IT DIRECTLY. IT WILL CHANGE CONTINOUSLY WITHOUT NOTICE.* -func Gen(w io.Writer, buildTags, pkgName, uid string, useUnsafe bool, ti *TypeInfos, typ ...reflect.Type) { - // trim out all types which already implement Selfer - typ2 := make([]reflect.Type, 0, len(typ)) - for _, t := range typ { - if reflect.PtrTo(t).Implements(selferTyp) || t.Implements(selferTyp) { - continue - } - typ2 = append(typ2, t) - } - typ = typ2 - - if len(typ) == 0 { - return - } - x := genRunner{ - unsafe: useUnsafe, - w: w, - t: typ, - te: make(map[uintptr]bool), - td: make(map[uintptr]bool), - im: make(map[string]reflect.Type), - imn: make(map[string]string), - is: make(map[reflect.Type]struct{}), - tm: make(map[reflect.Type]struct{}), - ts: []reflect.Type{}, - bp: genImportPath(typ[0]), - xs: uid, - ti: ti, - } - if x.ti == nil { - x.ti = defTypeInfos - } - if x.xs == "" { - rr := rand.New(rand.NewSource(time.Now().UnixNano())) - x.xs = strconv.FormatInt(rr.Int63n(9999), 10) - } - - // gather imports first: - x.cp = genImportPath(reflect.TypeOf(x)) - x.imn[x.cp] = genCodecPkg - for _, t := range typ { - // fmt.Printf("###########: PkgPath: '%v', Name: '%s'\n", genImportPath(t), t.Name()) - if genImportPath(t) != x.bp { - panic(genAllTypesSamePkgErr) - } - x.genRefPkgs(t) - } - if buildTags != "" { - x.line("//+build " + buildTags) - x.line("") - } - x.line(` - -// ************************************************************ -// DO NOT EDIT. -// THIS FILE IS AUTO-GENERATED BY codecgen. -// ************************************************************ - -`) - x.line("package " + pkgName) - x.line("") - x.line("import (") - if x.cp != x.bp { - x.cpfx = genCodecPkg + "." - x.linef("%s \"%s\"", genCodecPkg, x.cp) - } - // use a sorted set of im keys, so that we can get consistent output - imKeys := make([]string, 0, len(x.im)) - for k, _ := range x.im { - imKeys = append(imKeys, k) - } - sort.Strings(imKeys) - for _, k := range imKeys { // for k, _ := range x.im { - x.linef("%s \"%s\"", x.imn[k], k) - } - // add required packages - for _, k := range [...]string{"reflect", "unsafe", "runtime", "fmt", "errors"} { - if _, ok := x.im[k]; !ok { - if k == "unsafe" && !x.unsafe { - continue - } - x.line("\"" + k + "\"") - } - } - x.line(")") - x.line("") - - x.line("const (") - x.linef("// ----- content types ----") - x.linef("codecSelferC_UTF8%s = %v", x.xs, int64(c_UTF8)) - x.linef("codecSelferC_RAW%s = %v", x.xs, int64(c_RAW)) - x.linef("// ----- value types used ----") - x.linef("codecSelferValueTypeArray%s = %v", x.xs, int64(valueTypeArray)) - x.linef("codecSelferValueTypeMap%s = %v", x.xs, int64(valueTypeMap)) - x.linef("// ----- containerStateValues ----") - x.linef("codecSelfer_containerMapKey%s = %v", x.xs, int64(containerMapKey)) - x.linef("codecSelfer_containerMapValue%s = %v", x.xs, int64(containerMapValue)) - x.linef("codecSelfer_containerMapEnd%s = %v", x.xs, int64(containerMapEnd)) - x.linef("codecSelfer_containerArrayElem%s = %v", x.xs, int64(containerArrayElem)) - x.linef("codecSelfer_containerArrayEnd%s = %v", x.xs, int64(containerArrayEnd)) - x.line(")") - x.line("var (") - x.line("codecSelferBitsize" + x.xs + " = uint8(reflect.TypeOf(uint(0)).Bits())") - x.line("codecSelferOnlyMapOrArrayEncodeToStructErr" + x.xs + " = errors.New(`only encoded map or array can be decoded into a struct`)") - x.line(")") - x.line("") - - if x.unsafe { - x.line("type codecSelferUnsafeString" + x.xs + " struct { Data uintptr; Len int}") - x.line("") - } - x.hn = "codecSelfer" + x.xs - x.line("type " + x.hn + " struct{}") - x.line("") - - x.varsfxreset() - x.line("func init() {") - x.linef("if %sGenVersion != %v {", x.cpfx, GenVersion) - x.line("_, file, _, _ := runtime.Caller(0)") - x.line(`err := fmt.Errorf("codecgen version mismatch: current: %v, need %v. Re-generate file: %v", `) - x.linef(`%v, %sGenVersion, file)`, GenVersion, x.cpfx) - x.line("panic(err)") - x.linef("}") - x.line("if false { // reference the types, but skip this branch at build/run time") - var n int - // for k, t := range x.im { - for _, k := range imKeys { - t := x.im[k] - x.linef("var v%v %s.%s", n, x.imn[k], t.Name()) - n++ - } - if x.unsafe { - x.linef("var v%v unsafe.Pointer", n) - n++ - } - if n > 0 { - x.out("_") - for i := 1; i < n; i++ { - x.out(", _") - } - x.out(" = v0") - for i := 1; i < n; i++ { - x.outf(", v%v", i) - } - } - x.line("} ") // close if false - x.line("}") // close init - x.line("") - - // generate rest of type info - for _, t := range typ { - x.tc = t - x.selfer(true) - x.selfer(false) - } - - for _, t := range x.ts { - rtid := reflect.ValueOf(t).Pointer() - // generate enc functions for all these slice/map types. - x.varsfxreset() - x.linef("func (x %s) enc%s(v %s%s, e *%sEncoder) {", x.hn, x.genMethodNameT(t), x.arr2str(t, "*"), x.genTypeName(t), x.cpfx) - x.genRequiredMethodVars(true) - switch t.Kind() { - case reflect.Array, reflect.Slice, reflect.Chan: - x.encListFallback("v", t) - case reflect.Map: - x.encMapFallback("v", t) - default: - panic(genExpectArrayOrMapErr) - } - x.line("}") - x.line("") - - // generate dec functions for all these slice/map types. - x.varsfxreset() - x.linef("func (x %s) dec%s(v *%s, d *%sDecoder) {", x.hn, x.genMethodNameT(t), x.genTypeName(t), x.cpfx) - x.genRequiredMethodVars(false) - switch t.Kind() { - case reflect.Array, reflect.Slice, reflect.Chan: - x.decListFallback("v", rtid, t) - case reflect.Map: - x.decMapFallback("v", rtid, t) - default: - panic(genExpectArrayOrMapErr) - } - x.line("}") - x.line("") - } - - x.line("") -} - -func (x *genRunner) checkForSelfer(t reflect.Type, varname string) bool { - // return varname != genTopLevelVarName && t != x.tc - // the only time we checkForSelfer is if we are not at the TOP of the generated code. - return varname != genTopLevelVarName -} - -func (x *genRunner) arr2str(t reflect.Type, s string) string { - if t.Kind() == reflect.Array { - return s - } - return "" -} - -func (x *genRunner) genRequiredMethodVars(encode bool) { - x.line("var h " + x.hn) - if encode { - x.line("z, r := " + x.cpfx + "GenHelperEncoder(e)") - } else { - x.line("z, r := " + x.cpfx + "GenHelperDecoder(d)") - } - x.line("_, _, _ = h, z, r") -} - -func (x *genRunner) genRefPkgs(t reflect.Type) { - if _, ok := x.is[t]; ok { - return - } - // fmt.Printf(">>>>>>: PkgPath: '%v', Name: '%s'\n", genImportPath(t), t.Name()) - x.is[t] = struct{}{} - tpkg, tname := genImportPath(t), t.Name() - if tpkg != "" && tpkg != x.bp && tpkg != x.cp && tname != "" && tname[0] >= 'A' && tname[0] <= 'Z' { - if _, ok := x.im[tpkg]; !ok { - x.im[tpkg] = t - if idx := strings.LastIndex(tpkg, "/"); idx < 0 { - x.imn[tpkg] = tpkg - } else { - x.imc++ - x.imn[tpkg] = "pkg" + strconv.FormatUint(x.imc, 10) + "_" + genGoIdentifier(tpkg[idx+1:], false) - } - } - } - switch t.Kind() { - case reflect.Array, reflect.Slice, reflect.Ptr, reflect.Chan: - x.genRefPkgs(t.Elem()) - case reflect.Map: - x.genRefPkgs(t.Elem()) - x.genRefPkgs(t.Key()) - case reflect.Struct: - for i := 0; i < t.NumField(); i++ { - if fname := t.Field(i).Name; fname != "" && fname[0] >= 'A' && fname[0] <= 'Z' { - x.genRefPkgs(t.Field(i).Type) - } - } - } -} - -func (x *genRunner) line(s string) { - x.out(s) - if len(s) == 0 || s[len(s)-1] != '\n' { - x.out("\n") - } -} - -func (x *genRunner) varsfx() string { - x.c++ - return strconv.FormatUint(x.c, 10) -} - -func (x *genRunner) varsfxreset() { - x.c = 0 -} - -func (x *genRunner) out(s string) { - if _, err := io.WriteString(x.w, s); err != nil { - panic(err) - } -} - -func (x *genRunner) linef(s string, params ...interface{}) { - x.line(fmt.Sprintf(s, params...)) -} - -func (x *genRunner) outf(s string, params ...interface{}) { - x.out(fmt.Sprintf(s, params...)) -} - -func (x *genRunner) genTypeName(t reflect.Type) (n string) { - // defer func() { fmt.Printf(">>>> ####: genTypeName: t: %v, name: '%s'\n", t, n) }() - - // if the type has a PkgPath, which doesn't match the current package, - // then include it. - // We cannot depend on t.String() because it includes current package, - // or t.PkgPath because it includes full import path, - // - var ptrPfx string - for t.Kind() == reflect.Ptr { - ptrPfx += "*" - t = t.Elem() - } - if tn := t.Name(); tn != "" { - return ptrPfx + x.genTypeNamePrim(t) - } - switch t.Kind() { - case reflect.Map: - return ptrPfx + "map[" + x.genTypeName(t.Key()) + "]" + x.genTypeName(t.Elem()) - case reflect.Slice: - return ptrPfx + "[]" + x.genTypeName(t.Elem()) - case reflect.Array: - return ptrPfx + "[" + strconv.FormatInt(int64(t.Len()), 10) + "]" + x.genTypeName(t.Elem()) - case reflect.Chan: - return ptrPfx + t.ChanDir().String() + " " + x.genTypeName(t.Elem()) - default: - if t == intfTyp { - return ptrPfx + "interface{}" - } else { - return ptrPfx + x.genTypeNamePrim(t) - } - } -} - -func (x *genRunner) genTypeNamePrim(t reflect.Type) (n string) { - if t.Name() == "" { - return t.String() - } else if genImportPath(t) == "" || genImportPath(t) == genImportPath(x.tc) { - return t.Name() - } else { - return x.imn[genImportPath(t)] + "." + t.Name() - // return t.String() // best way to get the package name inclusive - } -} - -func (x *genRunner) genZeroValueR(t reflect.Type) string { - // if t is a named type, w - switch t.Kind() { - case reflect.Ptr, reflect.Interface, reflect.Chan, reflect.Func, - reflect.Slice, reflect.Map, reflect.Invalid: - return "nil" - case reflect.Bool: - return "false" - case reflect.String: - return `""` - case reflect.Struct, reflect.Array: - return x.genTypeName(t) + "{}" - default: // all numbers - return "0" - } -} - -func (x *genRunner) genMethodNameT(t reflect.Type) (s string) { - return genMethodNameT(t, x.tc) -} - -func (x *genRunner) selfer(encode bool) { - t := x.tc - t0 := t - // always make decode use a pointer receiver, - // and structs always use a ptr receiver (encode|decode) - isptr := !encode || t.Kind() == reflect.Struct - x.varsfxreset() - fnSigPfx := "func (x " - if isptr { - fnSigPfx += "*" - } - fnSigPfx += x.genTypeName(t) - - x.out(fnSigPfx) - if isptr { - t = reflect.PtrTo(t) - } - if encode { - x.line(") CodecEncodeSelf(e *" + x.cpfx + "Encoder) {") - x.genRequiredMethodVars(true) - // x.enc(genTopLevelVarName, t) - x.encVar(genTopLevelVarName, t) - } else { - x.line(") CodecDecodeSelf(d *" + x.cpfx + "Decoder) {") - x.genRequiredMethodVars(false) - // do not use decVar, as there is no need to check TryDecodeAsNil - // or way to elegantly handle that, and also setting it to a - // non-nil value doesn't affect the pointer passed. - // x.decVar(genTopLevelVarName, t, false) - x.dec(genTopLevelVarName, t0) - } - x.line("}") - x.line("") - - if encode || t0.Kind() != reflect.Struct { - return - } - - // write is containerMap - if genUseOneFunctionForDecStructMap { - x.out(fnSigPfx) - x.line(") codecDecodeSelfFromMap(l int, d *" + x.cpfx + "Decoder) {") - x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleConsolidated) - x.line("}") - x.line("") - } else { - x.out(fnSigPfx) - x.line(") codecDecodeSelfFromMapLenPrefix(l int, d *" + x.cpfx + "Decoder) {") - x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleLenPrefix) - x.line("}") - x.line("") - - x.out(fnSigPfx) - x.line(") codecDecodeSelfFromMapCheckBreak(l int, d *" + x.cpfx + "Decoder) {") - x.genRequiredMethodVars(false) - x.decStructMap(genTopLevelVarName, "l", reflect.ValueOf(t0).Pointer(), t0, genStructMapStyleCheckBreak) - x.line("}") - x.line("") - } - - // write containerArray - x.out(fnSigPfx) - x.line(") codecDecodeSelfFromArray(l int, d *" + x.cpfx + "Decoder) {") - x.genRequiredMethodVars(false) - x.decStructArray(genTopLevelVarName, "l", "return", reflect.ValueOf(t0).Pointer(), t0) - x.line("}") - x.line("") - -} - -// used for chan, array, slice, map -func (x *genRunner) xtraSM(varname string, encode bool, t reflect.Type) { - if encode { - x.linef("h.enc%s((%s%s)(%s), e)", x.genMethodNameT(t), x.arr2str(t, "*"), x.genTypeName(t), varname) - } else { - x.linef("h.dec%s((*%s)(%s), d)", x.genMethodNameT(t), x.genTypeName(t), varname) - } - x.registerXtraT(t) -} - -func (x *genRunner) registerXtraT(t reflect.Type) { - // recursively register the types - if _, ok := x.tm[t]; ok { - return - } - var tkey reflect.Type - switch t.Kind() { - case reflect.Chan, reflect.Slice, reflect.Array: - case reflect.Map: - tkey = t.Key() - default: - return - } - x.tm[t] = struct{}{} - x.ts = append(x.ts, t) - // check if this refers to any xtra types eg. a slice of array: add the array - x.registerXtraT(t.Elem()) - if tkey != nil { - x.registerXtraT(tkey) - } -} - -// encVar will encode a variable. -// The parameter, t, is the reflect.Type of the variable itself -func (x *genRunner) encVar(varname string, t reflect.Type) { - // fmt.Printf(">>>>>> varname: %s, t: %v\n", varname, t) - var checkNil bool - switch t.Kind() { - case reflect.Ptr, reflect.Interface, reflect.Slice, reflect.Map, reflect.Chan: - checkNil = true - } - if checkNil { - x.linef("if %s == nil { r.EncodeNil() } else { ", varname) - } - switch t.Kind() { - case reflect.Ptr: - switch t.Elem().Kind() { - case reflect.Struct, reflect.Array: - x.enc(varname, genNonPtr(t)) - default: - i := x.varsfx() - x.line(genTempVarPfx + i + " := *" + varname) - x.enc(genTempVarPfx+i, genNonPtr(t)) - } - case reflect.Struct, reflect.Array: - i := x.varsfx() - x.line(genTempVarPfx + i + " := &" + varname) - x.enc(genTempVarPfx+i, t) - default: - x.enc(varname, t) - } - - if checkNil { - x.line("}") - } - -} - -// enc will encode a variable (varname) of type t, -// except t is of kind reflect.Struct or reflect.Array, wherein varname is of type ptrTo(T) (to prevent copying) -func (x *genRunner) enc(varname string, t reflect.Type) { - rtid := reflect.ValueOf(t).Pointer() - // We call CodecEncodeSelf if one of the following are honored: - // - the type already implements Selfer, call that - // - the type has a Selfer implementation just created, use that - // - the type is in the list of the ones we will generate for, but it is not currently being generated - - mi := x.varsfx() - tptr := reflect.PtrTo(t) - tk := t.Kind() - if x.checkForSelfer(t, varname) { - if tk == reflect.Array || tk == reflect.Struct { // varname is of type *T - if tptr.Implements(selferTyp) || t.Implements(selferTyp) { - x.line(varname + ".CodecEncodeSelf(e)") - return - } - } else { // varname is of type T - if t.Implements(selferTyp) { - x.line(varname + ".CodecEncodeSelf(e)") - return - } else if tptr.Implements(selferTyp) { - x.linef("%ssf%s := &%s", genTempVarPfx, mi, varname) - x.linef("%ssf%s.CodecEncodeSelf(e)", genTempVarPfx, mi) - return - } - } - - if _, ok := x.te[rtid]; ok { - x.line(varname + ".CodecEncodeSelf(e)") - return - } - } - - inlist := false - for _, t0 := range x.t { - if t == t0 { - inlist = true - if x.checkForSelfer(t, varname) { - x.line(varname + ".CodecEncodeSelf(e)") - return - } - break - } - } - - var rtidAdded bool - if t == x.tc { - x.te[rtid] = true - rtidAdded = true - } - - // check if - // - type is RawExt - // - the type implements (Text|JSON|Binary)(Unm|M)arshal - x.linef("%sm%s := z.EncBinary()", genTempVarPfx, mi) - x.linef("_ = %sm%s", genTempVarPfx, mi) - x.line("if false {") //start if block - defer func() { x.line("}") }() //end if block - - if t == rawExtTyp { - x.linef("} else { r.EncodeRawExt(%v, e)", varname) - return - } - // HACK: Support for Builtins. - // Currently, only Binc supports builtins, and the only builtin type is time.Time. - // Have a method that returns the rtid for time.Time if Handle is Binc. - if t == timeTyp { - vrtid := genTempVarPfx + "m" + x.varsfx() - x.linef("} else if %s := z.TimeRtidIfBinc(); %s != 0 { ", vrtid, vrtid) - x.linef("r.EncodeBuiltin(%s, %s)", vrtid, varname) - } - // only check for extensions if the type is named, and has a packagePath. - if genImportPath(t) != "" && t.Name() != "" { - // first check if extensions are configued, before doing the interface conversion - x.linef("} else if z.HasExtensions() && z.EncExt(%s) {", varname) - } - if tk == reflect.Array || tk == reflect.Struct { // varname is of type *T - if t.Implements(binaryMarshalerTyp) || tptr.Implements(binaryMarshalerTyp) { - x.linef("} else if %sm%s { z.EncBinaryMarshal(%v) ", genTempVarPfx, mi, varname) - } - if t.Implements(jsonMarshalerTyp) || tptr.Implements(jsonMarshalerTyp) { - x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", genTempVarPfx, mi, varname) - } else if t.Implements(textMarshalerTyp) || tptr.Implements(textMarshalerTyp) { - x.linef("} else if !%sm%s { z.EncTextMarshal(%v) ", genTempVarPfx, mi, varname) - } - } else { // varname is of type T - if t.Implements(binaryMarshalerTyp) { - x.linef("} else if %sm%s { z.EncBinaryMarshal(%v) ", genTempVarPfx, mi, varname) - } else if tptr.Implements(binaryMarshalerTyp) { - x.linef("} else if %sm%s { z.EncBinaryMarshal(&%v) ", genTempVarPfx, mi, varname) - } - if t.Implements(jsonMarshalerTyp) { - x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(%v) ", genTempVarPfx, mi, varname) - } else if tptr.Implements(jsonMarshalerTyp) { - x.linef("} else if !%sm%s && z.IsJSONHandle() { z.EncJSONMarshal(&%v) ", genTempVarPfx, mi, varname) - } else if t.Implements(textMarshalerTyp) { - x.linef("} else if !%sm%s { z.EncTextMarshal(%v) ", genTempVarPfx, mi, varname) - } else if tptr.Implements(textMarshalerTyp) { - x.linef("} else if !%sm%s { z.EncTextMarshal(&%v) ", genTempVarPfx, mi, varname) - } - } - x.line("} else {") - - switch t.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - x.line("r.EncodeInt(int64(" + varname + "))") - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - x.line("r.EncodeUint(uint64(" + varname + "))") - case reflect.Float32: - x.line("r.EncodeFloat32(float32(" + varname + "))") - case reflect.Float64: - x.line("r.EncodeFloat64(float64(" + varname + "))") - case reflect.Bool: - x.line("r.EncodeBool(bool(" + varname + "))") - case reflect.String: - x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + ", string(" + varname + "))") - case reflect.Chan: - x.xtraSM(varname, true, t) - // x.encListFallback(varname, rtid, t) - case reflect.Array: - x.xtraSM(varname, true, t) - case reflect.Slice: - // if nil, call dedicated function - // if a []uint8, call dedicated function - // if a known fastpath slice, call dedicated function - // else write encode function in-line. - // - if elements are primitives or Selfers, call dedicated function on each member. - // - else call Encoder.encode(XXX) on it. - if rtid == uint8SliceTypId { - x.line("r.EncodeStringBytes(codecSelferC_RAW" + x.xs + ", []byte(" + varname + "))") - } else if fastpathAV.index(rtid) != -1 { - g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", false, e)") - } else { - x.xtraSM(varname, true, t) - // x.encListFallback(varname, rtid, t) - } - case reflect.Map: - // if nil, call dedicated function - // if a known fastpath map, call dedicated function - // else write encode function in-line. - // - if elements are primitives or Selfers, call dedicated function on each member. - // - else call Encoder.encode(XXX) on it. - // x.line("if " + varname + " == nil { \nr.EncodeNil()\n } else { ") - if fastpathAV.index(rtid) != -1 { - g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Enc", false) + "V(" + varname + ", false, e)") - } else { - x.xtraSM(varname, true, t) - // x.encMapFallback(varname, rtid, t) - } - case reflect.Struct: - if !inlist { - delete(x.te, rtid) - x.line("z.EncFallback(" + varname + ")") - break - } - x.encStruct(varname, rtid, t) - default: - if rtidAdded { - delete(x.te, rtid) - } - x.line("z.EncFallback(" + varname + ")") - } -} - -func (x *genRunner) encZero(t reflect.Type) { - switch t.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - x.line("r.EncodeInt(0)") - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - x.line("r.EncodeUint(0)") - case reflect.Float32: - x.line("r.EncodeFloat32(0)") - case reflect.Float64: - x.line("r.EncodeFloat64(0)") - case reflect.Bool: - x.line("r.EncodeBool(false)") - case reflect.String: - x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + `, "")`) - default: - x.line("r.EncodeNil()") - } -} - -func (x *genRunner) encStruct(varname string, rtid uintptr, t reflect.Type) { - // Use knowledge from structfieldinfo (mbs, encodable fields. Ignore omitempty. ) - // replicate code in kStruct i.e. for each field, deref type to non-pointer, and call x.enc on it - - // if t === type currently running selfer on, do for all - ti := x.ti.get(rtid, t) - i := x.varsfx() - sepVarname := genTempVarPfx + "sep" + i - numfieldsvar := genTempVarPfx + "q" + i - ti2arrayvar := genTempVarPfx + "r" + i - struct2arrvar := genTempVarPfx + "2arr" + i - - x.line(sepVarname + " := !z.EncBinary()") - x.linef("%s := z.EncBasicHandle().StructToArray", struct2arrvar) - tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. - // due to omitEmpty, we need to calculate the - // number of non-empty things we write out first. - // This is required as we need to pre-determine the size of the container, - // to support length-prefixing. - x.linef("var %s [%v]bool", numfieldsvar, len(tisfi)) - x.linef("_, _, _ = %s, %s, %s", sepVarname, numfieldsvar, struct2arrvar) - x.linef("const %s bool = %v", ti2arrayvar, ti.toArray) - nn := 0 - for j, si := range tisfi { - if !si.omitEmpty { - nn++ - continue - } - var t2 reflect.StructField - var omitline string - if si.i != -1 { - t2 = t.Field(int(si.i)) - } else { - t2typ := t - varname3 := varname - for _, ix := range si.is { - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(ix) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - if t2typ.Kind() == reflect.Ptr { - omitline += varname3 + " != nil && " - } - } - } - // never check omitEmpty on a struct type, as it may contain uncomparable map/slice/etc. - // also, for maps/slices/arrays, check if len ! 0 (not if == zero value) - switch t2.Type.Kind() { - case reflect.Struct: - omitline += " true" - case reflect.Map, reflect.Slice, reflect.Array, reflect.Chan: - omitline += "len(" + varname + "." + t2.Name + ") != 0" - default: - omitline += varname + "." + t2.Name + " != " + x.genZeroValueR(t2.Type) - } - x.linef("%s[%v] = %s", numfieldsvar, j, omitline) - } - x.linef("var %snn%s int", genTempVarPfx, i) - x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray { - x.line("r.EncodeArrayStart(" + strconv.FormatInt(int64(len(tisfi)), 10) + ")") - x.linef("} else {") // if not ti.toArray - x.linef("%snn%s = %v", genTempVarPfx, i, nn) - x.linef("for _, b := range %s { if b { %snn%s++ } }", numfieldsvar, genTempVarPfx, i) - x.linef("r.EncodeMapStart(%snn%s)", genTempVarPfx, i) - x.linef("%snn%s = %v", genTempVarPfx, i, 0) - // x.line("r.EncodeMapStart(" + strconv.FormatInt(int64(len(tisfi)), 10) + ")") - x.line("}") // close if not StructToArray - - for j, si := range tisfi { - i := x.varsfx() - isNilVarName := genTempVarPfx + "n" + i - var labelUsed bool - var t2 reflect.StructField - if si.i != -1 { - t2 = t.Field(int(si.i)) - } else { - t2typ := t - varname3 := varname - for _, ix := range si.is { - // fmt.Printf("%%%% %v, ix: %v\n", t2typ, ix) - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(ix) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - if t2typ.Kind() == reflect.Ptr { - if !labelUsed { - x.line("var " + isNilVarName + " bool") - } - x.line("if " + varname3 + " == nil { " + isNilVarName + " = true ") - x.line("goto LABEL" + i) - x.line("}") - labelUsed = true - // "varname3 = new(" + x.genTypeName(t3.Elem()) + ") }") - } - } - // t2 = t.FieldByIndex(si.is) - } - if labelUsed { - x.line("LABEL" + i + ":") - } - // if the type of the field is a Selfer, or one of the ones - - x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray - if labelUsed { - x.line("if " + isNilVarName + " { r.EncodeNil() } else { ") - } - x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) - if si.omitEmpty { - x.linef("if %s[%v] {", numfieldsvar, j) - } - x.encVar(varname+"."+t2.Name, t2.Type) - if si.omitEmpty { - x.linef("} else {") - x.encZero(t2.Type) - x.linef("}") - } - if labelUsed { - x.line("}") - } - - x.linef("} else {") // if not ti.toArray - - if si.omitEmpty { - x.linef("if %s[%v] {", numfieldsvar, j) - } - x.linef("z.EncSendContainerState(codecSelfer_containerMapKey%s)", x.xs) - x.line("r.EncodeString(codecSelferC_UTF8" + x.xs + ", string(\"" + si.encName + "\"))") - x.linef("z.EncSendContainerState(codecSelfer_containerMapValue%s)", x.xs) - if labelUsed { - x.line("if " + isNilVarName + " { r.EncodeNil() } else { ") - x.encVar(varname+"."+t2.Name, t2.Type) - x.line("}") - } else { - x.encVar(varname+"."+t2.Name, t2.Type) - } - if si.omitEmpty { - x.line("}") - } - x.linef("} ") // end if/else ti.toArray - } - x.linef("if %s || %s {", ti2arrayvar, struct2arrvar) // if ti.toArray { - x.linef("z.EncSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) - x.line("} else {") - x.linef("z.EncSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) - x.line("}") - -} - -func (x *genRunner) encListFallback(varname string, t reflect.Type) { - i := x.varsfx() - g := genTempVarPfx - x.line("r.EncodeArrayStart(len(" + varname + "))") - if t.Kind() == reflect.Chan { - x.linef("for %si%s, %si2%s := 0, len(%s); %si%s < %si2%s; %si%s++ {", g, i, g, i, varname, g, i, g, i, g, i) - x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) - x.linef("%sv%s := <-%s", g, i, varname) - } else { - // x.linef("for %si%s, %sv%s := range %s {", genTempVarPfx, i, genTempVarPfx, i, varname) - x.linef("for _, %sv%s := range %s {", genTempVarPfx, i, varname) - x.linef("z.EncSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) - } - x.encVar(genTempVarPfx+"v"+i, t.Elem()) - x.line("}") - x.linef("z.EncSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) -} - -func (x *genRunner) encMapFallback(varname string, t reflect.Type) { - // TODO: expand this to handle canonical. - i := x.varsfx() - x.line("r.EncodeMapStart(len(" + varname + "))") - x.linef("for %sk%s, %sv%s := range %s {", genTempVarPfx, i, genTempVarPfx, i, varname) - // x.line("for " + genTempVarPfx + "k" + i + ", " + genTempVarPfx + "v" + i + " := range " + varname + " {") - x.linef("z.EncSendContainerState(codecSelfer_containerMapKey%s)", x.xs) - x.encVar(genTempVarPfx+"k"+i, t.Key()) - x.linef("z.EncSendContainerState(codecSelfer_containerMapValue%s)", x.xs) - x.encVar(genTempVarPfx+"v"+i, t.Elem()) - x.line("}") - x.linef("z.EncSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) -} - -func (x *genRunner) decVar(varname string, t reflect.Type, canBeNil bool) { - // We only encode as nil if a nillable value. - // This removes some of the wasted checks for TryDecodeAsNil. - // We need to think about this more, to see what happens if omitempty, etc - // cause a nil value to be stored when something is expected. - // This could happen when decoding from a struct encoded as an array. - // For that, decVar should be called with canNil=true, to force true as its value. - i := x.varsfx() - if !canBeNil { - canBeNil = genAnythingCanBeNil || !genIsImmutable(t) - } - if canBeNil { - x.line("if r.TryDecodeAsNil() {") - if t.Kind() == reflect.Ptr { - x.line("if " + varname + " != nil { ") - - // if varname is a field of a struct (has a dot in it), - // then just set it to nil - if strings.IndexByte(varname, '.') != -1 { - x.line(varname + " = nil") - } else { - x.line("*" + varname + " = " + x.genZeroValueR(t.Elem())) - } - x.line("}") - } else { - x.line(varname + " = " + x.genZeroValueR(t)) - } - x.line("} else {") - } else { - x.line("// cannot be nil") - } - if t.Kind() != reflect.Ptr { - if x.decTryAssignPrimitive(varname, t) { - x.line(genTempVarPfx + "v" + i + " := &" + varname) - x.dec(genTempVarPfx+"v"+i, t) - } - } else { - x.linef("if %s == nil { %s = new(%s) }", varname, varname, x.genTypeName(t.Elem())) - // Ensure we set underlying ptr to a non-nil value (so we can deref to it later). - // There's a chance of a **T in here which is nil. - var ptrPfx string - for t = t.Elem(); t.Kind() == reflect.Ptr; t = t.Elem() { - ptrPfx += "*" - x.linef("if %s%s == nil { %s%s = new(%s)}", - ptrPfx, varname, ptrPfx, varname, x.genTypeName(t)) - } - // if varname has [ in it, then create temp variable for this ptr thingie - if strings.Index(varname, "[") >= 0 { - varname2 := genTempVarPfx + "w" + i - x.line(varname2 + " := " + varname) - varname = varname2 - } - - if ptrPfx == "" { - x.dec(varname, t) - } else { - x.line(genTempVarPfx + "z" + i + " := " + ptrPfx + varname) - x.dec(genTempVarPfx+"z"+i, t) - } - - } - - if canBeNil { - x.line("} ") - } -} - -// dec will decode a variable (varname) of type ptrTo(t). -// t is always a basetype (i.e. not of kind reflect.Ptr). -func (x *genRunner) dec(varname string, t reflect.Type) { - // assumptions: - // - the varname is to a pointer already. No need to take address of it - // - t is always a baseType T (not a *T, etc). - rtid := reflect.ValueOf(t).Pointer() - tptr := reflect.PtrTo(t) - if x.checkForSelfer(t, varname) { - if t.Implements(selferTyp) || tptr.Implements(selferTyp) { - x.line(varname + ".CodecDecodeSelf(d)") - return - } - if _, ok := x.td[rtid]; ok { - x.line(varname + ".CodecDecodeSelf(d)") - return - } - } - - inlist := false - for _, t0 := range x.t { - if t == t0 { - inlist = true - if x.checkForSelfer(t, varname) { - x.line(varname + ".CodecDecodeSelf(d)") - return - } - break - } - } - - var rtidAdded bool - if t == x.tc { - x.td[rtid] = true - rtidAdded = true - } - - // check if - // - type is RawExt - // - the type implements (Text|JSON|Binary)(Unm|M)arshal - mi := x.varsfx() - x.linef("%sm%s := z.DecBinary()", genTempVarPfx, mi) - x.linef("_ = %sm%s", genTempVarPfx, mi) - x.line("if false {") //start if block - defer func() { x.line("}") }() //end if block - - if t == rawExtTyp { - x.linef("} else { r.DecodeExt(%v, 0, nil)", varname) - return - } - - // HACK: Support for Builtins. - // Currently, only Binc supports builtins, and the only builtin type is time.Time. - // Have a method that returns the rtid for time.Time if Handle is Binc. - if t == timeTyp { - vrtid := genTempVarPfx + "m" + x.varsfx() - x.linef("} else if %s := z.TimeRtidIfBinc(); %s != 0 { ", vrtid, vrtid) - x.linef("r.DecodeBuiltin(%s, %s)", vrtid, varname) - } - // only check for extensions if the type is named, and has a packagePath. - if genImportPath(t) != "" && t.Name() != "" { - // first check if extensions are configued, before doing the interface conversion - x.linef("} else if z.HasExtensions() && z.DecExt(%s) {", varname) - } - - if t.Implements(binaryUnmarshalerTyp) || tptr.Implements(binaryUnmarshalerTyp) { - x.linef("} else if %sm%s { z.DecBinaryUnmarshal(%v) ", genTempVarPfx, mi, varname) - } - if t.Implements(jsonUnmarshalerTyp) || tptr.Implements(jsonUnmarshalerTyp) { - x.linef("} else if !%sm%s && z.IsJSONHandle() { z.DecJSONUnmarshal(%v)", genTempVarPfx, mi, varname) - } else if t.Implements(textUnmarshalerTyp) || tptr.Implements(textUnmarshalerTyp) { - x.linef("} else if !%sm%s { z.DecTextUnmarshal(%v)", genTempVarPfx, mi, varname) - } - - x.line("} else {") - - // Since these are pointers, we cannot share, and have to use them one by one - switch t.Kind() { - case reflect.Int: - x.line("*((*int)(" + varname + ")) = int(r.DecodeInt(codecSelferBitsize" + x.xs + "))") - // x.line("z.DecInt((*int)(" + varname + "))") - case reflect.Int8: - x.line("*((*int8)(" + varname + ")) = int8(r.DecodeInt(8))") - // x.line("z.DecInt8((*int8)(" + varname + "))") - case reflect.Int16: - x.line("*((*int16)(" + varname + ")) = int16(r.DecodeInt(16))") - // x.line("z.DecInt16((*int16)(" + varname + "))") - case reflect.Int32: - x.line("*((*int32)(" + varname + ")) = int32(r.DecodeInt(32))") - // x.line("z.DecInt32((*int32)(" + varname + "))") - case reflect.Int64: - x.line("*((*int64)(" + varname + ")) = int64(r.DecodeInt(64))") - // x.line("z.DecInt64((*int64)(" + varname + "))") - - case reflect.Uint: - x.line("*((*uint)(" + varname + ")) = uint(r.DecodeUint(codecSelferBitsize" + x.xs + "))") - // x.line("z.DecUint((*uint)(" + varname + "))") - case reflect.Uint8: - x.line("*((*uint8)(" + varname + ")) = uint8(r.DecodeUint(8))") - // x.line("z.DecUint8((*uint8)(" + varname + "))") - case reflect.Uint16: - x.line("*((*uint16)(" + varname + ")) = uint16(r.DecodeUint(16))") - //x.line("z.DecUint16((*uint16)(" + varname + "))") - case reflect.Uint32: - x.line("*((*uint32)(" + varname + ")) = uint32(r.DecodeUint(32))") - //x.line("z.DecUint32((*uint32)(" + varname + "))") - case reflect.Uint64: - x.line("*((*uint64)(" + varname + ")) = uint64(r.DecodeUint(64))") - //x.line("z.DecUint64((*uint64)(" + varname + "))") - case reflect.Uintptr: - x.line("*((*uintptr)(" + varname + ")) = uintptr(r.DecodeUint(codecSelferBitsize" + x.xs + "))") - - case reflect.Float32: - x.line("*((*float32)(" + varname + ")) = float32(r.DecodeFloat(true))") - //x.line("z.DecFloat32((*float32)(" + varname + "))") - case reflect.Float64: - x.line("*((*float64)(" + varname + ")) = float64(r.DecodeFloat(false))") - // x.line("z.DecFloat64((*float64)(" + varname + "))") - - case reflect.Bool: - x.line("*((*bool)(" + varname + ")) = r.DecodeBool()") - // x.line("z.DecBool((*bool)(" + varname + "))") - case reflect.String: - x.line("*((*string)(" + varname + ")) = r.DecodeString()") - // x.line("z.DecString((*string)(" + varname + "))") - case reflect.Array, reflect.Chan: - x.xtraSM(varname, false, t) - // x.decListFallback(varname, rtid, true, t) - case reflect.Slice: - // if a []uint8, call dedicated function - // if a known fastpath slice, call dedicated function - // else write encode function in-line. - // - if elements are primitives or Selfers, call dedicated function on each member. - // - else call Encoder.encode(XXX) on it. - if rtid == uint8SliceTypId { - x.line("*" + varname + " = r.DecodeBytes(*(*[]byte)(" + varname + "), false, false)") - } else if fastpathAV.index(rtid) != -1 { - g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Dec", false) + "X(" + varname + ", false, d)") - } else { - x.xtraSM(varname, false, t) - // x.decListFallback(varname, rtid, false, t) - } - case reflect.Map: - // if a known fastpath map, call dedicated function - // else write encode function in-line. - // - if elements are primitives or Selfers, call dedicated function on each member. - // - else call Encoder.encode(XXX) on it. - if fastpathAV.index(rtid) != -1 { - g := x.newGenV(t) - x.line("z.F." + g.MethodNamePfx("Dec", false) + "X(" + varname + ", false, d)") - } else { - x.xtraSM(varname, false, t) - // x.decMapFallback(varname, rtid, t) - } - case reflect.Struct: - if inlist { - x.decStruct(varname, rtid, t) - } else { - // delete(x.td, rtid) - x.line("z.DecFallback(" + varname + ", false)") - } - default: - if rtidAdded { - delete(x.te, rtid) - } - x.line("z.DecFallback(" + varname + ", true)") - } -} - -func (x *genRunner) decTryAssignPrimitive(varname string, t reflect.Type) (tryAsPtr bool) { - // This should only be used for exact primitives (ie un-named types). - // Named types may be implementations of Selfer, Unmarshaler, etc. - // They should be handled by dec(...) - - if t.Name() != "" { - tryAsPtr = true - return - } - - switch t.Kind() { - case reflect.Int: - x.linef("%s = r.DecodeInt(codecSelferBitsize%s)", varname, x.xs) - case reflect.Int8: - x.linef("%s = r.DecodeInt(8)", varname) - case reflect.Int16: - x.linef("%s = r.DecodeInt(16)", varname) - case reflect.Int32: - x.linef("%s = r.DecodeInt(32)", varname) - case reflect.Int64: - x.linef("%s = r.DecodeInt(64)", varname) - - case reflect.Uint: - x.linef("%s = r.DecodeUint(codecSelferBitsize%s)", varname, x.xs) - case reflect.Uint8: - x.linef("%s = r.DecodeUint(8)", varname) - case reflect.Uint16: - x.linef("%s = r.DecodeUint(16)", varname) - case reflect.Uint32: - x.linef("%s = r.DecodeUint(32)", varname) - case reflect.Uint64: - x.linef("%s = r.DecodeUint(64)", varname) - case reflect.Uintptr: - x.linef("%s = r.DecodeUint(codecSelferBitsize%s)", varname, x.xs) - - case reflect.Float32: - x.linef("%s = r.DecodeFloat(true)", varname) - case reflect.Float64: - x.linef("%s = r.DecodeFloat(false)", varname) - - case reflect.Bool: - x.linef("%s = r.DecodeBool()", varname) - case reflect.String: - x.linef("%s = r.DecodeString()", varname) - default: - tryAsPtr = true - } - return -} - -func (x *genRunner) decListFallback(varname string, rtid uintptr, t reflect.Type) { - type tstruc struct { - TempVar string - Rand string - Varname string - CTyp string - Typ string - Immutable bool - Size int - } - telem := t.Elem() - ts := tstruc{genTempVarPfx, x.varsfx(), varname, x.genTypeName(t), x.genTypeName(telem), genIsImmutable(telem), int(telem.Size())} - - funcs := make(template.FuncMap) - - funcs["decLineVar"] = func(varname string) string { - x.decVar(varname, telem, false) - return "" - } - funcs["decLine"] = func(pfx string) string { - x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(telem), false) - return "" - } - funcs["var"] = func(s string) string { - return ts.TempVar + s + ts.Rand - } - funcs["zero"] = func() string { - return x.genZeroValueR(telem) - } - funcs["isArray"] = func() bool { - return t.Kind() == reflect.Array - } - funcs["isSlice"] = func() bool { - return t.Kind() == reflect.Slice - } - funcs["isChan"] = func() bool { - return t.Kind() == reflect.Chan - } - tm, err := template.New("").Funcs(funcs).Parse(genDecListTmpl) - if err != nil { - panic(err) - } - if err = tm.Execute(x.w, &ts); err != nil { - panic(err) - } -} - -func (x *genRunner) decMapFallback(varname string, rtid uintptr, t reflect.Type) { - type tstruc struct { - TempVar string - Sfx string - Rand string - Varname string - KTyp string - Typ string - Size int - } - telem := t.Elem() - tkey := t.Key() - ts := tstruc{ - genTempVarPfx, x.xs, x.varsfx(), varname, x.genTypeName(tkey), - x.genTypeName(telem), int(telem.Size() + tkey.Size()), - } - - funcs := make(template.FuncMap) - funcs["decElemZero"] = func() string { - return x.genZeroValueR(telem) - } - funcs["decElemKindImmutable"] = func() bool { - return genIsImmutable(telem) - } - funcs["decElemKindPtr"] = func() bool { - return telem.Kind() == reflect.Ptr - } - funcs["decElemKindIntf"] = func() bool { - return telem.Kind() == reflect.Interface - } - funcs["decLineVarK"] = func(varname string) string { - x.decVar(varname, tkey, false) - return "" - } - funcs["decLineVar"] = func(varname string) string { - x.decVar(varname, telem, false) - return "" - } - funcs["decLineK"] = func(pfx string) string { - x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(tkey), false) - return "" - } - funcs["decLine"] = func(pfx string) string { - x.decVar(ts.TempVar+pfx+ts.Rand, reflect.PtrTo(telem), false) - return "" - } - funcs["var"] = func(s string) string { - return ts.TempVar + s + ts.Rand - } - - tm, err := template.New("").Funcs(funcs).Parse(genDecMapTmpl) - if err != nil { - panic(err) - } - if err = tm.Execute(x.w, &ts); err != nil { - panic(err) - } -} - -func (x *genRunner) decStructMapSwitch(kName string, varname string, rtid uintptr, t reflect.Type) { - ti := x.ti.get(rtid, t) - tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. - x.line("switch (" + kName + ") {") - for _, si := range tisfi { - x.line("case \"" + si.encName + "\":") - var t2 reflect.StructField - if si.i != -1 { - t2 = t.Field(int(si.i)) - } else { - //we must accomodate anonymous fields, where the embedded field is a nil pointer in the value. - // t2 = t.FieldByIndex(si.is) - t2typ := t - varname3 := varname - for _, ix := range si.is { - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(ix) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - if t2typ.Kind() == reflect.Ptr { - x.linef("if %s == nil { %s = new(%s) }", varname3, varname3, x.genTypeName(t2typ.Elem())) - } - } - } - x.decVar(varname+"."+t2.Name, t2.Type, false) - } - x.line("default:") - // pass the slice here, so that the string will not escape, and maybe save allocation - x.line("z.DecStructFieldNotFound(-1, " + kName + ")") - x.line("} // end switch " + kName) -} - -func (x *genRunner) decStructMap(varname, lenvarname string, rtid uintptr, t reflect.Type, style genStructMapStyle) { - tpfx := genTempVarPfx - i := x.varsfx() - kName := tpfx + "s" + i - - // We thought to use ReadStringAsBytes, as go compiler might optimize the copy out. - // However, using that was more expensive, as it seems that the switch expression - // is evaluated each time. - // - // We could depend on decodeString using a temporary/shared buffer internally. - // However, this model of creating a byte array, and using explicitly is faster, - // and allows optional use of unsafe []byte->string conversion without alloc. - - // Also, ensure that the slice array doesn't escape. - // That will help escape analysis prevent allocation when it gets better. - - // x.line("var " + kName + "Arr = [32]byte{} // default string to decode into") - // x.line("var " + kName + "Slc = " + kName + "Arr[:] // default slice to decode into") - // use the scratch buffer to avoid allocation (most field names are < 32). - - x.line("var " + kName + "Slc = z.DecScratchBuffer() // default slice to decode into") - - x.line("_ = " + kName + "Slc") - switch style { - case genStructMapStyleLenPrefix: - x.linef("for %sj%s := 0; %sj%s < %s; %sj%s++ {", tpfx, i, tpfx, i, lenvarname, tpfx, i) - case genStructMapStyleCheckBreak: - x.linef("for %sj%s := 0; !r.CheckBreak(); %sj%s++ {", tpfx, i, tpfx, i) - default: // 0, otherwise. - x.linef("var %shl%s bool = %s >= 0", tpfx, i, lenvarname) // has length - x.linef("for %sj%s := 0; ; %sj%s++ {", tpfx, i, tpfx, i) - x.linef("if %shl%s { if %sj%s >= %s { break }", tpfx, i, tpfx, i, lenvarname) - x.line("} else { if r.CheckBreak() { break }; }") - } - x.linef("z.DecSendContainerState(codecSelfer_containerMapKey%s)", x.xs) - x.line(kName + "Slc = r.DecodeBytes(" + kName + "Slc, true, true)") - // let string be scoped to this loop alone, so it doesn't escape. - if x.unsafe { - x.line(kName + "SlcHdr := codecSelferUnsafeString" + x.xs + "{uintptr(unsafe.Pointer(&" + - kName + "Slc[0])), len(" + kName + "Slc)}") - x.line(kName + " := *(*string)(unsafe.Pointer(&" + kName + "SlcHdr))") - } else { - x.line(kName + " := string(" + kName + "Slc)") - } - x.linef("z.DecSendContainerState(codecSelfer_containerMapValue%s)", x.xs) - x.decStructMapSwitch(kName, varname, rtid, t) - - x.line("} // end for " + tpfx + "j" + i) - x.linef("z.DecSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) -} - -func (x *genRunner) decStructArray(varname, lenvarname, breakString string, rtid uintptr, t reflect.Type) { - tpfx := genTempVarPfx - i := x.varsfx() - ti := x.ti.get(rtid, t) - tisfi := ti.sfip // always use sequence from file. decStruct expects same thing. - x.linef("var %sj%s int", tpfx, i) - x.linef("var %sb%s bool", tpfx, i) // break - x.linef("var %shl%s bool = %s >= 0", tpfx, i, lenvarname) // has length - for _, si := range tisfi { - var t2 reflect.StructField - if si.i != -1 { - t2 = t.Field(int(si.i)) - } else { - //we must accomodate anonymous fields, where the embedded field is a nil pointer in the value. - // t2 = t.FieldByIndex(si.is) - t2typ := t - varname3 := varname - for _, ix := range si.is { - for t2typ.Kind() == reflect.Ptr { - t2typ = t2typ.Elem() - } - t2 = t2typ.Field(ix) - t2typ = t2.Type - varname3 = varname3 + "." + t2.Name - if t2typ.Kind() == reflect.Ptr { - x.linef("if %s == nil { %s = new(%s) }", varname3, varname3, x.genTypeName(t2typ.Elem())) - } - } - } - - x.linef("%sj%s++; if %shl%s { %sb%s = %sj%s > %s } else { %sb%s = r.CheckBreak() }", - tpfx, i, tpfx, i, tpfx, i, - tpfx, i, lenvarname, tpfx, i) - x.linef("if %sb%s { z.DecSendContainerState(codecSelfer_containerArrayEnd%s); %s }", - tpfx, i, x.xs, breakString) - x.linef("z.DecSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) - x.decVar(varname+"."+t2.Name, t2.Type, true) - } - // read remaining values and throw away. - x.line("for {") - x.linef("%sj%s++; if %shl%s { %sb%s = %sj%s > %s } else { %sb%s = r.CheckBreak() }", - tpfx, i, tpfx, i, tpfx, i, - tpfx, i, lenvarname, tpfx, i) - x.linef("if %sb%s { break }", tpfx, i) - x.linef("z.DecSendContainerState(codecSelfer_containerArrayElem%s)", x.xs) - x.linef(`z.DecStructFieldNotFound(%sj%s - 1, "")`, tpfx, i) - x.line("}") - x.linef("z.DecSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) -} - -func (x *genRunner) decStruct(varname string, rtid uintptr, t reflect.Type) { - // if container is map - i := x.varsfx() - x.linef("%sct%s := r.ContainerType()", genTempVarPfx, i) - x.linef("if %sct%s == codecSelferValueTypeMap%s {", genTempVarPfx, i, x.xs) - x.line(genTempVarPfx + "l" + i + " := r.ReadMapStart()") - x.linef("if %sl%s == 0 {", genTempVarPfx, i) - x.linef("z.DecSendContainerState(codecSelfer_containerMapEnd%s)", x.xs) - if genUseOneFunctionForDecStructMap { - x.line("} else { ") - x.linef("x.codecDecodeSelfFromMap(%sl%s, d)", genTempVarPfx, i) - } else { - x.line("} else if " + genTempVarPfx + "l" + i + " > 0 { ") - x.line("x.codecDecodeSelfFromMapLenPrefix(" + genTempVarPfx + "l" + i + ", d)") - x.line("} else {") - x.line("x.codecDecodeSelfFromMapCheckBreak(" + genTempVarPfx + "l" + i + ", d)") - } - x.line("}") - - // else if container is array - x.linef("} else if %sct%s == codecSelferValueTypeArray%s {", genTempVarPfx, i, x.xs) - x.line(genTempVarPfx + "l" + i + " := r.ReadArrayStart()") - x.linef("if %sl%s == 0 {", genTempVarPfx, i) - x.linef("z.DecSendContainerState(codecSelfer_containerArrayEnd%s)", x.xs) - x.line("} else { ") - x.linef("x.codecDecodeSelfFromArray(%sl%s, d)", genTempVarPfx, i) - x.line("}") - // else panic - x.line("} else { ") - x.line("panic(codecSelferOnlyMapOrArrayEncodeToStructErr" + x.xs + ")") - x.line("} ") -} - -// -------- - -type genV struct { - // genV is either a primitive (Primitive != "") or a map (MapKey != "") or a slice - MapKey string - Elem string - Primitive string - Size int -} - -func (x *genRunner) newGenV(t reflect.Type) (v genV) { - switch t.Kind() { - case reflect.Slice, reflect.Array: - te := t.Elem() - v.Elem = x.genTypeName(te) - v.Size = int(te.Size()) - case reflect.Map: - te, tk := t.Elem(), t.Key() - v.Elem = x.genTypeName(te) - v.MapKey = x.genTypeName(tk) - v.Size = int(te.Size() + tk.Size()) - default: - panic("unexpected type for newGenV. Requires map or slice type") - } - return -} - -func (x *genV) MethodNamePfx(prefix string, prim bool) string { - var name []byte - if prefix != "" { - name = append(name, prefix...) - } - if prim { - name = append(name, genTitleCaseName(x.Primitive)...) - } else { - if x.MapKey == "" { - name = append(name, "Slice"...) - } else { - name = append(name, "Map"...) - name = append(name, genTitleCaseName(x.MapKey)...) - } - name = append(name, genTitleCaseName(x.Elem)...) - } - return string(name) - -} - -// genImportPath returns import path of a non-predeclared named typed, or an empty string otherwise. -// -// This handles the misbehaviour that occurs when 1.5-style vendoring is enabled, -// where PkgPath returns the full path, including the vendoring pre-fix that should have been stripped. -// We strip it here. -func genImportPath(t reflect.Type) (s string) { - s = t.PkgPath() - if genCheckVendor { - // HACK: Misbehaviour occurs in go 1.5. May have to re-visit this later. - // if s contains /vendor/ OR startsWith vendor/, then return everything after it. - const vendorStart = "vendor/" - const vendorInline = "/vendor/" - if i := strings.LastIndex(s, vendorInline); i >= 0 { - s = s[i+len(vendorInline):] - } else if strings.HasPrefix(s, vendorStart) { - s = s[len(vendorStart):] - } - } - return -} - -// A go identifier is (letter|_)[letter|number|_]* -func genGoIdentifier(s string, checkFirstChar bool) string { - b := make([]byte, 0, len(s)) - t := make([]byte, 4) - var n int - for i, r := range s { - if checkFirstChar && i == 0 && !unicode.IsLetter(r) { - b = append(b, '_') - } - // r must be unicode_letter, unicode_digit or _ - if unicode.IsLetter(r) || unicode.IsDigit(r) { - n = utf8.EncodeRune(t, r) - b = append(b, t[:n]...) - } else { - b = append(b, '_') - } - } - return string(b) -} - -func genNonPtr(t reflect.Type) reflect.Type { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t -} - -func genTitleCaseName(s string) string { - switch s { - case "interface{}", "interface {}": - return "Intf" - default: - return strings.ToUpper(s[0:1]) + s[1:] - } -} - -func genMethodNameT(t reflect.Type, tRef reflect.Type) (n string) { - var ptrPfx string - for t.Kind() == reflect.Ptr { - ptrPfx += "Ptrto" - t = t.Elem() - } - tstr := t.String() - if tn := t.Name(); tn != "" { - if tRef != nil && genImportPath(t) == genImportPath(tRef) { - return ptrPfx + tn - } else { - if genQNameRegex.MatchString(tstr) { - return ptrPfx + strings.Replace(tstr, ".", "_", 1000) - } else { - return ptrPfx + genCustomTypeName(tstr) - } - } - } - switch t.Kind() { - case reflect.Map: - return ptrPfx + "Map" + genMethodNameT(t.Key(), tRef) + genMethodNameT(t.Elem(), tRef) - case reflect.Slice: - return ptrPfx + "Slice" + genMethodNameT(t.Elem(), tRef) - case reflect.Array: - return ptrPfx + "Array" + strconv.FormatInt(int64(t.Len()), 10) + genMethodNameT(t.Elem(), tRef) - case reflect.Chan: - var cx string - switch t.ChanDir() { - case reflect.SendDir: - cx = "ChanSend" - case reflect.RecvDir: - cx = "ChanRecv" - default: - cx = "Chan" - } - return ptrPfx + cx + genMethodNameT(t.Elem(), tRef) - default: - if t == intfTyp { - return ptrPfx + "Interface" - } else { - if tRef != nil && genImportPath(t) == genImportPath(tRef) { - if t.Name() != "" { - return ptrPfx + t.Name() - } else { - return ptrPfx + genCustomTypeName(tstr) - } - } else { - // best way to get the package name inclusive - // return ptrPfx + strings.Replace(tstr, ".", "_", 1000) - // return ptrPfx + genBase64enc.EncodeToString([]byte(tstr)) - if t.Name() != "" && genQNameRegex.MatchString(tstr) { - return ptrPfx + strings.Replace(tstr, ".", "_", 1000) - } else { - return ptrPfx + genCustomTypeName(tstr) - } - } - } - } -} - -// genCustomNameForType base64encodes the t.String() value in such a way -// that it can be used within a function name. -func genCustomTypeName(tstr string) string { - len2 := genBase64enc.EncodedLen(len(tstr)) - bufx := make([]byte, len2) - genBase64enc.Encode(bufx, []byte(tstr)) - for i := len2 - 1; i >= 0; i-- { - if bufx[i] == '=' { - len2-- - } else { - break - } - } - return string(bufx[:len2]) -} - -func genIsImmutable(t reflect.Type) (v bool) { - return isImmutableKind(t.Kind()) -} - -type genInternal struct { - Values []genV - Unsafe bool -} - -func (x genInternal) FastpathLen() (l int) { - for _, v := range x.Values { - if v.Primitive == "" { - l++ - } - } - return -} - -func genInternalZeroValue(s string) string { - switch s { - case "interface{}", "interface {}": - return "nil" - case "bool": - return "false" - case "string": - return `""` - default: - return "0" - } -} - -func genInternalEncCommandAsString(s string, vname string) string { - switch s { - case "uint", "uint8", "uint16", "uint32", "uint64": - return "ee.EncodeUint(uint64(" + vname + "))" - case "int", "int8", "int16", "int32", "int64": - return "ee.EncodeInt(int64(" + vname + "))" - case "string": - return "ee.EncodeString(c_UTF8, " + vname + ")" - case "float32": - return "ee.EncodeFloat32(" + vname + ")" - case "float64": - return "ee.EncodeFloat64(" + vname + ")" - case "bool": - return "ee.EncodeBool(" + vname + ")" - case "symbol": - return "ee.EncodeSymbol(" + vname + ")" - default: - return "e.encode(" + vname + ")" - } -} - -func genInternalDecCommandAsString(s string) string { - switch s { - case "uint": - return "uint(dd.DecodeUint(uintBitsize))" - case "uint8": - return "uint8(dd.DecodeUint(8))" - case "uint16": - return "uint16(dd.DecodeUint(16))" - case "uint32": - return "uint32(dd.DecodeUint(32))" - case "uint64": - return "dd.DecodeUint(64)" - case "uintptr": - return "uintptr(dd.DecodeUint(uintBitsize))" - case "int": - return "int(dd.DecodeInt(intBitsize))" - case "int8": - return "int8(dd.DecodeInt(8))" - case "int16": - return "int16(dd.DecodeInt(16))" - case "int32": - return "int32(dd.DecodeInt(32))" - case "int64": - return "dd.DecodeInt(64)" - - case "string": - return "dd.DecodeString()" - case "float32": - return "float32(dd.DecodeFloat(true))" - case "float64": - return "dd.DecodeFloat(false)" - case "bool": - return "dd.DecodeBool()" - default: - panic(errors.New("gen internal: unknown type for decode: " + s)) - } -} - -func genInternalSortType(s string, elem bool) string { - for _, v := range [...]string{"int", "uint", "float", "bool", "string"} { - if strings.HasPrefix(s, v) { - if elem { - if v == "int" || v == "uint" || v == "float" { - return v + "64" - } else { - return v - } - } - return v + "Slice" - } - } - panic("sorttype: unexpected type: " + s) -} - -// var genInternalMu sync.Mutex -var genInternalV genInternal -var genInternalTmplFuncs template.FuncMap -var genInternalOnce sync.Once - -func genInternalInit() { - types := [...]string{ - "interface{}", - "string", - "float32", - "float64", - "uint", - "uint8", - "uint16", - "uint32", - "uint64", - "uintptr", - "int", - "int8", - "int16", - "int32", - "int64", - "bool", - } - // keep as slice, so it is in specific iteration order. - // Initial order was uint64, string, interface{}, int, int64 - mapvaltypes := [...]string{ - "interface{}", - "string", - "uint", - "uint8", - "uint16", - "uint32", - "uint64", - "uintptr", - "int", - "int8", - "int16", - "int32", - "int64", - "float32", - "float64", - "bool", - } - wordSizeBytes := int(intBitsize) / 8 - - mapvaltypes2 := map[string]int{ - "interface{}": 2 * wordSizeBytes, - "string": 2 * wordSizeBytes, - "uint": 1 * wordSizeBytes, - "uint8": 1, - "uint16": 2, - "uint32": 4, - "uint64": 8, - "uintptr": 1 * wordSizeBytes, - "int": 1 * wordSizeBytes, - "int8": 1, - "int16": 2, - "int32": 4, - "int64": 8, - "float32": 4, - "float64": 8, - "bool": 1, - } - var gt genInternal - - // For each slice or map type, there must be a (symetrical) Encode and Decode fast-path function - for _, s := range types { - gt.Values = append(gt.Values, genV{Primitive: s, Size: mapvaltypes2[s]}) - if s != "uint8" { // do not generate fast path for slice of bytes. Treat specially already. - gt.Values = append(gt.Values, genV{Elem: s, Size: mapvaltypes2[s]}) - } - if _, ok := mapvaltypes2[s]; !ok { - gt.Values = append(gt.Values, genV{MapKey: s, Elem: s, Size: 2 * mapvaltypes2[s]}) - } - for _, ms := range mapvaltypes { - gt.Values = append(gt.Values, genV{MapKey: s, Elem: ms, Size: mapvaltypes2[s] + mapvaltypes2[ms]}) - } - } - - funcs := make(template.FuncMap) - // funcs["haspfx"] = strings.HasPrefix - funcs["encmd"] = genInternalEncCommandAsString - funcs["decmd"] = genInternalDecCommandAsString - funcs["zerocmd"] = genInternalZeroValue - funcs["hasprefix"] = strings.HasPrefix - funcs["sorttype"] = genInternalSortType - - genInternalV = gt - genInternalTmplFuncs = funcs -} - -// genInternalGoFile is used to generate source files from templates. -// It is run by the program author alone. -// Unfortunately, it has to be exported so that it can be called from a command line tool. -// *** DO NOT USE *** -func genInternalGoFile(r io.Reader, w io.Writer, safe bool) (err error) { - genInternalOnce.Do(genInternalInit) - - gt := genInternalV - gt.Unsafe = !safe - - t := template.New("").Funcs(genInternalTmplFuncs) - - tmplstr, err := ioutil.ReadAll(r) - if err != nil { - return - } - - if t, err = t.Parse(string(tmplstr)); err != nil { - return - } - - var out bytes.Buffer - err = t.Execute(&out, gt) - if err != nil { - return - } - - bout, err := format.Source(out.Bytes()) - if err != nil { - w.Write(out.Bytes()) // write out if error, so we can still see. - // w.Write(bout) // write out if error, as much as possible, so we can still see. - return - } - w.Write(bout) - return -} diff --git a/vendor/github.com/ugorji/go/codec/gen_15.go b/vendor/github.com/ugorji/go/codec/gen_15.go deleted file mode 100644 index ab76c310270b..000000000000 --- a/vendor/github.com/ugorji/go/codec/gen_15.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.5,!go1.6 - -package codec - -import "os" - -func init() { - genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") == "1" -} diff --git a/vendor/github.com/ugorji/go/codec/gen_16.go b/vendor/github.com/ugorji/go/codec/gen_16.go deleted file mode 100644 index 87c04e2e1827..000000000000 --- a/vendor/github.com/ugorji/go/codec/gen_16.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -// +build go1.6 - -package codec - -import "os" - -func init() { - genCheckVendor = os.Getenv("GO15VENDOREXPERIMENT") != "0" -} diff --git a/vendor/github.com/ugorji/go/codec/helper.go b/vendor/github.com/ugorji/go/codec/helper.go deleted file mode 100644 index f3d2600d3e56..000000000000 --- a/vendor/github.com/ugorji/go/codec/helper.go +++ /dev/null @@ -1,1272 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// Contains code shared by both encode and decode. - -// Some shared ideas around encoding/decoding -// ------------------------------------------ -// -// If an interface{} is passed, we first do a type assertion to see if it is -// a primitive type or a map/slice of primitive types, and use a fastpath to handle it. -// -// If we start with a reflect.Value, we are already in reflect.Value land and -// will try to grab the function for the underlying Type and directly call that function. -// This is more performant than calling reflect.Value.Interface(). -// -// This still helps us bypass many layers of reflection, and give best performance. -// -// Containers -// ------------ -// Containers in the stream are either associative arrays (key-value pairs) or -// regular arrays (indexed by incrementing integers). -// -// Some streams support indefinite-length containers, and use a breaking -// byte-sequence to denote that the container has come to an end. -// -// Some streams also are text-based, and use explicit separators to denote the -// end/beginning of different values. -// -// During encode, we use a high-level condition to determine how to iterate through -// the container. That decision is based on whether the container is text-based (with -// separators) or binary (without separators). If binary, we do not even call the -// encoding of separators. -// -// During decode, we use a different high-level condition to determine how to iterate -// through the containers. That decision is based on whether the stream contained -// a length prefix, or if it used explicit breaks. If length-prefixed, we assume that -// it has to be binary, and we do not even try to read separators. -// -// The only codec that may suffer (slightly) is cbor, and only when decoding indefinite-length. -// It may suffer because we treat it like a text-based codec, and read separators. -// However, this read is a no-op and the cost is insignificant. -// -// Philosophy -// ------------ -// On decode, this codec will update containers appropriately: -// - If struct, update fields from stream into fields of struct. -// If field in stream not found in struct, handle appropriately (based on option). -// If a struct field has no corresponding value in the stream, leave it AS IS. -// If nil in stream, set value to nil/zero value. -// - If map, update map from stream. -// If the stream value is NIL, set the map to nil. -// - if slice, try to update up to length of array in stream. -// if container len is less than stream array length, -// and container cannot be expanded, handled (based on option). -// This means you can decode 4-element stream array into 1-element array. -// -// ------------------------------------ -// On encode, user can specify omitEmpty. This means that the value will be omitted -// if the zero value. The problem may occur during decode, where omitted values do not affect -// the value being decoded into. This means that if decoding into a struct with an -// int field with current value=5, and the field is omitted in the stream, then after -// decoding, the value will still be 5 (not 0). -// omitEmpty only works if you guarantee that you always decode into zero-values. -// -// ------------------------------------ -// We could have truncated a map to remove keys not available in the stream, -// or set values in the struct which are not in the stream to their zero values. -// We decided against it because there is no efficient way to do it. -// We may introduce it as an option later. -// However, that will require enabling it for both runtime and code generation modes. -// -// To support truncate, we need to do 2 passes over the container: -// map -// - first collect all keys (e.g. in k1) -// - for each key in stream, mark k1 that the key should not be removed -// - after updating map, do second pass and call delete for all keys in k1 which are not marked -// struct: -// - for each field, track the *typeInfo s1 -// - iterate through all s1, and for each one not marked, set value to zero -// - this involves checking the possible anonymous fields which are nil ptrs. -// too much work. -// -// ------------------------------------------ -// Error Handling is done within the library using panic. -// -// This way, the code doesn't have to keep checking if an error has happened, -// and we don't have to keep sending the error value along with each call -// or storing it in the En|Decoder and checking it constantly along the way. -// -// The disadvantage is that small functions which use panics cannot be inlined. -// The code accounts for that by only using panics behind an interface; -// since interface calls cannot be inlined, this is irrelevant. -// -// We considered storing the error is En|Decoder. -// - once it has its err field set, it cannot be used again. -// - panicing will be optional, controlled by const flag. -// - code should always check error first and return early. -// We eventually decided against it as it makes the code clumsier to always -// check for these error conditions. - -import ( - "bytes" - "encoding" - "encoding/binary" - "errors" - "fmt" - "math" - "reflect" - "sort" - "strings" - "sync" - "time" -) - -const ( - scratchByteArrayLen = 32 - initCollectionCap = 32 // 32 is defensive. 16 is preferred. - - // Support encoding.(Binary|Text)(Unm|M)arshaler. - // This constant flag will enable or disable it. - supportMarshalInterfaces = true - - // Each Encoder or Decoder uses a cache of functions based on conditionals, - // so that the conditionals are not run every time. - // - // Either a map or a slice is used to keep track of the functions. - // The map is more natural, but has a higher cost than a slice/array. - // This flag (useMapForCodecCache) controls which is used. - // - // From benchmarks, slices with linear search perform better with < 32 entries. - // We have typically seen a high threshold of about 24 entries. - useMapForCodecCache = false - - // for debugging, set this to false, to catch panic traces. - // Note that this will always cause rpc tests to fail, since they need io.EOF sent via panic. - recoverPanicToErr = true - - // Fast path functions try to create a fast path encode or decode implementation - // for common maps and slices, by by-passing reflection altogether. - fastpathEnabled = true - - // if checkStructForEmptyValue, check structs fields to see if an empty value. - // This could be an expensive call, so possibly disable it. - checkStructForEmptyValue = false - - // if derefForIsEmptyValue, deref pointers and interfaces when checking isEmptyValue - derefForIsEmptyValue = false - - // if resetSliceElemToZeroValue, then on decoding a slice, reset the element to a zero value first. - // Only concern is that, if the slice already contained some garbage, we will decode into that garbage. - // The chances of this are slim, so leave this "optimization". - // TODO: should this be true, to ensure that we always decode into a "zero" "empty" value? - resetSliceElemToZeroValue bool = false -) - -var ( - oneByteArr = [1]byte{0} - zeroByteSlice = oneByteArr[:0:0] -) - -type charEncoding uint8 - -const ( - c_RAW charEncoding = iota - c_UTF8 - c_UTF16LE - c_UTF16BE - c_UTF32LE - c_UTF32BE -) - -// valueType is the stream type -type valueType uint8 - -const ( - valueTypeUnset valueType = iota - valueTypeNil - valueTypeInt - valueTypeUint - valueTypeFloat - valueTypeBool - valueTypeString - valueTypeSymbol - valueTypeBytes - valueTypeMap - valueTypeArray - valueTypeTimestamp - valueTypeExt - - // valueTypeInvalid = 0xff -) - -type seqType uint8 - -const ( - _ seqType = iota - seqTypeArray - seqTypeSlice - seqTypeChan -) - -// note that containerMapStart and containerArraySend are not sent. -// This is because the ReadXXXStart and EncodeXXXStart already does these. -type containerState uint8 - -const ( - _ containerState = iota - - containerMapStart // slot left open, since Driver method already covers it - containerMapKey - containerMapValue - containerMapEnd - containerArrayStart // slot left open, since Driver methods already cover it - containerArrayElem - containerArrayEnd -) - -type rgetPoolT struct { - encNames [8]string - fNames [8]string - etypes [8]uintptr - sfis [8]*structFieldInfo -} - -var rgetPool = sync.Pool{ - New: func() interface{} { return new(rgetPoolT) }, -} - -type rgetT struct { - fNames []string - encNames []string - etypes []uintptr - sfis []*structFieldInfo -} - -type containerStateRecv interface { - sendContainerState(containerState) -} - -// mirror json.Marshaler and json.Unmarshaler here, -// so we don't import the encoding/json package -type jsonMarshaler interface { - MarshalJSON() ([]byte, error) -} -type jsonUnmarshaler interface { - UnmarshalJSON([]byte) error -} - -var ( - bigen = binary.BigEndian - structInfoFieldName = "_struct" - - mapStrIntfTyp = reflect.TypeOf(map[string]interface{}(nil)) - mapIntfIntfTyp = reflect.TypeOf(map[interface{}]interface{}(nil)) - intfSliceTyp = reflect.TypeOf([]interface{}(nil)) - intfTyp = intfSliceTyp.Elem() - - stringTyp = reflect.TypeOf("") - timeTyp = reflect.TypeOf(time.Time{}) - rawExtTyp = reflect.TypeOf(RawExt{}) - uint8SliceTyp = reflect.TypeOf([]uint8(nil)) - - mapBySliceTyp = reflect.TypeOf((*MapBySlice)(nil)).Elem() - - binaryMarshalerTyp = reflect.TypeOf((*encoding.BinaryMarshaler)(nil)).Elem() - binaryUnmarshalerTyp = reflect.TypeOf((*encoding.BinaryUnmarshaler)(nil)).Elem() - - textMarshalerTyp = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() - textUnmarshalerTyp = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() - - jsonMarshalerTyp = reflect.TypeOf((*jsonMarshaler)(nil)).Elem() - jsonUnmarshalerTyp = reflect.TypeOf((*jsonUnmarshaler)(nil)).Elem() - - selferTyp = reflect.TypeOf((*Selfer)(nil)).Elem() - - uint8SliceTypId = reflect.ValueOf(uint8SliceTyp).Pointer() - rawExtTypId = reflect.ValueOf(rawExtTyp).Pointer() - intfTypId = reflect.ValueOf(intfTyp).Pointer() - timeTypId = reflect.ValueOf(timeTyp).Pointer() - stringTypId = reflect.ValueOf(stringTyp).Pointer() - - mapStrIntfTypId = reflect.ValueOf(mapStrIntfTyp).Pointer() - mapIntfIntfTypId = reflect.ValueOf(mapIntfIntfTyp).Pointer() - intfSliceTypId = reflect.ValueOf(intfSliceTyp).Pointer() - // mapBySliceTypId = reflect.ValueOf(mapBySliceTyp).Pointer() - - intBitsize uint8 = uint8(reflect.TypeOf(int(0)).Bits()) - uintBitsize uint8 = uint8(reflect.TypeOf(uint(0)).Bits()) - - bsAll0x00 = []byte{0, 0, 0, 0, 0, 0, 0, 0} - bsAll0xff = []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} - - chkOvf checkOverflow - - noFieldNameToStructFieldInfoErr = errors.New("no field name passed to parseStructFieldInfo") -) - -var defTypeInfos = NewTypeInfos([]string{"codec", "json"}) - -// Selfer defines methods by which a value can encode or decode itself. -// -// Any type which implements Selfer will be able to encode or decode itself. -// Consequently, during (en|de)code, this takes precedence over -// (text|binary)(M|Unm)arshal or extension support. -type Selfer interface { - CodecEncodeSelf(*Encoder) - CodecDecodeSelf(*Decoder) -} - -// MapBySlice represents a slice which should be encoded as a map in the stream. -// The slice contains a sequence of key-value pairs. -// This affords storing a map in a specific sequence in the stream. -// -// The support of MapBySlice affords the following: -// - A slice type which implements MapBySlice will be encoded as a map -// - A slice can be decoded from a map in the stream -type MapBySlice interface { - MapBySlice() -} - -// WARNING: DO NOT USE DIRECTLY. EXPORTED FOR GODOC BENEFIT. WILL BE REMOVED. -// -// BasicHandle encapsulates the common options and extension functions. -type BasicHandle struct { - // TypeInfos is used to get the type info for any type. - // - // If not configured, the default TypeInfos is used, which uses struct tag keys: codec, json - TypeInfos *TypeInfos - - extHandle - EncodeOptions - DecodeOptions -} - -func (x *BasicHandle) getBasicHandle() *BasicHandle { - return x -} - -func (x *BasicHandle) getTypeInfo(rtid uintptr, rt reflect.Type) (pti *typeInfo) { - if x.TypeInfos != nil { - return x.TypeInfos.get(rtid, rt) - } - return defTypeInfos.get(rtid, rt) -} - -// Handle is the interface for a specific encoding format. -// -// Typically, a Handle is pre-configured before first time use, -// and not modified while in use. Such a pre-configured Handle -// is safe for concurrent access. -type Handle interface { - getBasicHandle() *BasicHandle - newEncDriver(w *Encoder) encDriver - newDecDriver(r *Decoder) decDriver - isBinary() bool -} - -// RawExt represents raw unprocessed extension data. -// Some codecs will decode extension data as a *RawExt if there is no registered extension for the tag. -// -// Only one of Data or Value is nil. If Data is nil, then the content of the RawExt is in the Value. -type RawExt struct { - Tag uint64 - // Data is the []byte which represents the raw ext. If Data is nil, ext is exposed in Value. - // Data is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of the types - Data []byte - // Value represents the extension, if Data is nil. - // Value is used by codecs (e.g. cbor) which use the format to do custom serialization of the types. - Value interface{} -} - -// BytesExt handles custom (de)serialization of types to/from []byte. -// It is used by codecs (e.g. binc, msgpack, simple) which do custom serialization of the types. -type BytesExt interface { - // WriteExt converts a value to a []byte. - // - // Note: v *may* be a pointer to the extension type, if the extension type was a struct or array. - WriteExt(v interface{}) []byte - - // ReadExt updates a value from a []byte. - ReadExt(dst interface{}, src []byte) -} - -// InterfaceExt handles custom (de)serialization of types to/from another interface{} value. -// The Encoder or Decoder will then handle the further (de)serialization of that known type. -// -// It is used by codecs (e.g. cbor, json) which use the format to do custom serialization of the types. -type InterfaceExt interface { - // ConvertExt converts a value into a simpler interface for easy encoding e.g. convert time.Time to int64. - // - // Note: v *may* be a pointer to the extension type, if the extension type was a struct or array. - ConvertExt(v interface{}) interface{} - - // UpdateExt updates a value from a simpler interface for easy decoding e.g. convert int64 to time.Time. - UpdateExt(dst interface{}, src interface{}) -} - -// Ext handles custom (de)serialization of custom types / extensions. -type Ext interface { - BytesExt - InterfaceExt -} - -// addExtWrapper is a wrapper implementation to support former AddExt exported method. -type addExtWrapper struct { - encFn func(reflect.Value) ([]byte, error) - decFn func(reflect.Value, []byte) error -} - -func (x addExtWrapper) WriteExt(v interface{}) []byte { - bs, err := x.encFn(reflect.ValueOf(v)) - if err != nil { - panic(err) - } - return bs -} - -func (x addExtWrapper) ReadExt(v interface{}, bs []byte) { - if err := x.decFn(reflect.ValueOf(v), bs); err != nil { - panic(err) - } -} - -func (x addExtWrapper) ConvertExt(v interface{}) interface{} { - return x.WriteExt(v) -} - -func (x addExtWrapper) UpdateExt(dest interface{}, v interface{}) { - x.ReadExt(dest, v.([]byte)) -} - -type setExtWrapper struct { - b BytesExt - i InterfaceExt -} - -func (x *setExtWrapper) WriteExt(v interface{}) []byte { - if x.b == nil { - panic("BytesExt.WriteExt is not supported") - } - return x.b.WriteExt(v) -} - -func (x *setExtWrapper) ReadExt(v interface{}, bs []byte) { - if x.b == nil { - panic("BytesExt.WriteExt is not supported") - - } - x.b.ReadExt(v, bs) -} - -func (x *setExtWrapper) ConvertExt(v interface{}) interface{} { - if x.i == nil { - panic("InterfaceExt.ConvertExt is not supported") - - } - return x.i.ConvertExt(v) -} - -func (x *setExtWrapper) UpdateExt(dest interface{}, v interface{}) { - if x.i == nil { - panic("InterfaceExxt.UpdateExt is not supported") - - } - x.i.UpdateExt(dest, v) -} - -// type errorString string -// func (x errorString) Error() string { return string(x) } - -type binaryEncodingType struct{} - -func (_ binaryEncodingType) isBinary() bool { return true } - -type textEncodingType struct{} - -func (_ textEncodingType) isBinary() bool { return false } - -// noBuiltInTypes is embedded into many types which do not support builtins -// e.g. msgpack, simple, cbor. -type noBuiltInTypes struct{} - -func (_ noBuiltInTypes) IsBuiltinType(rt uintptr) bool { return false } -func (_ noBuiltInTypes) EncodeBuiltin(rt uintptr, v interface{}) {} -func (_ noBuiltInTypes) DecodeBuiltin(rt uintptr, v interface{}) {} - -type noStreamingCodec struct{} - -func (_ noStreamingCodec) CheckBreak() bool { return false } - -// bigenHelper. -// Users must already slice the x completely, because we will not reslice. -type bigenHelper struct { - x []byte // must be correctly sliced to appropriate len. slicing is a cost. - w encWriter -} - -func (z bigenHelper) writeUint16(v uint16) { - bigen.PutUint16(z.x, v) - z.w.writeb(z.x) -} - -func (z bigenHelper) writeUint32(v uint32) { - bigen.PutUint32(z.x, v) - z.w.writeb(z.x) -} - -func (z bigenHelper) writeUint64(v uint64) { - bigen.PutUint64(z.x, v) - z.w.writeb(z.x) -} - -type extTypeTagFn struct { - rtid uintptr - rt reflect.Type - tag uint64 - ext Ext -} - -type extHandle []extTypeTagFn - -// DEPRECATED: Use SetBytesExt or SetInterfaceExt on the Handle instead. -// -// AddExt registes an encode and decode function for a reflect.Type. -// AddExt internally calls SetExt. -// To deregister an Ext, call AddExt with nil encfn and/or nil decfn. -func (o *extHandle) AddExt( - rt reflect.Type, tag byte, - encfn func(reflect.Value) ([]byte, error), decfn func(reflect.Value, []byte) error, -) (err error) { - if encfn == nil || decfn == nil { - return o.SetExt(rt, uint64(tag), nil) - } - return o.SetExt(rt, uint64(tag), addExtWrapper{encfn, decfn}) -} - -// DEPRECATED: Use SetBytesExt or SetInterfaceExt on the Handle instead. -// -// Note that the type must be a named type, and specifically not -// a pointer or Interface. An error is returned if that is not honored. -// -// To Deregister an ext, call SetExt with nil Ext -func (o *extHandle) SetExt(rt reflect.Type, tag uint64, ext Ext) (err error) { - // o is a pointer, because we may need to initialize it - if rt.PkgPath() == "" || rt.Kind() == reflect.Interface { - err = fmt.Errorf("codec.Handle.AddExt: Takes named type, especially not a pointer or interface: %T", - reflect.Zero(rt).Interface()) - return - } - - rtid := reflect.ValueOf(rt).Pointer() - for _, v := range *o { - if v.rtid == rtid { - v.tag, v.ext = tag, ext - return - } - } - - if *o == nil { - *o = make([]extTypeTagFn, 0, 4) - } - *o = append(*o, extTypeTagFn{rtid, rt, tag, ext}) - return -} - -func (o extHandle) getExt(rtid uintptr) *extTypeTagFn { - var v *extTypeTagFn - for i := range o { - v = &o[i] - if v.rtid == rtid { - return v - } - } - return nil -} - -func (o extHandle) getExtForTag(tag uint64) *extTypeTagFn { - var v *extTypeTagFn - for i := range o { - v = &o[i] - if v.tag == tag { - return v - } - } - return nil -} - -type structFieldInfo struct { - encName string // encode name - - // only one of 'i' or 'is' can be set. If 'i' is -1, then 'is' has been set. - - is []int // (recursive/embedded) field index in struct - i int16 // field index in struct - omitEmpty bool - toArray bool // if field is _struct, is the toArray set? -} - -// func (si *structFieldInfo) isZero() bool { -// return si.encName == "" && len(si.is) == 0 && si.i == 0 && !si.omitEmpty && !si.toArray -// } - -// rv returns the field of the struct. -// If anonymous, it returns an Invalid -func (si *structFieldInfo) field(v reflect.Value, update bool) (rv2 reflect.Value) { - if si.i != -1 { - v = v.Field(int(si.i)) - return v - } - // replicate FieldByIndex - for _, x := range si.is { - for v.Kind() == reflect.Ptr { - if v.IsNil() { - if !update { - return - } - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - v = v.Field(x) - } - return v -} - -func (si *structFieldInfo) setToZeroValue(v reflect.Value) { - if si.i != -1 { - v = v.Field(int(si.i)) - v.Set(reflect.Zero(v.Type())) - // v.Set(reflect.New(v.Type()).Elem()) - // v.Set(reflect.New(v.Type())) - } else { - // replicate FieldByIndex - for _, x := range si.is { - for v.Kind() == reflect.Ptr { - if v.IsNil() { - return - } - v = v.Elem() - } - v = v.Field(x) - } - v.Set(reflect.Zero(v.Type())) - } -} - -func parseStructFieldInfo(fname string, stag string) *structFieldInfo { - // if fname == "" { - // panic(noFieldNameToStructFieldInfoErr) - // } - si := structFieldInfo{ - encName: fname, - } - - if stag != "" { - for i, s := range strings.Split(stag, ",") { - if i == 0 { - if s != "" { - si.encName = s - } - } else { - if s == "omitempty" { - si.omitEmpty = true - } else if s == "toarray" { - si.toArray = true - } - } - } - } - // si.encNameBs = []byte(si.encName) - return &si -} - -type sfiSortedByEncName []*structFieldInfo - -func (p sfiSortedByEncName) Len() int { - return len(p) -} - -func (p sfiSortedByEncName) Less(i, j int) bool { - return p[i].encName < p[j].encName -} - -func (p sfiSortedByEncName) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -// typeInfo keeps information about each type referenced in the encode/decode sequence. -// -// During an encode/decode sequence, we work as below: -// - If base is a built in type, en/decode base value -// - If base is registered as an extension, en/decode base value -// - If type is binary(M/Unm)arshaler, call Binary(M/Unm)arshal method -// - If type is text(M/Unm)arshaler, call Text(M/Unm)arshal method -// - Else decode appropriately based on the reflect.Kind -type typeInfo struct { - sfi []*structFieldInfo // sorted. Used when enc/dec struct to map. - sfip []*structFieldInfo // unsorted. Used when enc/dec struct to array. - - rt reflect.Type - rtid uintptr - - numMeth uint16 // number of methods - - // baseId gives pointer to the base reflect.Type, after deferencing - // the pointers. E.g. base type of ***time.Time is time.Time. - base reflect.Type - baseId uintptr - baseIndir int8 // number of indirections to get to base - - mbs bool // base type (T or *T) is a MapBySlice - - bm bool // base type (T or *T) is a binaryMarshaler - bunm bool // base type (T or *T) is a binaryUnmarshaler - bmIndir int8 // number of indirections to get to binaryMarshaler type - bunmIndir int8 // number of indirections to get to binaryUnmarshaler type - - tm bool // base type (T or *T) is a textMarshaler - tunm bool // base type (T or *T) is a textUnmarshaler - tmIndir int8 // number of indirections to get to textMarshaler type - tunmIndir int8 // number of indirections to get to textUnmarshaler type - - jm bool // base type (T or *T) is a jsonMarshaler - junm bool // base type (T or *T) is a jsonUnmarshaler - jmIndir int8 // number of indirections to get to jsonMarshaler type - junmIndir int8 // number of indirections to get to jsonUnmarshaler type - - cs bool // base type (T or *T) is a Selfer - csIndir int8 // number of indirections to get to Selfer type - - toArray bool // whether this (struct) type should be encoded as an array -} - -func (ti *typeInfo) indexForEncName(name string) int { - // NOTE: name may be a stringView, so don't pass it to another function. - //tisfi := ti.sfi - const binarySearchThreshold = 16 - if sfilen := len(ti.sfi); sfilen < binarySearchThreshold { - // linear search. faster than binary search in my testing up to 16-field structs. - for i, si := range ti.sfi { - if si.encName == name { - return i - } - } - } else { - // binary search. adapted from sort/search.go. - h, i, j := 0, 0, sfilen - for i < j { - h = i + (j-i)/2 - if ti.sfi[h].encName < name { - i = h + 1 - } else { - j = h - } - } - if i < sfilen && ti.sfi[i].encName == name { - return i - } - } - return -1 -} - -// TypeInfos caches typeInfo for each type on first inspection. -// -// It is configured with a set of tag keys, which are used to get -// configuration for the type. -type TypeInfos struct { - infos map[uintptr]*typeInfo - mu sync.RWMutex - tags []string -} - -// NewTypeInfos creates a TypeInfos given a set of struct tags keys. -// -// This allows users customize the struct tag keys which contain configuration -// of their types. -func NewTypeInfos(tags []string) *TypeInfos { - return &TypeInfos{tags: tags, infos: make(map[uintptr]*typeInfo, 64)} -} - -func (x *TypeInfos) structTag(t reflect.StructTag) (s string) { - // check for tags: codec, json, in that order. - // this allows seamless support for many configured structs. - for _, x := range x.tags { - s = t.Get(x) - if s != "" { - return s - } - } - return -} - -func (x *TypeInfos) get(rtid uintptr, rt reflect.Type) (pti *typeInfo) { - var ok bool - x.mu.RLock() - pti, ok = x.infos[rtid] - x.mu.RUnlock() - if ok { - return - } - - // do not hold lock while computing this. - // it may lead to duplication, but that's ok. - ti := typeInfo{rt: rt, rtid: rtid} - ti.numMeth = uint16(rt.NumMethod()) - - var indir int8 - if ok, indir = implementsIntf(rt, binaryMarshalerTyp); ok { - ti.bm, ti.bmIndir = true, indir - } - if ok, indir = implementsIntf(rt, binaryUnmarshalerTyp); ok { - ti.bunm, ti.bunmIndir = true, indir - } - if ok, indir = implementsIntf(rt, textMarshalerTyp); ok { - ti.tm, ti.tmIndir = true, indir - } - if ok, indir = implementsIntf(rt, textUnmarshalerTyp); ok { - ti.tunm, ti.tunmIndir = true, indir - } - if ok, indir = implementsIntf(rt, jsonMarshalerTyp); ok { - ti.jm, ti.jmIndir = true, indir - } - if ok, indir = implementsIntf(rt, jsonUnmarshalerTyp); ok { - ti.junm, ti.junmIndir = true, indir - } - if ok, indir = implementsIntf(rt, selferTyp); ok { - ti.cs, ti.csIndir = true, indir - } - if ok, _ = implementsIntf(rt, mapBySliceTyp); ok { - ti.mbs = true - } - - pt := rt - var ptIndir int8 - // for ; pt.Kind() == reflect.Ptr; pt, ptIndir = pt.Elem(), ptIndir+1 { } - for pt.Kind() == reflect.Ptr { - pt = pt.Elem() - ptIndir++ - } - if ptIndir == 0 { - ti.base = rt - ti.baseId = rtid - } else { - ti.base = pt - ti.baseId = reflect.ValueOf(pt).Pointer() - ti.baseIndir = ptIndir - } - - if rt.Kind() == reflect.Struct { - var siInfo *structFieldInfo - if f, ok := rt.FieldByName(structInfoFieldName); ok { - siInfo = parseStructFieldInfo(structInfoFieldName, x.structTag(f.Tag)) - ti.toArray = siInfo.toArray - } - pi := rgetPool.Get() - pv := pi.(*rgetPoolT) - pv.etypes[0] = ti.baseId - vv := rgetT{pv.fNames[:0], pv.encNames[:0], pv.etypes[:1], pv.sfis[:0]} - x.rget(rt, rtid, nil, &vv, siInfo) - ti.sfip = make([]*structFieldInfo, len(vv.sfis)) - ti.sfi = make([]*structFieldInfo, len(vv.sfis)) - copy(ti.sfip, vv.sfis) - sort.Sort(sfiSortedByEncName(vv.sfis)) - copy(ti.sfi, vv.sfis) - rgetPool.Put(pi) - } - // sfi = sfip - - x.mu.Lock() - if pti, ok = x.infos[rtid]; !ok { - pti = &ti - x.infos[rtid] = pti - } - x.mu.Unlock() - return -} - -func (x *TypeInfos) rget(rt reflect.Type, rtid uintptr, - indexstack []int, pv *rgetT, siInfo *structFieldInfo, -) { - // This will read up the fields and store how to access the value. - // It uses the go language's rules for embedding, as below: - // - if a field has been seen while traversing, skip it - // - if an encName has been seen while traversing, skip it - // - if an embedded type has been seen, skip it - // - // Also, per Go's rules, embedded fields must be analyzed AFTER all top-level fields. - // - // Note: we consciously use slices, not a map, to simulate a set. - // Typically, types have < 16 fields, and iteration using equals is faster than maps there - - type anonField struct { - ft reflect.Type - idx int - } - - var anonFields []anonField - -LOOP: - for j, jlen := 0, rt.NumField(); j < jlen; j++ { - f := rt.Field(j) - fkind := f.Type.Kind() - // skip if a func type, or is unexported, or structTag value == "-" - switch fkind { - case reflect.Func, reflect.Complex64, reflect.Complex128, reflect.UnsafePointer: - continue LOOP - } - - // if r1, _ := utf8.DecodeRuneInString(f.Name); r1 == utf8.RuneError || !unicode.IsUpper(r1) { - if f.PkgPath != "" && !f.Anonymous { // unexported, not embedded - continue - } - stag := x.structTag(f.Tag) - if stag == "-" { - continue - } - var si *structFieldInfo - // if anonymous and no struct tag (or it's blank), and a struct (or pointer to struct), inline it. - if f.Anonymous && fkind != reflect.Interface { - doInline := stag == "" - if !doInline { - si = parseStructFieldInfo("", stag) - doInline = si.encName == "" - // doInline = si.isZero() - } - if doInline { - ft := f.Type - for ft.Kind() == reflect.Ptr { - ft = ft.Elem() - } - if ft.Kind() == reflect.Struct { - // handle anonymous fields after handling all the non-anon fields - anonFields = append(anonFields, anonField{ft, j}) - continue - } - } - } - - // after the anonymous dance: if an unexported field, skip - if f.PkgPath != "" { // unexported - continue - } - - if f.Name == "" { - panic(noFieldNameToStructFieldInfoErr) - } - - for _, k := range pv.fNames { - if k == f.Name { - continue LOOP - } - } - pv.fNames = append(pv.fNames, f.Name) - - if si == nil { - si = parseStructFieldInfo(f.Name, stag) - } else if si.encName == "" { - si.encName = f.Name - } - - for _, k := range pv.encNames { - if k == si.encName { - continue LOOP - } - } - pv.encNames = append(pv.encNames, si.encName) - - // si.ikind = int(f.Type.Kind()) - if len(indexstack) == 0 { - si.i = int16(j) - } else { - si.i = -1 - si.is = make([]int, len(indexstack)+1) - copy(si.is, indexstack) - si.is[len(indexstack)] = j - // si.is = append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) - } - - if siInfo != nil { - if siInfo.omitEmpty { - si.omitEmpty = true - } - } - pv.sfis = append(pv.sfis, si) - } - - // now handle anonymous fields -LOOP2: - for _, af := range anonFields { - // if etypes contains this, then do not call rget again (as the fields are already seen here) - ftid := reflect.ValueOf(af.ft).Pointer() - for _, k := range pv.etypes { - if k == ftid { - continue LOOP2 - } - } - pv.etypes = append(pv.etypes, ftid) - - indexstack2 := make([]int, len(indexstack)+1) - copy(indexstack2, indexstack) - indexstack2[len(indexstack)] = af.idx - // indexstack2 := append(append(make([]int, 0, len(indexstack)+4), indexstack...), j) - x.rget(af.ft, ftid, indexstack2, pv, siInfo) - } -} - -func panicToErr(err *error) { - if recoverPanicToErr { - if x := recover(); x != nil { - //debug.PrintStack() - panicValToErr(x, err) - } - } -} - -// func doPanic(tag string, format string, params ...interface{}) { -// params2 := make([]interface{}, len(params)+1) -// params2[0] = tag -// copy(params2[1:], params) -// panic(fmt.Errorf("%s: "+format, params2...)) -// } - -func isImmutableKind(k reflect.Kind) (v bool) { - return false || - k == reflect.Int || - k == reflect.Int8 || - k == reflect.Int16 || - k == reflect.Int32 || - k == reflect.Int64 || - k == reflect.Uint || - k == reflect.Uint8 || - k == reflect.Uint16 || - k == reflect.Uint32 || - k == reflect.Uint64 || - k == reflect.Uintptr || - k == reflect.Float32 || - k == reflect.Float64 || - k == reflect.Bool || - k == reflect.String -} - -// these functions must be inlinable, and not call anybody -type checkOverflow struct{} - -func (_ checkOverflow) Float32(f float64) (overflow bool) { - if f < 0 { - f = -f - } - return math.MaxFloat32 < f && f <= math.MaxFloat64 -} - -func (_ checkOverflow) Uint(v uint64, bitsize uint8) (overflow bool) { - if bitsize == 0 || bitsize >= 64 || v == 0 { - return - } - if trunc := (v << (64 - bitsize)) >> (64 - bitsize); v != trunc { - overflow = true - } - return -} - -func (_ checkOverflow) Int(v int64, bitsize uint8) (overflow bool) { - if bitsize == 0 || bitsize >= 64 || v == 0 { - return - } - if trunc := (v << (64 - bitsize)) >> (64 - bitsize); v != trunc { - overflow = true - } - return -} - -func (_ checkOverflow) SignedInt(v uint64) (i int64, overflow bool) { - //e.g. -127 to 128 for int8 - pos := (v >> 63) == 0 - ui2 := v & 0x7fffffffffffffff - if pos { - if ui2 > math.MaxInt64 { - overflow = true - return - } - } else { - if ui2 > math.MaxInt64-1 { - overflow = true - return - } - } - i = int64(v) - return -} - -// ------------------ SORT ----------------- - -func isNaN(f float64) bool { return f != f } - -// ----------------------- - -type intSlice []int64 -type uintSlice []uint64 -type floatSlice []float64 -type boolSlice []bool -type stringSlice []string -type bytesSlice [][]byte - -func (p intSlice) Len() int { return len(p) } -func (p intSlice) Less(i, j int) bool { return p[i] < p[j] } -func (p intSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p uintSlice) Len() int { return len(p) } -func (p uintSlice) Less(i, j int) bool { return p[i] < p[j] } -func (p uintSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p floatSlice) Len() int { return len(p) } -func (p floatSlice) Less(i, j int) bool { - return p[i] < p[j] || isNaN(p[i]) && !isNaN(p[j]) -} -func (p floatSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p stringSlice) Len() int { return len(p) } -func (p stringSlice) Less(i, j int) bool { return p[i] < p[j] } -func (p stringSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p bytesSlice) Len() int { return len(p) } -func (p bytesSlice) Less(i, j int) bool { return bytes.Compare(p[i], p[j]) == -1 } -func (p bytesSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p boolSlice) Len() int { return len(p) } -func (p boolSlice) Less(i, j int) bool { return !p[i] && p[j] } -func (p boolSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// --------------------- - -type intRv struct { - v int64 - r reflect.Value -} -type intRvSlice []intRv -type uintRv struct { - v uint64 - r reflect.Value -} -type uintRvSlice []uintRv -type floatRv struct { - v float64 - r reflect.Value -} -type floatRvSlice []floatRv -type boolRv struct { - v bool - r reflect.Value -} -type boolRvSlice []boolRv -type stringRv struct { - v string - r reflect.Value -} -type stringRvSlice []stringRv -type bytesRv struct { - v []byte - r reflect.Value -} -type bytesRvSlice []bytesRv - -func (p intRvSlice) Len() int { return len(p) } -func (p intRvSlice) Less(i, j int) bool { return p[i].v < p[j].v } -func (p intRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p uintRvSlice) Len() int { return len(p) } -func (p uintRvSlice) Less(i, j int) bool { return p[i].v < p[j].v } -func (p uintRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p floatRvSlice) Len() int { return len(p) } -func (p floatRvSlice) Less(i, j int) bool { - return p[i].v < p[j].v || isNaN(p[i].v) && !isNaN(p[j].v) -} -func (p floatRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p stringRvSlice) Len() int { return len(p) } -func (p stringRvSlice) Less(i, j int) bool { return p[i].v < p[j].v } -func (p stringRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p bytesRvSlice) Len() int { return len(p) } -func (p bytesRvSlice) Less(i, j int) bool { return bytes.Compare(p[i].v, p[j].v) == -1 } -func (p bytesRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p boolRvSlice) Len() int { return len(p) } -func (p boolRvSlice) Less(i, j int) bool { return !p[i].v && p[j].v } -func (p boolRvSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// ----------------- - -type bytesI struct { - v []byte - i interface{} -} - -type bytesISlice []bytesI - -func (p bytesISlice) Len() int { return len(p) } -func (p bytesISlice) Less(i, j int) bool { return bytes.Compare(p[i].v, p[j].v) == -1 } -func (p bytesISlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// ----------------- - -type set []uintptr - -func (s *set) add(v uintptr) (exists bool) { - // e.ci is always nil, or len >= 1 - // defer func() { fmt.Printf("$$$$$$$$$$$ cirRef Add: %v, exists: %v\n", v, exists) }() - x := *s - if x == nil { - x = make([]uintptr, 1, 8) - x[0] = v - *s = x - return - } - // typically, length will be 1. make this perform. - if len(x) == 1 { - if j := x[0]; j == 0 { - x[0] = v - } else if j == v { - exists = true - } else { - x = append(x, v) - *s = x - } - return - } - // check if it exists - for _, j := range x { - if j == v { - exists = true - return - } - } - // try to replace a "deleted" slot - for i, j := range x { - if j == 0 { - x[i] = v - return - } - } - // if unable to replace deleted slot, just append it. - x = append(x, v) - *s = x - return -} - -func (s *set) remove(v uintptr) (exists bool) { - // defer func() { fmt.Printf("$$$$$$$$$$$ cirRef Rm: %v, exists: %v\n", v, exists) }() - x := *s - if len(x) == 0 { - return - } - if len(x) == 1 { - if x[0] == v { - x[0] = 0 - } - return - } - for i, j := range x { - if j == v { - exists = true - x[i] = 0 // set it to 0, as way to delete it. - // copy(x[i:], x[i+1:]) - // x = x[:len(x)-1] - return - } - } - return -} diff --git a/vendor/github.com/ugorji/go/codec/helper_internal.go b/vendor/github.com/ugorji/go/codec/helper_internal.go deleted file mode 100644 index dea981fbb7be..000000000000 --- a/vendor/github.com/ugorji/go/codec/helper_internal.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// All non-std package dependencies live in this file, -// so porting to different environment is easy (just update functions). - -import ( - "errors" - "fmt" - "math" - "reflect" -) - -func panicValToErr(panicVal interface{}, err *error) { - if panicVal == nil { - return - } - // case nil - switch xerr := panicVal.(type) { - case error: - *err = xerr - case string: - *err = errors.New(xerr) - default: - *err = fmt.Errorf("%v", panicVal) - } - return -} - -func hIsEmptyValue(v reflect.Value, deref, checkStruct bool) bool { - switch v.Kind() { - case reflect.Invalid: - return true - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - if deref { - if v.IsNil() { - return true - } - return hIsEmptyValue(v.Elem(), deref, checkStruct) - } else { - return v.IsNil() - } - case reflect.Struct: - if !checkStruct { - return false - } - // return true if all fields are empty. else return false. - // we cannot use equality check, because some fields may be maps/slices/etc - // and consequently the structs are not comparable. - // return v.Interface() == reflect.Zero(v.Type()).Interface() - for i, n := 0, v.NumField(); i < n; i++ { - if !hIsEmptyValue(v.Field(i), deref, checkStruct) { - return false - } - } - return true - } - return false -} - -func isEmptyValue(v reflect.Value) bool { - return hIsEmptyValue(v, derefForIsEmptyValue, checkStructForEmptyValue) -} - -func pruneSignExt(v []byte, pos bool) (n int) { - if len(v) < 2 { - } else if pos && v[0] == 0 { - for ; v[n] == 0 && n+1 < len(v) && (v[n+1]&(1<<7) == 0); n++ { - } - } else if !pos && v[0] == 0xff { - for ; v[n] == 0xff && n+1 < len(v) && (v[n+1]&(1<<7) != 0); n++ { - } - } - return -} - -func implementsIntf(typ, iTyp reflect.Type) (success bool, indir int8) { - if typ == nil { - return - } - rt := typ - // The type might be a pointer and we need to keep - // dereferencing to the base type until we find an implementation. - for { - if rt.Implements(iTyp) { - return true, indir - } - if p := rt; p.Kind() == reflect.Ptr { - indir++ - if indir >= math.MaxInt8 { // insane number of indirections - return false, 0 - } - rt = p.Elem() - continue - } - break - } - // No luck yet, but if this is a base type (non-pointer), the pointer might satisfy. - if typ.Kind() != reflect.Ptr { - // Not a pointer, but does the pointer work? - if reflect.PtrTo(typ).Implements(iTyp) { - return true, -1 - } - } - return false, 0 -} - -// validate that this function is correct ... -// culled from OGRE (Object-Oriented Graphics Rendering Engine) -// function: halfToFloatI (http://stderr.org/doc/ogre-doc/api/OgreBitwise_8h-source.html) -func halfFloatToFloatBits(yy uint16) (d uint32) { - y := uint32(yy) - s := (y >> 15) & 0x01 - e := (y >> 10) & 0x1f - m := y & 0x03ff - - if e == 0 { - if m == 0 { // plu or minus 0 - return s << 31 - } else { // Denormalized number -- renormalize it - for (m & 0x00000400) == 0 { - m <<= 1 - e -= 1 - } - e += 1 - const zz uint32 = 0x0400 - m &= ^zz - } - } else if e == 31 { - if m == 0 { // Inf - return (s << 31) | 0x7f800000 - } else { // NaN - return (s << 31) | 0x7f800000 | (m << 13) - } - } - e = e + (127 - 15) - m = m << 13 - return (s << 31) | (e << 23) | m -} - -// GrowCap will return a new capacity for a slice, given the following: -// - oldCap: current capacity -// - unit: in-memory size of an element -// - num: number of elements to add -func growCap(oldCap, unit, num int) (newCap int) { - // appendslice logic (if cap < 1024, *2, else *1.25): - // leads to many copy calls, especially when copying bytes. - // bytes.Buffer model (2*cap + n): much better for bytes. - // smarter way is to take the byte-size of the appended element(type) into account - - // maintain 3 thresholds: - // t1: if cap <= t1, newcap = 2x - // t2: if cap <= t2, newcap = 1.75x - // t3: if cap <= t3, newcap = 1.5x - // else newcap = 1.25x - // - // t1, t2, t3 >= 1024 always. - // i.e. if unit size >= 16, then always do 2x or 1.25x (ie t1, t2, t3 are all same) - // - // With this, appending for bytes increase by: - // 100% up to 4K - // 75% up to 8K - // 50% up to 16K - // 25% beyond that - - // unit can be 0 e.g. for struct{}{}; handle that appropriately - var t1, t2, t3 int // thresholds - if unit <= 1 { - t1, t2, t3 = 4*1024, 8*1024, 16*1024 - } else if unit < 16 { - t3 = 16 / unit * 1024 - t1 = t3 * 1 / 4 - t2 = t3 * 2 / 4 - } else { - t1, t2, t3 = 1024, 1024, 1024 - } - - var x int // temporary variable - - // x is multiplier here: one of 5, 6, 7 or 8; incr of 25%, 50%, 75% or 100% respectively - if oldCap <= t1 { // [0,t1] - x = 8 - } else if oldCap > t3 { // (t3,infinity] - x = 5 - } else if oldCap <= t2 { // (t1,t2] - x = 7 - } else { // (t2,t3] - x = 6 - } - newCap = x * oldCap / 4 - - if num > 0 { - newCap += num - } - - // ensure newCap is a multiple of 64 (if it is > 64) or 16. - if newCap > 64 { - if x = newCap % 64; x != 0 { - x = newCap / 64 - newCap = 64 * (x + 1) - } - } else { - if x = newCap % 16; x != 0 { - x = newCap / 16 - newCap = 16 * (x + 1) - } - } - return -} - -func expandSliceValue(s reflect.Value, num int) reflect.Value { - if num <= 0 { - return s - } - l0 := s.Len() - l1 := l0 + num // new slice length - if l1 < l0 { - panic("ExpandSlice: slice overflow") - } - c0 := s.Cap() - if l1 <= c0 { - return s.Slice(0, l1) - } - st := s.Type() - c1 := growCap(c0, int(st.Elem().Size()), num) - s2 := reflect.MakeSlice(st, l1, c1) - // println("expandslicevalue: cap-old: ", c0, ", cap-new: ", c1, ", len-new: ", l1) - reflect.Copy(s2, s) - return s2 -} diff --git a/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go b/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go deleted file mode 100644 index 7c2ffc0fde6e..000000000000 --- a/vendor/github.com/ugorji/go/codec/helper_not_unsafe.go +++ /dev/null @@ -1,20 +0,0 @@ -//+build !unsafe - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// stringView returns a view of the []byte as a string. -// In unsafe mode, it doesn't incur allocation and copying caused by conversion. -// In regular safe mode, it is an allocation and copy. -func stringView(v []byte) string { - return string(v) -} - -// bytesView returns a view of the string as a []byte. -// In unsafe mode, it doesn't incur allocation and copying caused by conversion. -// In regular safe mode, it is an allocation and copy. -func bytesView(v string) []byte { - return []byte(v) -} diff --git a/vendor/github.com/ugorji/go/codec/helper_unsafe.go b/vendor/github.com/ugorji/go/codec/helper_unsafe.go deleted file mode 100644 index 2928e4f7747f..000000000000 --- a/vendor/github.com/ugorji/go/codec/helper_unsafe.go +++ /dev/null @@ -1,49 +0,0 @@ -//+build unsafe - -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "unsafe" -) - -// This file has unsafe variants of some helper methods. - -type unsafeString struct { - Data uintptr - Len int -} - -type unsafeSlice struct { - Data uintptr - Len int - Cap int -} - -// stringView returns a view of the []byte as a string. -// In unsafe mode, it doesn't incur allocation and copying caused by conversion. -// In regular safe mode, it is an allocation and copy. -func stringView(v []byte) string { - if len(v) == 0 { - return "" - } - - bx := (*unsafeSlice)(unsafe.Pointer(&v)) - sx := unsafeString{bx.Data, bx.Len} - return *(*string)(unsafe.Pointer(&sx)) -} - -// bytesView returns a view of the string as a []byte. -// In unsafe mode, it doesn't incur allocation and copying caused by conversion. -// In regular safe mode, it is an allocation and copy. -func bytesView(v string) []byte { - if len(v) == 0 { - return zeroByteSlice - } - - sx := (*unsafeString)(unsafe.Pointer(&v)) - bx := unsafeSlice{sx.Data, sx.Len, sx.Len} - return *(*[]byte)(unsafe.Pointer(&bx)) -} diff --git a/vendor/github.com/ugorji/go/codec/json.go b/vendor/github.com/ugorji/go/codec/json.go deleted file mode 100644 index a04dfcb9d3ad..000000000000 --- a/vendor/github.com/ugorji/go/codec/json.go +++ /dev/null @@ -1,1213 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -// By default, this json support uses base64 encoding for bytes, because you cannot -// store and read any arbitrary string in json (only unicode). -// However, the user can configre how to encode/decode bytes. -// -// This library specifically supports UTF-8 for encoding and decoding only. -// -// Note that the library will happily encode/decode things which are not valid -// json e.g. a map[int64]string. We do it for consistency. With valid json, -// we will encode and decode appropriately. -// Users can specify their map type if necessary to force it. -// -// Note: -// - we cannot use strconv.Quote and strconv.Unquote because json quotes/unquotes differently. -// We implement it here. -// - Also, strconv.ParseXXX for floats and integers -// - only works on strings resulting in unnecessary allocation and []byte-string conversion. -// - it does a lot of redundant checks, because json numbers are simpler that what it supports. -// - We parse numbers (floats and integers) directly here. -// We only delegate parsing floats if it is a hairy float which could cause a loss of precision. -// In that case, we delegate to strconv.ParseFloat. -// -// Note: -// - encode does not beautify. There is no whitespace when encoding. -// - rpc calls which take single integer arguments or write single numeric arguments will need care. - -// Top-level methods of json(End|Dec)Driver (which are implementations of (en|de)cDriver -// MUST not call one-another. - -import ( - "bytes" - "encoding/base64" - "fmt" - "reflect" - "strconv" - "unicode/utf16" - "unicode/utf8" -) - -//-------------------------------- - -var ( - jsonLiterals = [...]byte{'t', 'r', 'u', 'e', 'f', 'a', 'l', 's', 'e', 'n', 'u', 'l', 'l'} - - jsonFloat64Pow10 = [...]float64{ - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - 1e20, 1e21, 1e22, - } - - jsonUint64Pow10 = [...]uint64{ - 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, - 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, - } - - // jsonTabs and jsonSpaces are used as caches for indents - jsonTabs, jsonSpaces string -) - -const ( - // jsonUnreadAfterDecNum controls whether we unread after decoding a number. - // - // instead of unreading, just update d.tok (iff it's not a whitespace char) - // However, doing this means that we may HOLD onto some data which belongs to another stream. - // Thus, it is safest to unread the data when done. - // keep behind a constant flag for now. - jsonUnreadAfterDecNum = true - - // If !jsonValidateSymbols, decoding will be faster, by skipping some checks: - // - If we see first character of null, false or true, - // do not validate subsequent characters. - // - e.g. if we see a n, assume null and skip next 3 characters, - // and do not validate they are ull. - // P.S. Do not expect a significant decoding boost from this. - jsonValidateSymbols = true - - // if jsonTruncateMantissa, truncate mantissa if trailing 0's. - // This is important because it could allow some floats to be decoded without - // deferring to strconv.ParseFloat. - jsonTruncateMantissa = true - - // if mantissa >= jsonNumUintCutoff before multiplying by 10, this is an overflow - jsonNumUintCutoff = (1<<64-1)/uint64(10) + 1 // cutoff64(base) - - // if mantissa >= jsonNumUintMaxVal, this is an overflow - jsonNumUintMaxVal = 1< 1<<53 || v < -(1<<53)) { - e.w.writen1('"') - e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) - e.w.writen1('"') - return - } - e.w.writeb(strconv.AppendInt(e.b[:0], v, 10)) -} - -func (e *jsonEncDriver) EncodeUint(v uint64) { - if x := e.h.IntegerAsString; x == 'A' || x == 'L' && v > 1<<53 { - e.w.writen1('"') - e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) - e.w.writen1('"') - return - } - e.w.writeb(strconv.AppendUint(e.b[:0], v, 10)) -} - -func (e *jsonEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, en *Encoder) { - if v := ext.ConvertExt(rv); v == nil { - e.w.writeb(jsonLiterals[9:13]) // null // e.EncodeNil() - } else { - en.encode(v) - } -} - -func (e *jsonEncDriver) EncodeRawExt(re *RawExt, en *Encoder) { - // only encodes re.Value (never re.Data) - if re.Value == nil { - e.w.writeb(jsonLiterals[9:13]) // null // e.EncodeNil() - } else { - en.encode(re.Value) - } -} - -func (e *jsonEncDriver) EncodeArrayStart(length int) { - if e.d { - e.dl++ - } - e.w.writen1('[') - e.c = containerArrayStart -} - -func (e *jsonEncDriver) EncodeMapStart(length int) { - if e.d { - e.dl++ - } - e.w.writen1('{') - e.c = containerMapStart -} - -func (e *jsonEncDriver) EncodeString(c charEncoding, v string) { - // e.w.writestr(strconv.Quote(v)) - e.quoteStr(v) -} - -func (e *jsonEncDriver) EncodeSymbol(v string) { - // e.EncodeString(c_UTF8, v) - e.quoteStr(v) -} - -func (e *jsonEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - // if encoding raw bytes and RawBytesExt is configured, use it to encode - if c == c_RAW && e.se.i != nil { - e.EncodeExt(v, 0, &e.se, e.e) - return - } - if c == c_RAW { - slen := base64.StdEncoding.EncodedLen(len(v)) - if cap(e.bs) >= slen { - e.bs = e.bs[:slen] - } else { - e.bs = make([]byte, slen) - } - base64.StdEncoding.Encode(e.bs, v) - e.w.writen1('"') - e.w.writeb(e.bs) - e.w.writen1('"') - } else { - // e.EncodeString(c, string(v)) - e.quoteStr(stringView(v)) - } -} - -func (e *jsonEncDriver) EncodeAsis(v []byte) { - e.w.writeb(v) -} - -func (e *jsonEncDriver) quoteStr(s string) { - // adapted from std pkg encoding/json - const hex = "0123456789abcdef" - w := e.w - w.writen1('"') - start := 0 - for i := 0; i < len(s); { - if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { - i++ - continue - } - if start < i { - w.writestr(s[start:i]) - } - switch b { - case '\\', '"': - w.writen2('\\', b) - case '\n': - w.writen2('\\', 'n') - case '\r': - w.writen2('\\', 'r') - case '\b': - w.writen2('\\', 'b') - case '\f': - w.writen2('\\', 'f') - case '\t': - w.writen2('\\', 't') - default: - // encode all bytes < 0x20 (except \r, \n). - // also encode < > & to prevent security holes when served to some browsers. - w.writestr(`\u00`) - w.writen2(hex[b>>4], hex[b&0xF]) - } - i++ - start = i - continue - } - c, size := utf8.DecodeRuneInString(s[i:]) - if c == utf8.RuneError && size == 1 { - if start < i { - w.writestr(s[start:i]) - } - w.writestr(`\ufffd`) - i += size - start = i - continue - } - // U+2028 is LINE SEPARATOR. U+2029 is PARAGRAPH SEPARATOR. - // Both technically valid JSON, but bomb on JSONP, so fix here. - if c == '\u2028' || c == '\u2029' { - if start < i { - w.writestr(s[start:i]) - } - w.writestr(`\u202`) - w.writen1(hex[c&0xF]) - i += size - start = i - continue - } - i += size - } - if start < len(s) { - w.writestr(s[start:]) - } - w.writen1('"') -} - -//-------------------------------- - -type jsonNum struct { - // bytes []byte // may have [+-.eE0-9] - mantissa uint64 // where mantissa ends, and maybe dot begins. - exponent int16 // exponent value. - manOverflow bool - neg bool // started with -. No initial sign in the bytes above. - dot bool // has dot - explicitExponent bool // explicit exponent -} - -func (x *jsonNum) reset() { - x.manOverflow = false - x.neg = false - x.dot = false - x.explicitExponent = false - x.mantissa = 0 - x.exponent = 0 -} - -// uintExp is called only if exponent > 0. -func (x *jsonNum) uintExp() (n uint64, overflow bool) { - n = x.mantissa - e := x.exponent - if e >= int16(len(jsonUint64Pow10)) { - overflow = true - return - } - n *= jsonUint64Pow10[e] - if n < x.mantissa || n > jsonNumUintMaxVal { - overflow = true - return - } - return - // for i := int16(0); i < e; i++ { - // if n >= jsonNumUintCutoff { - // overflow = true - // return - // } - // n *= 10 - // } - // return -} - -// these constants are only used withn floatVal. -// They are brought out, so that floatVal can be inlined. -const ( - jsonUint64MantissaBits = 52 - jsonMaxExponent = int16(len(jsonFloat64Pow10)) - 1 -) - -func (x *jsonNum) floatVal() (f float64, parseUsingStrConv bool) { - // We do not want to lose precision. - // Consequently, we will delegate to strconv.ParseFloat if any of the following happen: - // - There are more digits than in math.MaxUint64: 18446744073709551615 (20 digits) - // We expect up to 99.... (19 digits) - // - The mantissa cannot fit into a 52 bits of uint64 - // - The exponent is beyond our scope ie beyong 22. - parseUsingStrConv = x.manOverflow || - x.exponent > jsonMaxExponent || - (x.exponent < 0 && -(x.exponent) > jsonMaxExponent) || - x.mantissa>>jsonUint64MantissaBits != 0 - - if parseUsingStrConv { - return - } - - // all good. so handle parse here. - f = float64(x.mantissa) - // fmt.Printf(".Float: uint64 value: %v, float: %v\n", m, f) - if x.neg { - f = -f - } - if x.exponent > 0 { - f *= jsonFloat64Pow10[x.exponent] - } else if x.exponent < 0 { - f /= jsonFloat64Pow10[-x.exponent] - } - return -} - -type jsonDecDriver struct { - noBuiltInTypes - d *Decoder - h *JsonHandle - r decReader - - c containerState - // tok is used to store the token read right after skipWhiteSpace. - tok uint8 - - bstr [8]byte // scratch used for string \UXXX parsing - b [64]byte // scratch, used for parsing strings or numbers - b2 [64]byte // scratch, used only for decodeBytes (after base64) - bs []byte // scratch. Initialized from b. Used for parsing strings or numbers. - - se setExtWrapper - - n jsonNum -} - -func jsonIsWS(b byte) bool { - return b == ' ' || b == '\t' || b == '\r' || b == '\n' -} - -// // This will skip whitespace characters and return the next byte to read. -// // The next byte determines what the value will be one of. -// func (d *jsonDecDriver) skipWhitespace() { -// // fast-path: do not enter loop. Just check first (in case no whitespace). -// b := d.r.readn1() -// if jsonIsWS(b) { -// r := d.r -// for b = r.readn1(); jsonIsWS(b); b = r.readn1() { -// } -// } -// d.tok = b -// } - -func (d *jsonDecDriver) uncacheRead() { - if d.tok != 0 { - d.r.unreadn1() - d.tok = 0 - } -} - -func (d *jsonDecDriver) sendContainerState(c containerState) { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - var xc uint8 // char expected - if c == containerMapKey { - if d.c != containerMapStart { - xc = ',' - } - } else if c == containerMapValue { - xc = ':' - } else if c == containerMapEnd { - xc = '}' - } else if c == containerArrayElem { - if d.c != containerArrayStart { - xc = ',' - } - } else if c == containerArrayEnd { - xc = ']' - } - if xc != 0 { - if d.tok != xc { - d.d.errorf("json: expect char '%c' but got char '%c'", xc, d.tok) - } - d.tok = 0 - } - d.c = c -} - -func (d *jsonDecDriver) CheckBreak() bool { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok == '}' || d.tok == ']' { - // d.tok = 0 // only checking, not consuming - return true - } - return false -} - -func (d *jsonDecDriver) readStrIdx(fromIdx, toIdx uint8) { - bs := d.r.readx(int(toIdx - fromIdx)) - d.tok = 0 - if jsonValidateSymbols { - if !bytes.Equal(bs, jsonLiterals[fromIdx:toIdx]) { - d.d.errorf("json: expecting %s: got %s", jsonLiterals[fromIdx:toIdx], bs) - return - } - } -} - -func (d *jsonDecDriver) TryDecodeAsNil() bool { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok == 'n' { - d.readStrIdx(10, 13) // ull - return true - } - return false -} - -func (d *jsonDecDriver) DecodeBool() bool { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok == 'f' { - d.readStrIdx(5, 9) // alse - return false - } - if d.tok == 't' { - d.readStrIdx(1, 4) // rue - return true - } - d.d.errorf("json: decode bool: got first char %c", d.tok) - return false // "unreachable" -} - -func (d *jsonDecDriver) ReadMapStart() int { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok != '{' { - d.d.errorf("json: expect char '%c' but got char '%c'", '{', d.tok) - } - d.tok = 0 - d.c = containerMapStart - return -1 -} - -func (d *jsonDecDriver) ReadArrayStart() int { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok != '[' { - d.d.errorf("json: expect char '%c' but got char '%c'", '[', d.tok) - } - d.tok = 0 - d.c = containerArrayStart - return -1 -} - -func (d *jsonDecDriver) ContainerType() (vt valueType) { - // check container type by checking the first char - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if b := d.tok; b == '{' { - return valueTypeMap - } else if b == '[' { - return valueTypeArray - } else if b == 'n' { - return valueTypeNil - } else if b == '"' { - return valueTypeString - } - return valueTypeUnset - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - // return false // "unreachable" -} - -func (d *jsonDecDriver) decNum(storeBytes bool) { - // If it is has a . or an e|E, decode as a float; else decode as an int. - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - b := d.tok - var str bool - if b == '"' { - str = true - b = d.r.readn1() - } - if !(b == '+' || b == '-' || b == '.' || (b >= '0' && b <= '9')) { - d.d.errorf("json: decNum: got first char '%c'", b) - return - } - d.tok = 0 - - const cutoff = (1<<64-1)/uint64(10) + 1 // cutoff64(base) - const jsonNumUintMaxVal = 1<= jsonNumUintCutoff { - n.manOverflow = true - break - } - v := uint64(b - '0') - n.mantissa *= 10 - if v != 0 { - n1 := n.mantissa + v - if n1 < n.mantissa || n1 > jsonNumUintMaxVal { - n.manOverflow = true // n+v overflows - break - } - n.mantissa = n1 - } - case 6: - state = 7 - fallthrough - case 7: - if !(b == '0' && e == 0) { - e = e*10 + int16(b-'0') - } - default: - break LOOP - } - case '"': - if str { - if storeBytes { - d.bs = append(d.bs, '"') - } - b, eof = r.readn1eof() - } - break LOOP - default: - break LOOP - } - if storeBytes { - d.bs = append(d.bs, b) - } - b, eof = r.readn1eof() - } - - if jsonTruncateMantissa && n.mantissa != 0 { - for n.mantissa%10 == 0 { - n.mantissa /= 10 - n.exponent++ - } - } - - if e != 0 { - if eNeg { - n.exponent -= e - } else { - n.exponent += e - } - } - - // d.n = n - - if !eof { - if jsonUnreadAfterDecNum { - r.unreadn1() - } else { - if !jsonIsWS(b) { - d.tok = b - } - } - } - // fmt.Printf("1: n: bytes: %s, neg: %v, dot: %v, exponent: %v, mantissaEndIndex: %v\n", - // n.bytes, n.neg, n.dot, n.exponent, n.mantissaEndIndex) - return -} - -func (d *jsonDecDriver) DecodeInt(bitsize uint8) (i int64) { - d.decNum(false) - n := &d.n - if n.manOverflow { - d.d.errorf("json: overflow integer after: %v", n.mantissa) - return - } - var u uint64 - if n.exponent == 0 { - u = n.mantissa - } else if n.exponent < 0 { - d.d.errorf("json: fractional integer") - return - } else if n.exponent > 0 { - var overflow bool - if u, overflow = n.uintExp(); overflow { - d.d.errorf("json: overflow integer") - return - } - } - i = int64(u) - if n.neg { - i = -i - } - if chkOvf.Int(i, bitsize) { - d.d.errorf("json: overflow %v bits: %s", bitsize, d.bs) - return - } - // fmt.Printf("DecodeInt: %v\n", i) - return -} - -// floatVal MUST only be called after a decNum, as d.bs now contains the bytes of the number -func (d *jsonDecDriver) floatVal() (f float64) { - f, useStrConv := d.n.floatVal() - if useStrConv { - var err error - if f, err = strconv.ParseFloat(stringView(d.bs), 64); err != nil { - panic(fmt.Errorf("parse float: %s, %v", d.bs, err)) - } - if d.n.neg { - f = -f - } - } - return -} - -func (d *jsonDecDriver) DecodeUint(bitsize uint8) (u uint64) { - d.decNum(false) - n := &d.n - if n.neg { - d.d.errorf("json: unsigned integer cannot be negative") - return - } - if n.manOverflow { - d.d.errorf("json: overflow integer after: %v", n.mantissa) - return - } - if n.exponent == 0 { - u = n.mantissa - } else if n.exponent < 0 { - d.d.errorf("json: fractional integer") - return - } else if n.exponent > 0 { - var overflow bool - if u, overflow = n.uintExp(); overflow { - d.d.errorf("json: overflow integer") - return - } - } - if chkOvf.Uint(u, bitsize) { - d.d.errorf("json: overflow %v bits: %s", bitsize, d.bs) - return - } - // fmt.Printf("DecodeUint: %v\n", u) - return -} - -func (d *jsonDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - d.decNum(true) - f = d.floatVal() - if chkOverflow32 && chkOvf.Float32(f) { - d.d.errorf("json: overflow float32: %v, %s", f, d.bs) - return - } - return -} - -func (d *jsonDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { - if ext == nil { - re := rv.(*RawExt) - re.Tag = xtag - d.d.decode(&re.Value) - } else { - var v interface{} - d.d.decode(&v) - ext.UpdateExt(rv, v) - } - return -} - -func (d *jsonDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { - // if decoding into raw bytes, and the RawBytesExt is configured, use it to decode. - if !isstring && d.se.i != nil { - bsOut = bs - d.DecodeExt(&bsOut, 0, &d.se) - return - } - d.appendStringAsBytes() - // if isstring, then just return the bytes, even if it is using the scratch buffer. - // the bytes will be converted to a string as needed. - if isstring { - return d.bs - } - bs0 := d.bs - slen := base64.StdEncoding.DecodedLen(len(bs0)) - if slen <= cap(bs) { - bsOut = bs[:slen] - } else if zerocopy && slen <= cap(d.b2) { - bsOut = d.b2[:slen] - } else { - bsOut = make([]byte, slen) - } - slen2, err := base64.StdEncoding.Decode(bsOut, bs0) - if err != nil { - d.d.errorf("json: error decoding base64 binary '%s': %v", bs0, err) - return nil - } - if slen != slen2 { - bsOut = bsOut[:slen2] - } - return -} - -func (d *jsonDecDriver) DecodeString() (s string) { - d.appendStringAsBytes() - // if x := d.s.sc; x != nil && x.so && x.st == '}' { // map key - if d.c == containerMapKey { - return d.d.string(d.bs) - } - return string(d.bs) -} - -func (d *jsonDecDriver) appendStringAsBytes() { - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - if d.tok != '"' { - d.d.errorf("json: expect char '%c' but got char '%c'", '"', d.tok) - } - d.tok = 0 - - v := d.bs[:0] - var c uint8 - r := d.r - for { - c = r.readn1() - if c == '"' { - break - } else if c == '\\' { - c = r.readn1() - switch c { - case '"', '\\', '/', '\'': - v = append(v, c) - case 'b': - v = append(v, '\b') - case 'f': - v = append(v, '\f') - case 'n': - v = append(v, '\n') - case 'r': - v = append(v, '\r') - case 't': - v = append(v, '\t') - case 'u': - rr := d.jsonU4(false) - // fmt.Printf("$$$$$$$$$: is surrogate: %v\n", utf16.IsSurrogate(rr)) - if utf16.IsSurrogate(rr) { - rr = utf16.DecodeRune(rr, d.jsonU4(true)) - } - w2 := utf8.EncodeRune(d.bstr[:], rr) - v = append(v, d.bstr[:w2]...) - default: - d.d.errorf("json: unsupported escaped value: %c", c) - } - } else { - v = append(v, c) - } - } - d.bs = v -} - -func (d *jsonDecDriver) jsonU4(checkSlashU bool) rune { - r := d.r - if checkSlashU && !(r.readn1() == '\\' && r.readn1() == 'u') { - d.d.errorf(`json: unquoteStr: invalid unicode sequence. Expecting \u`) - return 0 - } - // u, _ := strconv.ParseUint(string(d.bstr[:4]), 16, 64) - var u uint32 - for i := 0; i < 4; i++ { - v := r.readn1() - if '0' <= v && v <= '9' { - v = v - '0' - } else if 'a' <= v && v <= 'z' { - v = v - 'a' + 10 - } else if 'A' <= v && v <= 'Z' { - v = v - 'A' + 10 - } else { - d.d.errorf(`json: unquoteStr: invalid hex char in \u unicode sequence: %q`, v) - return 0 - } - u = u*16 + uint32(v) - } - return rune(u) -} - -func (d *jsonDecDriver) DecodeNaked() { - z := &d.d.n - // var decodeFurther bool - - if d.tok == 0 { - var b byte - r := d.r - for b = r.readn1(); jsonIsWS(b); b = r.readn1() { - } - d.tok = b - } - switch d.tok { - case 'n': - d.readStrIdx(10, 13) // ull - z.v = valueTypeNil - case 'f': - d.readStrIdx(5, 9) // alse - z.v = valueTypeBool - z.b = false - case 't': - d.readStrIdx(1, 4) // rue - z.v = valueTypeBool - z.b = true - case '{': - z.v = valueTypeMap - // d.tok = 0 // don't consume. kInterfaceNaked will call ReadMapStart - // decodeFurther = true - case '[': - z.v = valueTypeArray - // d.tok = 0 // don't consume. kInterfaceNaked will call ReadArrayStart - // decodeFurther = true - case '"': - z.v = valueTypeString - z.s = d.DecodeString() - default: // number - d.decNum(true) - n := &d.n - // if the string had a any of [.eE], then decode as float. - switch { - case n.explicitExponent, n.dot, n.exponent < 0, n.manOverflow: - z.v = valueTypeFloat - z.f = d.floatVal() - case n.exponent == 0: - u := n.mantissa - switch { - case n.neg: - z.v = valueTypeInt - z.i = -int64(u) - case d.h.SignedInteger: - z.v = valueTypeInt - z.i = int64(u) - default: - z.v = valueTypeUint - z.u = u - } - default: - u, overflow := n.uintExp() - switch { - case overflow: - z.v = valueTypeFloat - z.f = d.floatVal() - case n.neg: - z.v = valueTypeInt - z.i = -int64(u) - case d.h.SignedInteger: - z.v = valueTypeInt - z.i = int64(u) - default: - z.v = valueTypeUint - z.u = u - } - } - // fmt.Printf("DecodeNaked: Number: %T, %v\n", v, v) - } - // if decodeFurther { - // d.s.sc.retryRead() - // } - return -} - -//---------------------- - -// JsonHandle is a handle for JSON encoding format. -// -// Json is comprehensively supported: -// - decodes numbers into interface{} as int, uint or float64 -// - configurable way to encode/decode []byte . -// by default, encodes and decodes []byte using base64 Std Encoding -// - UTF-8 support for encoding and decoding -// -// It has better performance than the json library in the standard library, -// by leveraging the performance improvements of the codec library and -// minimizing allocations. -// -// In addition, it doesn't read more bytes than necessary during a decode, which allows -// reading multiple values from a stream containing json and non-json content. -// For example, a user can read a json value, then a cbor value, then a msgpack value, -// all from the same stream in sequence. -type JsonHandle struct { - textEncodingType - BasicHandle - // RawBytesExt, if configured, is used to encode and decode raw bytes in a custom way. - // If not configured, raw bytes are encoded to/from base64 text. - RawBytesExt InterfaceExt - - // Indent indicates how a value is encoded. - // - If positive, indent by that number of spaces. - // - If negative, indent by that number of tabs. - Indent int8 - - // IntegerAsString controls how integers (signed and unsigned) are encoded. - // - // Per the JSON Spec, JSON numbers are 64-bit floating point numbers. - // Consequently, integers > 2^53 cannot be represented as a JSON number without losing precision. - // This can be mitigated by configuring how to encode integers. - // - // IntegerAsString interpretes the following values: - // - if 'L', then encode integers > 2^53 as a json string. - // - if 'A', then encode all integers as a json string - // containing the exact integer representation as a decimal. - // - else encode all integers as a json number (default) - IntegerAsString uint8 -} - -func (h *JsonHandle) SetInterfaceExt(rt reflect.Type, tag uint64, ext InterfaceExt) (err error) { - return h.SetExt(rt, tag, &setExtWrapper{i: ext}) -} - -func (h *JsonHandle) newEncDriver(e *Encoder) encDriver { - hd := jsonEncDriver{e: e, h: h} - hd.bs = hd.b[:0] - - hd.reset() - - return &hd -} - -func (h *JsonHandle) newDecDriver(d *Decoder) decDriver { - // d := jsonDecDriver{r: r.(*bytesDecReader), h: h} - hd := jsonDecDriver{d: d, h: h} - hd.bs = hd.b[:0] - hd.reset() - return &hd -} - -func (e *jsonEncDriver) reset() { - e.w = e.e.w - e.se.i = e.h.RawBytesExt - if e.bs != nil { - e.bs = e.bs[:0] - } - e.d, e.dt, e.dl, e.ds = false, false, 0, "" - e.c = 0 - if e.h.Indent > 0 { - e.d = true - e.ds = jsonSpaces[:e.h.Indent] - } else if e.h.Indent < 0 { - e.d = true - e.dt = true - e.ds = jsonTabs[:-(e.h.Indent)] - } -} - -func (d *jsonDecDriver) reset() { - d.r = d.d.r - d.se.i = d.h.RawBytesExt - if d.bs != nil { - d.bs = d.bs[:0] - } - d.c, d.tok = 0, 0 - d.n.reset() -} - -var jsonEncodeTerminate = []byte{' '} - -func (h *JsonHandle) rpcEncodeTerminate() []byte { - return jsonEncodeTerminate -} - -var _ decDriver = (*jsonDecDriver)(nil) -var _ encDriver = (*jsonEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/msgpack.go b/vendor/github.com/ugorji/go/codec/msgpack.go deleted file mode 100644 index f9f87236277a..000000000000 --- a/vendor/github.com/ugorji/go/codec/msgpack.go +++ /dev/null @@ -1,845 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -/* -MSGPACK - -Msgpack-c implementation powers the c, c++, python, ruby, etc libraries. -We need to maintain compatibility with it and how it encodes integer values -without caring about the type. - -For compatibility with behaviour of msgpack-c reference implementation: - - Go intX (>0) and uintX - IS ENCODED AS - msgpack +ve fixnum, unsigned - - Go intX (<0) - IS ENCODED AS - msgpack -ve fixnum, signed - -*/ -package codec - -import ( - "fmt" - "io" - "math" - "net/rpc" - "reflect" -) - -const ( - mpPosFixNumMin byte = 0x00 - mpPosFixNumMax = 0x7f - mpFixMapMin = 0x80 - mpFixMapMax = 0x8f - mpFixArrayMin = 0x90 - mpFixArrayMax = 0x9f - mpFixStrMin = 0xa0 - mpFixStrMax = 0xbf - mpNil = 0xc0 - _ = 0xc1 - mpFalse = 0xc2 - mpTrue = 0xc3 - mpFloat = 0xca - mpDouble = 0xcb - mpUint8 = 0xcc - mpUint16 = 0xcd - mpUint32 = 0xce - mpUint64 = 0xcf - mpInt8 = 0xd0 - mpInt16 = 0xd1 - mpInt32 = 0xd2 - mpInt64 = 0xd3 - - // extensions below - mpBin8 = 0xc4 - mpBin16 = 0xc5 - mpBin32 = 0xc6 - mpExt8 = 0xc7 - mpExt16 = 0xc8 - mpExt32 = 0xc9 - mpFixExt1 = 0xd4 - mpFixExt2 = 0xd5 - mpFixExt4 = 0xd6 - mpFixExt8 = 0xd7 - mpFixExt16 = 0xd8 - - mpStr8 = 0xd9 // new - mpStr16 = 0xda - mpStr32 = 0xdb - - mpArray16 = 0xdc - mpArray32 = 0xdd - - mpMap16 = 0xde - mpMap32 = 0xdf - - mpNegFixNumMin = 0xe0 - mpNegFixNumMax = 0xff -) - -// MsgpackSpecRpcMultiArgs is a special type which signifies to the MsgpackSpecRpcCodec -// that the backend RPC service takes multiple arguments, which have been arranged -// in sequence in the slice. -// -// The Codec then passes it AS-IS to the rpc service (without wrapping it in an -// array of 1 element). -type MsgpackSpecRpcMultiArgs []interface{} - -// A MsgpackContainer type specifies the different types of msgpackContainers. -type msgpackContainerType struct { - fixCutoff int - bFixMin, b8, b16, b32 byte - hasFixMin, has8, has8Always bool -} - -var ( - msgpackContainerStr = msgpackContainerType{32, mpFixStrMin, mpStr8, mpStr16, mpStr32, true, true, false} - msgpackContainerBin = msgpackContainerType{0, 0, mpBin8, mpBin16, mpBin32, false, true, true} - msgpackContainerList = msgpackContainerType{16, mpFixArrayMin, 0, mpArray16, mpArray32, true, false, false} - msgpackContainerMap = msgpackContainerType{16, mpFixMapMin, 0, mpMap16, mpMap32, true, false, false} -) - -//--------------------------------------------- - -type msgpackEncDriver struct { - noBuiltInTypes - encNoSeparator - e *Encoder - w encWriter - h *MsgpackHandle - x [8]byte -} - -func (e *msgpackEncDriver) EncodeNil() { - e.w.writen1(mpNil) -} - -func (e *msgpackEncDriver) EncodeInt(i int64) { - if i >= 0 { - e.EncodeUint(uint64(i)) - } else if i >= -32 { - e.w.writen1(byte(i)) - } else if i >= math.MinInt8 { - e.w.writen2(mpInt8, byte(i)) - } else if i >= math.MinInt16 { - e.w.writen1(mpInt16) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(i)) - } else if i >= math.MinInt32 { - e.w.writen1(mpInt32) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(i)) - } else { - e.w.writen1(mpInt64) - bigenHelper{e.x[:8], e.w}.writeUint64(uint64(i)) - } -} - -func (e *msgpackEncDriver) EncodeUint(i uint64) { - if i <= math.MaxInt8 { - e.w.writen1(byte(i)) - } else if i <= math.MaxUint8 { - e.w.writen2(mpUint8, byte(i)) - } else if i <= math.MaxUint16 { - e.w.writen1(mpUint16) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(i)) - } else if i <= math.MaxUint32 { - e.w.writen1(mpUint32) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(i)) - } else { - e.w.writen1(mpUint64) - bigenHelper{e.x[:8], e.w}.writeUint64(uint64(i)) - } -} - -func (e *msgpackEncDriver) EncodeBool(b bool) { - if b { - e.w.writen1(mpTrue) - } else { - e.w.writen1(mpFalse) - } -} - -func (e *msgpackEncDriver) EncodeFloat32(f float32) { - e.w.writen1(mpFloat) - bigenHelper{e.x[:4], e.w}.writeUint32(math.Float32bits(f)) -} - -func (e *msgpackEncDriver) EncodeFloat64(f float64) { - e.w.writen1(mpDouble) - bigenHelper{e.x[:8], e.w}.writeUint64(math.Float64bits(f)) -} - -func (e *msgpackEncDriver) EncodeExt(v interface{}, xtag uint64, ext Ext, _ *Encoder) { - bs := ext.WriteExt(v) - if bs == nil { - e.EncodeNil() - return - } - if e.h.WriteExt { - e.encodeExtPreamble(uint8(xtag), len(bs)) - e.w.writeb(bs) - } else { - e.EncodeStringBytes(c_RAW, bs) - } -} - -func (e *msgpackEncDriver) EncodeRawExt(re *RawExt, _ *Encoder) { - e.encodeExtPreamble(uint8(re.Tag), len(re.Data)) - e.w.writeb(re.Data) -} - -func (e *msgpackEncDriver) encodeExtPreamble(xtag byte, l int) { - if l == 1 { - e.w.writen2(mpFixExt1, xtag) - } else if l == 2 { - e.w.writen2(mpFixExt2, xtag) - } else if l == 4 { - e.w.writen2(mpFixExt4, xtag) - } else if l == 8 { - e.w.writen2(mpFixExt8, xtag) - } else if l == 16 { - e.w.writen2(mpFixExt16, xtag) - } else if l < 256 { - e.w.writen2(mpExt8, byte(l)) - e.w.writen1(xtag) - } else if l < 65536 { - e.w.writen1(mpExt16) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(l)) - e.w.writen1(xtag) - } else { - e.w.writen1(mpExt32) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(l)) - e.w.writen1(xtag) - } -} - -func (e *msgpackEncDriver) EncodeArrayStart(length int) { - e.writeContainerLen(msgpackContainerList, length) -} - -func (e *msgpackEncDriver) EncodeMapStart(length int) { - e.writeContainerLen(msgpackContainerMap, length) -} - -func (e *msgpackEncDriver) EncodeString(c charEncoding, s string) { - if c == c_RAW && e.h.WriteExt { - e.writeContainerLen(msgpackContainerBin, len(s)) - } else { - e.writeContainerLen(msgpackContainerStr, len(s)) - } - if len(s) > 0 { - e.w.writestr(s) - } -} - -func (e *msgpackEncDriver) EncodeSymbol(v string) { - e.EncodeString(c_UTF8, v) -} - -func (e *msgpackEncDriver) EncodeStringBytes(c charEncoding, bs []byte) { - if c == c_RAW && e.h.WriteExt { - e.writeContainerLen(msgpackContainerBin, len(bs)) - } else { - e.writeContainerLen(msgpackContainerStr, len(bs)) - } - if len(bs) > 0 { - e.w.writeb(bs) - } -} - -func (e *msgpackEncDriver) writeContainerLen(ct msgpackContainerType, l int) { - if ct.hasFixMin && l < ct.fixCutoff { - e.w.writen1(ct.bFixMin | byte(l)) - } else if ct.has8 && l < 256 && (ct.has8Always || e.h.WriteExt) { - e.w.writen2(ct.b8, uint8(l)) - } else if l < 65536 { - e.w.writen1(ct.b16) - bigenHelper{e.x[:2], e.w}.writeUint16(uint16(l)) - } else { - e.w.writen1(ct.b32) - bigenHelper{e.x[:4], e.w}.writeUint32(uint32(l)) - } -} - -//--------------------------------------------- - -type msgpackDecDriver struct { - d *Decoder - r decReader // *Decoder decReader decReaderT - h *MsgpackHandle - b [scratchByteArrayLen]byte - bd byte - bdRead bool - br bool // bytes reader - noBuiltInTypes - noStreamingCodec - decNoSeparator -} - -// Note: This returns either a primitive (int, bool, etc) for non-containers, -// or a containerType, or a specific type denoting nil or extension. -// It is called when a nil interface{} is passed, leaving it up to the DecDriver -// to introspect the stream and decide how best to decode. -// It deciphers the value by looking at the stream first. -func (d *msgpackDecDriver) DecodeNaked() { - if !d.bdRead { - d.readNextBd() - } - bd := d.bd - n := &d.d.n - var decodeFurther bool - - switch bd { - case mpNil: - n.v = valueTypeNil - d.bdRead = false - case mpFalse: - n.v = valueTypeBool - n.b = false - case mpTrue: - n.v = valueTypeBool - n.b = true - - case mpFloat: - n.v = valueTypeFloat - n.f = float64(math.Float32frombits(bigen.Uint32(d.r.readx(4)))) - case mpDouble: - n.v = valueTypeFloat - n.f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) - - case mpUint8: - n.v = valueTypeUint - n.u = uint64(d.r.readn1()) - case mpUint16: - n.v = valueTypeUint - n.u = uint64(bigen.Uint16(d.r.readx(2))) - case mpUint32: - n.v = valueTypeUint - n.u = uint64(bigen.Uint32(d.r.readx(4))) - case mpUint64: - n.v = valueTypeUint - n.u = uint64(bigen.Uint64(d.r.readx(8))) - - case mpInt8: - n.v = valueTypeInt - n.i = int64(int8(d.r.readn1())) - case mpInt16: - n.v = valueTypeInt - n.i = int64(int16(bigen.Uint16(d.r.readx(2)))) - case mpInt32: - n.v = valueTypeInt - n.i = int64(int32(bigen.Uint32(d.r.readx(4)))) - case mpInt64: - n.v = valueTypeInt - n.i = int64(int64(bigen.Uint64(d.r.readx(8)))) - - default: - switch { - case bd >= mpPosFixNumMin && bd <= mpPosFixNumMax: - // positive fixnum (always signed) - n.v = valueTypeInt - n.i = int64(int8(bd)) - case bd >= mpNegFixNumMin && bd <= mpNegFixNumMax: - // negative fixnum - n.v = valueTypeInt - n.i = int64(int8(bd)) - case bd == mpStr8, bd == mpStr16, bd == mpStr32, bd >= mpFixStrMin && bd <= mpFixStrMax: - if d.h.RawToString { - n.v = valueTypeString - n.s = d.DecodeString() - } else { - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - } - case bd == mpBin8, bd == mpBin16, bd == mpBin32: - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - case bd == mpArray16, bd == mpArray32, bd >= mpFixArrayMin && bd <= mpFixArrayMax: - n.v = valueTypeArray - decodeFurther = true - case bd == mpMap16, bd == mpMap32, bd >= mpFixMapMin && bd <= mpFixMapMax: - n.v = valueTypeMap - decodeFurther = true - case bd >= mpFixExt1 && bd <= mpFixExt16, bd >= mpExt8 && bd <= mpExt32: - n.v = valueTypeExt - clen := d.readExtLen() - n.u = uint64(d.r.readn1()) - n.l = d.r.readx(clen) - default: - d.d.errorf("Nil-Deciphered DecodeValue: %s: hex: %x, dec: %d", msgBadDesc, bd, bd) - } - } - if !decodeFurther { - d.bdRead = false - } - if n.v == valueTypeUint && d.h.SignedInteger { - n.v = valueTypeInt - n.i = int64(n.u) - } - return -} - -// int can be decoded from msgpack type: intXXX or uintXXX -func (d *msgpackDecDriver) DecodeInt(bitsize uint8) (i int64) { - if !d.bdRead { - d.readNextBd() - } - switch d.bd { - case mpUint8: - i = int64(uint64(d.r.readn1())) - case mpUint16: - i = int64(uint64(bigen.Uint16(d.r.readx(2)))) - case mpUint32: - i = int64(uint64(bigen.Uint32(d.r.readx(4)))) - case mpUint64: - i = int64(bigen.Uint64(d.r.readx(8))) - case mpInt8: - i = int64(int8(d.r.readn1())) - case mpInt16: - i = int64(int16(bigen.Uint16(d.r.readx(2)))) - case mpInt32: - i = int64(int32(bigen.Uint32(d.r.readx(4)))) - case mpInt64: - i = int64(bigen.Uint64(d.r.readx(8))) - default: - switch { - case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax: - i = int64(int8(d.bd)) - case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax: - i = int64(int8(d.bd)) - default: - d.d.errorf("Unhandled single-byte unsigned integer value: %s: %x", msgBadDesc, d.bd) - return - } - } - // check overflow (logic adapted from std pkg reflect/value.go OverflowUint() - if bitsize > 0 { - if trunc := (i << (64 - bitsize)) >> (64 - bitsize); i != trunc { - d.d.errorf("Overflow int value: %v", i) - return - } - } - d.bdRead = false - return -} - -// uint can be decoded from msgpack type: intXXX or uintXXX -func (d *msgpackDecDriver) DecodeUint(bitsize uint8) (ui uint64) { - if !d.bdRead { - d.readNextBd() - } - switch d.bd { - case mpUint8: - ui = uint64(d.r.readn1()) - case mpUint16: - ui = uint64(bigen.Uint16(d.r.readx(2))) - case mpUint32: - ui = uint64(bigen.Uint32(d.r.readx(4))) - case mpUint64: - ui = bigen.Uint64(d.r.readx(8)) - case mpInt8: - if i := int64(int8(d.r.readn1())); i >= 0 { - ui = uint64(i) - } else { - d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) - return - } - case mpInt16: - if i := int64(int16(bigen.Uint16(d.r.readx(2)))); i >= 0 { - ui = uint64(i) - } else { - d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) - return - } - case mpInt32: - if i := int64(int32(bigen.Uint32(d.r.readx(4)))); i >= 0 { - ui = uint64(i) - } else { - d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) - return - } - case mpInt64: - if i := int64(bigen.Uint64(d.r.readx(8))); i >= 0 { - ui = uint64(i) - } else { - d.d.errorf("Assigning negative signed value: %v, to unsigned type", i) - return - } - default: - switch { - case d.bd >= mpPosFixNumMin && d.bd <= mpPosFixNumMax: - ui = uint64(d.bd) - case d.bd >= mpNegFixNumMin && d.bd <= mpNegFixNumMax: - d.d.errorf("Assigning negative signed value: %v, to unsigned type", int(d.bd)) - return - default: - d.d.errorf("Unhandled single-byte unsigned integer value: %s: %x", msgBadDesc, d.bd) - return - } - } - // check overflow (logic adapted from std pkg reflect/value.go OverflowUint() - if bitsize > 0 { - if trunc := (ui << (64 - bitsize)) >> (64 - bitsize); ui != trunc { - d.d.errorf("Overflow uint value: %v", ui) - return - } - } - d.bdRead = false - return -} - -// float can either be decoded from msgpack type: float, double or intX -func (d *msgpackDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == mpFloat { - f = float64(math.Float32frombits(bigen.Uint32(d.r.readx(4)))) - } else if d.bd == mpDouble { - f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) - } else { - f = float64(d.DecodeInt(0)) - } - if chkOverflow32 && chkOvf.Float32(f) { - d.d.errorf("msgpack: float32 overflow: %v", f) - return - } - d.bdRead = false - return -} - -// bool can be decoded from bool, fixnum 0 or 1. -func (d *msgpackDecDriver) DecodeBool() (b bool) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == mpFalse || d.bd == 0 { - // b = false - } else if d.bd == mpTrue || d.bd == 1 { - b = true - } else { - d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) - return - } - d.bdRead = false - return -} - -func (d *msgpackDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { - if !d.bdRead { - d.readNextBd() - } - var clen int - // ignore isstring. Expect that the bytes may be found from msgpackContainerStr or msgpackContainerBin - if bd := d.bd; bd == mpBin8 || bd == mpBin16 || bd == mpBin32 { - clen = d.readContainerLen(msgpackContainerBin) - } else { - clen = d.readContainerLen(msgpackContainerStr) - } - // println("DecodeBytes: clen: ", clen) - d.bdRead = false - // bytes may be nil, so handle it. if nil, clen=-1. - if clen < 0 { - return nil - } - if zerocopy { - if d.br { - return d.r.readx(clen) - } else if len(bs) == 0 { - bs = d.b[:] - } - } - return decByteSlice(d.r, clen, bs) -} - -func (d *msgpackDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.b[:], true, true)) -} - -func (d *msgpackDecDriver) readNextBd() { - d.bd = d.r.readn1() - d.bdRead = true -} - -func (d *msgpackDecDriver) ContainerType() (vt valueType) { - bd := d.bd - if bd == mpNil { - return valueTypeNil - } else if bd == mpBin8 || bd == mpBin16 || bd == mpBin32 || - (!d.h.RawToString && - (bd == mpStr8 || bd == mpStr16 || bd == mpStr32 || (bd >= mpFixStrMin && bd <= mpFixStrMax))) { - return valueTypeBytes - } else if d.h.RawToString && - (bd == mpStr8 || bd == mpStr16 || bd == mpStr32 || (bd >= mpFixStrMin && bd <= mpFixStrMax)) { - return valueTypeString - } else if bd == mpArray16 || bd == mpArray32 || (bd >= mpFixArrayMin && bd <= mpFixArrayMax) { - return valueTypeArray - } else if bd == mpMap16 || bd == mpMap32 || (bd >= mpFixMapMin && bd <= mpFixMapMax) { - return valueTypeMap - } else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - } - return valueTypeUnset -} - -func (d *msgpackDecDriver) TryDecodeAsNil() (v bool) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == mpNil { - d.bdRead = false - v = true - } - return -} - -func (d *msgpackDecDriver) readContainerLen(ct msgpackContainerType) (clen int) { - bd := d.bd - if bd == mpNil { - clen = -1 // to represent nil - } else if bd == ct.b8 { - clen = int(d.r.readn1()) - } else if bd == ct.b16 { - clen = int(bigen.Uint16(d.r.readx(2))) - } else if bd == ct.b32 { - clen = int(bigen.Uint32(d.r.readx(4))) - } else if (ct.bFixMin & bd) == ct.bFixMin { - clen = int(ct.bFixMin ^ bd) - } else { - d.d.errorf("readContainerLen: %s: hex: %x, decimal: %d", msgBadDesc, bd, bd) - return - } - d.bdRead = false - return -} - -func (d *msgpackDecDriver) ReadMapStart() int { - return d.readContainerLen(msgpackContainerMap) -} - -func (d *msgpackDecDriver) ReadArrayStart() int { - return d.readContainerLen(msgpackContainerList) -} - -func (d *msgpackDecDriver) readExtLen() (clen int) { - switch d.bd { - case mpNil: - clen = -1 // to represent nil - case mpFixExt1: - clen = 1 - case mpFixExt2: - clen = 2 - case mpFixExt4: - clen = 4 - case mpFixExt8: - clen = 8 - case mpFixExt16: - clen = 16 - case mpExt8: - clen = int(d.r.readn1()) - case mpExt16: - clen = int(bigen.Uint16(d.r.readx(2))) - case mpExt32: - clen = int(bigen.Uint32(d.r.readx(4))) - default: - d.d.errorf("decoding ext bytes: found unexpected byte: %x", d.bd) - return - } - return -} - -func (d *msgpackDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { - if xtag > 0xff { - d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) - return - } - realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) - realxtag = uint64(realxtag1) - if ext == nil { - re := rv.(*RawExt) - re.Tag = realxtag - re.Data = detachZeroCopyBytes(d.br, re.Data, xbs) - } else { - ext.ReadExt(rv, xbs) - } - return -} - -func (d *msgpackDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs []byte) { - if !d.bdRead { - d.readNextBd() - } - xbd := d.bd - if xbd == mpBin8 || xbd == mpBin16 || xbd == mpBin32 { - xbs = d.DecodeBytes(nil, false, true) - } else if xbd == mpStr8 || xbd == mpStr16 || xbd == mpStr32 || - (xbd >= mpFixStrMin && xbd <= mpFixStrMax) { - xbs = d.DecodeBytes(nil, true, true) - } else { - clen := d.readExtLen() - xtag = d.r.readn1() - if verifyTag && xtag != tag { - d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) - return - } - xbs = d.r.readx(clen) - } - d.bdRead = false - return -} - -//-------------------------------------------------- - -//MsgpackHandle is a Handle for the Msgpack Schema-Free Encoding Format. -type MsgpackHandle struct { - BasicHandle - - // RawToString controls how raw bytes are decoded into a nil interface{}. - RawToString bool - - // WriteExt flag supports encoding configured extensions with extension tags. - // It also controls whether other elements of the new spec are encoded (ie Str8). - // - // With WriteExt=false, configured extensions are serialized as raw bytes - // and Str8 is not encoded. - // - // A stream can still be decoded into a typed value, provided an appropriate value - // is provided, but the type cannot be inferred from the stream. If no appropriate - // type is provided (e.g. decoding into a nil interface{}), you get back - // a []byte or string based on the setting of RawToString. - WriteExt bool - binaryEncodingType -} - -func (h *MsgpackHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &setExtWrapper{b: ext}) -} - -func (h *MsgpackHandle) newEncDriver(e *Encoder) encDriver { - return &msgpackEncDriver{e: e, w: e.w, h: h} -} - -func (h *MsgpackHandle) newDecDriver(d *Decoder) decDriver { - return &msgpackDecDriver{d: d, r: d.r, h: h, br: d.bytes} -} - -func (e *msgpackEncDriver) reset() { - e.w = e.e.w -} - -func (d *msgpackDecDriver) reset() { - d.r = d.d.r - d.bd, d.bdRead = 0, false -} - -//-------------------------------------------------- - -type msgpackSpecRpcCodec struct { - rpcCodec -} - -// /////////////// Spec RPC Codec /////////////////// -func (c *msgpackSpecRpcCodec) WriteRequest(r *rpc.Request, body interface{}) error { - // WriteRequest can write to both a Go service, and other services that do - // not abide by the 1 argument rule of a Go service. - // We discriminate based on if the body is a MsgpackSpecRpcMultiArgs - var bodyArr []interface{} - if m, ok := body.(MsgpackSpecRpcMultiArgs); ok { - bodyArr = ([]interface{})(m) - } else { - bodyArr = []interface{}{body} - } - r2 := []interface{}{0, uint32(r.Seq), r.ServiceMethod, bodyArr} - return c.write(r2, nil, false, true) -} - -func (c *msgpackSpecRpcCodec) WriteResponse(r *rpc.Response, body interface{}) error { - var moe interface{} - if r.Error != "" { - moe = r.Error - } - if moe != nil && body != nil { - body = nil - } - r2 := []interface{}{1, uint32(r.Seq), moe, body} - return c.write(r2, nil, false, true) -} - -func (c *msgpackSpecRpcCodec) ReadResponseHeader(r *rpc.Response) error { - return c.parseCustomHeader(1, &r.Seq, &r.Error) -} - -func (c *msgpackSpecRpcCodec) ReadRequestHeader(r *rpc.Request) error { - return c.parseCustomHeader(0, &r.Seq, &r.ServiceMethod) -} - -func (c *msgpackSpecRpcCodec) ReadRequestBody(body interface{}) error { - if body == nil { // read and discard - return c.read(nil) - } - bodyArr := []interface{}{body} - return c.read(&bodyArr) -} - -func (c *msgpackSpecRpcCodec) parseCustomHeader(expectTypeByte byte, msgid *uint64, methodOrError *string) (err error) { - - if c.isClosed() { - return io.EOF - } - - // We read the response header by hand - // so that the body can be decoded on its own from the stream at a later time. - - const fia byte = 0x94 //four item array descriptor value - // Not sure why the panic of EOF is swallowed above. - // if bs1 := c.dec.r.readn1(); bs1 != fia { - // err = fmt.Errorf("Unexpected value for array descriptor: Expecting %v. Received %v", fia, bs1) - // return - // } - var b byte - b, err = c.br.ReadByte() - if err != nil { - return - } - if b != fia { - err = fmt.Errorf("Unexpected value for array descriptor: Expecting %v. Received %v", fia, b) - return - } - - if err = c.read(&b); err != nil { - return - } - if b != expectTypeByte { - err = fmt.Errorf("Unexpected byte descriptor in header. Expecting %v. Received %v", expectTypeByte, b) - return - } - if err = c.read(msgid); err != nil { - return - } - if err = c.read(methodOrError); err != nil { - return - } - return -} - -//-------------------------------------------------- - -// msgpackSpecRpc is the implementation of Rpc that uses custom communication protocol -// as defined in the msgpack spec at https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md -type msgpackSpecRpc struct{} - -// MsgpackSpecRpc implements Rpc using the communication protocol defined in -// the msgpack spec at https://github.com/msgpack-rpc/msgpack-rpc/blob/master/spec.md . -// Its methods (ServerCodec and ClientCodec) return values that implement RpcCodecBuffered. -var MsgpackSpecRpc msgpackSpecRpc - -func (x msgpackSpecRpc) ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec { - return &msgpackSpecRpcCodec{newRPCCodec(conn, h)} -} - -func (x msgpackSpecRpc) ClientCodec(conn io.ReadWriteCloser, h Handle) rpc.ClientCodec { - return &msgpackSpecRpcCodec{newRPCCodec(conn, h)} -} - -var _ decDriver = (*msgpackDecDriver)(nil) -var _ encDriver = (*msgpackEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/noop.go b/vendor/github.com/ugorji/go/codec/noop.go deleted file mode 100644 index cfee3d084dc2..000000000000 --- a/vendor/github.com/ugorji/go/codec/noop.go +++ /dev/null @@ -1,213 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "math/rand" - "time" -) - -// NoopHandle returns a no-op handle. It basically does nothing. -// It is only useful for benchmarking, as it gives an idea of the -// overhead from the codec framework. -// -// LIBRARY USERS: *** DO NOT USE *** -func NoopHandle(slen int) *noopHandle { - h := noopHandle{} - h.rand = rand.New(rand.NewSource(time.Now().UnixNano())) - h.B = make([][]byte, slen) - h.S = make([]string, slen) - for i := 0; i < len(h.S); i++ { - b := make([]byte, i+1) - for j := 0; j < len(b); j++ { - b[j] = 'a' + byte(i) - } - h.B[i] = b - h.S[i] = string(b) - } - return &h -} - -// noopHandle does nothing. -// It is used to simulate the overhead of the codec framework. -type noopHandle struct { - BasicHandle - binaryEncodingType - noopDrv // noopDrv is unexported here, so we can get a copy of it when needed. -} - -type noopDrv struct { - d *Decoder - e *Encoder - i int - S []string - B [][]byte - mks []bool // stack. if map (true), else if array (false) - mk bool // top of stack. what container are we on? map or array? - ct valueType // last response for IsContainerType. - cb int // counter for ContainerType - rand *rand.Rand -} - -func (h *noopDrv) r(v int) int { return h.rand.Intn(v) } -func (h *noopDrv) m(v int) int { h.i++; return h.i % v } - -func (h *noopDrv) newEncDriver(e *Encoder) encDriver { h.e = e; return h } -func (h *noopDrv) newDecDriver(d *Decoder) decDriver { h.d = d; return h } - -func (h *noopDrv) reset() {} -func (h *noopDrv) uncacheRead() {} - -// --- encDriver - -// stack functions (for map and array) -func (h *noopDrv) start(b bool) { - // println("start", len(h.mks)+1) - h.mks = append(h.mks, b) - h.mk = b -} -func (h *noopDrv) end() { - // println("end: ", len(h.mks)-1) - h.mks = h.mks[:len(h.mks)-1] - if len(h.mks) > 0 { - h.mk = h.mks[len(h.mks)-1] - } else { - h.mk = false - } -} - -func (h *noopDrv) EncodeBuiltin(rt uintptr, v interface{}) {} -func (h *noopDrv) EncodeNil() {} -func (h *noopDrv) EncodeInt(i int64) {} -func (h *noopDrv) EncodeUint(i uint64) {} -func (h *noopDrv) EncodeBool(b bool) {} -func (h *noopDrv) EncodeFloat32(f float32) {} -func (h *noopDrv) EncodeFloat64(f float64) {} -func (h *noopDrv) EncodeRawExt(re *RawExt, e *Encoder) {} -func (h *noopDrv) EncodeArrayStart(length int) { h.start(true) } -func (h *noopDrv) EncodeMapStart(length int) { h.start(false) } -func (h *noopDrv) EncodeEnd() { h.end() } - -func (h *noopDrv) EncodeString(c charEncoding, v string) {} -func (h *noopDrv) EncodeSymbol(v string) {} -func (h *noopDrv) EncodeStringBytes(c charEncoding, v []byte) {} - -func (h *noopDrv) EncodeExt(rv interface{}, xtag uint64, ext Ext, e *Encoder) {} - -// ---- decDriver -func (h *noopDrv) initReadNext() {} -func (h *noopDrv) CheckBreak() bool { return false } -func (h *noopDrv) IsBuiltinType(rt uintptr) bool { return false } -func (h *noopDrv) DecodeBuiltin(rt uintptr, v interface{}) {} -func (h *noopDrv) DecodeInt(bitsize uint8) (i int64) { return int64(h.m(15)) } -func (h *noopDrv) DecodeUint(bitsize uint8) (ui uint64) { return uint64(h.m(35)) } -func (h *noopDrv) DecodeFloat(chkOverflow32 bool) (f float64) { return float64(h.m(95)) } -func (h *noopDrv) DecodeBool() (b bool) { return h.m(2) == 0 } -func (h *noopDrv) DecodeString() (s string) { return h.S[h.m(8)] } - -// func (h *noopDrv) DecodeStringAsBytes(bs []byte) []byte { return h.DecodeBytes(bs) } - -func (h *noopDrv) DecodeBytes(bs []byte, isstring, zerocopy bool) []byte { return h.B[h.m(len(h.B))] } - -func (h *noopDrv) ReadEnd() { h.end() } - -// toggle map/slice -func (h *noopDrv) ReadMapStart() int { h.start(true); return h.m(10) } -func (h *noopDrv) ReadArrayStart() int { h.start(false); return h.m(10) } - -func (h *noopDrv) ContainerType() (vt valueType) { - // return h.m(2) == 0 - // handle kStruct, which will bomb is it calls this and doesn't get back a map or array. - // consequently, if the return value is not map or array, reset it to one of them based on h.m(7) % 2 - // for kstruct: at least one out of every 2 times, return one of valueTypeMap or Array (else kstruct bombs) - // however, every 10th time it is called, we just return something else. - var vals = [...]valueType{valueTypeArray, valueTypeMap} - // ------------ TAKE ------------ - // if h.cb%2 == 0 { - // if h.ct == valueTypeMap || h.ct == valueTypeArray { - // } else { - // h.ct = vals[h.m(2)] - // } - // } else if h.cb%5 == 0 { - // h.ct = valueType(h.m(8)) - // } else { - // h.ct = vals[h.m(2)] - // } - // ------------ TAKE ------------ - // if h.cb%16 == 0 { - // h.ct = valueType(h.cb % 8) - // } else { - // h.ct = vals[h.cb%2] - // } - h.ct = vals[h.cb%2] - h.cb++ - return h.ct - - // if h.ct == valueTypeNil || h.ct == valueTypeString || h.ct == valueTypeBytes { - // return h.ct - // } - // return valueTypeUnset - // TODO: may need to tweak this so it works. - // if h.ct == valueTypeMap && vt == valueTypeArray || h.ct == valueTypeArray && vt == valueTypeMap { - // h.cb = !h.cb - // h.ct = vt - // return h.cb - // } - // // go in a loop and check it. - // h.ct = vt - // h.cb = h.m(7) == 0 - // return h.cb -} -func (h *noopDrv) TryDecodeAsNil() bool { - if h.mk { - return false - } else { - return h.m(8) == 0 - } -} -func (h *noopDrv) DecodeExt(rv interface{}, xtag uint64, ext Ext) uint64 { - return 0 -} - -func (h *noopDrv) DecodeNaked() { - // use h.r (random) not h.m() because h.m() could cause the same value to be given. - var sk int - if h.mk { - // if mapkey, do not support values of nil OR bytes, array, map or rawext - sk = h.r(7) + 1 - } else { - sk = h.r(12) - } - n := &h.d.n - switch sk { - case 0: - n.v = valueTypeNil - case 1: - n.v, n.b = valueTypeBool, false - case 2: - n.v, n.b = valueTypeBool, true - case 3: - n.v, n.i = valueTypeInt, h.DecodeInt(64) - case 4: - n.v, n.u = valueTypeUint, h.DecodeUint(64) - case 5: - n.v, n.f = valueTypeFloat, h.DecodeFloat(true) - case 6: - n.v, n.f = valueTypeFloat, h.DecodeFloat(false) - case 7: - n.v, n.s = valueTypeString, h.DecodeString() - case 8: - n.v, n.l = valueTypeBytes, h.B[h.m(len(h.B))] - case 9: - n.v = valueTypeArray - case 10: - n.v = valueTypeMap - default: - n.v = valueTypeExt - n.u = h.DecodeUint(64) - n.l = h.B[h.m(len(h.B))] - } - h.ct = n.v - return -} diff --git a/vendor/github.com/ugorji/go/codec/prebuild.go b/vendor/github.com/ugorji/go/codec/prebuild.go deleted file mode 100644 index 2353263e88af..000000000000 --- a/vendor/github.com/ugorji/go/codec/prebuild.go +++ /dev/null @@ -1,3 +0,0 @@ -package codec - -//go:generate bash prebuild.sh diff --git a/vendor/github.com/ugorji/go/codec/rpc.go b/vendor/github.com/ugorji/go/codec/rpc.go deleted file mode 100644 index dad53d0c61e6..000000000000 --- a/vendor/github.com/ugorji/go/codec/rpc.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "bufio" - "io" - "net/rpc" - "sync" -) - -// rpcEncodeTerminator allows a handler specify a []byte terminator to send after each Encode. -// -// Some codecs like json need to put a space after each encoded value, to serve as a -// delimiter for things like numbers (else json codec will continue reading till EOF). -type rpcEncodeTerminator interface { - rpcEncodeTerminate() []byte -} - -// Rpc provides a rpc Server or Client Codec for rpc communication. -type Rpc interface { - ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec - ClientCodec(conn io.ReadWriteCloser, h Handle) rpc.ClientCodec -} - -// RpcCodecBuffered allows access to the underlying bufio.Reader/Writer -// used by the rpc connection. It accomodates use-cases where the connection -// should be used by rpc and non-rpc functions, e.g. streaming a file after -// sending an rpc response. -type RpcCodecBuffered interface { - BufferedReader() *bufio.Reader - BufferedWriter() *bufio.Writer -} - -// ------------------------------------- - -// rpcCodec defines the struct members and common methods. -type rpcCodec struct { - rwc io.ReadWriteCloser - dec *Decoder - enc *Encoder - bw *bufio.Writer - br *bufio.Reader - mu sync.Mutex - h Handle - - cls bool - clsmu sync.RWMutex -} - -func newRPCCodec(conn io.ReadWriteCloser, h Handle) rpcCodec { - bw := bufio.NewWriter(conn) - br := bufio.NewReader(conn) - return rpcCodec{ - rwc: conn, - bw: bw, - br: br, - enc: NewEncoder(bw, h), - dec: NewDecoder(br, h), - h: h, - } -} - -func (c *rpcCodec) BufferedReader() *bufio.Reader { - return c.br -} - -func (c *rpcCodec) BufferedWriter() *bufio.Writer { - return c.bw -} - -func (c *rpcCodec) write(obj1, obj2 interface{}, writeObj2, doFlush bool) (err error) { - if c.isClosed() { - return io.EOF - } - if err = c.enc.Encode(obj1); err != nil { - return - } - t, tOk := c.h.(rpcEncodeTerminator) - if tOk { - c.bw.Write(t.rpcEncodeTerminate()) - } - if writeObj2 { - if err = c.enc.Encode(obj2); err != nil { - return - } - if tOk { - c.bw.Write(t.rpcEncodeTerminate()) - } - } - if doFlush { - return c.bw.Flush() - } - return -} - -func (c *rpcCodec) read(obj interface{}) (err error) { - if c.isClosed() { - return io.EOF - } - //If nil is passed in, we should still attempt to read content to nowhere. - if obj == nil { - var obj2 interface{} - return c.dec.Decode(&obj2) - } - return c.dec.Decode(obj) -} - -func (c *rpcCodec) isClosed() bool { - c.clsmu.RLock() - x := c.cls - c.clsmu.RUnlock() - return x -} - -func (c *rpcCodec) Close() error { - if c.isClosed() { - return io.EOF - } - c.clsmu.Lock() - c.cls = true - c.clsmu.Unlock() - return c.rwc.Close() -} - -func (c *rpcCodec) ReadResponseBody(body interface{}) error { - return c.read(body) -} - -// ------------------------------------- - -type goRpcCodec struct { - rpcCodec -} - -func (c *goRpcCodec) WriteRequest(r *rpc.Request, body interface{}) error { - // Must protect for concurrent access as per API - c.mu.Lock() - defer c.mu.Unlock() - return c.write(r, body, true, true) -} - -func (c *goRpcCodec) WriteResponse(r *rpc.Response, body interface{}) error { - c.mu.Lock() - defer c.mu.Unlock() - return c.write(r, body, true, true) -} - -func (c *goRpcCodec) ReadResponseHeader(r *rpc.Response) error { - return c.read(r) -} - -func (c *goRpcCodec) ReadRequestHeader(r *rpc.Request) error { - return c.read(r) -} - -func (c *goRpcCodec) ReadRequestBody(body interface{}) error { - return c.read(body) -} - -// ------------------------------------- - -// goRpc is the implementation of Rpc that uses the communication protocol -// as defined in net/rpc package. -type goRpc struct{} - -// GoRpc implements Rpc using the communication protocol defined in net/rpc package. -// Its methods (ServerCodec and ClientCodec) return values that implement RpcCodecBuffered. -var GoRpc goRpc - -func (x goRpc) ServerCodec(conn io.ReadWriteCloser, h Handle) rpc.ServerCodec { - return &goRpcCodec{newRPCCodec(conn, h)} -} - -func (x goRpc) ClientCodec(conn io.ReadWriteCloser, h Handle) rpc.ClientCodec { - return &goRpcCodec{newRPCCodec(conn, h)} -} - -var _ RpcCodecBuffered = (*rpcCodec)(nil) // ensure *rpcCodec implements RpcCodecBuffered diff --git a/vendor/github.com/ugorji/go/codec/simple.go b/vendor/github.com/ugorji/go/codec/simple.go deleted file mode 100644 index 7c0ba7affc77..000000000000 --- a/vendor/github.com/ugorji/go/codec/simple.go +++ /dev/null @@ -1,519 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "math" - "reflect" -) - -const ( - _ uint8 = iota - simpleVdNil = 1 - simpleVdFalse = 2 - simpleVdTrue = 3 - simpleVdFloat32 = 4 - simpleVdFloat64 = 5 - - // each lasts for 4 (ie n, n+1, n+2, n+3) - simpleVdPosInt = 8 - simpleVdNegInt = 12 - - // containers: each lasts for 4 (ie n, n+1, n+2, ... n+7) - simpleVdString = 216 - simpleVdByteArray = 224 - simpleVdArray = 232 - simpleVdMap = 240 - simpleVdExt = 248 -) - -type simpleEncDriver struct { - noBuiltInTypes - encNoSeparator - e *Encoder - h *SimpleHandle - w encWriter - b [8]byte -} - -func (e *simpleEncDriver) EncodeNil() { - e.w.writen1(simpleVdNil) -} - -func (e *simpleEncDriver) EncodeBool(b bool) { - if b { - e.w.writen1(simpleVdTrue) - } else { - e.w.writen1(simpleVdFalse) - } -} - -func (e *simpleEncDriver) EncodeFloat32(f float32) { - e.w.writen1(simpleVdFloat32) - bigenHelper{e.b[:4], e.w}.writeUint32(math.Float32bits(f)) -} - -func (e *simpleEncDriver) EncodeFloat64(f float64) { - e.w.writen1(simpleVdFloat64) - bigenHelper{e.b[:8], e.w}.writeUint64(math.Float64bits(f)) -} - -func (e *simpleEncDriver) EncodeInt(v int64) { - if v < 0 { - e.encUint(uint64(-v), simpleVdNegInt) - } else { - e.encUint(uint64(v), simpleVdPosInt) - } -} - -func (e *simpleEncDriver) EncodeUint(v uint64) { - e.encUint(v, simpleVdPosInt) -} - -func (e *simpleEncDriver) encUint(v uint64, bd uint8) { - if v <= math.MaxUint8 { - e.w.writen2(bd, uint8(v)) - } else if v <= math.MaxUint16 { - e.w.writen1(bd + 1) - bigenHelper{e.b[:2], e.w}.writeUint16(uint16(v)) - } else if v <= math.MaxUint32 { - e.w.writen1(bd + 2) - bigenHelper{e.b[:4], e.w}.writeUint32(uint32(v)) - } else { // if v <= math.MaxUint64 { - e.w.writen1(bd + 3) - bigenHelper{e.b[:8], e.w}.writeUint64(v) - } -} - -func (e *simpleEncDriver) encLen(bd byte, length int) { - if length == 0 { - e.w.writen1(bd) - } else if length <= math.MaxUint8 { - e.w.writen1(bd + 1) - e.w.writen1(uint8(length)) - } else if length <= math.MaxUint16 { - e.w.writen1(bd + 2) - bigenHelper{e.b[:2], e.w}.writeUint16(uint16(length)) - } else if int64(length) <= math.MaxUint32 { - e.w.writen1(bd + 3) - bigenHelper{e.b[:4], e.w}.writeUint32(uint32(length)) - } else { - e.w.writen1(bd + 4) - bigenHelper{e.b[:8], e.w}.writeUint64(uint64(length)) - } -} - -func (e *simpleEncDriver) EncodeExt(rv interface{}, xtag uint64, ext Ext, _ *Encoder) { - bs := ext.WriteExt(rv) - if bs == nil { - e.EncodeNil() - return - } - e.encodeExtPreamble(uint8(xtag), len(bs)) - e.w.writeb(bs) -} - -func (e *simpleEncDriver) EncodeRawExt(re *RawExt, _ *Encoder) { - e.encodeExtPreamble(uint8(re.Tag), len(re.Data)) - e.w.writeb(re.Data) -} - -func (e *simpleEncDriver) encodeExtPreamble(xtag byte, length int) { - e.encLen(simpleVdExt, length) - e.w.writen1(xtag) -} - -func (e *simpleEncDriver) EncodeArrayStart(length int) { - e.encLen(simpleVdArray, length) -} - -func (e *simpleEncDriver) EncodeMapStart(length int) { - e.encLen(simpleVdMap, length) -} - -func (e *simpleEncDriver) EncodeString(c charEncoding, v string) { - e.encLen(simpleVdString, len(v)) - e.w.writestr(v) -} - -func (e *simpleEncDriver) EncodeSymbol(v string) { - e.EncodeString(c_UTF8, v) -} - -func (e *simpleEncDriver) EncodeStringBytes(c charEncoding, v []byte) { - e.encLen(simpleVdByteArray, len(v)) - e.w.writeb(v) -} - -//------------------------------------ - -type simpleDecDriver struct { - d *Decoder - h *SimpleHandle - r decReader - bdRead bool - bd byte - br bool // bytes reader - noBuiltInTypes - noStreamingCodec - decNoSeparator - b [scratchByteArrayLen]byte -} - -func (d *simpleDecDriver) readNextBd() { - d.bd = d.r.readn1() - d.bdRead = true -} - -func (d *simpleDecDriver) ContainerType() (vt valueType) { - if d.bd == simpleVdNil { - return valueTypeNil - } else if d.bd == simpleVdByteArray || d.bd == simpleVdByteArray+1 || - d.bd == simpleVdByteArray+2 || d.bd == simpleVdByteArray+3 || d.bd == simpleVdByteArray+4 { - return valueTypeBytes - } else if d.bd == simpleVdString || d.bd == simpleVdString+1 || - d.bd == simpleVdString+2 || d.bd == simpleVdString+3 || d.bd == simpleVdString+4 { - return valueTypeString - } else if d.bd == simpleVdArray || d.bd == simpleVdArray+1 || - d.bd == simpleVdArray+2 || d.bd == simpleVdArray+3 || d.bd == simpleVdArray+4 { - return valueTypeArray - } else if d.bd == simpleVdMap || d.bd == simpleVdMap+1 || - d.bd == simpleVdMap+2 || d.bd == simpleVdMap+3 || d.bd == simpleVdMap+4 { - return valueTypeMap - } else { - // d.d.errorf("isContainerType: unsupported parameter: %v", vt) - } - return valueTypeUnset -} - -func (d *simpleDecDriver) TryDecodeAsNil() bool { - if !d.bdRead { - d.readNextBd() - } - if d.bd == simpleVdNil { - d.bdRead = false - return true - } - return false -} - -func (d *simpleDecDriver) decCheckInteger() (ui uint64, neg bool) { - if !d.bdRead { - d.readNextBd() - } - switch d.bd { - case simpleVdPosInt: - ui = uint64(d.r.readn1()) - case simpleVdPosInt + 1: - ui = uint64(bigen.Uint16(d.r.readx(2))) - case simpleVdPosInt + 2: - ui = uint64(bigen.Uint32(d.r.readx(4))) - case simpleVdPosInt + 3: - ui = uint64(bigen.Uint64(d.r.readx(8))) - case simpleVdNegInt: - ui = uint64(d.r.readn1()) - neg = true - case simpleVdNegInt + 1: - ui = uint64(bigen.Uint16(d.r.readx(2))) - neg = true - case simpleVdNegInt + 2: - ui = uint64(bigen.Uint32(d.r.readx(4))) - neg = true - case simpleVdNegInt + 3: - ui = uint64(bigen.Uint64(d.r.readx(8))) - neg = true - default: - d.d.errorf("decIntAny: Integer only valid from pos/neg integer1..8. Invalid descriptor: %v", d.bd) - return - } - // don't do this check, because callers may only want the unsigned value. - // if ui > math.MaxInt64 { - // d.d.errorf("decIntAny: Integer out of range for signed int64: %v", ui) - // return - // } - return -} - -func (d *simpleDecDriver) DecodeInt(bitsize uint8) (i int64) { - ui, neg := d.decCheckInteger() - i, overflow := chkOvf.SignedInt(ui) - if overflow { - d.d.errorf("simple: overflow converting %v to signed integer", ui) - return - } - if neg { - i = -i - } - if chkOvf.Int(i, bitsize) { - d.d.errorf("simple: overflow integer: %v", i) - return - } - d.bdRead = false - return -} - -func (d *simpleDecDriver) DecodeUint(bitsize uint8) (ui uint64) { - ui, neg := d.decCheckInteger() - if neg { - d.d.errorf("Assigning negative signed value to unsigned type") - return - } - if chkOvf.Uint(ui, bitsize) { - d.d.errorf("simple: overflow integer: %v", ui) - return - } - d.bdRead = false - return -} - -func (d *simpleDecDriver) DecodeFloat(chkOverflow32 bool) (f float64) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == simpleVdFloat32 { - f = float64(math.Float32frombits(bigen.Uint32(d.r.readx(4)))) - } else if d.bd == simpleVdFloat64 { - f = math.Float64frombits(bigen.Uint64(d.r.readx(8))) - } else { - if d.bd >= simpleVdPosInt && d.bd <= simpleVdNegInt+3 { - f = float64(d.DecodeInt(64)) - } else { - d.d.errorf("Float only valid from float32/64: Invalid descriptor: %v", d.bd) - return - } - } - if chkOverflow32 && chkOvf.Float32(f) { - d.d.errorf("msgpack: float32 overflow: %v", f) - return - } - d.bdRead = false - return -} - -// bool can be decoded from bool only (single byte). -func (d *simpleDecDriver) DecodeBool() (b bool) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == simpleVdTrue { - b = true - } else if d.bd == simpleVdFalse { - } else { - d.d.errorf("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd) - return - } - d.bdRead = false - return -} - -func (d *simpleDecDriver) ReadMapStart() (length int) { - d.bdRead = false - return d.decLen() -} - -func (d *simpleDecDriver) ReadArrayStart() (length int) { - d.bdRead = false - return d.decLen() -} - -func (d *simpleDecDriver) decLen() int { - switch d.bd % 8 { - case 0: - return 0 - case 1: - return int(d.r.readn1()) - case 2: - return int(bigen.Uint16(d.r.readx(2))) - case 3: - ui := uint64(bigen.Uint32(d.r.readx(4))) - if chkOvf.Uint(ui, intBitsize) { - d.d.errorf("simple: overflow integer: %v", ui) - return 0 - } - return int(ui) - case 4: - ui := bigen.Uint64(d.r.readx(8)) - if chkOvf.Uint(ui, intBitsize) { - d.d.errorf("simple: overflow integer: %v", ui) - return 0 - } - return int(ui) - } - d.d.errorf("decLen: Cannot read length: bd%8 must be in range 0..4. Got: %d", d.bd%8) - return -1 -} - -func (d *simpleDecDriver) DecodeString() (s string) { - return string(d.DecodeBytes(d.b[:], true, true)) -} - -func (d *simpleDecDriver) DecodeBytes(bs []byte, isstring, zerocopy bool) (bsOut []byte) { - if !d.bdRead { - d.readNextBd() - } - if d.bd == simpleVdNil { - d.bdRead = false - return - } - clen := d.decLen() - d.bdRead = false - if zerocopy { - if d.br { - return d.r.readx(clen) - } else if len(bs) == 0 { - bs = d.b[:] - } - } - return decByteSlice(d.r, clen, bs) -} - -func (d *simpleDecDriver) DecodeExt(rv interface{}, xtag uint64, ext Ext) (realxtag uint64) { - if xtag > 0xff { - d.d.errorf("decodeExt: tag must be <= 0xff; got: %v", xtag) - return - } - realxtag1, xbs := d.decodeExtV(ext != nil, uint8(xtag)) - realxtag = uint64(realxtag1) - if ext == nil { - re := rv.(*RawExt) - re.Tag = realxtag - re.Data = detachZeroCopyBytes(d.br, re.Data, xbs) - } else { - ext.ReadExt(rv, xbs) - } - return -} - -func (d *simpleDecDriver) decodeExtV(verifyTag bool, tag byte) (xtag byte, xbs []byte) { - if !d.bdRead { - d.readNextBd() - } - switch d.bd { - case simpleVdExt, simpleVdExt + 1, simpleVdExt + 2, simpleVdExt + 3, simpleVdExt + 4: - l := d.decLen() - xtag = d.r.readn1() - if verifyTag && xtag != tag { - d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", xtag, tag) - return - } - xbs = d.r.readx(l) - case simpleVdByteArray, simpleVdByteArray + 1, simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: - xbs = d.DecodeBytes(nil, false, true) - default: - d.d.errorf("Invalid d.bd for extensions (Expecting extensions or byte array). Got: 0x%x", d.bd) - return - } - d.bdRead = false - return -} - -func (d *simpleDecDriver) DecodeNaked() { - if !d.bdRead { - d.readNextBd() - } - - n := &d.d.n - var decodeFurther bool - - switch d.bd { - case simpleVdNil: - n.v = valueTypeNil - case simpleVdFalse: - n.v = valueTypeBool - n.b = false - case simpleVdTrue: - n.v = valueTypeBool - n.b = true - case simpleVdPosInt, simpleVdPosInt + 1, simpleVdPosInt + 2, simpleVdPosInt + 3: - if d.h.SignedInteger { - n.v = valueTypeInt - n.i = d.DecodeInt(64) - } else { - n.v = valueTypeUint - n.u = d.DecodeUint(64) - } - case simpleVdNegInt, simpleVdNegInt + 1, simpleVdNegInt + 2, simpleVdNegInt + 3: - n.v = valueTypeInt - n.i = d.DecodeInt(64) - case simpleVdFloat32: - n.v = valueTypeFloat - n.f = d.DecodeFloat(true) - case simpleVdFloat64: - n.v = valueTypeFloat - n.f = d.DecodeFloat(false) - case simpleVdString, simpleVdString + 1, simpleVdString + 2, simpleVdString + 3, simpleVdString + 4: - n.v = valueTypeString - n.s = d.DecodeString() - case simpleVdByteArray, simpleVdByteArray + 1, simpleVdByteArray + 2, simpleVdByteArray + 3, simpleVdByteArray + 4: - n.v = valueTypeBytes - n.l = d.DecodeBytes(nil, false, false) - case simpleVdExt, simpleVdExt + 1, simpleVdExt + 2, simpleVdExt + 3, simpleVdExt + 4: - n.v = valueTypeExt - l := d.decLen() - n.u = uint64(d.r.readn1()) - n.l = d.r.readx(l) - case simpleVdArray, simpleVdArray + 1, simpleVdArray + 2, simpleVdArray + 3, simpleVdArray + 4: - n.v = valueTypeArray - decodeFurther = true - case simpleVdMap, simpleVdMap + 1, simpleVdMap + 2, simpleVdMap + 3, simpleVdMap + 4: - n.v = valueTypeMap - decodeFurther = true - default: - d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd) - } - - if !decodeFurther { - d.bdRead = false - } - return -} - -//------------------------------------ - -// SimpleHandle is a Handle for a very simple encoding format. -// -// simple is a simplistic codec similar to binc, but not as compact. -// - Encoding of a value is always preceeded by the descriptor byte (bd) -// - True, false, nil are encoded fully in 1 byte (the descriptor) -// - Integers (intXXX, uintXXX) are encoded in 1, 2, 4 or 8 bytes (plus a descriptor byte). -// There are positive (uintXXX and intXXX >= 0) and negative (intXXX < 0) integers. -// - Floats are encoded in 4 or 8 bytes (plus a descriptor byte) -// - Lenght of containers (strings, bytes, array, map, extensions) -// are encoded in 0, 1, 2, 4 or 8 bytes. -// Zero-length containers have no length encoded. -// For others, the number of bytes is given by pow(2, bd%3) -// - maps are encoded as [bd] [length] [[key][value]]... -// - arrays are encoded as [bd] [length] [value]... -// - extensions are encoded as [bd] [length] [tag] [byte]... -// - strings/bytearrays are encoded as [bd] [length] [byte]... -// -// The full spec will be published soon. -type SimpleHandle struct { - BasicHandle - binaryEncodingType -} - -func (h *SimpleHandle) SetBytesExt(rt reflect.Type, tag uint64, ext BytesExt) (err error) { - return h.SetExt(rt, tag, &setExtWrapper{b: ext}) -} - -func (h *SimpleHandle) newEncDriver(e *Encoder) encDriver { - return &simpleEncDriver{e: e, w: e.w, h: h} -} - -func (h *SimpleHandle) newDecDriver(d *Decoder) decDriver { - return &simpleDecDriver{d: d, r: d.r, h: h, br: d.bytes} -} - -func (e *simpleEncDriver) reset() { - e.w = e.e.w -} - -func (d *simpleDecDriver) reset() { - d.r = d.d.r - d.bd, d.bdRead = 0, false -} - -var _ decDriver = (*simpleDecDriver)(nil) -var _ encDriver = (*simpleEncDriver)(nil) diff --git a/vendor/github.com/ugorji/go/codec/time.go b/vendor/github.com/ugorji/go/codec/time.go deleted file mode 100644 index 718b731ec580..000000000000 --- a/vendor/github.com/ugorji/go/codec/time.go +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved. -// Use of this source code is governed by a MIT license found in the LICENSE file. - -package codec - -import ( - "fmt" - "reflect" - "time" -) - -var ( - timeDigits = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} - timeExtEncFn = func(rv reflect.Value) (bs []byte, err error) { - defer panicToErr(&err) - bs = timeExt{}.WriteExt(rv.Interface()) - return - } - timeExtDecFn = func(rv reflect.Value, bs []byte) (err error) { - defer panicToErr(&err) - timeExt{}.ReadExt(rv.Interface(), bs) - return - } -) - -type timeExt struct{} - -func (x timeExt) WriteExt(v interface{}) (bs []byte) { - switch v2 := v.(type) { - case time.Time: - bs = encodeTime(v2) - case *time.Time: - bs = encodeTime(*v2) - default: - panic(fmt.Errorf("unsupported format for time conversion: expecting time.Time; got %T", v2)) - } - return -} -func (x timeExt) ReadExt(v interface{}, bs []byte) { - tt, err := decodeTime(bs) - if err != nil { - panic(err) - } - *(v.(*time.Time)) = tt -} - -func (x timeExt) ConvertExt(v interface{}) interface{} { - return x.WriteExt(v) -} -func (x timeExt) UpdateExt(v interface{}, src interface{}) { - x.ReadExt(v, src.([]byte)) -} - -// EncodeTime encodes a time.Time as a []byte, including -// information on the instant in time and UTC offset. -// -// Format Description -// -// A timestamp is composed of 3 components: -// -// - secs: signed integer representing seconds since unix epoch -// - nsces: unsigned integer representing fractional seconds as a -// nanosecond offset within secs, in the range 0 <= nsecs < 1e9 -// - tz: signed integer representing timezone offset in minutes east of UTC, -// and a dst (daylight savings time) flag -// -// When encoding a timestamp, the first byte is the descriptor, which -// defines which components are encoded and how many bytes are used to -// encode secs and nsecs components. *If secs/nsecs is 0 or tz is UTC, it -// is not encoded in the byte array explicitly*. -// -// Descriptor 8 bits are of the form `A B C DDD EE`: -// A: Is secs component encoded? 1 = true -// B: Is nsecs component encoded? 1 = true -// C: Is tz component encoded? 1 = true -// DDD: Number of extra bytes for secs (range 0-7). -// If A = 1, secs encoded in DDD+1 bytes. -// If A = 0, secs is not encoded, and is assumed to be 0. -// If A = 1, then we need at least 1 byte to encode secs. -// DDD says the number of extra bytes beyond that 1. -// E.g. if DDD=0, then secs is represented in 1 byte. -// if DDD=2, then secs is represented in 3 bytes. -// EE: Number of extra bytes for nsecs (range 0-3). -// If B = 1, nsecs encoded in EE+1 bytes (similar to secs/DDD above) -// -// Following the descriptor bytes, subsequent bytes are: -// -// secs component encoded in `DDD + 1` bytes (if A == 1) -// nsecs component encoded in `EE + 1` bytes (if B == 1) -// tz component encoded in 2 bytes (if C == 1) -// -// secs and nsecs components are integers encoded in a BigEndian -// 2-complement encoding format. -// -// tz component is encoded as 2 bytes (16 bits). Most significant bit 15 to -// Least significant bit 0 are described below: -// -// Timezone offset has a range of -12:00 to +14:00 (ie -720 to +840 minutes). -// Bit 15 = have\_dst: set to 1 if we set the dst flag. -// Bit 14 = dst\_on: set to 1 if dst is in effect at the time, or 0 if not. -// Bits 13..0 = timezone offset in minutes. It is a signed integer in Big Endian format. -// -func encodeTime(t time.Time) []byte { - //t := rv.Interface().(time.Time) - tsecs, tnsecs := t.Unix(), t.Nanosecond() - var ( - bd byte - btmp [8]byte - bs [16]byte - i int = 1 - ) - l := t.Location() - if l == time.UTC { - l = nil - } - if tsecs != 0 { - bd = bd | 0x80 - bigen.PutUint64(btmp[:], uint64(tsecs)) - f := pruneSignExt(btmp[:], tsecs >= 0) - bd = bd | (byte(7-f) << 2) - copy(bs[i:], btmp[f:]) - i = i + (8 - f) - } - if tnsecs != 0 { - bd = bd | 0x40 - bigen.PutUint32(btmp[:4], uint32(tnsecs)) - f := pruneSignExt(btmp[:4], true) - bd = bd | byte(3-f) - copy(bs[i:], btmp[f:4]) - i = i + (4 - f) - } - if l != nil { - bd = bd | 0x20 - // Note that Go Libs do not give access to dst flag. - _, zoneOffset := t.Zone() - //zoneName, zoneOffset := t.Zone() - zoneOffset /= 60 - z := uint16(zoneOffset) - bigen.PutUint16(btmp[:2], z) - // clear dst flags - bs[i] = btmp[0] & 0x3f - bs[i+1] = btmp[1] - i = i + 2 - } - bs[0] = bd - return bs[0:i] -} - -// DecodeTime decodes a []byte into a time.Time. -func decodeTime(bs []byte) (tt time.Time, err error) { - bd := bs[0] - var ( - tsec int64 - tnsec uint32 - tz uint16 - i byte = 1 - i2 byte - n byte - ) - if bd&(1<<7) != 0 { - var btmp [8]byte - n = ((bd >> 2) & 0x7) + 1 - i2 = i + n - copy(btmp[8-n:], bs[i:i2]) - //if first bit of bs[i] is set, then fill btmp[0..8-n] with 0xff (ie sign extend it) - if bs[i]&(1<<7) != 0 { - copy(btmp[0:8-n], bsAll0xff) - //for j,k := byte(0), 8-n; j < k; j++ { btmp[j] = 0xff } - } - i = i2 - tsec = int64(bigen.Uint64(btmp[:])) - } - if bd&(1<<6) != 0 { - var btmp [4]byte - n = (bd & 0x3) + 1 - i2 = i + n - copy(btmp[4-n:], bs[i:i2]) - i = i2 - tnsec = bigen.Uint32(btmp[:]) - } - if bd&(1<<5) == 0 { - tt = time.Unix(tsec, int64(tnsec)).UTC() - return - } - // In stdlib time.Parse, when a date is parsed without a zone name, it uses "" as zone name. - // However, we need name here, so it can be shown when time is printed. - // Zone name is in form: UTC-08:00. - // Note that Go Libs do not give access to dst flag, so we ignore dst bits - - i2 = i + 2 - tz = bigen.Uint16(bs[i:i2]) - i = i2 - // sign extend sign bit into top 2 MSB (which were dst bits): - if tz&(1<<13) == 0 { // positive - tz = tz & 0x3fff //clear 2 MSBs: dst bits - } else { // negative - tz = tz | 0xc000 //set 2 MSBs: dst bits - //tzname[3] = '-' (TODO: verify. this works here) - } - tzint := int16(tz) - if tzint == 0 { - tt = time.Unix(tsec, int64(tnsec)).UTC() - } else { - // For Go Time, do not use a descriptive timezone. - // It's unnecessary, and makes it harder to do a reflect.DeepEqual. - // The Offset already tells what the offset should be, if not on UTC and unknown zone name. - // var zoneName = timeLocUTCName(tzint) - tt = time.Unix(tsec, int64(tnsec)).In(time.FixedZone("", int(tzint)*60)) - } - return -} - -func timeLocUTCName(tzint int16) string { - if tzint == 0 { - return "UTC" - } - var tzname = []byte("UTC+00:00") - //tzname := fmt.Sprintf("UTC%s%02d:%02d", tzsign, tz/60, tz%60) //perf issue using Sprintf. inline below. - //tzhr, tzmin := tz/60, tz%60 //faster if u convert to int first - var tzhr, tzmin int16 - if tzint < 0 { - tzname[3] = '-' // (TODO: verify. this works here) - tzhr, tzmin = -tzint/60, (-tzint)%60 - } else { - tzhr, tzmin = tzint/60, tzint%60 - } - tzname[4] = timeDigits[tzhr/10] - tzname[5] = timeDigits[tzhr%10] - tzname[7] = timeDigits[tzmin/10] - tzname[8] = timeDigits[tzmin%10] - return string(tzname) - //return time.FixedZone(string(tzname), int(tzint)*60) -} From 19a833060103660698c3f5ed9ca2d597a24ff7e9 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 4 Jul 2018 20:24:23 +0000 Subject: [PATCH 078/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 4 ---- options/locale/locale_fr-FR.ini | 4 ---- options/locale/locale_it-IT.ini | 4 ---- options/locale/locale_lv-LV.ini | 4 ---- options/locale/locale_pt-BR.ini | 15 +++++++++++---- options/locale/locale_ru-RU.ini | 4 ---- options/locale/locale_uk-UA.ini | 4 ---- options/locale/locale_zh-CN.ini | 4 ---- options/locale/locale_zh-TW.ini | 3 --- 9 files changed, 11 insertions(+), 35 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index b5ac216eeaa5..d72f0834b867 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -491,12 +491,8 @@ owner=Besitzer repo_name=Repository-Name repo_name_helper=Ein guter Repository-Name besteht normalerweise aus kurzen, unvergesslichen und einzigartigen Schlagwörtern. visibility=Sichtbarkeit -visiblity_helper=privates Repository -visiblity_helper_forced=Auf dieser Gitea-Instanz können nur private Repositories angelegt werden. -visiblity_fork_helper=(Eine Änderung dieses Wertes wirkt sich auf alle Forks aus) fork_repo=Repository forken fork_from=Fork von -fork_visiblity_helper=Die Sichtbarkeit einer geforkten Repository kann nicht geändert werden. repo_desc=Beschreibung repo_lang=Sprache repo_gitignore_helper=Wähle eine .gitignore-Vorlage aus. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 7368dfb62b25..3f8a6c2a9585 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -491,12 +491,8 @@ owner=Propriétaire repo_name=Nom du dépôt repo_name_helper=Idéalement, le nom d'un dépôt devrait être court, mémorisable et unique. visibility=Visibilité -visiblity_helper=Rendre le dépôt privé -visiblity_helper_forced=L'administrateur de votre site impose que les nouveaux dépôts soient privés. -visiblity_fork_helper=(Les changement de cette valeur affecteront toutes les bifurcations.) fork_repo=Créer une bifurcation du dépôt fork_from=Bifurquer depuis -fork_visiblity_helper=La visibilité d'un dépôt bifurqué ne peut être changée. repo_desc=Description repo_lang=Langue repo_gitignore_helper=Choisissez un modèle de fichier .gitignore. diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 87be4ded7727..7a89098005d9 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -492,12 +492,8 @@ owner=Proprietario repo_name=Nome Repository repo_name_helper=Un buon nome per un repository è costituito da parole chiave corte, facili da ricordare e uniche. visibility=Visibilità -visiblity_helper=Rendi il repository privato -visiblity_helper_forced=L'amministratore del sito impone che le nuove repositories siano private. -visiblity_fork_helper=(Questa modifica avrà effetto su tutti i fork) fork_repo=Forka Repository fork_from=Forka da -fork_visiblity_helper=La visibilità di un repository forkato non può essere modificata. repo_desc=Descrizione repo_lang=Lingua repo_gitignore_helper=Seleziona i templates di .gitignore. diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index de6dfa3e625d..4bb962cb01d0 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -492,13 +492,9 @@ owner=Īpašnieks repo_name=Repozitorija nosaukums repo_name_helper=Labi repozitorija nosaukumi ir īsi, unikāli un tādi, ko viegli atcerēties. visibility=Redzamība -visiblity_helper=Padarīt repozitoriju privātu -visiblity_helper_forced=Jūsu sistēmas administrators ir noteicis, ka visiem no jauna izveidotajiem repozitorijiem ir jābūt privātiem. -visiblity_fork_helper=(Šīs vērtības maiņa ietekmēs arī visus atdalītos repozitorijus) clone_helper=Nepieciešama palīdzība klonēšanā? Apmeklē palīdzības sadaļu. fork_repo=Atdalīt repozitoriju fork_from=Atdalīt no -fork_visiblity_helper=Atdalītam repozitorijam nav iespējams nomainīt tā redzamību. repo_desc=Apraksts repo_lang=Valoda repo_gitignore_helper=Izvēlieties .gitignore sagatavi. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index d30faac8125f..317315a3546f 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -75,6 +75,7 @@ cancel=Cancelar [install] install=Instalação title=Configuração inicial +docker_helper=Se você está rodando o Gitea dentro do Docker, por favor leia a documentação cuidadosamente antes de alterar qualquer coisa nesta página. requite_db_desc=Gitea requer MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB. db_title=Configurações de banco de dados db_type=Tipo de banco de dados @@ -491,12 +492,13 @@ owner=Proprietário repo_name=Nome do repositório repo_name_helper=Um bom nome de repositório é composto por palavras curtas, memorizáveis e únicas. visibility=Visibilidade -visiblity_helper=Tornar este repositório privado -visiblity_helper_forced=O administrador do site força novos repositórios a serem privados. -visiblity_fork_helper=(Esta alteração irá afetar todos os forks.) +visibility_helper=Tornar este repositório privado +visibility_helper_forced=O administrador do site força novos repositórios a serem privados. +visibility_fork_helper=(Esta alteração irá afetar todos os forks.) +clone_helper=Precisa de ajuda com o clone? Visite a Ajuda. fork_repo=Fork do repositório fork_from=Fork de -fork_visiblity_helper=A visibilidade do fork de um repositório não pode ser alterada. +fork_visibility_helper=A visibilidade do fork de um repositório não pode ser alterada. repo_desc=Descrição repo_lang=Linguagem repo_gitignore_helper=Selecione modelos do .gitignore. @@ -611,6 +613,7 @@ editor.directory_is_a_file=O nome do diretório '%s' já é usado como um nome d editor.file_is_a_symlink='%s' é um link simbólico. Links simbólicos não podem ser editados no editor da web editor.filename_is_a_directory=O nome do arquivo '%s' já é usado como um nome de diretório neste repositório. editor.file_editing_no_longer_exists=O arquivo que está sendo editado, '%s', não existe mais neste repositório. +editor.file_changed_while_editing=O conteúdo do arquivo mudou desde que você começou a editar. Clique aqui para ver o que foi editado ou clique em Commit novamemente para sobreescrever essas mudanças. editor.file_already_exists=Um arquivo com nome '%s' já existe neste repositório. editor.no_changes_to_show=Nenhuma alteração a mostrar. editor.fail_to_update_file=Houve erro ao criar ou atualizar arquivo '%s': %v @@ -991,6 +994,7 @@ settings.search_user_placeholder=Pesquisar usuário... settings.org_not_allowed_to_be_collaborator=Organizações não podem ser adicionadas como um colaborador. settings.user_is_org_member=O usuário é um membro da organização e não pode ser adicionado como um colaborador. settings.add_webhook=Adicionar webhook +settings.hooks_desc=Webhooks automaticamente fazem requisições de HTTP POST para um servidor quando acionados determinados eventos de Gitea. Leia mais no guia de webhooks. settings.webhook_deletion=Remover webhook settings.webhook_deletion_desc=A exclusão de um webhook exclui suas configurações e o histórico de entrega. Continuar? settings.webhook_deletion_success=O webhook foi removido. @@ -1007,6 +1011,7 @@ settings.githook_edit_desc=Se o hook não estiver ativo, o conteúdo de exemplo settings.githook_name=Nome do Hook settings.githook_content=Conteúdo do Hook settings.update_githook=Atualizar Hook +settings.add_webhook_desc=Gitea enviará requisições POST com um tipo de conteúdo especificado para a URL de destino. Leia mais no guia de webhooks. settings.payload_url=URL de destino settings.content_type=Tipo de conteúdo POST settings.secret=Senha @@ -1268,6 +1273,8 @@ dashboard.operation_switch=Trocar dashboard.operation_run=Executar dashboard.clean_unbind_oauth=Limpar conexões OAuth não vinculadas dashboard.clean_unbind_oauth_success=Todas as conexões de OAuth não vinculadas foram excluídas. +dashboard.delete_inactivate_accounts=Excluir todas as contas não ativadas +dashboard.delete_inactivate_accounts_success=Todas as contas não ativadas foram excluídas. dashboard.delete_repo_archives=Excluir todos os arquivos do repositório dashboard.delete_repo_archives_success=Todos os arquivos do repositório foram excluídos. dashboard.delete_missing_repos=Excluir todos os repositórios que não possuem seus arquivos Git diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index ff8613a24cfc..74f889ded67b 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -492,13 +492,9 @@ owner=Владелец repo_name=Имя репозитория repo_name_helper=Лучшие названия репозиториев состоят из коротких, легко запоминаемых и уникальных ключевых слов. visibility=Видимость -visiblity_helper=Сделать репозиторий приватным -visiblity_helper_forced=Администратор сайта настроил параметр видимости новых репозиториев. Репозиторий приватный по умолчанию. -visiblity_fork_helper=(Изменение этого повлияет на все форки.) clone_helper=Нужна помощь в клонировании? Посетите страницу помощи. fork_repo=Форкнуть репозиторий fork_from=Форк от -fork_visiblity_helper=Видимость форкнутого репозитория изменить нельзя. repo_desc=Описание repo_lang=Язык repo_gitignore_helper=Выберите шаблон .gitignore. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 65d17c4c56e9..2bd85a3d648c 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -492,13 +492,9 @@ owner=Власник repo_name=Назва репозиторію repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. visibility=Видимість -visiblity_helper=Зробити репозиторій приватним -visiblity_helper_forced=Адміністратор вашого сайту налаштував параметри нових репозиторіїв: всі нові репозиторії будуть приватними. -visiblity_fork_helper=(Зміна цього вплине на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте сторінку Допомога. fork_repo=Форкнути репозиторій fork_from=Форк з -fork_visiblity_helper=Видимість форкнутого репозиторію змінити не можна. repo_desc=Опис repo_lang=Мова repo_gitignore_helper=Виберіть шаблон .gitignore. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 40de2a8c6d29..ad89a0e98115 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -491,12 +491,8 @@ owner=拥有者 repo_name=仓库名称 repo_name_helper=好的存储库名称使用简短、深刻和独特的关键字。 visibility=可见性 -visiblity_helper=将仓库设为私有 -visiblity_helper_forced=站点管理员强制要求新仓库为私有。 -visiblity_fork_helper=(修改该值将会影响到所有派生仓库) fork_repo=派生仓库 fork_from=派生自 -fork_visiblity_helper=无法更改派生仓库的可见性。 repo_desc=仓库描述 repo_lang=仓库语言 repo_gitignore_helper=选择 .gitignore 模板。 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 1155cf396e00..7c0242f707dc 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -460,9 +460,6 @@ owner=擁有者 repo_name=儲存庫名稱 repo_name_helper=好的儲存庫名稱通常是簡短的、好記的、且獨特的。 visibility=可見度 -visiblity_helper=將儲存庫設為私人 -visiblity_helper_forced=您的網站管理員強制新的存儲庫必需設定為私人。 -visiblity_fork_helper=(修改該值將會影響到所有派生倉庫) fork_repo=複製儲存庫 fork_from=複製自 repo_desc=儲存庫描述 From 105e8e02e4d410219ba7167d59cfe7d401216d14 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 5 Jul 2018 05:47:05 +0800 Subject: [PATCH 079/447] fix repository last updated time update when delete a user who watched the repo (#4363) --- models/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/user.go b/models/user.go index 5ac86587966a..0b7af8df6d27 100644 --- a/models/user.go +++ b/models/user.go @@ -956,7 +956,7 @@ func deleteUser(e *xorm.Session, u *User) error { Where("watch.user_id = ?", u.ID).Find(&watchedRepoIDs); err != nil { return fmt.Errorf("get all watches: %v", err) } - if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).Update(new(Repository)); err != nil { + if _, err = e.Decr("num_watches").In("id", watchedRepoIDs).NoAutoTime().Update(new(Repository)); err != nil { return fmt.Errorf("decrease repository num_watches: %v", err) } // ***** END: Watch ***** @@ -966,7 +966,7 @@ func deleteUser(e *xorm.Session, u *User) error { if err = e.Table("star").Cols("star.repo_id"). Where("star.uid = ?", u.ID).Find(&starredRepoIDs); err != nil { return fmt.Errorf("get all stars: %v", err) - } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).Update(new(Repository)); err != nil { + } else if _, err = e.Decr("num_stars").In("id", starredRepoIDs).NoAutoTime().Update(new(Repository)); err != nil { return fmt.Errorf("decrease repository num_stars: %v", err) } // ***** END: Star ***** From 8270561a04a6a59e3fd11cd0d42c0365ba55cc04 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 5 Jul 2018 01:45:15 +0300 Subject: [PATCH 080/447] Check that repositories can only be migrated to own user or organizations (#4366) * Repositories can only migrated to own user or organizations * Add check for organization that user does not belong to * Allow admin to migrate repositories for other users --- integrations/api_repo_test.go | 27 +++++++++++++++++++++++++++ routers/api/v1/repo/repo.go | 23 +++++++++++++++-------- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index 12429c88a871..c789cc9ee466 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -235,3 +235,30 @@ func TestAPIGetRepoByIDUnauthorized(t *testing.T) { req := NewRequestf(t, "GET", "/api/v1/repositories/2") sess.MakeRequest(t, req, http.StatusNotFound) } + +func TestAPIRepoMigrate(t *testing.T) { + testCases := []struct { + ctxUserID, userID int64 + cloneURL, repoName string + expectedStatus int + }{ + {ctxUserID: 1, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-admin", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 2, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-own", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 1, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad", expectedStatus: http.StatusForbidden}, + {ctxUserID: 2, userID: 3, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-org", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, userID: 6, cloneURL: "https://github.com/go-gitea/git.git", repoName: "git-bad-org", expectedStatus: http.StatusForbidden}, + } + + prepareTestEnv(t) + for _, testCase := range testCases { + user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User) + session := loginUser(t, user.Name) + + req := NewRequestWithJSON(t, "POST", "/api/v1/repos/migrate", &api.MigrateRepoOption{ + CloneAddr: testCase.cloneURL, + UID: int(testCase.userID), + RepoName: testCase.repoName, + }) + session.MakeRequest(t, req, testCase.expectedStatus) + } +} diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index ccfe0440c852..c6c5d4aec3d2 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -306,16 +306,23 @@ func Migrate(ctx *context.APIContext, form auth.MigrateRepoForm) { return } - if ctxUser.IsOrganization() && !ctx.User.IsAdmin { - // Check ownership of organization. - isOwner, err := ctxUser.IsOwnedBy(ctx.User.ID) - if err != nil { - ctx.Error(500, "IsOwnedBy", err) - return - } else if !isOwner { - ctx.Error(403, "", "Given user is not owner of organization.") + if !ctx.User.IsAdmin { + if !ctxUser.IsOrganization() && ctx.User.ID != ctxUser.ID { + ctx.Error(403, "", "Given user is not an organization.") return } + + if ctxUser.IsOrganization() { + // Check ownership of organization. + isOwner, err := ctxUser.IsOwnedBy(ctx.User.ID) + if err != nil { + ctx.Error(500, "IsOwnedBy", err) + return + } else if !isOwner { + ctx.Error(403, "", "Given user is not owner of organization.") + return + } + } } remoteAddr, err := form.ParseRemoteAddr(ctx.User) From 26317e70b1c4f17b85617158b1bc985b84780304 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 4 Jul 2018 22:53:06 +0000 Subject: [PATCH 081/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 4 ++++ options/locale/locale_uk-UA.ini | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index dc4ebd405f73..addaa8e3170e 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -566,6 +566,10 @@ milestones.due_date=Förfallodatum (valfritt) milestones.clear=Rensa milestones.edit=Redigera milstolpe milestones.cancel=Avbryt +milestones.modify=Uppdatera milstolpe +milestones.edit_success=Milstolpe '%s' har blivit uppdaterad. +milestones.deletion=Ta bort milstolpe +milestones.deletion_desc=Borttagning av en milstolpe tar bort den från samtliga relaterade ärende. Fortsätta? milestones.filter_sort.closest_due_date=Närmaste förfallodatum milestones.filter_sort.furthest_due_date=Mest avlägsna förfallodatum milestones.filter_sort.least_complete=Minst klar diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 2bd85a3d648c..fe93cdf0bb61 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -492,9 +492,13 @@ owner=Власник repo_name=Назва репозиторію repo_name_helper=Хороші назви репозиторіїв використовують короткі, унікальні ключові слова що легко запам'ятати. visibility=Видимість +visibility_helper=Створити приватний репозиторій +visibility_helper_forced=Адміністратор вашого сайту налаштував параметри: всі нові репозиторії будуть приватними. +visibility_fork_helper=(Ці зміни вплинуть на всі форки.) clone_helper=Потрібна допомога у клонуванні? Відвідайте сторінку Допомога. fork_repo=Форкнути репозиторій fork_from=Форк з +fork_visibility_helper=Неможливо змінити видимість форкнутого репозиторію. repo_desc=Опис repo_lang=Мова repo_gitignore_helper=Виберіть шаблон .gitignore. From 403d9371243d8c8c7cd48efd57b5bfbb054c4796 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 5 Jul 2018 02:51:02 +0300 Subject: [PATCH 082/447] Allow administrator to create repository for any organization (#4368) --- integrations/api_repo_test.go | 23 +++++++++++++++++++++++ routers/api/v1/repo/repo.go | 16 +++++++++------- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/integrations/api_repo_test.go b/integrations/api_repo_test.go index c789cc9ee466..aec8c8f81bd7 100644 --- a/integrations/api_repo_test.go +++ b/integrations/api_repo_test.go @@ -262,3 +262,26 @@ func TestAPIRepoMigrate(t *testing.T) { session.MakeRequest(t, req, testCase.expectedStatus) } } + +func TestAPIOrgRepoCreate(t *testing.T) { + testCases := []struct { + ctxUserID int64 + orgName, repoName string + expectedStatus int + }{ + {ctxUserID: 1, orgName: "user3", repoName: "repo-admin", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, orgName: "user3", repoName: "repo-own", expectedStatus: http.StatusCreated}, + {ctxUserID: 2, orgName: "user6", repoName: "repo-bad-org", expectedStatus: http.StatusForbidden}, + } + + prepareTestEnv(t) + for _, testCase := range testCases { + user := models.AssertExistsAndLoadBean(t, &models.User{ID: testCase.ctxUserID}).(*models.User) + session := loginUser(t, user.Name) + + req := NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/org/%s/repos", testCase.orgName), &api.CreateRepoOption{ + Name: testCase.repoName, + }) + session.MakeRequest(t, req, testCase.expectedStatus) + } +} diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index c6c5d4aec3d2..044b1e9c18bb 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -257,13 +257,15 @@ func CreateOrgRepo(ctx *context.APIContext, opt api.CreateRepoOption) { return } - isOwner, err := org.IsOwnedBy(ctx.User.ID) - if err != nil { - ctx.ServerError("IsOwnedBy", err) - return - } else if !isOwner { - ctx.Error(403, "", "Given user is not owner of organization.") - return + if !ctx.User.IsAdmin { + isOwner, err := org.IsOwnedBy(ctx.User.ID) + if err != nil { + ctx.ServerError("IsOwnedBy", err) + return + } else if !isOwner { + ctx.Error(403, "", "Given user is not owner of organization.") + return + } } CreateUserRepo(ctx, org, opt) } From 30244ca448930aa5645c97d81586295386737864 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 5 Jul 2018 00:05:18 +0000 Subject: [PATCH 083/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_sv-SE.ini | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index addaa8e3170e..968fb97a92c1 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -570,6 +570,7 @@ milestones.modify=Uppdatera milstolpe milestones.edit_success=Milstolpe '%s' har blivit uppdaterad. milestones.deletion=Ta bort milstolpe milestones.deletion_desc=Borttagning av en milstolpe tar bort den från samtliga relaterade ärende. Fortsätta? +milestones.deletion_success=Milstolpen har blivit borttagen. milestones.filter_sort.closest_due_date=Närmaste förfallodatum milestones.filter_sort.furthest_due_date=Mest avlägsna förfallodatum milestones.filter_sort.least_complete=Minst klar @@ -577,17 +578,26 @@ milestones.filter_sort.most_complete=Mest klar milestones.filter_sort.most_issues=Mest ärenden milestones.filter_sort.least_issues=Minst ärenden +ext_wiki=Extern Wiki +ext_wiki.desc=Länk till extern wiki. wiki=Wiki +wiki.welcome=Välkommen till Wikin. +wiki.welcome_desc=Wikin låter dig skriva och dela dokumentation med medarbetare. +wiki.desc=Skriv och dela dokumentation med medarbetare. +wiki.create_first_page=Skapa den första sidan wiki.page=Sida wiki.filter_page=Filtrera sida +wiki.new_page=Sida wiki.default_commit_message=Skriv en anteckning om den här uppdateringen (valfritt). wiki.save_page=Spara sidan wiki.last_commit_info=%s redigerade denna sida %s wiki.edit_page_button=Redigera wiki.new_page_button=Ny Sida wiki.delete_page_button=Tag bort sida +wiki.delete_page_notice_1=Borttagning utav wiki sidan '%s' kan inte ångras. Fortsätta? wiki.page_already_exists=Wiki-sida med samma namn finns redan. +wiki.reserved_page=Namnet för wikisidan '%s' är reserverat. wiki.pages=Sidor wiki.last_updated=Senast uppdaterad %s @@ -624,6 +634,9 @@ activity.closed_issue_label=Stängd activity.new_issues_count_1=Nytt ärende activity.new_issues_count_n=Nya ärenden activity.new_issue_label=Öppnad +activity.title.unresolved_conv_1=%d Olöst konversation +activity.title.unresolved_conv_n=%d Olösta konversationer +activity.unresolved_conv_desc=De nyligen förändrade ärendena och pull-requesterna har inte blivit lösta ännu. activity.unresolved_conv_label=Öppna activity.title.releases_1=%d release activity.title.releases_n=%d releaser @@ -636,6 +649,9 @@ search.results=Sökresultat för ”%s” i %s settings=Inställningar settings.desc=Inställningarna är där du kan hantera inställningar för utvecklingskatalogen +settings.options=Utvecklingskatalog +settings.collaboration=Medarbetare +settings.collaboration.admin=Administratör settings.collaboration.write=Skriva settings.collaboration.read=Läsa settings.collaboration.undefined=Odefinierad @@ -643,10 +659,23 @@ settings.hooks=Webbhookar settings.githooks=Githookar settings.basic_settings=Basinställningar settings.mirror_settings=Inställningar för spegling +settings.sync_mirror=Synkronisera nu +settings.mirror_sync_in_progress=Synkronisering utav speglingar pågår. Kontrollera igen om en minut. +settings.site=Webbplats settings.update_settings=Uppdatera inställningar settings.advanced_settings=Advancerade Inställningar +settings.wiki_desc=Aktivera wiki för utvecklingskatalog +settings.use_internal_wiki=Använd inbyggd Wiki +settings.use_external_wiki=Använd extern wiki settings.external_wiki_url=Extern Wiki-URL +settings.external_wiki_url_error=Den externa wiki-länken är inte giltig. +settings.external_wiki_url_desc=Besökare omdirigeras till den externa wiki-länken när de trycker på wiki-tabben. +settings.issues_desc=Aktivera ärendehantering för utvecklingskatalogen +settings.use_internal_issue_tracker=Använd inbyggt ärendehanteringssystem +settings.use_external_issue_tracker=Använd externt ärendehanteringssystem settings.external_tracker_url=URL För Extern Ärendehanterare +settings.external_tracker_url_error=Länken för ärendehanteringsystemet är inte en giltig länk. +settings.external_tracker_url_desc=Besökare dirigeras om till länken för det externa ärendehanteringssystemet när de trycker på ärende-tabben. settings.tracker_url_format=URL-Format För Extern Ärendehanterare settings.tracker_issue_style.numeric=Numerisk settings.tracker_issue_style.alphanumeric=Alfanumerisk From 0fb1120580204d65a2583dc16f0b16dd5d0a98ed Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 5 Jul 2018 06:02:54 +0300 Subject: [PATCH 084/447] Add default merge options when adding new repository (#4369) --- models/repo.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/models/repo.go b/models/repo.go index 52325f262329..c795deee8db7 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1347,6 +1347,12 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err Type: tp, Config: &IssuesConfig{EnableTimetracker: setting.Service.DefaultEnableTimetracking, AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime}, }) + } else if tp == UnitTypePullRequests { + units = append(units, RepoUnit{ + RepoID: repo.ID, + Type: tp, + Config: &PullRequestsConfig{AllowMerge: true, AllowRebase: true, AllowSquash: true}, + }) } else { units = append(units, RepoUnit{ RepoID: repo.ID, From 6c2f1f9413ee67e683985f25e4bc2e1b0c94d039 Mon Sep 17 00:00:00 2001 From: Fluf <36822577+flufmonster@users.noreply.github.com> Date: Thu, 5 Jul 2018 00:13:05 -0400 Subject: [PATCH 085/447] Add Recaptcha functionality to Gitea (#4044) --- custom/conf/app.ini.sample | 8 +++- .../doc/advanced/config-cheat-sheet.en-us.md | 5 +- modules/auth/user_form.go | 9 ++-- modules/auth/user_form_auth_openid.go | 5 +- modules/recaptcha/recaptcha.go | 47 +++++++++++++++++++ modules/setting/setting.go | 14 +++++- public/css/index.css | 2 +- public/less/_form.less | 17 +++++++ routers/user/auth.go | 35 +++++++++++++- routers/user/auth_openid.go | 17 ++++++- templates/base/footer.tmpl | 5 ++ templates/user/auth/signup_inner.tmpl | 7 ++- .../user/auth/signup_openid_register.tmpl | 7 ++- 13 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 modules/recaptcha/recaptcha.go diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 774a1df59887..931a525d7bb4 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -301,7 +301,13 @@ ENABLE_NOTIFY_MAIL = false ENABLE_REVERSE_PROXY_AUTHENTICATION = false ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = false ; Enable captcha validation for registration -ENABLE_CAPTCHA = true +ENABLE_CAPTCHA = false +; Type of captcha you want to use. Options: image, recaptcha +CAPTCHA_TYPE = image +; Enable recaptcha to use Google's recaptcha service +; Go to https://www.google.com/recaptcha/admin to sign up for a key +RECAPTCHA_SECRET = +RECAPTCHA_SITEKEY = ; Default value for KeepEmailPrivate ; Each new user will get the value of this setting copied into their profile DEFAULT_KEEP_EMAIL_PRIVATE = false diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 3f8ebea61f86..de4ce6b188dc 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -177,7 +177,10 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `ENABLE_REVERSE_PROXY_AUTHENTICATION`: **false**: Enable this to allow reverse proxy authentication. - `ENABLE_REVERSE_PROXY_AUTO_REGISTRATION`: **false**: Enable this to allow auto-registration for reverse authentication. -- `ENABLE_CAPTCHA`: **true**: Enable this to use captcha validation for registration. +- `ENABLE_CAPTCHA`: **false**: Enable this to use captcha validation for registration. +- `CAPTCHA_TYPE`: **image**: \[image, recaptcha\] +- `RECAPTCHA_SECRET`: **""**: Go to https://www.google.com/recaptcha/admin to get a secret for recaptcha +- `RECAPTCHA_SITEKEY`: **""**: Go to https://www.google.com/recaptcha/admin to get a sitekey for recaptcha ## Webhook (`webhook`) diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 0c342df86ab3..959a8ac4172d 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -72,10 +72,11 @@ func (f *InstallForm) Validate(ctx *macaron.Context, errs binding.Errors) bindin // RegisterForm form for registering type RegisterForm struct { - UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` - Email string `binding:"Required;Email;MaxSize(254)"` - Password string `binding:"Required;MaxSize(255)"` - Retype string + UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` + Email string `binding:"Required;Email;MaxSize(254)"` + Password string `binding:"Required;MaxSize(255)"` + Retype string + GRecaptchaResponse string `form:"g-recaptcha-response"` } // Validate valideates the fields diff --git a/modules/auth/user_form_auth_openid.go b/modules/auth/user_form_auth_openid.go index 0ef821dd9eb2..6a3c2848730e 100644 --- a/modules/auth/user_form_auth_openid.go +++ b/modules/auth/user_form_auth_openid.go @@ -22,8 +22,9 @@ func (f *SignInOpenIDForm) Validate(ctx *macaron.Context, errs binding.Errors) b // SignUpOpenIDForm form for signin up with OpenID type SignUpOpenIDForm struct { - UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` - Email string `binding:"Required;Email;MaxSize(254)"` + UserName string `binding:"Required;AlphaDashDot;MaxSize(35)"` + Email string `binding:"Required;Email;MaxSize(254)"` + GRecaptchaResponse string `form:"g-recaptcha-response"` } // Validate valideates the fields diff --git a/modules/recaptcha/recaptcha.go b/modules/recaptcha/recaptcha.go new file mode 100644 index 000000000000..100918596101 --- /dev/null +++ b/modules/recaptcha/recaptcha.go @@ -0,0 +1,47 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package recaptcha + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "time" + + "code.gitea.io/gitea/modules/setting" +) + +// Response is the structure of JSON returned from API +type Response struct { + Success bool `json:"success"` + ChallengeTS time.Time `json:"challenge_ts"` + Hostname string `json:"hostname"` + ErrorCodes []string `json:"error-codes"` +} + +const apiURL = "https://www.google.com/recaptcha/api/siteverify" + +// Verify calls Google Recaptcha API to verify token +func Verify(response string) (bool, error) { + resp, err := http.PostForm(apiURL, + url.Values{"secret": {setting.Service.RecaptchaSecret}, "response": {response}}) + if err != nil { + return false, fmt.Errorf("Failed to send CAPTCHA response: %s", err) + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, fmt.Errorf("Failed to read CAPTCHA response: %s", err) + } + var jsonResponse Response + err = json.Unmarshal(body, &jsonResponse) + if err != nil { + return false, fmt.Errorf("Failed to parse CAPTCHA response: %s", err) + } + + return jsonResponse.Success, nil +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index a5f4457f3337..5230307cab2d 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -75,6 +75,12 @@ const ( RepoCreatingPublic = "public" ) +// enumerates all the types of captchas +const ( + ImageCaptcha = "image" + ReCaptcha = "recaptcha" +) + // settings var ( // AppVer settings @@ -1165,6 +1171,9 @@ var Service struct { EnableReverseProxyAuth bool EnableReverseProxyAutoRegister bool EnableCaptcha bool + CaptchaType string + RecaptchaSecret string + RecaptchaSitekey string DefaultKeepEmailPrivate bool DefaultAllowCreateOrganization bool EnableTimetracking bool @@ -1189,7 +1198,10 @@ func newService() { Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() Service.EnableReverseProxyAutoRegister = sec.Key("ENABLE_REVERSE_PROXY_AUTO_REGISTRATION").MustBool() - Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool() + Service.EnableCaptcha = sec.Key("ENABLE_CAPTCHA").MustBool(false) + Service.CaptchaType = sec.Key("CAPTCHA_TYPE").MustString(ImageCaptcha) + Service.RecaptchaSecret = sec.Key("RECAPTCHA_SECRET").MustString("") + Service.RecaptchaSitekey = sec.Key("RECAPTCHA_SITEKEY").MustString("") Service.DefaultKeepEmailPrivate = sec.Key("DEFAULT_KEEP_EMAIL_PRIVATE").MustBool() Service.DefaultAllowCreateOrganization = sec.Key("DEFAULT_ALLOW_CREATE_ORGANIZATION").MustBool(true) Service.EnableTimetracking = sec.Key("ENABLE_TIMETRACKING").MustBool(true) diff --git a/public/css/index.css b/public/css/index.css index 2ee3e831436d..5d24bee4234d 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}@media only screen and (min-width:768px){.g-recaptcha{margin:0 auto!important;width:304px;padding-left:30px}}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.77);-webkit-transform:scale(.77);transform-origin:0 0;-webkit-transform-origin:0 0}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file diff --git a/public/less/_form.less b/public/less/_form.less index a352e1ebb5c9..db9f8f38a5e2 100644 --- a/public/less/_form.less +++ b/public/less/_form.less @@ -80,6 +80,23 @@ } } } + +@media only screen and (min-width: 768px) { + .g-recaptcha { + margin: 0 auto !important; + width: 304px; + padding-left: 30px; + } +} +@media screen and (max-height: 575px){ + #rc-imageselect, .g-recaptcha { + transform:scale(0.77); + -webkit-transform:scale(0.77); + transform-origin:0 0; + -webkit-transform-origin:0 0; + } +} + .user.activate, .user.forgot.password, .user.reset.password, diff --git a/routers/user/auth.go b/routers/user/auth.go index 317b4af3bb04..4852d47aec9a 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -17,6 +17,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/recaptcha" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" @@ -641,6 +642,8 @@ func LinkAccount(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("link_account") ctx.Data["LinkAccountMode"] = true ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false @@ -666,6 +669,8 @@ func LinkAccountPostSignIn(ctx *context.Context, signInForm auth.SignInForm) { ctx.Data["LinkAccountMode"] = true ctx.Data["LinkAccountModeSignIn"] = true ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false @@ -732,6 +737,8 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au ctx.Data["LinkAccountMode"] = true ctx.Data["LinkAccountModeRegister"] = true ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.Data["ShowRegistrationButton"] = false @@ -755,12 +762,21 @@ func LinkAccountPostRegister(ctx *context.Context, cpt *captcha.Captcha, form au return } - if setting.Service.EnableCaptcha && !cpt.VerifyReq(ctx.Req) { + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ImageCaptcha && !cpt.VerifyReq(ctx.Req) { ctx.Data["Err_Captcha"] = true ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplLinkAccount, &form) return } + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ReCaptcha { + valid, _ := recaptcha.Verify(form.GRecaptchaResponse) + if !valid { + ctx.Data["Err_Captcha"] = true + ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplLinkAccount, &form) + return + } + } + if (len(strings.TrimSpace(form.Password)) > 0 || len(strings.TrimSpace(form.Retype)) > 0) && form.Password != form.Retype { ctx.Data["Err_Password"] = true ctx.RenderWithErr(ctx.Tr("form.password_not_match"), tplLinkAccount, &form) @@ -858,6 +874,9 @@ func SignUp(ctx *context.Context) { ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey + ctx.Data["DisableRegistration"] = setting.Service.DisableRegistration ctx.HTML(200, tplSignUp) @@ -871,6 +890,9 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey + //Permission denied if DisableRegistration or AllowOnlyExternalRegistration options are true if !setting.Service.ShowRegistrationButton { ctx.Error(403) @@ -882,12 +904,21 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo return } - if setting.Service.EnableCaptcha && !cpt.VerifyReq(ctx.Req) { + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ImageCaptcha && !cpt.VerifyReq(ctx.Req) { ctx.Data["Err_Captcha"] = true ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUp, &form) return } + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ReCaptcha { + valid, _ := recaptcha.Verify(form.GRecaptchaResponse) + if !valid { + ctx.Data["Err_Captcha"] = true + ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUp, &form) + return + } + } + if form.Password != form.Retype { ctx.Data["Err_Password"] = true ctx.RenderWithErr(ctx.Tr("form.password_not_match"), tplSignUp, &form) diff --git a/routers/user/auth_openid.go b/routers/user/auth_openid.go index 9fe3424aae9d..1f938e3d7153 100644 --- a/routers/user/auth_openid.go +++ b/routers/user/auth_openid.go @@ -15,6 +15,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/recaptcha" "code.gitea.io/gitea/modules/setting" "github.com/go-macaron/captcha" @@ -308,6 +309,8 @@ func RegisterOpenID(ctx *context.Context) { ctx.Data["PageIsOpenIDRegister"] = true ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey ctx.Data["OpenID"] = oid userName, _ := ctx.Session.Get("openid_determined_username").(string) if userName != "" { @@ -333,14 +336,26 @@ func RegisterOpenIDPost(ctx *context.Context, cpt *captcha.Captcha, form auth.Si ctx.Data["PageIsOpenIDRegister"] = true ctx.Data["EnableOpenIDSignUp"] = setting.Service.EnableOpenIDSignUp ctx.Data["EnableCaptcha"] = setting.Service.EnableCaptcha + ctx.Data["CaptchaType"] = setting.Service.CaptchaType + ctx.Data["RecaptchaSitekey"] = setting.Service.RecaptchaSitekey ctx.Data["OpenID"] = oid - if setting.Service.EnableCaptcha && !cpt.VerifyReq(ctx.Req) { + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ImageCaptcha && !cpt.VerifyReq(ctx.Req) { ctx.Data["Err_Captcha"] = true ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUpOID, &form) return } + if setting.Service.EnableCaptcha && setting.Service.CaptchaType == setting.ReCaptcha { + ctx.Req.ParseForm() + valid, _ := recaptcha.Verify(form.GRecaptchaResponse) + if !valid { + ctx.Data["Err_Captcha"] = true + ctx.RenderWithErr(ctx.Tr("form.captcha_incorrect"), tplSignUpOID, &form) + return + } + } + len := setting.MinPasswordLength if len < 256 { len = 256 diff --git a/templates/base/footer.tmpl b/templates/base/footer.tmpl index ed4e75ffc909..a23ae57303c5 100644 --- a/templates/base/footer.tmpl +++ b/templates/base/footer.tmpl @@ -67,6 +67,11 @@ {{if .RequireU2F}} {{end}} +{{if .EnableCaptcha}} + {{if eq .CaptchaType "recaptcha"}} + + {{end}} +{{end}} {{if .RequireTribute}} diff --git a/templates/user/auth/signup_inner.tmpl b/templates/user/auth/signup_inner.tmpl index 52386f6dcf63..cd969276b9d5 100644 --- a/templates/user/auth/signup_inner.tmpl +++ b/templates/user/auth/signup_inner.tmpl @@ -29,7 +29,7 @@
- {{if .EnableCaptcha}} + {{if and .EnableCaptcha (eq .CaptchaType "image")}}
{{.Captcha.CreateHtml}} @@ -39,6 +39,11 @@
{{end}} + {{if and .EnableCaptcha (eq .CaptchaType "recaptcha")}} +
+
+
+ {{end}}
diff --git a/templates/user/auth/signup_openid_register.tmpl b/templates/user/auth/signup_openid_register.tmpl index 741ffdf3b596..67f03a19edd1 100644 --- a/templates/user/auth/signup_openid_register.tmpl +++ b/templates/user/auth/signup_openid_register.tmpl @@ -20,7 +20,7 @@
- {{if .EnableCaptcha}} + {{if and .EnableCaptcha (eq .CaptchaType "image")}}
{{.Captcha.CreateHtml}} @@ -30,6 +30,11 @@
{{end}} + {{if and .EnableCaptcha (eq .CaptchaType "recaptcha")}} +
+
+
+ {{end}}
From 8d7fc3a3bed8f7ec0ae3a23a3ee8ac6c7b357581 Mon Sep 17 00:00:00 2001 From: Nicolas Da Mutten Date: Thu, 5 Jul 2018 09:14:56 +0200 Subject: [PATCH 086/447] Fixes repo membership check in API (#4341) Untested, since I can't compile (yet). --- routers/api/v1/org/member.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/org/member.go b/routers/api/v1/org/member.go index 0cc531780264..65754b88ecd3 100644 --- a/routers/api/v1/org/member.go +++ b/routers/api/v1/org/member.go @@ -133,7 +133,7 @@ func IsMember(ctx *context.APIContext) { ctx.Error(500, "IsOrgMember", err) return } else if userIsMember { - userToCheckIsMember, err := ctx.Org.Organization.IsOrgMember(ctx.User.ID) + userToCheckIsMember, err := ctx.Org.Organization.IsOrgMember(userToCheck.ID) if err != nil { ctx.Error(500, "IsOrgMember", err) } else if userToCheckIsMember { From 54e3e315f043693f6f36ce96857d9c115effba57 Mon Sep 17 00:00:00 2001 From: Lanre Adelowo Date: Thu, 5 Jul 2018 16:35:42 +0100 Subject: [PATCH 087/447] Don't display buttons if there are no system notifications (#4280) * Don't display buttons if there are no notices * remove redundant gt check --- templates/admin/notice.tmpl | 50 +++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/templates/admin/notice.tmpl b/templates/admin/notice.tmpl index 745433d180f4..b1d886be42c9 100644 --- a/templates/admin/notice.tmpl +++ b/templates/admin/notice.tmpl @@ -34,33 +34,35 @@ {{end}} - - - - - - From 5ed2a327643401088c2d0d550dff7c9e3d9915cf Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 19 Jul 2018 15:26:27 +0000 Subject: [PATCH 123/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 51 ++++++++++++++++++++++++++------- options/locale/locale_uk-UA.ini | 2 ++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index f7b8ed079408..e1f4550ff87e 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -53,7 +53,7 @@ new_mirror=Novo mirror new_fork=Novo Fork de Repositório new_org=Nova organização manage_org=Gerenciar organizações -admin_panel=Administração do site +admin_panel=Administração geral account_settings=Configurações da conta settings=Configurações your_profile=Perfil @@ -93,7 +93,7 @@ no_admin_and_disable_registration=Você não pode desabilitar o auto-cadastro do err_empty_admin_password=A senha do administrador não pode ser em branco. general_title=Configurações gerais -app_name=Título do site +app_name=Nome do servidor app_name_helper=Você pode inserir o nome da empresa aqui. repo_path=Caminho raíz do repositório repo_path_helper=Todos os repositórios remotos do Git serão salvos neste diretório. @@ -597,7 +597,7 @@ editor.name_your_file=Nomeie o seu arquivo… editor.filename_help=Adicione um diretório digitando seu nome seguido por uma barra ('/'). Remova um diretório digitando o backspace no início do campo de entrada. editor.or=ou editor.cancel_lower=Cancelar -editor.commit_changes=Confirmar alterações +editor.commit_changes=Realizar commit das alterações editor.add_tmpl=Adicionar '%s/' editor.add=Adicionar '%s' editor.update=Atualizar '%s' @@ -682,7 +682,7 @@ issues.filter_milestone_no_select=Todos os marcos issues.filter_assignee=Atribuído issues.filter_assginee_no_select=Todos os responsáveis issues.filter_type=Tipo -issues.filter_type.all_issues=Todos os issues +issues.filter_type.all_issues=Todas as issues issues.filter_type.assigned_to_you=Atribuídos a você issues.filter_type.created_by_you=Criado por você issues.filter_type.mentioning_you=Mencionando você @@ -781,6 +781,34 @@ issues.due_date_added=adicionou a data limite %s %s issues.due_date_modified=modificou a data limite para %s ao invés de %s %s issues.due_date_remove=removeu a data limite %s %s issues.due_date_overdue=Em atraso +issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. Por favor, use o formato dd/mm/aaaa. +issues.dependency.title=Dependências +issues.dependency.issue_no_dependencies=Esta issue atualmente não tem dependências. +issues.dependency.pr_no_dependencies=Este pull request atualmente não tem dependências. +issues.dependency.add=Adicione uma nova dependência... +issues.dependency.cancel=Cancelar +issues.dependency.remove=Remover +issues.dependency.issue_number=Número da issue +issues.dependency.added_dependency=`%[2]s adicionou uma nova dependência %[3]s` +issues.dependency.removed_dependency=`%[2]s removeu uma dependência %[3]s` +issues.dependency.issue_closing_blockedby=Fechamento deste pull request está bloqueado pelas seguintes issues +issues.dependency.pr_closing_blockedby=Fechamento desta issue está bloqueado pelas seguintes issues +issues.dependency.issue_close_blocks=Esta issue bloqueia o fechamento das seguintes issues +issues.dependency.pr_close_blocks=Este pull request bloqueia o fechamento das seguintes issues +issues.dependency.issue_close_blocked=Você precisa fechar todas as issues que bloqueiam esta issue antes de poder fechá-la! +issues.dependency.pr_close_blocked=Você precisa fechar todas issues que bloqueiam este pull request antes de poder fazer o merge! +issues.dependency.blocks_short=Bloqueia +issues.dependency.blocked_by_short=Depende de +issues.dependency.remove_header=Remover dependência +issues.dependency.issue_remove_text=Isto irá remover a dependência desta issue. Tem certeza? Você não pode desfazer isso! +issues.dependency.pr_remove_text=Isto irá remover a dependência deste pull request. Tem certeza? Você não pode desfazer isso! +issues.dependency.setting=Issues & PRs podem ter dependências +issues.dependency.add_error_same_issue=Você não pode fazer uma issue depender dela mesma! +issues.dependency.add_error_dep_issue_not_exist=Issue dependente não existe! +issues.dependency.add_error_dep_not_exist=Dependência não existe! +issues.dependency.add_error_dep_exists=Dependência já existe! +issues.dependency.add_error_cannot_create_circular=Você não pode criar uma dependência entre duas issues bloqueando uma a outra! +issues.dependency.add_error_dep_not_same_repo=Ambas as issues devem estar no mesmo repositório! pulls.desc=Habilitar solicitações de merge e revisões de código. pulls.new=Novo pull request @@ -793,7 +821,7 @@ pulls.no_results=Nada encontrado. pulls.nothing_to_compare=Estes branches são iguais. Não há nenhuma necessidade para criar um pull request. pulls.has_pull_request=`Um pull request entre esses branches já existe: %[2]s#%[3]d` pulls.create=Criar pull request -pulls.title_desc=quer mesclar %[1]d commits de %[2]s em %[3]s +pulls.title_desc=quer realizar o merge de %[1]d commits de %[2]s em %[3]s pulls.merged_title_desc=fez merge dos %[1]d commits de %[2]s em %[3]s %[4]s pulls.tab_conversation=Conversação pulls.tab_commits=Commits @@ -818,14 +846,14 @@ milestones.new=Novo marco milestones.open_tab=%d Aberto milestones.close_tab=%d Fechado milestones.closed=Fechado %s -milestones.no_due_date=Sem prazo +milestones.no_due_date=Sem data limite milestones.open=Reabrir milestones.close=Fechar milestones.new_subheader=Marcos organizam as issues e acompanham o progresso. milestones.create=Criar marco milestones.title=Título milestones.desc=Descrição -milestones.due_date=Prazo (opcional) +milestones.due_date=Data limite (opcional) milestones.clear=Limpar milestones.invalid_due_date_format=Formato da data limite deve ser 'dd/mm/aaaa'. milestones.create_success=O marco '%s' foi criado. @@ -837,8 +865,8 @@ milestones.edit_success=O marco '%s' foi atualizado. milestones.deletion=Excluir marco milestones.deletion_desc=A exclusão deste marco irá removê-lo de todas as issues. Tem certeza que deseja continuar? milestones.deletion_success=O marco foi excluído. -milestones.filter_sort.closest_due_date=Prazo mais próximo -milestones.filter_sort.furthest_due_date=Prazo mais longe +milestones.filter_sort.closest_due_date=Data limite mais próxima +milestones.filter_sort.furthest_due_date=Data limite mais distante milestones.filter_sort.least_complete=Menos completo milestones.filter_sort.most_complete=Mais completo milestones.filter_sort.most_issues=Com mais issues @@ -975,7 +1003,7 @@ settings.confirm_wiki_delete=Excluir dados da wiki settings.wiki_deletion_success=Os dados da wiki do repositório foi excluídos. settings.delete=Excluir este repositório settings.delete_desc=A exclusão de um repositório é permanente e não pode ser desfeita. -settings.delete_notices_1=-Esta operação NÃO PODERÁ ser desfeita. +settings.delete_notices_1=- Esta operação NÃO PODERÁ ser desfeita. settings.delete_notices_2=- Essa operação excluirá permanentemente o repositório %s, incluindo código, issues, comentários, dados da wiki e configurações do colaborador. settings.delete_notices_fork_1=- Forks deste repositório se tornarão independentes após a exclusão. settings.deletion_success=O repositório foi excluído. @@ -1443,7 +1471,7 @@ auths.deletion_success=A fonte de autenticação foi excluída. auths.login_source_exist=A fonte de autenticação '%s' já existe. config.server_config=Configuração do servidor -config.app_name=Título do site +config.app_name=Nome do servidor config.app_ver=Versão do Gitea config.app_url=URL base do Gitea config.custom_conf=Caminho do Arquivo de Configuração @@ -1499,6 +1527,7 @@ config.enable_timetracking=Habilitar contador de tempo config.default_enable_timetracking=Habilitar o contador de tempo por padrão config.default_allow_only_contributors_to_track_time=Permitir que apenas os colaboradores acompanhem o contador de tempo config.no_reply_address=Ocultar domínio de e-mail +config.default_enable_dependencies=Habilitar dependências de issue por padrão config.webhook_config=Configuração de Hook da Web config.queue_length=Tamanho da fila diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 839ee3806702..20985668e4fd 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -781,6 +781,8 @@ issues.due_date_added=додав(ла) дату завершення %s %s issues.due_date_modified=термін змінено з %s %s на %s issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено +issues.dependency.cancel=Відмінити +issues.dependency.remove=Видалити pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. pulls.new=Новий запит на злиття From 43866e0ec65786bbf9458241bf6b0ff3e3366dd9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 19 Jul 2018 23:39:19 +0800 Subject: [PATCH 124/447] add valid for lfs oid (#4461) --- modules/lfs/server.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/lfs/server.go b/modules/lfs/server.go index dc12791775cf..d6543816b926 100644 --- a/modules/lfs/server.go +++ b/modules/lfs/server.go @@ -85,9 +85,12 @@ type link struct { var oidRegExp = regexp.MustCompile(`^[A-Fa-f0-9]+$`) +func isOidValid(oid string) bool { + return oidRegExp.MatchString(oid) +} + // ObjectOidHandler is the main request routing entry point into LFS server functions func ObjectOidHandler(ctx *context.Context) { - if !setting.LFS.StartServer { writeStatus(ctx, 404) return @@ -110,6 +113,11 @@ func ObjectOidHandler(ctx *context.Context) { } func getAuthenticatedRepoAndMeta(ctx *context.Context, rv *RequestVars, requireWrite bool) (*models.LFSMetaObject, *models.Repository) { + if !isOidValid(rv.Oid) { + writeStatus(ctx, 404) + return nil, nil + } + repository, err := models.GetRepositoryByOwnerAndName(rv.User, rv.Repo) if err != nil { log.Debug("Could not find repository: %s/%s - %s", rv.User, rv.Repo, err) @@ -222,7 +230,7 @@ func PostHandler(ctx *context.Context) { return } - if !oidRegExp.MatchString(rv.Oid) { + if !isOidValid(rv.Oid) { writeStatus(ctx, 404) return } @@ -249,7 +257,6 @@ func PostHandler(ctx *context.Context) { // BatchHandler provides the batch api func BatchHandler(ctx *context.Context) { - if !setting.LFS.StartServer { writeStatus(ctx, 404) return @@ -266,6 +273,10 @@ func BatchHandler(ctx *context.Context) { // Create a response object for _, object := range bv.Objects { + if !isOidValid(object.Oid) { + continue + } + repository, err := models.GetRepositoryByOwnerAndName(object.User, object.Repo) if err != nil { @@ -292,12 +303,10 @@ func BatchHandler(ctx *context.Context) { continue } - if oidRegExp.MatchString(object.Oid) { - // Object is not found - meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID}) - if err == nil { - responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta))) - } + // Object is not found + meta, err = models.NewLFSMetaObject(&models.LFSMetaObject{Oid: object.Oid, Size: object.Size, RepositoryID: repository.ID}) + if err == nil { + responseObjects = append(responseObjects, Represent(object, meta, meta.Existing, !contentStore.Exists(meta))) } } From cc4550e46b83a3a4b326f462e4163248efe965e5 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Thu, 19 Jul 2018 13:58:33 -0400 Subject: [PATCH 125/447] Redirect to correct page after using scratch token (#4458) --- routers/user/auth.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routers/user/auth.go b/routers/user/auth.go index 4852d47aec9a..9a24108c731e 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -320,7 +321,7 @@ func TwoFactorScratchPost(ctx *context.Context, form auth.TwoFactorScratchAuthFo handleSignInFull(ctx, u, remember, false) ctx.Flash.Info(ctx.Tr("auth.twofa_scratch_used")) - ctx.Redirect(setting.AppSubURL + "/user/settings/two_factor") + ctx.Redirect(setting.AppSubURL + "/user/settings/security") return } From 8fb7780cb70487c0060a60c5cf840a0e89233071 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 19 Jul 2018 17:59:34 +0000 Subject: [PATCH 126/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index e1f4550ff87e..62d21fee52a0 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -785,7 +785,7 @@ issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. P issues.dependency.title=Dependências issues.dependency.issue_no_dependencies=Esta issue atualmente não tem dependências. issues.dependency.pr_no_dependencies=Este pull request atualmente não tem dependências. -issues.dependency.add=Adicione uma nova dependência... +issues.dependency.add=Adicione... issues.dependency.cancel=Cancelar issues.dependency.remove=Remover issues.dependency.issue_number=Número da issue @@ -922,8 +922,8 @@ activity.closed_issues_count_1=Issue fechada activity.closed_issues_count_n=Issues fechadas activity.title.issues_1=+%d Issue activity.title.issues_n=+%d Issues -activity.title.issues_closed_by=%s fechado por %s -activity.title.issues_created_by=%s criado por %s +activity.title.issues_closed_by=%s fechada por %s +activity.title.issues_created_by=%s criada por %s activity.closed_issue_label=Fechado activity.new_issues_count_1=Nova issue activity.new_issues_count_n=Novas issues @@ -1615,7 +1615,7 @@ create_repo=criou o repositório %s rename_repo=renomeou o repositório %[1]s para %[3]s commit_repo=fez push para %[3]s em %[4]s create_issue=`abriu a issue %s#%[2]s` -close_issue=`fechou issue %s#%[2]s` +close_issue=`fechou a issue %s#%[2]s` reopen_issue=`reabriu a issue %s#%[2]s` create_pull_request=`criou o pull request %s#%[2]s` close_pull_request=`fechou o pull request %s#%[2]s` From e8ffea251b150deedb583d27fee95dbebffc6e7d Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Fri, 20 Jul 2018 05:10:17 +0300 Subject: [PATCH 127/447] Update xorm to latest version and fix correct `user` table referencing in sql (#4473) --- Gopkg.lock | 10 +- Gopkg.toml | 2 +- models/issue.go | 2 +- models/issue_list.go | 2 +- models/issue_watch.go | 2 +- models/org.go | 4 +- models/repo.go | 2 +- models/repo_watch.go | 2 +- models/user.go | 8 +- vendor/github.com/go-xorm/builder/builder.go | 39 + .../go-xorm/builder/builder_insert.go | 6 +- .../go-xorm/builder/builder_select.go | 55 +- vendor/github.com/go-xorm/builder/cond.go | 9 +- .../go-xorm/builder/cond_compare.go | 8 +- vendor/github.com/go-xorm/builder/cond_eq.go | 20 +- .../github.com/go-xorm/builder/cond_like.go | 2 +- vendor/github.com/go-xorm/builder/cond_neq.go | 20 +- vendor/github.com/go-xorm/builder/cond_not.go | 24 + .../go-xorm/builder/strings_builder.go | 119 +++ vendor/github.com/go-xorm/core/column.go | 4 +- vendor/github.com/go-xorm/core/db.go | 57 +- vendor/github.com/go-xorm/core/dialect.go | 7 +- vendor/github.com/go-xorm/core/filter.go | 6 +- vendor/github.com/go-xorm/core/index.go | 2 + vendor/github.com/go-xorm/core/rows.go | 64 +- vendor/github.com/go-xorm/core/table.go | 2 - vendor/github.com/go-xorm/core/type.go | 38 +- .../github.com/go-xorm/xorm/dialect_mysql.go | 74 ++ .../go-xorm/xorm/dialect_postgres.go | 105 ++- vendor/github.com/go-xorm/xorm/engine.go | 192 +++-- vendor/github.com/go-xorm/xorm/engine_cond.go | 5 +- .../github.com/go-xorm/xorm/engine_table.go | 113 +++ vendor/github.com/go-xorm/xorm/error.go | 31 +- vendor/github.com/go-xorm/xorm/helpers.go | 162 ---- vendor/github.com/go-xorm/xorm/interface.go | 6 + vendor/github.com/go-xorm/xorm/rows.go | 6 +- vendor/github.com/go-xorm/xorm/session.go | 709 +++++++++--------- .../github.com/go-xorm/xorm/session_cols.go | 115 +++ .../github.com/go-xorm/xorm/session_delete.go | 6 +- .../github.com/go-xorm/xorm/session_exist.go | 2 +- .../github.com/go-xorm/xorm/session_find.go | 49 +- vendor/github.com/go-xorm/xorm/session_get.go | 7 +- .../github.com/go-xorm/xorm/session_insert.go | 168 +++-- .../github.com/go-xorm/xorm/session_query.go | 6 +- .../github.com/go-xorm/xorm/session_schema.go | 87 +-- vendor/github.com/go-xorm/xorm/session_tx.go | 2 + .../github.com/go-xorm/xorm/session_update.go | 115 ++- vendor/github.com/go-xorm/xorm/statement.go | 280 ++++--- vendor/github.com/go-xorm/xorm/xorm.go | 12 +- 49 files changed, 1692 insertions(+), 1076 deletions(-) create mode 100644 vendor/github.com/go-xorm/builder/strings_builder.go create mode 100644 vendor/github.com/go-xorm/xorm/engine_table.go diff --git a/Gopkg.lock b/Gopkg.lock index df8203267fd3..38573b67187d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -288,17 +288,19 @@ [[projects]] name = "github.com/go-xorm/builder" packages = ["."] - revision = "488224409dd8aa2ce7a5baf8d10d55764a913738" + revision = "dc8bf48f58fab2b4da338ffd25191905fd741b8f" + version = "v0.3.0" [[projects]] name = "github.com/go-xorm/core" packages = ["."] - revision = "cb1d0ca71f42d3ee1bf4aba7daa16099bc31a7e9" + revision = "c10e21e7e1cec20e09398f2dfae385e58c8df555" + version = "v0.6.0" [[projects]] name = "github.com/go-xorm/xorm" packages = ["."] - revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" + revision = "ad69f7d8f0861a29438154bb0a20b60501298480" [[projects]] branch = "master" @@ -701,6 +703,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "59451a3ad1d449f75c5e9035daf542a377c5c4a397e219bebec0aa0007ab9c39" + inputs-digest = "5ae18d543bbb8186589c003422b333097d67bb5fed8b4c294be70c012ccffc94" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 933c858ce3ad..65155cea97e0 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -33,7 +33,7 @@ ignored = ["google.golang.org/appengine*"] [[override]] name = "github.com/go-xorm/xorm" #version = "0.6.5" - revision = "d4149d1eee0c2c488a74a5863fd9caf13d60fd03" + revision = "ad69f7d8f0861a29438154bb0a20b60501298480" [[override]] name = "github.com/go-sql-driver/mysql" diff --git a/models/issue.go b/models/issue.go index c89ffa7d0f5e..1ac200c80095 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1297,7 +1297,7 @@ func getParticipantsByIssueID(e Engine, issueID int64) ([]*User, error) { And("`comment`.type = ?", CommentTypeComment). And("`user`.is_active = ?", true). And("`user`.prohibit_login = ?", false). - Join("INNER", "user", "`user`.id = `comment`.poster_id"). + Join("INNER", "`user`", "`user`.id = `comment`.poster_id"). Distinct("poster_id"). Find(&userIDs); err != nil { return nil, fmt.Errorf("get poster IDs: %v", err) diff --git a/models/issue_list.go b/models/issue_list.go index 05130a6eefc2..fdfca71aff40 100644 --- a/models/issue_list.go +++ b/models/issue_list.go @@ -166,7 +166,7 @@ func (issues IssueList) loadAssignees(e Engine) error { var assignees = make(map[int64][]*User, len(issues)) rows, err := e.Table("issue_assignees"). - Join("INNER", "user", "`user`.id = `issue_assignees`.assignee_id"). + Join("INNER", "`user`", "`user`.id = `issue_assignees`.assignee_id"). In("`issue_assignees`.issue_id", issues.getIssueIDs()). Rows(new(AssigneeIssue)) if err != nil { diff --git a/models/issue_watch.go b/models/issue_watch.go index 3e7d24821bbe..579c9154761c 100644 --- a/models/issue_watch.go +++ b/models/issue_watch.go @@ -67,7 +67,7 @@ func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error Where("`issue_watch`.issue_id = ?", issueID). And("`user`.is_active = ?", true). And("`user`.prohibit_login = ?", false). - Join("INNER", "user", "`user`.id = `issue_watch`.user_id"). + Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id"). Find(&watches) return } diff --git a/models/org.go b/models/org.go index 23f6c58bf6ab..bd5fc825b88b 100644 --- a/models/org.go +++ b/models/org.go @@ -383,7 +383,7 @@ func GetOwnedOrgsByUserIDDesc(userID int64, desc string) ([]*User, error) { func GetOrgUsersByUserID(uid int64, all bool) ([]*OrgUser, error) { ous := make([]*OrgUser, 0, 10) sess := x. - Join("LEFT", "user", "`org_user`.org_id=`user`.id"). + Join("LEFT", "`user`", "`org_user`.org_id=`user`.id"). Where("`org_user`.uid=?", uid) if !all { // Only show public organizations @@ -575,7 +575,7 @@ func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team, return teams, e. Where("`team_user`.org_id = ?", org.ID). Join("INNER", "team_user", "`team_user`.team_id = team.id"). - Join("INNER", "user", "`user`.id=team_user.uid"). + Join("INNER", "`user`", "`user`.id=team_user.uid"). And("`team_user`.uid = ?", userID). Asc("`user`.name"). Cols(cols...). diff --git a/models/repo.go b/models/repo.go index e87883969dae..3c4908b0d847 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1958,7 +1958,7 @@ func DeleteRepository(doer *User, uid, repoID int64) error { func GetRepositoryByOwnerAndName(ownerName, repoName string) (*Repository, error) { var repo Repository has, err := x.Select("repository.*"). - Join("INNER", "user", "`user`.id = repository.owner_id"). + Join("INNER", "`user`", "`user`.id = repository.owner_id"). Where("repository.lower_name = ?", strings.ToLower(repoName)). And("`user`.lower_name = ?", strings.ToLower(ownerName)). Get(&repo) diff --git a/models/repo_watch.go b/models/repo_watch.go index 8019027c1e51..95c7e44e938d 100644 --- a/models/repo_watch.go +++ b/models/repo_watch.go @@ -54,7 +54,7 @@ func getWatchers(e Engine, repoID int64) ([]*Watch, error) { return watches, e.Where("`watch`.repo_id=?", repoID). And("`user`.is_active=?", true). And("`user`.prohibit_login=?", false). - Join("INNER", "user", "`user`.id = `watch`.user_id"). + Join("INNER", "`user`", "`user`.id = `watch`.user_id"). Find(&watches) } diff --git a/models/user.go b/models/user.go index 0b7af8df6d27..32b9bfec9bcd 100644 --- a/models/user.go +++ b/models/user.go @@ -374,9 +374,9 @@ func (u *User) GetFollowers(page int) ([]*User, error) { Limit(ItemsPerPage, (page-1)*ItemsPerPage). Where("follow.follow_id=?", u.ID) if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "follow", `"user".id=follow.user_id`) + sess = sess.Join("LEFT", "follow", "`user`.id=follow.user_id") } else { - sess = sess.Join("LEFT", "follow", "user.id=follow.user_id") + sess = sess.Join("LEFT", "follow", "`user`.id=follow.user_id") } return users, sess.Find(&users) } @@ -393,9 +393,9 @@ func (u *User) GetFollowing(page int) ([]*User, error) { Limit(ItemsPerPage, (page-1)*ItemsPerPage). Where("follow.user_id=?", u.ID) if setting.UsePostgreSQL { - sess = sess.Join("LEFT", "follow", `"user".id=follow.follow_id`) + sess = sess.Join("LEFT", "follow", "`user`.id=follow.follow_id") } else { - sess = sess.Join("LEFT", "follow", "user.id=follow.follow_id") + sess = sess.Join("LEFT", "follow", "`user`.id=follow.follow_id") } return users, sess.Find(&users) } diff --git a/vendor/github.com/go-xorm/builder/builder.go b/vendor/github.com/go-xorm/builder/builder.go index 1253b9887e1a..80586ce4e145 100644 --- a/vendor/github.com/go-xorm/builder/builder.go +++ b/vendor/github.com/go-xorm/builder/builder.go @@ -4,6 +4,10 @@ package builder +import ( + "fmt" +) + type optype byte const ( @@ -29,6 +33,9 @@ type Builder struct { joins []join inserts Eq updates []Eq + orderBy string + groupBy string + having string } // Select creates a select Builder @@ -67,6 +74,11 @@ func (b *Builder) From(tableName string) *Builder { return b } +// TableName returns the table name +func (b *Builder) TableName() string { + return b.tableName +} + // Into sets insert table name func (b *Builder) Into(tableName string) *Builder { b.tableName = tableName @@ -178,6 +190,33 @@ func (b *Builder) ToSQL() (string, []interface{}, error) { return w.writer.String(), w.args, nil } +// ConvertPlaceholder replaces ? to $1, $2 ... or :1, :2 ... according prefix +func ConvertPlaceholder(sql, prefix string) (string, error) { + buf := StringBuilder{} + var j, start = 0, 0 + for i := 0; i < len(sql); i++ { + if sql[i] == '?' { + _, err := buf.WriteString(sql[start:i]) + if err != nil { + return "", err + } + start = i + 1 + + _, err = buf.WriteString(prefix) + if err != nil { + return "", err + } + + j = j + 1 + _, err = buf.WriteString(fmt.Sprintf("%d", j)) + if err != nil { + return "", err + } + } + } + return buf.String(), nil +} + // ToSQL convert a builder or condtions to SQL and args func ToSQL(cond interface{}) (string, []interface{}, error) { switch cond.(type) { diff --git a/vendor/github.com/go-xorm/builder/builder_insert.go b/vendor/github.com/go-xorm/builder/builder_insert.go index decec931304d..9b213ec73178 100644 --- a/vendor/github.com/go-xorm/builder/builder_insert.go +++ b/vendor/github.com/go-xorm/builder/builder_insert.go @@ -15,7 +15,7 @@ func (b *Builder) insertWriteTo(w Writer) error { return errors.New("no table indicated") } if len(b.inserts) <= 0 { - return errors.New("no column to be update") + return errors.New("no column to be insert") } if _, err := fmt.Fprintf(w, "INSERT INTO %s (", b.tableName); err != nil { @@ -26,7 +26,9 @@ func (b *Builder) insertWriteTo(w Writer) error { var bs []byte var valBuffer = bytes.NewBuffer(bs) var i = 0 - for col, value := range b.inserts { + + for _, col := range b.inserts.sortedKeys() { + value := b.inserts[col] fmt.Fprint(w, col) if e, ok := value.(expr); ok { fmt.Fprint(valBuffer, e.sql) diff --git a/vendor/github.com/go-xorm/builder/builder_select.go b/vendor/github.com/go-xorm/builder/builder_select.go index 3a3967cccc79..deaacbd02431 100644 --- a/vendor/github.com/go-xorm/builder/builder_select.go +++ b/vendor/github.com/go-xorm/builder/builder_select.go @@ -34,24 +34,65 @@ func (b *Builder) selectWriteTo(w Writer) error { } } - if _, err := fmt.Fprintf(w, " FROM %s", b.tableName); err != nil { + if _, err := fmt.Fprint(w, " FROM ", b.tableName); err != nil { return err } for _, v := range b.joins { - fmt.Fprintf(w, " %s JOIN %s ON ", v.joinType, v.joinTable) + if _, err := fmt.Fprintf(w, " %s JOIN %s ON ", v.joinType, v.joinTable); err != nil { + return err + } + if err := v.joinCond.WriteTo(w); err != nil { return err } } - if !b.cond.IsValid() { - return nil + if b.cond.IsValid() { + if _, err := fmt.Fprint(w, " WHERE "); err != nil { + return err + } + + if err := b.cond.WriteTo(w); err != nil { + return err + } } - if _, err := fmt.Fprint(w, " WHERE "); err != nil { - return err + if len(b.groupBy) > 0 { + if _, err := fmt.Fprint(w, " GROUP BY ", b.groupBy); err != nil { + return err + } } - return b.cond.WriteTo(w) + if len(b.having) > 0 { + if _, err := fmt.Fprint(w, " HAVING ", b.having); err != nil { + return err + } + } + + if len(b.orderBy) > 0 { + if _, err := fmt.Fprint(w, " ORDER BY ", b.orderBy); err != nil { + return err + } + } + + return nil +} + +// OrderBy orderBy SQL +func (b *Builder) OrderBy(orderBy string) *Builder { + b.orderBy = orderBy + return b +} + +// GroupBy groupby SQL +func (b *Builder) GroupBy(groupby string) *Builder { + b.groupBy = groupby + return b +} + +// Having having SQL +func (b *Builder) Having(having string) *Builder { + b.having = having + return b } diff --git a/vendor/github.com/go-xorm/builder/cond.go b/vendor/github.com/go-xorm/builder/cond.go index 77dd139bfef3..c0c2553de546 100644 --- a/vendor/github.com/go-xorm/builder/cond.go +++ b/vendor/github.com/go-xorm/builder/cond.go @@ -5,7 +5,6 @@ package builder import ( - "bytes" "io" ) @@ -19,15 +18,15 @@ var _ Writer = NewWriter() // BytesWriter implments Writer and save SQL in bytes.Buffer type BytesWriter struct { - writer *bytes.Buffer - buffer []byte + writer *StringBuilder args []interface{} } // NewWriter creates a new string writer func NewWriter() *BytesWriter { - w := &BytesWriter{} - w.writer = bytes.NewBuffer(w.buffer) + w := &BytesWriter{ + writer: &StringBuilder{}, + } return w } diff --git a/vendor/github.com/go-xorm/builder/cond_compare.go b/vendor/github.com/go-xorm/builder/cond_compare.go index e10ef7447c9f..1c293719c054 100644 --- a/vendor/github.com/go-xorm/builder/cond_compare.go +++ b/vendor/github.com/go-xorm/builder/cond_compare.go @@ -10,7 +10,13 @@ import "fmt" func WriteMap(w Writer, data map[string]interface{}, op string) error { var args = make([]interface{}, 0, len(data)) var i = 0 - for k, v := range data { + keys := make([]string, 0, len(data)) + for k := range data { + keys = append(keys, k) + } + + for _, k := range keys { + v := data[k] switch v.(type) { case expr: if _, err := fmt.Fprintf(w, "%s%s(", k, op); err != nil { diff --git a/vendor/github.com/go-xorm/builder/cond_eq.go b/vendor/github.com/go-xorm/builder/cond_eq.go index 8777727ffc69..79d795e6dd2f 100644 --- a/vendor/github.com/go-xorm/builder/cond_eq.go +++ b/vendor/github.com/go-xorm/builder/cond_eq.go @@ -4,7 +4,10 @@ package builder -import "fmt" +import ( + "fmt" + "sort" +) // Incr implements a type used by Eq type Incr int @@ -19,7 +22,8 @@ var _ Cond = Eq{} func (eq Eq) opWriteTo(op string, w Writer) error { var i = 0 - for k, v := range eq { + for _, k := range eq.sortedKeys() { + v := eq[k] switch v.(type) { case []int, []int64, []string, []int32, []int16, []int8, []uint, []uint64, []uint32, []uint16, []interface{}: if err := In(k, v).WriteTo(w); err != nil { @@ -94,3 +98,15 @@ func (eq Eq) Or(conds ...Cond) Cond { func (eq Eq) IsValid() bool { return len(eq) > 0 } + +// sortedKeys returns all keys of this Eq sorted with sort.Strings. +// It is used internally for consistent ordering when generating +// SQL, see https://github.com/go-xorm/builder/issues/10 +func (eq Eq) sortedKeys() []string { + keys := make([]string, 0, len(eq)) + for key := range eq { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} diff --git a/vendor/github.com/go-xorm/builder/cond_like.go b/vendor/github.com/go-xorm/builder/cond_like.go index 9291f12c9bfd..e34202f8b017 100644 --- a/vendor/github.com/go-xorm/builder/cond_like.go +++ b/vendor/github.com/go-xorm/builder/cond_like.go @@ -16,7 +16,7 @@ func (like Like) WriteTo(w Writer) error { if _, err := fmt.Fprintf(w, "%s LIKE ?", like[0]); err != nil { return err } - // FIXME: if use other regular express, this will be failed. but for compitable, keep this + // FIXME: if use other regular express, this will be failed. but for compatible, keep this if like[1][0] == '%' || like[1][len(like[1])-1] == '%' { w.Append(like[1]) } else { diff --git a/vendor/github.com/go-xorm/builder/cond_neq.go b/vendor/github.com/go-xorm/builder/cond_neq.go index d07b2b18e80b..3a8f3136d9d6 100644 --- a/vendor/github.com/go-xorm/builder/cond_neq.go +++ b/vendor/github.com/go-xorm/builder/cond_neq.go @@ -4,7 +4,10 @@ package builder -import "fmt" +import ( + "fmt" + "sort" +) // Neq defines not equal conditions type Neq map[string]interface{} @@ -15,7 +18,8 @@ var _ Cond = Neq{} func (neq Neq) WriteTo(w Writer) error { var args = make([]interface{}, 0, len(neq)) var i = 0 - for k, v := range neq { + for _, k := range neq.sortedKeys() { + v := neq[k] switch v.(type) { case []int, []int64, []string, []int32, []int16, []int8: if err := NotIn(k, v).WriteTo(w); err != nil { @@ -76,3 +80,15 @@ func (neq Neq) Or(conds ...Cond) Cond { func (neq Neq) IsValid() bool { return len(neq) > 0 } + +// sortedKeys returns all keys of this Neq sorted with sort.Strings. +// It is used internally for consistent ordering when generating +// SQL, see https://github.com/go-xorm/builder/issues/10 +func (neq Neq) sortedKeys() []string { + keys := make([]string, 0, len(neq)) + for key := range neq { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} diff --git a/vendor/github.com/go-xorm/builder/cond_not.go b/vendor/github.com/go-xorm/builder/cond_not.go index 294a7e072802..667dfe7293bf 100644 --- a/vendor/github.com/go-xorm/builder/cond_not.go +++ b/vendor/github.com/go-xorm/builder/cond_not.go @@ -21,6 +21,18 @@ func (not Not) WriteTo(w Writer) error { if _, err := fmt.Fprint(w, "("); err != nil { return err } + case Eq: + if len(not[0].(Eq)) > 1 { + if _, err := fmt.Fprint(w, "("); err != nil { + return err + } + } + case Neq: + if len(not[0].(Neq)) > 1 { + if _, err := fmt.Fprint(w, "("); err != nil { + return err + } + } } if err := not[0].WriteTo(w); err != nil { @@ -32,6 +44,18 @@ func (not Not) WriteTo(w Writer) error { if _, err := fmt.Fprint(w, ")"); err != nil { return err } + case Eq: + if len(not[0].(Eq)) > 1 { + if _, err := fmt.Fprint(w, ")"); err != nil { + return err + } + } + case Neq: + if len(not[0].(Neq)) > 1 { + if _, err := fmt.Fprint(w, ")"); err != nil { + return err + } + } } return nil diff --git a/vendor/github.com/go-xorm/builder/strings_builder.go b/vendor/github.com/go-xorm/builder/strings_builder.go new file mode 100644 index 000000000000..d4de8717e77a --- /dev/null +++ b/vendor/github.com/go-xorm/builder/strings_builder.go @@ -0,0 +1,119 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package builder + +import ( + "unicode/utf8" + "unsafe" +) + +// A StringBuilder is used to efficiently build a string using Write methods. +// It minimizes memory copying. The zero value is ready to use. +// Do not copy a non-zero Builder. +type StringBuilder struct { + addr *StringBuilder // of receiver, to detect copies by value + buf []byte +} + +// noescape hides a pointer from escape analysis. noescape is +// the identity function but escape analysis doesn't think the +// output depends on the input. noescape is inlined and currently +// compiles down to zero instructions. +// USE CAREFULLY! +// This was copied from the runtime; see issues 23382 and 7921. +//go:nosplit +func noescape(p unsafe.Pointer) unsafe.Pointer { + x := uintptr(p) + return unsafe.Pointer(x ^ 0) +} + +func (b *StringBuilder) copyCheck() { + if b.addr == nil { + // This hack works around a failing of Go's escape analysis + // that was causing b to escape and be heap allocated. + // See issue 23382. + // TODO: once issue 7921 is fixed, this should be reverted to + // just "b.addr = b". + b.addr = (*StringBuilder)(noescape(unsafe.Pointer(b))) + } else if b.addr != b { + panic("strings: illegal use of non-zero Builder copied by value") + } +} + +// String returns the accumulated string. +func (b *StringBuilder) String() string { + return *(*string)(unsafe.Pointer(&b.buf)) +} + +// Len returns the number of accumulated bytes; b.Len() == len(b.String()). +func (b *StringBuilder) Len() int { return len(b.buf) } + +// Reset resets the Builder to be empty. +func (b *StringBuilder) Reset() { + b.addr = nil + b.buf = nil +} + +// grow copies the buffer to a new, larger buffer so that there are at least n +// bytes of capacity beyond len(b.buf). +func (b *StringBuilder) grow(n int) { + buf := make([]byte, len(b.buf), 2*cap(b.buf)+n) + copy(buf, b.buf) + b.buf = buf +} + +// Grow grows b's capacity, if necessary, to guarantee space for +// another n bytes. After Grow(n), at least n bytes can be written to b +// without another allocation. If n is negative, Grow panics. +func (b *StringBuilder) Grow(n int) { + b.copyCheck() + if n < 0 { + panic("strings.Builder.Grow: negative count") + } + if cap(b.buf)-len(b.buf) < n { + b.grow(n) + } +} + +// Write appends the contents of p to b's buffer. +// Write always returns len(p), nil. +func (b *StringBuilder) Write(p []byte) (int, error) { + b.copyCheck() + b.buf = append(b.buf, p...) + return len(p), nil +} + +// WriteByte appends the byte c to b's buffer. +// The returned error is always nil. +func (b *StringBuilder) WriteByte(c byte) error { + b.copyCheck() + b.buf = append(b.buf, c) + return nil +} + +// WriteRune appends the UTF-8 encoding of Unicode code point r to b's buffer. +// It returns the length of r and a nil error. +func (b *StringBuilder) WriteRune(r rune) (int, error) { + b.copyCheck() + if r < utf8.RuneSelf { + b.buf = append(b.buf, byte(r)) + return 1, nil + } + l := len(b.buf) + if cap(b.buf)-l < utf8.UTFMax { + b.grow(utf8.UTFMax) + } + n := utf8.EncodeRune(b.buf[l:l+utf8.UTFMax], r) + b.buf = b.buf[:l+n] + return n, nil +} + +// WriteString appends the contents of s to b's buffer. +// It returns the length of s and a nil error. +func (b *StringBuilder) WriteString(s string) (int, error) { + b.copyCheck() + b.buf = append(b.buf, s...) + return len(s), nil +} diff --git a/vendor/github.com/go-xorm/core/column.go b/vendor/github.com/go-xorm/core/column.go index 65370bb5ba1d..20912b713c41 100644 --- a/vendor/github.com/go-xorm/core/column.go +++ b/vendor/github.com/go-xorm/core/column.go @@ -147,12 +147,12 @@ func (col *Column) ValueOfV(dataStruct *reflect.Value) (*reflect.Value, error) { } fieldValue = fieldValue.Elem().FieldByName(fieldPath[i+1]) } else { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) + return nil, fmt.Errorf("field %v is not valid", col.FieldName) } } if !fieldValue.IsValid() { - return nil, fmt.Errorf("field %v is not valid", col.FieldName) + return nil, fmt.Errorf("field %v is not valid", col.FieldName) } return &fieldValue, nil diff --git a/vendor/github.com/go-xorm/core/db.go b/vendor/github.com/go-xorm/core/db.go index 6111c4b332fb..9969fa431349 100644 --- a/vendor/github.com/go-xorm/core/db.go +++ b/vendor/github.com/go-xorm/core/db.go @@ -7,6 +7,11 @@ import ( "fmt" "reflect" "regexp" + "sync" +) + +var ( + DefaultCacheSize = 200 ) func MapToSlice(query string, mp interface{}) (string, []interface{}, error) { @@ -58,9 +63,16 @@ func StructToSlice(query string, st interface{}) (string, []interface{}, error) return query, args, nil } +type cacheStruct struct { + value reflect.Value + idx int +} + type DB struct { *sql.DB - Mapper IMapper + Mapper IMapper + reflectCache map[reflect.Type]*cacheStruct + reflectCacheMutex sync.RWMutex } func Open(driverName, dataSourceName string) (*DB, error) { @@ -68,11 +80,32 @@ func Open(driverName, dataSourceName string) (*DB, error) { if err != nil { return nil, err } - return &DB{db, NewCacheMapper(&SnakeMapper{})}, nil + return &DB{ + DB: db, + Mapper: NewCacheMapper(&SnakeMapper{}), + reflectCache: make(map[reflect.Type]*cacheStruct), + }, nil } func FromDB(db *sql.DB) *DB { - return &DB{db, NewCacheMapper(&SnakeMapper{})} + return &DB{ + DB: db, + Mapper: NewCacheMapper(&SnakeMapper{}), + reflectCache: make(map[reflect.Type]*cacheStruct), + } +} + +func (db *DB) reflectNew(typ reflect.Type) reflect.Value { + db.reflectCacheMutex.Lock() + defer db.reflectCacheMutex.Unlock() + cs, ok := db.reflectCache[typ] + if !ok || cs.idx+1 > DefaultCacheSize-1 { + cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), DefaultCacheSize, DefaultCacheSize), 0} + db.reflectCache[typ] = cs + } else { + cs.idx = cs.idx + 1 + } + return cs.value.Index(cs.idx).Addr() } func (db *DB) Query(query string, args ...interface{}) (*Rows, error) { @@ -83,7 +116,7 @@ func (db *DB) Query(query string, args ...interface{}) (*Rows, error) { } return nil, err } - return &Rows{rows, db.Mapper}, nil + return &Rows{rows, db}, nil } func (db *DB) QueryMap(query string, mp interface{}) (*Rows, error) { @@ -128,8 +161,8 @@ func (db *DB) QueryRowStruct(query string, st interface{}) *Row { type Stmt struct { *sql.Stmt - Mapper IMapper - names map[string]int + db *DB + names map[string]int } func (db *DB) Prepare(query string) (*Stmt, error) { @@ -145,7 +178,7 @@ func (db *DB) Prepare(query string) (*Stmt, error) { if err != nil { return nil, err } - return &Stmt{stmt, db.Mapper, names}, nil + return &Stmt{stmt, db, names}, nil } func (s *Stmt) ExecMap(mp interface{}) (sql.Result, error) { @@ -179,7 +212,7 @@ func (s *Stmt) Query(args ...interface{}) (*Rows, error) { if err != nil { return nil, err } - return &Rows{rows, s.Mapper}, nil + return &Rows{rows, s.db}, nil } func (s *Stmt) QueryMap(mp interface{}) (*Rows, error) { @@ -274,7 +307,7 @@ func (EmptyScanner) Scan(src interface{}) error { type Tx struct { *sql.Tx - Mapper IMapper + db *DB } func (db *DB) Begin() (*Tx, error) { @@ -282,7 +315,7 @@ func (db *DB) Begin() (*Tx, error) { if err != nil { return nil, err } - return &Tx{tx, db.Mapper}, nil + return &Tx{tx, db}, nil } func (tx *Tx) Prepare(query string) (*Stmt, error) { @@ -298,7 +331,7 @@ func (tx *Tx) Prepare(query string) (*Stmt, error) { if err != nil { return nil, err } - return &Stmt{stmt, tx.Mapper, names}, nil + return &Stmt{stmt, tx.db, names}, nil } func (tx *Tx) Stmt(stmt *Stmt) *Stmt { @@ -327,7 +360,7 @@ func (tx *Tx) Query(query string, args ...interface{}) (*Rows, error) { if err != nil { return nil, err } - return &Rows{rows, tx.Mapper}, nil + return &Rows{rows, tx.db}, nil } func (tx *Tx) QueryMap(query string, mp interface{}) (*Rows, error) { diff --git a/vendor/github.com/go-xorm/core/dialect.go b/vendor/github.com/go-xorm/core/dialect.go index 6f2e81d017b3..c288a0847837 100644 --- a/vendor/github.com/go-xorm/core/dialect.go +++ b/vendor/github.com/go-xorm/core/dialect.go @@ -74,6 +74,7 @@ type Dialect interface { GetIndexes(tableName string) (map[string]*Index, error) Filters() []Filter + SetParams(params map[string]string) } func OpenDialect(dialect Dialect) (*DB, error) { @@ -148,7 +149,8 @@ func (db *Base) SupportDropIfExists() bool { } func (db *Base) DropTableSql(tableName string) string { - return fmt.Sprintf("DROP TABLE IF EXISTS `%s`", tableName) + quote := db.dialect.Quote + return fmt.Sprintf("DROP TABLE IF EXISTS %s", quote(tableName)) } func (db *Base) HasRecords(query string, args ...interface{}) (bool, error) { @@ -289,6 +291,9 @@ func (b *Base) LogSQL(sql string, args []interface{}) { } } +func (b *Base) SetParams(params map[string]string) { +} + var ( dialects = map[string]func() Dialect{} ) diff --git a/vendor/github.com/go-xorm/core/filter.go b/vendor/github.com/go-xorm/core/filter.go index 60caaf290262..35b0ece67648 100644 --- a/vendor/github.com/go-xorm/core/filter.go +++ b/vendor/github.com/go-xorm/core/filter.go @@ -37,9 +37,9 @@ func (q *Quoter) Quote(content string) string { func (i *IdFilter) Do(sql string, dialect Dialect, table *Table) string { quoter := NewQuoter(dialect) if table != nil && len(table.PrimaryKeys) == 1 { - sql = strings.Replace(sql, "`(id)`", quoter.Quote(table.PrimaryKeys[0]), -1) - sql = strings.Replace(sql, quoter.Quote("(id)"), quoter.Quote(table.PrimaryKeys[0]), -1) - return strings.Replace(sql, "(id)", quoter.Quote(table.PrimaryKeys[0]), -1) + sql = strings.Replace(sql, " `(id)` ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) + sql = strings.Replace(sql, " "+quoter.Quote("(id)")+" ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) + return strings.Replace(sql, " (id) ", " "+quoter.Quote(table.PrimaryKeys[0])+" ", -1) } return sql } diff --git a/vendor/github.com/go-xorm/core/index.go b/vendor/github.com/go-xorm/core/index.go index 73b95175adc2..9aa1b7ac99ba 100644 --- a/vendor/github.com/go-xorm/core/index.go +++ b/vendor/github.com/go-xorm/core/index.go @@ -22,6 +22,8 @@ type Index struct { func (index *Index) XName(tableName string) string { if !strings.HasPrefix(index.Name, "UQE_") && !strings.HasPrefix(index.Name, "IDX_") { + tableName = strings.Replace(tableName, `"`, "", -1) + tableName = strings.Replace(tableName, `.`, "_", -1) if index.Type == UniqueType { return fmt.Sprintf("UQE_%v_%v", tableName, index.Name) } diff --git a/vendor/github.com/go-xorm/core/rows.go b/vendor/github.com/go-xorm/core/rows.go index 4a4acaa4c26b..580de4f9c669 100644 --- a/vendor/github.com/go-xorm/core/rows.go +++ b/vendor/github.com/go-xorm/core/rows.go @@ -9,7 +9,7 @@ import ( type Rows struct { *sql.Rows - Mapper IMapper + db *DB } func (rs *Rows) ToMapString() ([]map[string]string, error) { @@ -105,7 +105,7 @@ func (rs *Rows) ScanStructByName(dest interface{}) error { newDest := make([]interface{}, len(cols)) var v EmptyScanner for j, name := range cols { - f := fieldByName(vv.Elem(), rs.Mapper.Table2Obj(name)) + f := fieldByName(vv.Elem(), rs.db.Mapper.Table2Obj(name)) if f.IsValid() { newDest[j] = f.Addr().Interface() } else { @@ -116,36 +116,6 @@ func (rs *Rows) ScanStructByName(dest interface{}) error { return rs.Rows.Scan(newDest...) } -type cacheStruct struct { - value reflect.Value - idx int -} - -var ( - reflectCache = make(map[reflect.Type]*cacheStruct) - reflectCacheMutex sync.RWMutex -) - -func ReflectNew(typ reflect.Type) reflect.Value { - reflectCacheMutex.RLock() - cs, ok := reflectCache[typ] - reflectCacheMutex.RUnlock() - - const newSize = 200 - - if !ok || cs.idx+1 > newSize-1 { - cs = &cacheStruct{reflect.MakeSlice(reflect.SliceOf(typ), newSize, newSize), 0} - reflectCacheMutex.Lock() - reflectCache[typ] = cs - reflectCacheMutex.Unlock() - } else { - reflectCacheMutex.Lock() - cs.idx = cs.idx + 1 - reflectCacheMutex.Unlock() - } - return cs.value.Index(cs.idx).Addr() -} - // scan data to a slice's pointer, slice's length should equal to columns' number func (rs *Rows) ScanSlice(dest interface{}) error { vv := reflect.ValueOf(dest) @@ -197,9 +167,7 @@ func (rs *Rows) ScanMap(dest interface{}) error { vvv := vv.Elem() for i, _ := range cols { - newDest[i] = ReflectNew(vvv.Type().Elem()).Interface() - //v := reflect.New(vvv.Type().Elem()) - //newDest[i] = v.Interface() + newDest[i] = rs.db.reflectNew(vvv.Type().Elem()).Interface() } err = rs.Rows.Scan(newDest...) @@ -215,32 +183,6 @@ func (rs *Rows) ScanMap(dest interface{}) error { return nil } -/*func (rs *Rows) ScanMap(dest interface{}) error { - vv := reflect.ValueOf(dest) - if vv.Kind() != reflect.Ptr || vv.Elem().Kind() != reflect.Map { - return errors.New("dest should be a map's pointer") - } - - cols, err := rs.Columns() - if err != nil { - return err - } - - newDest := make([]interface{}, len(cols)) - err = rs.ScanSlice(newDest) - if err != nil { - return err - } - - vvv := vv.Elem() - - for i, name := range cols { - vname := reflect.ValueOf(name) - vvv.SetMapIndex(vname, reflect.ValueOf(newDest[i]).Elem()) - } - - return nil -}*/ type Row struct { rows *Rows // One of these two will be non-nil: diff --git a/vendor/github.com/go-xorm/core/table.go b/vendor/github.com/go-xorm/core/table.go index 88199bedd61a..b5d079404c8e 100644 --- a/vendor/github.com/go-xorm/core/table.go +++ b/vendor/github.com/go-xorm/core/table.go @@ -49,7 +49,6 @@ func NewTable(name string, t reflect.Type) *Table { } func (table *Table) columnsByName(name string) []*Column { - n := len(name) for k := range table.columnsMap { @@ -75,7 +74,6 @@ func (table *Table) GetColumn(name string) *Column { } func (table *Table) GetColumnIdx(name string, idx int) *Column { - cols := table.columnsByName(name) if cols != nil && idx < len(cols) { diff --git a/vendor/github.com/go-xorm/core/type.go b/vendor/github.com/go-xorm/core/type.go index 8010a2220fc2..5cbf93057306 100644 --- a/vendor/github.com/go-xorm/core/type.go +++ b/vendor/github.com/go-xorm/core/type.go @@ -69,15 +69,18 @@ var ( Enum = "ENUM" Set = "SET" - Char = "CHAR" - Varchar = "VARCHAR" - NVarchar = "NVARCHAR" - TinyText = "TINYTEXT" - Text = "TEXT" - Clob = "CLOB" - MediumText = "MEDIUMTEXT" - LongText = "LONGTEXT" - Uuid = "UUID" + Char = "CHAR" + Varchar = "VARCHAR" + NVarchar = "NVARCHAR" + TinyText = "TINYTEXT" + Text = "TEXT" + NText = "NTEXT" + Clob = "CLOB" + MediumText = "MEDIUMTEXT" + LongText = "LONGTEXT" + Uuid = "UUID" + UniqueIdentifier = "UNIQUEIDENTIFIER" + SysName = "SYSNAME" Date = "DATE" DateTime = "DATETIME" @@ -128,10 +131,12 @@ var ( NVarchar: TEXT_TYPE, TinyText: TEXT_TYPE, Text: TEXT_TYPE, + NText: TEXT_TYPE, MediumText: TEXT_TYPE, LongText: TEXT_TYPE, Uuid: TEXT_TYPE, Clob: TEXT_TYPE, + SysName: TEXT_TYPE, Date: TIME_TYPE, DateTime: TIME_TYPE, @@ -148,11 +153,12 @@ var ( Binary: BLOB_TYPE, VarBinary: BLOB_TYPE, - TinyBlob: BLOB_TYPE, - Blob: BLOB_TYPE, - MediumBlob: BLOB_TYPE, - LongBlob: BLOB_TYPE, - Bytea: BLOB_TYPE, + TinyBlob: BLOB_TYPE, + Blob: BLOB_TYPE, + MediumBlob: BLOB_TYPE, + LongBlob: BLOB_TYPE, + Bytea: BLOB_TYPE, + UniqueIdentifier: BLOB_TYPE, Bool: NUMERIC_TYPE, @@ -289,9 +295,9 @@ func SQLType2Type(st SQLType) reflect.Type { return reflect.TypeOf(float32(1)) case Double: return reflect.TypeOf(float64(1)) - case Char, Varchar, NVarchar, TinyText, Text, MediumText, LongText, Enum, Set, Uuid, Clob: + case Char, Varchar, NVarchar, TinyText, Text, NText, MediumText, LongText, Enum, Set, Uuid, Clob, SysName: return reflect.TypeOf("") - case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary: + case TinyBlob, Blob, LongBlob, Bytea, Binary, MediumBlob, VarBinary, UniqueIdentifier: return reflect.TypeOf([]byte{}) case Bool: return reflect.TypeOf(true) diff --git a/vendor/github.com/go-xorm/xorm/dialect_mysql.go b/vendor/github.com/go-xorm/xorm/dialect_mysql.go index 99100b232519..f2b4ff7a786b 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_mysql.go +++ b/vendor/github.com/go-xorm/xorm/dialect_mysql.go @@ -172,12 +172,33 @@ type mysql struct { allowAllFiles bool allowOldPasswords bool clientFoundRows bool + rowFormat string } func (db *mysql) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { return db.Base.Init(d, db, uri, drivername, dataSourceName) } +func (db *mysql) SetParams(params map[string]string) { + rowFormat, ok := params["rowFormat"] + if ok { + var t = strings.ToUpper(rowFormat) + switch t { + case "COMPACT": + fallthrough + case "REDUNDANT": + fallthrough + case "DYNAMIC": + fallthrough + case "COMPRESSED": + db.rowFormat = t + break + default: + break + } + } +} + func (db *mysql) SqlType(c *core.Column) string { var res string switch t := c.SQLType.Name; t { @@ -487,6 +508,59 @@ func (db *mysql) GetIndexes(tableName string) (map[string]*core.Index, error) { return indexes, nil } +func (db *mysql) CreateTableSql(table *core.Table, tableName, storeEngine, charset string) string { + var sql string + sql = "CREATE TABLE IF NOT EXISTS " + if tableName == "" { + tableName = table.Name + } + + sql += db.Quote(tableName) + sql += " (" + + if len(table.ColumnsSeq()) > 0 { + pkList := table.PrimaryKeys + + for _, colName := range table.ColumnsSeq() { + col := table.GetColumn(colName) + if col.IsPrimaryKey && len(pkList) == 1 { + sql += col.String(db) + } else { + sql += col.StringNoPk(db) + } + sql = strings.TrimSpace(sql) + if len(col.Comment) > 0 { + sql += " COMMENT '" + col.Comment + "'" + } + sql += ", " + } + + if len(pkList) > 1 { + sql += "PRIMARY KEY ( " + sql += db.Quote(strings.Join(pkList, db.Quote(","))) + sql += " ), " + } + + sql = sql[:len(sql)-2] + } + sql += ")" + + if storeEngine != "" { + sql += " ENGINE=" + storeEngine + } + + if len(charset) == 0 { + charset = db.URI().Charset + } else if len(charset) > 0 { + sql += " DEFAULT CHARSET " + charset + } + + if db.rowFormat != "" { + sql += " ROW_FORMAT=" + db.rowFormat + } + return sql +} + func (db *mysql) Filters() []core.Filter { return []core.Filter{&core.IdFilter{}} } diff --git a/vendor/github.com/go-xorm/xorm/dialect_postgres.go b/vendor/github.com/go-xorm/xorm/dialect_postgres.go index d6f71acc1db1..1f74bd312e89 100644 --- a/vendor/github.com/go-xorm/xorm/dialect_postgres.go +++ b/vendor/github.com/go-xorm/xorm/dialect_postgres.go @@ -769,14 +769,21 @@ var ( DefaultPostgresSchema = "public" ) +const postgresPublicSchema = "public" + type postgres struct { core.Base - schema string } func (db *postgres) Init(d *core.DB, uri *core.Uri, drivername, dataSourceName string) error { - db.schema = DefaultPostgresSchema - return db.Base.Init(d, db, uri, drivername, dataSourceName) + err := db.Base.Init(d, db, uri, drivername, dataSourceName) + if err != nil { + return err + } + if db.Schema == "" { + db.Schema = DefaultPostgresSchema + } + return nil } func (db *postgres) SqlType(c *core.Column) string { @@ -873,32 +880,42 @@ func (db *postgres) IndexOnTable() bool { } func (db *postgres) IndexCheckSql(tableName, idxName string) (string, []interface{}) { - args := []interface{}{tableName, idxName} + if len(db.Schema) == 0 { + args := []interface{}{tableName, idxName} + return `SELECT indexname FROM pg_indexes WHERE tablename = ? AND indexname = ?`, args + } + + args := []interface{}{db.Schema, tableName, idxName} return `SELECT indexname FROM pg_indexes ` + - `WHERE tablename = ? AND indexname = ?`, args + `WHERE schemaname = ? AND tablename = ? AND indexname = ?`, args } func (db *postgres) TableCheckSql(tableName string) (string, []interface{}) { - args := []interface{}{tableName} - return `SELECT tablename FROM pg_tables WHERE tablename = ?`, args -} + if len(db.Schema) == 0 { + args := []interface{}{tableName} + return `SELECT tablename FROM pg_tables WHERE tablename = ?`, args + } -/*func (db *postgres) ColumnCheckSql(tableName, colName string) (string, []interface{}) { - args := []interface{}{tableName, colName} - return "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = ?" + - " AND column_name = ?", args -}*/ + args := []interface{}{db.Schema, tableName} + return `SELECT tablename FROM pg_tables WHERE schemaname = ? AND tablename = ?`, args +} func (db *postgres) ModifyColumnSql(tableName string, col *core.Column) string { - return fmt.Sprintf("alter table %s ALTER COLUMN %s TYPE %s", - tableName, col.Name, db.SqlType(col)) + if len(db.Schema) == 0 { + return fmt.Sprintf("alter table %s ALTER COLUMN %s TYPE %s", + tableName, col.Name, db.SqlType(col)) + } + return fmt.Sprintf("alter table %s.%s ALTER COLUMN %s TYPE %s", + db.Schema, tableName, col.Name, db.SqlType(col)) } func (db *postgres) DropIndexSql(tableName string, index *core.Index) string { - //var unique string quote := db.Quote idxName := index.Name + tableName = strings.Replace(tableName, `"`, "", -1) + tableName = strings.Replace(tableName, `.`, "_", -1) + if !strings.HasPrefix(idxName, "UQE_") && !strings.HasPrefix(idxName, "IDX_") { if index.Type == core.UniqueType { @@ -907,13 +924,21 @@ func (db *postgres) DropIndexSql(tableName string, index *core.Index) string { idxName = fmt.Sprintf("IDX_%v_%v", tableName, index.Name) } } + if db.Uri.Schema != "" { + idxName = db.Uri.Schema + "." + idxName + } return fmt.Sprintf("DROP INDEX %v", quote(idxName)) } func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) { - args := []interface{}{tableName, colName} - query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" + - " AND column_name = $2" + args := []interface{}{db.Schema, tableName, colName} + query := "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = $1 AND table_name = $2" + + " AND column_name = $3" + if len(db.Schema) == 0 { + args = []interface{}{tableName, colName} + query = "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = $1" + + " AND column_name = $2" + } db.LogSQL(query, args) rows, err := db.DB().Query(query, args...) @@ -926,8 +951,7 @@ func (db *postgres) IsColumnExist(tableName, colName string) (bool, error) { } func (db *postgres) GetColumns(tableName string) ([]string, map[string]*core.Column, error) { - // FIXME: the schema should be replaced by user custom's - args := []interface{}{tableName, db.schema} + args := []interface{}{tableName} s := `SELECT column_name, column_default, is_nullable, data_type, character_maximum_length, numeric_precision, numeric_precision_radix , CASE WHEN p.contype = 'p' THEN true ELSE false END AS primarykey, CASE WHEN p.contype = 'u' THEN true ELSE false END AS uniquekey @@ -938,7 +962,15 @@ FROM pg_attribute f LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey) LEFT JOIN pg_class AS g ON p.confrelid = g.oid LEFT JOIN INFORMATION_SCHEMA.COLUMNS s ON s.column_name=f.attname AND c.relname=s.table_name -WHERE c.relkind = 'r'::char AND c.relname = $1 AND s.table_schema = $2 AND f.attnum > 0 ORDER BY f.attnum;` +WHERE c.relkind = 'r'::char AND c.relname = $1%s AND f.attnum > 0 ORDER BY f.attnum;` + + var f string + if len(db.Schema) != 0 { + args = append(args, db.Schema) + f = " AND s.table_schema = $2" + } + s = fmt.Sprintf(s, f) + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) @@ -1028,8 +1060,13 @@ WHERE c.relkind = 'r'::char AND c.relname = $1 AND s.table_schema = $2 AND f.att } func (db *postgres) GetTables() ([]*core.Table, error) { - args := []interface{}{db.schema} - s := fmt.Sprintf("SELECT tablename FROM pg_tables WHERE schemaname = $1") + args := []interface{}{} + s := "SELECT tablename FROM pg_tables" + if len(db.Schema) != 0 { + args = append(args, db.Schema) + s = s + " WHERE schemaname = $1" + } + db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) @@ -1053,8 +1090,12 @@ func (db *postgres) GetTables() ([]*core.Table, error) { } func (db *postgres) GetIndexes(tableName string) (map[string]*core.Index, error) { - args := []interface{}{db.schema, tableName} - s := fmt.Sprintf("SELECT indexname, indexdef FROM pg_indexes WHERE schemaname=$1 AND tablename=$2") + args := []interface{}{tableName} + s := fmt.Sprintf("SELECT indexname, indexdef FROM pg_indexes WHERE tablename=$1") + if len(db.Schema) != 0 { + args = append(args, db.Schema) + s = s + " AND schemaname=$2" + } db.LogSQL(s, args) rows, err := db.DB().Query(s, args...) @@ -1182,3 +1223,15 @@ func (p *pqDriver) Parse(driverName, dataSourceName string) (*core.Uri, error) { return db, nil } + +type pqDriverPgx struct { + pqDriver +} + +func (pgx *pqDriverPgx) Parse(driverName, dataSourceName string) (*core.Uri, error) { + // Remove the leading characters for driver to work + if len(dataSourceName) >= 9 && dataSourceName[0] == 0 { + dataSourceName = dataSourceName[9:] + } + return pgx.pqDriver.Parse(driverName, dataSourceName) +} diff --git a/vendor/github.com/go-xorm/xorm/engine.go b/vendor/github.com/go-xorm/xorm/engine.go index 444611afb16a..846889c36437 100644 --- a/vendor/github.com/go-xorm/xorm/engine.go +++ b/vendor/github.com/go-xorm/xorm/engine.go @@ -49,6 +49,35 @@ type Engine struct { tagHandlers map[string]tagHandler engineGroup *EngineGroup + + cachers map[string]core.Cacher + cacherLock sync.RWMutex +} + +func (engine *Engine) setCacher(tableName string, cacher core.Cacher) { + engine.cacherLock.Lock() + engine.cachers[tableName] = cacher + engine.cacherLock.Unlock() +} + +func (engine *Engine) SetCacher(tableName string, cacher core.Cacher) { + engine.setCacher(tableName, cacher) +} + +func (engine *Engine) getCacher(tableName string) core.Cacher { + var cacher core.Cacher + var ok bool + engine.cacherLock.RLock() + cacher, ok = engine.cachers[tableName] + engine.cacherLock.RUnlock() + if !ok && !engine.disableGlobalCache { + cacher = engine.Cacher + } + return cacher +} + +func (engine *Engine) GetCacher(tableName string) core.Cacher { + return engine.getCacher(tableName) } // BufferSize sets buffer size for iterate @@ -165,7 +194,7 @@ func (engine *Engine) Quote(value string) string { } // QuoteTo quotes string and writes into the buffer -func (engine *Engine) QuoteTo(buf *bytes.Buffer, value string) { +func (engine *Engine) QuoteTo(buf *builder.StringBuilder, value string) { if buf == nil { return } @@ -245,13 +274,7 @@ func (engine *Engine) NoCascade() *Session { // MapCacher Set a table use a special cacher func (engine *Engine) MapCacher(bean interface{}, cacher core.Cacher) error { - v := rValue(bean) - tb, err := engine.autoMapType(v) - if err != nil { - return err - } - - tb.Cacher = cacher + engine.setCacher(engine.TableName(bean, true), cacher) return nil } @@ -536,33 +559,6 @@ func (engine *Engine) dumpTables(tables []*core.Table, w io.Writer, tp ...core.D return nil } -func (engine *Engine) tableName(beanOrTableName interface{}) (string, error) { - v := rValue(beanOrTableName) - if v.Type().Kind() == reflect.String { - return beanOrTableName.(string), nil - } else if v.Type().Kind() == reflect.Struct { - return engine.tbName(v), nil - } - return "", errors.New("bean should be a struct or struct's point") -} - -func (engine *Engine) tbName(v reflect.Value) string { - if tb, ok := v.Interface().(TableName); ok { - return tb.TableName() - } - - if v.Type().Kind() == reflect.Ptr { - if tb, ok := reflect.Indirect(v).Interface().(TableName); ok { - return tb.TableName() - } - } else if v.CanAddr() { - if tb, ok := v.Addr().Interface().(TableName); ok { - return tb.TableName() - } - } - return engine.TableMapper.Obj2Table(reflect.Indirect(v).Type().Name()) -} - // Cascade use cascade or not func (engine *Engine) Cascade(trueOrFalse ...bool) *Session { session := engine.NewSession() @@ -846,7 +842,7 @@ func (engine *Engine) TableInfo(bean interface{}) *Table { if err != nil { engine.logger.Error(err) } - return &Table{tb, engine.tbName(v)} + return &Table{tb, engine.TableName(bean)} } func addIndex(indexName string, table *core.Table, col *core.Column, indexType int) { @@ -861,15 +857,6 @@ func addIndex(indexName string, table *core.Table, col *core.Column, indexType i } } -func (engine *Engine) newTable() *core.Table { - table := core.NewEmptyTable() - - if !engine.disableGlobalCache { - table.Cacher = engine.Cacher - } - return table -} - // TableName table name interface to define customerize table name type TableName interface { TableName() string @@ -881,21 +868,9 @@ var ( func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) { t := v.Type() - table := engine.newTable() - if tb, ok := v.Interface().(TableName); ok { - table.Name = tb.TableName() - } else { - if v.CanAddr() { - if tb, ok = v.Addr().Interface().(TableName); ok { - table.Name = tb.TableName() - } - } - if table.Name == "" { - table.Name = engine.TableMapper.Obj2Table(t.Name()) - } - } - + table := core.NewEmptyTable() table.Type = t + table.Name = engine.tbNameForMap(v) var idFieldColName string var hasCacheTag, hasNoCacheTag bool @@ -1049,15 +1024,15 @@ func (engine *Engine) mapType(v reflect.Value) (*core.Table, error) { if hasCacheTag { if engine.Cacher != nil { // !nash! use engine's cacher if provided engine.logger.Info("enable cache on table:", table.Name) - table.Cacher = engine.Cacher + engine.setCacher(table.Name, engine.Cacher) } else { engine.logger.Info("enable LRU cache on table:", table.Name) - table.Cacher = NewLRUCacher2(NewMemoryStore(), time.Hour, 10000) // !nashtsai! HACK use LRU cacher for now + engine.setCacher(table.Name, NewLRUCacher2(NewMemoryStore(), time.Hour, 10000)) } } if hasNoCacheTag { - engine.logger.Info("no cache on table:", table.Name) - table.Cacher = nil + engine.logger.Info("disable cache on table:", table.Name) + engine.setCacher(table.Name, nil) } return table, nil @@ -1116,7 +1091,25 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) { pk := make([]interface{}, len(table.PrimaryKeys)) for i, col := range table.PKColumns() { var err error - pkField := v.FieldByName(col.FieldName) + + fieldName := col.FieldName + for { + parts := strings.SplitN(fieldName, ".", 2) + if len(parts) == 1 { + break + } + + v = v.FieldByName(parts[0]) + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if v.Kind() != reflect.Struct { + return nil, ErrUnSupportedType + } + fieldName = parts[1] + } + + pkField := v.FieldByName(fieldName) switch pkField.Kind() { case reflect.String: pk[i], err = engine.idTypeAssertion(col, pkField.String()) @@ -1162,26 +1155,10 @@ func (engine *Engine) CreateUniques(bean interface{}) error { return session.CreateUniques(bean) } -func (engine *Engine) getCacher2(table *core.Table) core.Cacher { - return table.Cacher -} - // ClearCacheBean if enabled cache, clear the cache bean func (engine *Engine) ClearCacheBean(bean interface{}, id string) error { - v := rValue(bean) - t := v.Type() - if t.Kind() != reflect.Struct { - return errors.New("error params") - } - tableName := engine.tbName(v) - table, err := engine.autoMapType(v) - if err != nil { - return err - } - cacher := table.Cacher - if cacher == nil { - cacher = engine.Cacher - } + tableName := engine.TableName(bean) + cacher := engine.getCacher(tableName) if cacher != nil { cacher.ClearIds(tableName) cacher.DelBean(tableName, id) @@ -1192,21 +1169,8 @@ func (engine *Engine) ClearCacheBean(bean interface{}, id string) error { // ClearCache if enabled cache, clear some tables' cache func (engine *Engine) ClearCache(beans ...interface{}) error { for _, bean := range beans { - v := rValue(bean) - t := v.Type() - if t.Kind() != reflect.Struct { - return errors.New("error params") - } - tableName := engine.tbName(v) - table, err := engine.autoMapType(v) - if err != nil { - return err - } - - cacher := table.Cacher - if cacher == nil { - cacher = engine.Cacher - } + tableName := engine.TableName(bean) + cacher := engine.getCacher(tableName) if cacher != nil { cacher.ClearIds(tableName) cacher.ClearBeans(tableName) @@ -1224,13 +1188,13 @@ func (engine *Engine) Sync(beans ...interface{}) error { for _, bean := range beans { v := rValue(bean) - tableName := engine.tbName(v) + tableNameNoSchema := engine.TableName(bean) table, err := engine.autoMapType(v) if err != nil { return err } - isExist, err := session.Table(bean).isTableExist(tableName) + isExist, err := session.Table(bean).isTableExist(tableNameNoSchema) if err != nil { return err } @@ -1256,12 +1220,12 @@ func (engine *Engine) Sync(beans ...interface{}) error { } } else { for _, col := range table.Columns() { - isExist, err := engine.dialect.IsColumnExist(tableName, col.Name) + isExist, err := engine.dialect.IsColumnExist(tableNameNoSchema, col.Name) if err != nil { return err } if !isExist { - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } err = session.addColumn(col.Name) @@ -1272,35 +1236,35 @@ func (engine *Engine) Sync(beans ...interface{}) error { } for name, index := range table.Indexes { - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } if index.Type == core.UniqueType { - isExist, err := session.isIndexExist2(tableName, index.Cols, true) + isExist, err := session.isIndexExist2(tableNameNoSchema, index.Cols, true) if err != nil { return err } if !isExist { - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } - err = session.addUnique(tableName, name) + err = session.addUnique(tableNameNoSchema, name) if err != nil { return err } } } else if index.Type == core.IndexType { - isExist, err := session.isIndexExist2(tableName, index.Cols, false) + isExist, err := session.isIndexExist2(tableNameNoSchema, index.Cols, false) if err != nil { return err } if !isExist { - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } - err = session.addIndex(tableName, name) + err = session.addIndex(tableNameNoSchema, name) if err != nil { return err } @@ -1453,6 +1417,13 @@ func (engine *Engine) Find(beans interface{}, condiBeans ...interface{}) error { return session.Find(beans, condiBeans...) } +// FindAndCount find the results and also return the counts +func (engine *Engine) FindAndCount(rowsSlicePtr interface{}, condiBean ...interface{}) (int64, error) { + session := engine.NewSession() + defer session.Close() + return session.FindAndCount(rowsSlicePtr, condiBean...) +} + // Iterate record by record handle records from table, bean's non-empty fields // are conditions. func (engine *Engine) Iterate(bean interface{}, fun IterFunc) error { @@ -1629,6 +1600,11 @@ func (engine *Engine) SetTZDatabase(tz *time.Location) { engine.DatabaseTZ = tz } +// SetSchema sets the schema of database +func (engine *Engine) SetSchema(schema string) { + engine.dialect.URI().Schema = schema +} + // Unscoped always disable struct tag "deleted" func (engine *Engine) Unscoped() *Session { session := engine.NewSession() diff --git a/vendor/github.com/go-xorm/xorm/engine_cond.go b/vendor/github.com/go-xorm/xorm/engine_cond.go index 6c8e3879cee0..4dde8662e13b 100644 --- a/vendor/github.com/go-xorm/xorm/engine_cond.go +++ b/vendor/github.com/go-xorm/xorm/engine_cond.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "reflect" + "strings" "time" "github.com/go-xorm/builder" @@ -51,7 +52,9 @@ func (engine *Engine) buildConds(table *core.Table, bean interface{}, fieldValuePtr, err := col.ValueOf(bean) if err != nil { - engine.logger.Error(err) + if !strings.Contains(err.Error(), "is not valid") { + engine.logger.Warn(err) + } continue } diff --git a/vendor/github.com/go-xorm/xorm/engine_table.go b/vendor/github.com/go-xorm/xorm/engine_table.go new file mode 100644 index 000000000000..94871a4bce5b --- /dev/null +++ b/vendor/github.com/go-xorm/xorm/engine_table.go @@ -0,0 +1,113 @@ +// Copyright 2018 The Xorm Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package xorm + +import ( + "fmt" + "reflect" + "strings" + + "github.com/go-xorm/core" +) + +// TableNameWithSchema will automatically add schema prefix on table name +func (engine *Engine) tbNameWithSchema(v string) string { + // Add schema name as prefix of table name. + // Only for postgres database. + if engine.dialect.DBType() == core.POSTGRES && + engine.dialect.URI().Schema != "" && + engine.dialect.URI().Schema != postgresPublicSchema && + strings.Index(v, ".") == -1 { + return engine.dialect.URI().Schema + "." + v + } + return v +} + +// TableName returns table name with schema prefix if has +func (engine *Engine) TableName(bean interface{}, includeSchema ...bool) string { + tbName := engine.tbNameNoSchema(bean) + if len(includeSchema) > 0 && includeSchema[0] { + tbName = engine.tbNameWithSchema(tbName) + } + + return tbName +} + +// tbName get some table's table name +func (session *Session) tbNameNoSchema(table *core.Table) string { + if len(session.statement.AltTableName) > 0 { + return session.statement.AltTableName + } + + return table.Name +} + +func (engine *Engine) tbNameForMap(v reflect.Value) string { + if v.Type().Implements(tpTableName) { + return v.Interface().(TableName).TableName() + } + if v.Kind() == reflect.Ptr { + v = v.Elem() + if v.Type().Implements(tpTableName) { + return v.Interface().(TableName).TableName() + } + } + + return engine.TableMapper.Obj2Table(v.Type().Name()) +} + +func (engine *Engine) tbNameNoSchema(tablename interface{}) string { + switch tablename.(type) { + case []string: + t := tablename.([]string) + if len(t) > 1 { + return fmt.Sprintf("%v AS %v", engine.Quote(t[0]), engine.Quote(t[1])) + } else if len(t) == 1 { + return engine.Quote(t[0]) + } + case []interface{}: + t := tablename.([]interface{}) + l := len(t) + var table string + if l > 0 { + f := t[0] + switch f.(type) { + case string: + table = f.(string) + case TableName: + table = f.(TableName).TableName() + default: + v := rValue(f) + t := v.Type() + if t.Kind() == reflect.Struct { + table = engine.tbNameForMap(v) + } else { + table = engine.Quote(fmt.Sprintf("%v", f)) + } + } + } + if l > 1 { + return fmt.Sprintf("%v AS %v", engine.Quote(table), + engine.Quote(fmt.Sprintf("%v", t[1]))) + } else if l == 1 { + return engine.Quote(table) + } + case TableName: + return tablename.(TableName).TableName() + case string: + return tablename.(string) + case reflect.Value: + v := tablename.(reflect.Value) + return engine.tbNameForMap(v) + default: + v := rValue(tablename) + t := v.Type() + if t.Kind() == reflect.Struct { + return engine.tbNameForMap(v) + } + return engine.Quote(fmt.Sprintf("%v", tablename)) + } + return "" +} diff --git a/vendor/github.com/go-xorm/xorm/error.go b/vendor/github.com/go-xorm/xorm/error.go index cfeefc31e8ee..a223fc4a8615 100644 --- a/vendor/github.com/go-xorm/xorm/error.go +++ b/vendor/github.com/go-xorm/xorm/error.go @@ -6,23 +6,44 @@ package xorm import ( "errors" + "fmt" ) var ( // ErrParamsType params error ErrParamsType = errors.New("Params type error") // ErrTableNotFound table not found error - ErrTableNotFound = errors.New("Not found table") + ErrTableNotFound = errors.New("Table not found") // ErrUnSupportedType unsupported error ErrUnSupportedType = errors.New("Unsupported type error") - // ErrNotExist record is not exist error - ErrNotExist = errors.New("Not exist error") + // ErrNotExist record does not exist error + ErrNotExist = errors.New("Record does not exist") // ErrCacheFailed cache failed error ErrCacheFailed = errors.New("Cache failed") // ErrNeedDeletedCond delete needs less one condition error - ErrNeedDeletedCond = errors.New("Delete need at least one condition") + ErrNeedDeletedCond = errors.New("Delete action needs at least one condition") // ErrNotImplemented not implemented ErrNotImplemented = errors.New("Not implemented") // ErrConditionType condition type unsupported - ErrConditionType = errors.New("Unsupported conditon type") + ErrConditionType = errors.New("Unsupported condition type") ) + +// ErrFieldIsNotExist columns does not exist +type ErrFieldIsNotExist struct { + FieldName string + TableName string +} + +func (e ErrFieldIsNotExist) Error() string { + return fmt.Sprintf("field %s is not valid on table %s", e.FieldName, e.TableName) +} + +// ErrFieldIsNotValid is not valid +type ErrFieldIsNotValid struct { + FieldName string + TableName string +} + +func (e ErrFieldIsNotValid) Error() string { + return fmt.Sprintf("field %s is not valid on table %s", e.FieldName, e.TableName) +} diff --git a/vendor/github.com/go-xorm/xorm/helpers.go b/vendor/github.com/go-xorm/xorm/helpers.go index f39ed4725608..f1705782e3d0 100644 --- a/vendor/github.com/go-xorm/xorm/helpers.go +++ b/vendor/github.com/go-xorm/xorm/helpers.go @@ -11,7 +11,6 @@ import ( "sort" "strconv" "strings" - "time" "github.com/go-xorm/core" ) @@ -293,19 +292,6 @@ func structName(v reflect.Type) string { return v.Name() } -func col2NewCols(columns ...string) []string { - newColumns := make([]string, 0, len(columns)) - for _, col := range columns { - col = strings.Replace(col, "`", "", -1) - col = strings.Replace(col, `"`, "", -1) - ccols := strings.Split(col, ",") - for _, c := range ccols { - newColumns = append(newColumns, strings.TrimSpace(c)) - } - } - return newColumns -} - func sliceEq(left, right []string) bool { if len(left) != len(right) { return false @@ -320,154 +306,6 @@ func sliceEq(left, right []string) bool { return true } -func setColumnInt(bean interface{}, col *core.Column, t int64) { - v, err := col.ValueOf(bean) - if err != nil { - return - } - if v.CanSet() { - switch v.Type().Kind() { - case reflect.Int, reflect.Int64, reflect.Int32: - v.SetInt(t) - case reflect.Uint, reflect.Uint64, reflect.Uint32: - v.SetUint(uint64(t)) - } - } -} - -func setColumnTime(bean interface{}, col *core.Column, t time.Time) { - v, err := col.ValueOf(bean) - if err != nil { - return - } - if v.CanSet() { - switch v.Type().Kind() { - case reflect.Struct: - v.Set(reflect.ValueOf(t).Convert(v.Type())) - case reflect.Int, reflect.Int64, reflect.Int32: - v.SetInt(t.Unix()) - case reflect.Uint, reflect.Uint64, reflect.Uint32: - v.SetUint(uint64(t.Unix())) - } - } -} - -func genCols(table *core.Table, session *Session, bean interface{}, useCol bool, includeQuote bool) ([]string, []interface{}, error) { - colNames := make([]string, 0, len(table.ColumnsSeq())) - args := make([]interface{}, 0, len(table.ColumnsSeq())) - - for _, col := range table.Columns() { - if useCol && !col.IsVersion && !col.IsCreated && !col.IsUpdated { - if _, ok := getFlagForColumn(session.statement.columnMap, col); !ok { - continue - } - } - if col.MapType == core.ONLYFROMDB { - continue - } - - fieldValuePtr, err := col.ValueOf(bean) - if err != nil { - return nil, nil, err - } - fieldValue := *fieldValuePtr - - if col.IsAutoIncrement { - switch fieldValue.Type().Kind() { - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int, reflect.Int64: - if fieldValue.Int() == 0 { - continue - } - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint, reflect.Uint64: - if fieldValue.Uint() == 0 { - continue - } - case reflect.String: - if len(fieldValue.String()) == 0 { - continue - } - case reflect.Ptr: - if fieldValue.Pointer() == 0 { - continue - } - } - } - - if col.IsDeleted { - continue - } - - if session.statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); !ok { - continue - } else if _, ok := session.statement.incrColumns[col.Name]; ok { - continue - } else if _, ok := session.statement.decrColumns[col.Name]; ok { - continue - } - } - if session.statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); ok { - continue - } - } - - // !evalphobia! set fieldValue as nil when column is nullable and zero-value - if _, ok := getFlagForColumn(session.statement.nullableMap, col); ok { - if col.Nullable && isZero(fieldValue.Interface()) { - var nilValue *int - fieldValue = reflect.ValueOf(nilValue) - } - } - - if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime /*&& isZero(fieldValue.Interface())*/ { - // if time is non-empty, then set to auto time - val, t := session.engine.nowTime(col) - args = append(args, val) - - var colName = col.Name - session.afterClosures = append(session.afterClosures, func(bean interface{}) { - col := table.GetColumn(colName) - setColumnTime(bean, col, t) - }) - } else if col.IsVersion && session.statement.checkVersion { - args = append(args, 1) - } else { - arg, err := session.value2Interface(col, fieldValue) - if err != nil { - return colNames, args, err - } - args = append(args, arg) - } - - if includeQuote { - colNames = append(colNames, session.engine.Quote(col.Name)+" = ?") - } else { - colNames = append(colNames, col.Name) - } - } - return colNames, args, nil -} - func indexName(tableName, idxName string) string { return fmt.Sprintf("IDX_%v_%v", tableName, idxName) } - -func getFlagForColumn(m map[string]bool, col *core.Column) (val bool, has bool) { - if len(m) == 0 { - return false, false - } - - n := len(col.Name) - - for mk := range m { - if len(mk) != n { - continue - } - if strings.EqualFold(mk, col.Name) { - return m[mk], true - } - } - - return false, false -} diff --git a/vendor/github.com/go-xorm/xorm/interface.go b/vendor/github.com/go-xorm/xorm/interface.go index 9a3b6da0b2bf..0bc12ba00662 100644 --- a/vendor/github.com/go-xorm/xorm/interface.go +++ b/vendor/github.com/go-xorm/xorm/interface.go @@ -30,6 +30,7 @@ type Interface interface { Exec(string, ...interface{}) (sql.Result, error) Exist(bean ...interface{}) (bool, error) Find(interface{}, ...interface{}) error + FindAndCount(interface{}, ...interface{}) (int64, error) Get(interface{}) (bool, error) GroupBy(keys string) *Session ID(interface{}) *Session @@ -41,6 +42,7 @@ type Interface interface { IsTableExist(beanOrTableName interface{}) (bool, error) Iterate(interface{}, IterFunc) error Limit(int, ...int) *Session + MustCols(columns ...string) *Session NoAutoCondition(...bool) *Session NotIn(string, ...interface{}) *Session Join(joinOperator string, tablename interface{}, condition string, args ...interface{}) *Session @@ -75,6 +77,7 @@ type EngineInterface interface { Dialect() core.Dialect DropTables(...interface{}) error DumpAllToFile(fp string, tp ...core.DbType) error + GetCacher(string) core.Cacher GetColumnMapper() core.IMapper GetDefaultCacher() core.Cacher GetTableMapper() core.IMapper @@ -83,9 +86,11 @@ type EngineInterface interface { NewSession() *Session NoAutoTime() *Session Quote(string) string + SetCacher(string, core.Cacher) SetDefaultCacher(core.Cacher) SetLogLevel(core.LogLevel) SetMapper(core.IMapper) + SetSchema(string) SetTZDatabase(tz *time.Location) SetTZLocation(tz *time.Location) ShowSQL(show ...bool) @@ -93,6 +98,7 @@ type EngineInterface interface { Sync2(...interface{}) error StoreEngine(storeEngine string) *Session TableInfo(bean interface{}) *Table + TableName(interface{}, ...bool) string UnMapType(reflect.Type) } diff --git a/vendor/github.com/go-xorm/xorm/rows.go b/vendor/github.com/go-xorm/xorm/rows.go index 31e29ae26f66..54ec7f37a28a 100644 --- a/vendor/github.com/go-xorm/xorm/rows.go +++ b/vendor/github.com/go-xorm/xorm/rows.go @@ -32,7 +32,7 @@ func newRows(session *Session, bean interface{}) (*Rows, error) { var args []interface{} var err error - if err = rows.session.statement.setRefValue(rValue(bean)); err != nil { + if err = rows.session.statement.setRefBean(bean); err != nil { return nil, err } @@ -94,8 +94,7 @@ func (rows *Rows) Scan(bean interface{}) error { return fmt.Errorf("scan arg is incompatible type to [%v]", rows.beanType) } - dataStruct := rValue(bean) - if err := rows.session.statement.setRefValue(dataStruct); err != nil { + if err := rows.session.statement.setRefBean(bean); err != nil { return err } @@ -104,6 +103,7 @@ func (rows *Rows) Scan(bean interface{}) error { return err } + dataStruct := rValue(bean) _, err = rows.session.slice2Bean(scanResults, rows.fields, bean, &dataStruct, rows.session.statement.RefTable) if err != nil { return err diff --git a/vendor/github.com/go-xorm/xorm/session.go b/vendor/github.com/go-xorm/xorm/session.go index 5c6cb5f9defe..3775eb0116c9 100644 --- a/vendor/github.com/go-xorm/xorm/session.go +++ b/vendor/github.com/go-xorm/xorm/session.go @@ -278,24 +278,22 @@ func (session *Session) doPrepare(db *core.DB, sqlStr string) (stmt *core.Stmt, return } -func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) *reflect.Value { +func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) (*reflect.Value, error) { var col *core.Column if col = table.GetColumnIdx(key, idx); col == nil { - //session.engine.logger.Warnf("table %v has no column %v. %v", table.Name, key, table.ColumnsSeq()) - return nil + return nil, ErrFieldIsNotExist{key, table.Name} } fieldValue, err := col.ValueOfV(dataStruct) if err != nil { - session.engine.logger.Error(err) - return nil + return nil, err } if !fieldValue.IsValid() || !fieldValue.CanSet() { - session.engine.logger.Warnf("table %v's column %v is not valid or cannot set", table.Name, key) - return nil + return nil, ErrFieldIsNotValid{key, table.Name} } - return fieldValue + + return fieldValue, nil } // Cell cell is a result of one column field @@ -407,409 +405,417 @@ func (session *Session) slice2Bean(scanResults []interface{}, fields []string, b } tempMap[lKey] = idx - if fieldValue := session.getField(dataStruct, key, table, idx); fieldValue != nil { - rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii])) - - // if row is null then ignore - if rawValue.Interface() == nil { - continue + fieldValue, err := session.getField(dataStruct, key, table, idx) + if err != nil { + if !strings.Contains(err.Error(), "is not valid") { + session.engine.logger.Warn(err) } + continue + } + if fieldValue == nil { + continue + } + rawValue := reflect.Indirect(reflect.ValueOf(scanResults[ii])) - if fieldValue.CanAddr() { - if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { - if data, err := value2Bytes(&rawValue); err == nil { - if err := structConvert.FromDB(data); err != nil { - return nil, err - } - } else { - return nil, err - } - continue - } - } + // if row is null then ignore + if rawValue.Interface() == nil { + continue + } - if _, ok := fieldValue.Interface().(core.Conversion); ok { + if fieldValue.CanAddr() { + if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { if data, err := value2Bytes(&rawValue); err == nil { - if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() { - fieldValue.Set(reflect.New(fieldValue.Type().Elem())) + if err := structConvert.FromDB(data); err != nil { + return nil, err } - fieldValue.Interface().(core.Conversion).FromDB(data) } else { return nil, err } continue } + } - rawValueType := reflect.TypeOf(rawValue.Interface()) - vv := reflect.ValueOf(rawValue.Interface()) - col := table.GetColumnIdx(key, idx) - if col.IsPrimaryKey { - pk = append(pk, rawValue.Interface()) + if _, ok := fieldValue.Interface().(core.Conversion); ok { + if data, err := value2Bytes(&rawValue); err == nil { + if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() { + fieldValue.Set(reflect.New(fieldValue.Type().Elem())) + } + fieldValue.Interface().(core.Conversion).FromDB(data) + } else { + return nil, err } - fieldType := fieldValue.Type() - hasAssigned := false + continue + } - if col.SQLType.IsJson() { - var bs []byte - if rawValueType.Kind() == reflect.String { - bs = []byte(vv.String()) - } else if rawValueType.ConvertibleTo(core.BytesType) { - bs = vv.Bytes() - } else { - return nil, fmt.Errorf("unsupported database data type: %s %v", key, rawValueType.Kind()) - } + rawValueType := reflect.TypeOf(rawValue.Interface()) + vv := reflect.ValueOf(rawValue.Interface()) + col := table.GetColumnIdx(key, idx) + if col.IsPrimaryKey { + pk = append(pk, rawValue.Interface()) + } + fieldType := fieldValue.Type() + hasAssigned := false + + if col.SQLType.IsJson() { + var bs []byte + if rawValueType.Kind() == reflect.String { + bs = []byte(vv.String()) + } else if rawValueType.ConvertibleTo(core.BytesType) { + bs = vv.Bytes() + } else { + return nil, fmt.Errorf("unsupported database data type: %s %v", key, rawValueType.Kind()) + } - hasAssigned = true + hasAssigned = true - if len(bs) > 0 { - if fieldType.Kind() == reflect.String { - fieldValue.SetString(string(bs)) - continue + if len(bs) > 0 { + if fieldType.Kind() == reflect.String { + fieldValue.SetString(string(bs)) + continue + } + if fieldValue.CanAddr() { + err := json.Unmarshal(bs, fieldValue.Addr().Interface()) + if err != nil { + return nil, err } - if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) - if err != nil { - return nil, err - } - } else { - x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) - if err != nil { - return nil, err - } - fieldValue.Set(x.Elem()) + } else { + x := reflect.New(fieldType) + err := json.Unmarshal(bs, x.Interface()) + if err != nil { + return nil, err } + fieldValue.Set(x.Elem()) } - - continue } - switch fieldType.Kind() { - case reflect.Complex64, reflect.Complex128: - // TODO: reimplement this - var bs []byte - if rawValueType.Kind() == reflect.String { - bs = []byte(vv.String()) - } else if rawValueType.ConvertibleTo(core.BytesType) { - bs = vv.Bytes() - } + continue + } - hasAssigned = true - if len(bs) > 0 { - if fieldValue.CanAddr() { - err := json.Unmarshal(bs, fieldValue.Addr().Interface()) - if err != nil { - return nil, err - } - } else { - x := reflect.New(fieldType) - err := json.Unmarshal(bs, x.Interface()) - if err != nil { - return nil, err - } - fieldValue.Set(x.Elem()) + switch fieldType.Kind() { + case reflect.Complex64, reflect.Complex128: + // TODO: reimplement this + var bs []byte + if rawValueType.Kind() == reflect.String { + bs = []byte(vv.String()) + } else if rawValueType.ConvertibleTo(core.BytesType) { + bs = vv.Bytes() + } + + hasAssigned = true + if len(bs) > 0 { + if fieldValue.CanAddr() { + err := json.Unmarshal(bs, fieldValue.Addr().Interface()) + if err != nil { + return nil, err + } + } else { + x := reflect.New(fieldType) + err := json.Unmarshal(bs, x.Interface()) + if err != nil { + return nil, err } + fieldValue.Set(x.Elem()) } + } + case reflect.Slice, reflect.Array: + switch rawValueType.Kind() { case reflect.Slice, reflect.Array: - switch rawValueType.Kind() { - case reflect.Slice, reflect.Array: - switch rawValueType.Elem().Kind() { - case reflect.Uint8: - if fieldType.Elem().Kind() == reflect.Uint8 { - hasAssigned = true - if col.SQLType.IsText() { - x := reflect.New(fieldType) - err := json.Unmarshal(vv.Bytes(), x.Interface()) - if err != nil { - return nil, err + switch rawValueType.Elem().Kind() { + case reflect.Uint8: + if fieldType.Elem().Kind() == reflect.Uint8 { + hasAssigned = true + if col.SQLType.IsText() { + x := reflect.New(fieldType) + err := json.Unmarshal(vv.Bytes(), x.Interface()) + if err != nil { + return nil, err + } + fieldValue.Set(x.Elem()) + } else { + if fieldValue.Len() > 0 { + for i := 0; i < fieldValue.Len(); i++ { + if i < vv.Len() { + fieldValue.Index(i).Set(vv.Index(i)) + } } - fieldValue.Set(x.Elem()) } else { - if fieldValue.Len() > 0 { - for i := 0; i < fieldValue.Len(); i++ { - if i < vv.Len() { - fieldValue.Index(i).Set(vv.Index(i)) - } - } - } else { - for i := 0; i < vv.Len(); i++ { - fieldValue.Set(reflect.Append(*fieldValue, vv.Index(i))) - } + for i := 0; i < vv.Len(); i++ { + fieldValue.Set(reflect.Append(*fieldValue, vv.Index(i))) } } } } } - case reflect.String: - if rawValueType.Kind() == reflect.String { - hasAssigned = true - fieldValue.SetString(vv.String()) - } - case reflect.Bool: - if rawValueType.Kind() == reflect.Bool { - hasAssigned = true - fieldValue.SetBool(vv.Bool()) - } + } + case reflect.String: + if rawValueType.Kind() == reflect.String { + hasAssigned = true + fieldValue.SetString(vv.String()) + } + case reflect.Bool: + if rawValueType.Kind() == reflect.Bool { + hasAssigned = true + fieldValue.SetBool(vv.Bool()) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch rawValueType.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch rawValueType.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - hasAssigned = true - fieldValue.SetInt(vv.Int()) - } + hasAssigned = true + fieldValue.SetInt(vv.Int()) + } + case reflect.Float32, reflect.Float64: + switch rawValueType.Kind() { case reflect.Float32, reflect.Float64: - switch rawValueType.Kind() { - case reflect.Float32, reflect.Float64: - hasAssigned = true - fieldValue.SetFloat(vv.Float()) - } + hasAssigned = true + fieldValue.SetFloat(vv.Float()) + } + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + switch rawValueType.Kind() { case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - switch rawValueType.Kind() { - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - hasAssigned = true - fieldValue.SetUint(vv.Uint()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - hasAssigned = true - fieldValue.SetUint(uint64(vv.Int())) + hasAssigned = true + fieldValue.SetUint(vv.Uint()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + hasAssigned = true + fieldValue.SetUint(uint64(vv.Int())) + } + case reflect.Struct: + if fieldType.ConvertibleTo(core.TimeType) { + dbTZ := session.engine.DatabaseTZ + if col.TimeZone != nil { + dbTZ = col.TimeZone } - case reflect.Struct: - if fieldType.ConvertibleTo(core.TimeType) { - dbTZ := session.engine.DatabaseTZ - if col.TimeZone != nil { - dbTZ = col.TimeZone - } - if rawValueType == core.TimeType { - hasAssigned = true - - t := vv.Convert(core.TimeType).Interface().(time.Time) - - z, _ := t.Zone() - // set new location if database don't save timezone or give an incorrect timezone - if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbTZ.String() { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location - session.engine.logger.Debugf("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location()) - t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), - t.Minute(), t.Second(), t.Nanosecond(), dbTZ) - } + if rawValueType == core.TimeType { + hasAssigned = true - t = t.In(session.engine.TZLocation) - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } else if rawValueType == core.IntType || rawValueType == core.Int64Type || - rawValueType == core.Int32Type { - hasAssigned = true + t := vv.Convert(core.TimeType).Interface().(time.Time) - t := time.Unix(vv.Int(), 0).In(session.engine.TZLocation) - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } else { - if d, ok := vv.Interface().([]uint8); ok { - hasAssigned = true - t, err := session.byte2Time(col, d) - if err != nil { - session.engine.logger.Error("byte2Time error:", err.Error()) - hasAssigned = false - } else { - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } - } else if d, ok := vv.Interface().(string); ok { - hasAssigned = true - t, err := session.str2Time(col, d) - if err != nil { - session.engine.logger.Error("byte2Time error:", err.Error()) - hasAssigned = false - } else { - fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) - } - } else { - return nil, fmt.Errorf("rawValueType is %v, value is %v", rawValueType, vv.Interface()) - } - } - } else if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { - // !! 增加支持sql.Scanner接口的结构,如sql.NullString - hasAssigned = true - if err := nulVal.Scan(vv.Interface()); err != nil { - session.engine.logger.Error("sql.Sanner error:", err.Error()) - hasAssigned = false - } - } else if col.SQLType.IsJson() { - if rawValueType.Kind() == reflect.String { - hasAssigned = true - x := reflect.New(fieldType) - if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), x.Interface()) - if err != nil { - return nil, err - } - fieldValue.Set(x.Elem()) - } - } else if rawValueType.Kind() == reflect.Slice { - hasAssigned = true - x := reflect.New(fieldType) - if len(vv.Bytes()) > 0 { - err := json.Unmarshal(vv.Bytes(), x.Interface()) - if err != nil { - return nil, err - } - fieldValue.Set(x.Elem()) - } - } - } else if session.statement.UseCascade { - table, err := session.engine.autoMapType(*fieldValue) - if err != nil { - return nil, err + z, _ := t.Zone() + // set new location if database don't save timezone or give an incorrect timezone + if len(z) == 0 || t.Year() == 0 || t.Location().String() != dbTZ.String() { // !nashtsai! HACK tmp work around for lib/pq doesn't properly time with location + session.engine.logger.Debugf("empty zone key[%v] : %v | zone: %v | location: %+v\n", key, t, z, *t.Location()) + t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), + t.Minute(), t.Second(), t.Nanosecond(), dbTZ) } + t = t.In(session.engine.TZLocation) + fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) + } else if rawValueType == core.IntType || rawValueType == core.Int64Type || + rawValueType == core.Int32Type { hasAssigned = true - if len(table.PrimaryKeys) != 1 { - return nil, errors.New("unsupported non or composited primary key cascade") - } - var pk = make(core.PK, len(table.PrimaryKeys)) - pk[0], err = asKind(vv, rawValueType) - if err != nil { - return nil, err - } - if !isPKZero(pk) { - // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch - // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne - // property to be fetched lazily - structInter := reflect.New(fieldValue.Type()) - has, err := session.ID(pk).NoCascade().get(structInter.Interface()) + t := time.Unix(vv.Int(), 0).In(session.engine.TZLocation) + fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) + } else { + if d, ok := vv.Interface().([]uint8); ok { + hasAssigned = true + t, err := session.byte2Time(col, d) if err != nil { - return nil, err + session.engine.logger.Error("byte2Time error:", err.Error()) + hasAssigned = false + } else { + fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) } - if has { - fieldValue.Set(structInter.Elem()) + } else if d, ok := vv.Interface().(string); ok { + hasAssigned = true + t, err := session.str2Time(col, d) + if err != nil { + session.engine.logger.Error("byte2Time error:", err.Error()) + hasAssigned = false } else { - return nil, errors.New("cascade obj is not exist") + fieldValue.Set(reflect.ValueOf(t).Convert(fieldType)) } + } else { + return nil, fmt.Errorf("rawValueType is %v, value is %v", rawValueType, vv.Interface()) } } - case reflect.Ptr: - // !nashtsai! TODO merge duplicated codes above - switch fieldType { - // following types case matching ptr's native type, therefore assign ptr directly - case core.PtrStringType: - if rawValueType.Kind() == reflect.String { - x := vv.String() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrBoolType: - if rawValueType.Kind() == reflect.Bool { - x := vv.Bool() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrTimeType: - if rawValueType == core.PtrTimeType { - hasAssigned = true - var x = rawValue.Interface().(time.Time) - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrFloat64Type: - if rawValueType.Kind() == reflect.Float64 { - x := vv.Float() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUint64Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint64(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt64Type: - if rawValueType.Kind() == reflect.Int64 { - x := vv.Int() - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrFloat32Type: - if rawValueType.Kind() == reflect.Float64 { - var x = float32(vv.Float()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrIntType: - if rawValueType.Kind() == reflect.Int64 { - var x = int(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt32Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int32(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt8Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int8(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrInt16Type: - if rawValueType.Kind() == reflect.Int64 { - var x = int16(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUintType: - if rawValueType.Kind() == reflect.Int64 { - var x = uint(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.PtrUint32Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint32(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Uint8Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint8(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Uint16Type: - if rawValueType.Kind() == reflect.Int64 { - var x = uint16(vv.Int()) - hasAssigned = true - fieldValue.Set(reflect.ValueOf(&x)) - } - case core.Complex64Type: - var x complex64 + } else if nulVal, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { + // !! 增加支持sql.Scanner接口的结构,如sql.NullString + hasAssigned = true + if err := nulVal.Scan(vv.Interface()); err != nil { + session.engine.logger.Error("sql.Sanner error:", err.Error()) + hasAssigned = false + } + } else if col.SQLType.IsJson() { + if rawValueType.Kind() == reflect.String { + hasAssigned = true + x := reflect.New(fieldType) if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) + err := json.Unmarshal([]byte(vv.String()), x.Interface()) if err != nil { return nil, err } - fieldValue.Set(reflect.ValueOf(&x)) + fieldValue.Set(x.Elem()) } + } else if rawValueType.Kind() == reflect.Slice { hasAssigned = true - case core.Complex128Type: - var x complex128 - if len([]byte(vv.String())) > 0 { - err := json.Unmarshal([]byte(vv.String()), &x) + x := reflect.New(fieldType) + if len(vv.Bytes()) > 0 { + err := json.Unmarshal(vv.Bytes(), x.Interface()) if err != nil { return nil, err } - fieldValue.Set(reflect.ValueOf(&x)) + fieldValue.Set(x.Elem()) } - hasAssigned = true - } // switch fieldType - } // switch fieldType.Kind() - - // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value - if !hasAssigned { - data, err := value2Bytes(&rawValue) + } + } else if session.statement.UseCascade { + table, err := session.engine.autoMapType(*fieldValue) if err != nil { return nil, err } - if err = session.bytes2Value(col, fieldValue, data); err != nil { + hasAssigned = true + if len(table.PrimaryKeys) != 1 { + return nil, errors.New("unsupported non or composited primary key cascade") + } + var pk = make(core.PK, len(table.PrimaryKeys)) + pk[0], err = asKind(vv, rawValueType) + if err != nil { return nil, err } + + if !isPKZero(pk) { + // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch + // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne + // property to be fetched lazily + structInter := reflect.New(fieldValue.Type()) + has, err := session.ID(pk).NoCascade().get(structInter.Interface()) + if err != nil { + return nil, err + } + if has { + fieldValue.Set(structInter.Elem()) + } else { + return nil, errors.New("cascade obj is not exist") + } + } + } + case reflect.Ptr: + // !nashtsai! TODO merge duplicated codes above + switch fieldType { + // following types case matching ptr's native type, therefore assign ptr directly + case core.PtrStringType: + if rawValueType.Kind() == reflect.String { + x := vv.String() + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrBoolType: + if rawValueType.Kind() == reflect.Bool { + x := vv.Bool() + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrTimeType: + if rawValueType == core.PtrTimeType { + hasAssigned = true + var x = rawValue.Interface().(time.Time) + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrFloat64Type: + if rawValueType.Kind() == reflect.Float64 { + x := vv.Float() + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrUint64Type: + if rawValueType.Kind() == reflect.Int64 { + var x = uint64(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrInt64Type: + if rawValueType.Kind() == reflect.Int64 { + x := vv.Int() + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrFloat32Type: + if rawValueType.Kind() == reflect.Float64 { + var x = float32(vv.Float()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrIntType: + if rawValueType.Kind() == reflect.Int64 { + var x = int(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrInt32Type: + if rawValueType.Kind() == reflect.Int64 { + var x = int32(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrInt8Type: + if rawValueType.Kind() == reflect.Int64 { + var x = int8(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrInt16Type: + if rawValueType.Kind() == reflect.Int64 { + var x = int16(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrUintType: + if rawValueType.Kind() == reflect.Int64 { + var x = uint(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.PtrUint32Type: + if rawValueType.Kind() == reflect.Int64 { + var x = uint32(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.Uint8Type: + if rawValueType.Kind() == reflect.Int64 { + var x = uint8(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.Uint16Type: + if rawValueType.Kind() == reflect.Int64 { + var x = uint16(vv.Int()) + hasAssigned = true + fieldValue.Set(reflect.ValueOf(&x)) + } + case core.Complex64Type: + var x complex64 + if len([]byte(vv.String())) > 0 { + err := json.Unmarshal([]byte(vv.String()), &x) + if err != nil { + return nil, err + } + fieldValue.Set(reflect.ValueOf(&x)) + } + hasAssigned = true + case core.Complex128Type: + var x complex128 + if len([]byte(vv.String())) > 0 { + err := json.Unmarshal([]byte(vv.String()), &x) + if err != nil { + return nil, err + } + fieldValue.Set(reflect.ValueOf(&x)) + } + hasAssigned = true + } // switch fieldType + } // switch fieldType.Kind() + + // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value + if !hasAssigned { + data, err := value2Bytes(&rawValue) + if err != nil { + return nil, err + } + + if err = session.bytes2Value(col, fieldValue, data); err != nil { + return nil, err } } } @@ -828,15 +834,6 @@ func (session *Session) LastSQL() (string, []interface{}) { return session.lastSQL, session.lastSQLArgs } -// tbName get some table's table name -func (session *Session) tbNameNoSchema(table *core.Table) string { - if len(session.statement.AltTableName) > 0 { - return session.statement.AltTableName - } - - return table.Name -} - // Unscoped always disable struct tag "deleted" func (session *Session) Unscoped() *Session { session.statement.Unscoped() diff --git a/vendor/github.com/go-xorm/xorm/session_cols.go b/vendor/github.com/go-xorm/xorm/session_cols.go index 9972cb0ae4b4..47d109c6cbbe 100644 --- a/vendor/github.com/go-xorm/xorm/session_cols.go +++ b/vendor/github.com/go-xorm/xorm/session_cols.go @@ -4,6 +4,121 @@ package xorm +import ( + "reflect" + "strings" + "time" + + "github.com/go-xorm/core" +) + +type incrParam struct { + colName string + arg interface{} +} + +type decrParam struct { + colName string + arg interface{} +} + +type exprParam struct { + colName string + expr string +} + +type columnMap []string + +func (m columnMap) contain(colName string) bool { + if len(m) == 0 { + return false + } + + n := len(colName) + for _, mk := range m { + if len(mk) != n { + continue + } + if strings.EqualFold(mk, colName) { + return true + } + } + + return false +} + +func (m *columnMap) add(colName string) bool { + if m.contain(colName) { + return false + } + *m = append(*m, colName) + return true +} + +func setColumnInt(bean interface{}, col *core.Column, t int64) { + v, err := col.ValueOf(bean) + if err != nil { + return + } + if v.CanSet() { + switch v.Type().Kind() { + case reflect.Int, reflect.Int64, reflect.Int32: + v.SetInt(t) + case reflect.Uint, reflect.Uint64, reflect.Uint32: + v.SetUint(uint64(t)) + } + } +} + +func setColumnTime(bean interface{}, col *core.Column, t time.Time) { + v, err := col.ValueOf(bean) + if err != nil { + return + } + if v.CanSet() { + switch v.Type().Kind() { + case reflect.Struct: + v.Set(reflect.ValueOf(t).Convert(v.Type())) + case reflect.Int, reflect.Int64, reflect.Int32: + v.SetInt(t.Unix()) + case reflect.Uint, reflect.Uint64, reflect.Uint32: + v.SetUint(uint64(t.Unix())) + } + } +} + +func getFlagForColumn(m map[string]bool, col *core.Column) (val bool, has bool) { + if len(m) == 0 { + return false, false + } + + n := len(col.Name) + + for mk := range m { + if len(mk) != n { + continue + } + if strings.EqualFold(mk, col.Name) { + return m[mk], true + } + } + + return false, false +} + +func col2NewCols(columns ...string) []string { + newColumns := make([]string, 0, len(columns)) + for _, col := range columns { + col = strings.Replace(col, "`", "", -1) + col = strings.Replace(col, `"`, "", -1) + ccols := strings.Split(col, ",") + for _, c := range ccols { + newColumns = append(newColumns, strings.TrimSpace(c)) + } + } + return newColumns +} + // Incr provides a query string like "count = count + 1" func (session *Session) Incr(column string, arg ...interface{}) *Session { session.statement.Incr(column, arg...) diff --git a/vendor/github.com/go-xorm/xorm/session_delete.go b/vendor/github.com/go-xorm/xorm/session_delete.go index 688b122ca6d8..d9cf3ea93738 100644 --- a/vendor/github.com/go-xorm/xorm/session_delete.go +++ b/vendor/github.com/go-xorm/xorm/session_delete.go @@ -27,7 +27,7 @@ func (session *Session) cacheDelete(table *core.Table, tableName, sqlStr string, return ErrCacheFailed } - cacher := session.engine.getCacher2(table) + cacher := session.engine.getCacher(tableName) pkColumns := table.PKColumns() ids, err := core.GetCacheSql(cacher, tableName, newsql, args) if err != nil { @@ -79,7 +79,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) { defer session.Close() } - if err := session.statement.setRefValue(rValue(bean)); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return 0, err } @@ -199,7 +199,7 @@ func (session *Session) Delete(bean interface{}) (int64, error) { }) } - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { + if cacher := session.engine.getCacher(tableName); cacher != nil && session.statement.UseCache { session.cacheDelete(table, tableNameNoQuote, deleteSQL, argsForCache...) } diff --git a/vendor/github.com/go-xorm/xorm/session_exist.go b/vendor/github.com/go-xorm/xorm/session_exist.go index 378a648376c9..74a660e852bd 100644 --- a/vendor/github.com/go-xorm/xorm/session_exist.go +++ b/vendor/github.com/go-xorm/xorm/session_exist.go @@ -57,7 +57,7 @@ func (session *Session) Exist(bean ...interface{}) (bool, error) { } if beanValue.Elem().Kind() == reflect.Struct { - if err := session.statement.setRefValue(beanValue.Elem()); err != nil { + if err := session.statement.setRefBean(bean[0]); err != nil { return false, err } } diff --git a/vendor/github.com/go-xorm/xorm/session_find.go b/vendor/github.com/go-xorm/xorm/session_find.go index f95dcfef2cbb..46bbf26c98d8 100644 --- a/vendor/github.com/go-xorm/xorm/session_find.go +++ b/vendor/github.com/go-xorm/xorm/session_find.go @@ -29,6 +29,39 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{}) return session.find(rowsSlicePtr, condiBean...) } +// FindAndCount find the results and also return the counts +func (session *Session) FindAndCount(rowsSlicePtr interface{}, condiBean ...interface{}) (int64, error) { + if session.isAutoClose { + defer session.Close() + } + + session.autoResetStatement = false + err := session.find(rowsSlicePtr, condiBean...) + if err != nil { + return 0, err + } + + sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) + if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { + return 0, errors.New("needs a pointer to a slice or a map") + } + + sliceElementType := sliceValue.Type().Elem() + if sliceElementType.Kind() == reflect.Ptr { + sliceElementType = sliceElementType.Elem() + } + session.autoResetStatement = true + + if session.statement.selectStr != "" { + session.statement.selectStr = "" + } + if session.statement.OrderStr != "" { + session.statement.OrderStr = "" + } + + return session.Count(reflect.New(sliceElementType).Interface()) +} + func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) error { sliceValue := reflect.Indirect(reflect.ValueOf(rowsSlicePtr)) if sliceValue.Kind() != reflect.Slice && sliceValue.Kind() != reflect.Map { @@ -42,7 +75,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) if sliceElementType.Kind() == reflect.Ptr { if sliceElementType.Elem().Kind() == reflect.Struct { pv := reflect.New(sliceElementType.Elem()) - if err := session.statement.setRefValue(pv.Elem()); err != nil { + if err := session.statement.setRefValue(pv); err != nil { return err } } else { @@ -50,7 +83,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) } } else if sliceElementType.Kind() == reflect.Struct { pv := reflect.New(sliceElementType) - if err := session.statement.setRefValue(pv.Elem()); err != nil { + if err := session.statement.setRefValue(pv); err != nil { return err } } else { @@ -128,7 +161,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) } args = append(session.statement.joinArgs, condArgs...) - sqlStr, err = session.statement.genSelectSQL(columnStr, condSQL) + sqlStr, err = session.statement.genSelectSQL(columnStr, condSQL, true, true) if err != nil { return err } @@ -143,7 +176,7 @@ func (session *Session) find(rowsSlicePtr interface{}, condiBean ...interface{}) } if session.canCache() { - if cacher := session.engine.getCacher2(table); cacher != nil && + if cacher := session.engine.getCacher(table.Name); cacher != nil && !session.statement.IsDistinct && !session.statement.unscoped { err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...) @@ -288,6 +321,12 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in return ErrCacheFailed } + tableName := session.statement.TableName() + cacher := session.engine.getCacher(tableName) + if cacher == nil { + return nil + } + for _, filter := range session.engine.dialect.Filters() { sqlStr = filter.Do(sqlStr, session.engine.dialect, session.statement.RefTable) } @@ -297,9 +336,7 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in return ErrCacheFailed } - tableName := session.statement.TableName() table := session.statement.RefTable - cacher := session.engine.getCacher2(table) ids, err := core.GetCacheSql(cacher, tableName, newsql, args) if err != nil { rows, err := session.queryRows(newsql, args...) diff --git a/vendor/github.com/go-xorm/xorm/session_get.go b/vendor/github.com/go-xorm/xorm/session_get.go index 68b37af7f119..3b2c9493c264 100644 --- a/vendor/github.com/go-xorm/xorm/session_get.go +++ b/vendor/github.com/go-xorm/xorm/session_get.go @@ -31,7 +31,7 @@ func (session *Session) get(bean interface{}) (bool, error) { } if beanValue.Elem().Kind() == reflect.Struct { - if err := session.statement.setRefValue(beanValue.Elem()); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return false, err } } @@ -57,7 +57,7 @@ func (session *Session) get(bean interface{}) (bool, error) { table := session.statement.RefTable if session.canCache() && beanValue.Elem().Kind() == reflect.Struct { - if cacher := session.engine.getCacher2(table); cacher != nil && + if cacher := session.engine.getCacher(table.Name); cacher != nil && !session.statement.unscoped { has, err := session.cacheGet(bean, sqlStr, args...) if err != ErrCacheFailed { @@ -134,8 +134,9 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf return false, ErrCacheFailed } - cacher := session.engine.getCacher2(session.statement.RefTable) tableName := session.statement.TableName() + cacher := session.engine.getCacher(tableName) + session.engine.logger.Debug("[cacheGet] find sql:", newsql, args) table := session.statement.RefTable ids, err := core.GetCacheSql(cacher, tableName, newsql, args) diff --git a/vendor/github.com/go-xorm/xorm/session_insert.go b/vendor/github.com/go-xorm/xorm/session_insert.go index 129ee23098a0..2ea58fdaf959 100644 --- a/vendor/github.com/go-xorm/xorm/session_insert.go +++ b/vendor/github.com/go-xorm/xorm/session_insert.go @@ -66,11 +66,12 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error return 0, errors.New("could not insert a empty slice") } - if err := session.statement.setRefValue(reflect.ValueOf(sliceValue.Index(0).Interface())); err != nil { + if err := session.statement.setRefBean(sliceValue.Index(0).Interface()); err != nil { return 0, err } - if len(session.statement.TableName()) <= 0 { + tableName := session.statement.TableName() + if len(tableName) <= 0 { return 0, ErrTableNotFound } @@ -115,15 +116,11 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error if col.IsDeleted { continue } - if session.statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); !ok { - continue - } + if session.statement.omitColumnMap.contain(col.Name) { + continue } - if session.statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); ok { - continue - } + if len(session.statement.columnMap) > 0 && !session.statement.columnMap.contain(col.Name) { + continue } if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime { val, t := session.engine.nowTime(col) @@ -170,15 +167,11 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error if col.IsDeleted { continue } - if session.statement.ColumnStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); !ok { - continue - } + if session.statement.omitColumnMap.contain(col.Name) { + continue } - if session.statement.OmitStr != "" { - if _, ok := getFlagForColumn(session.statement.columnMap, col); ok { - continue - } + if len(session.statement.columnMap) > 0 && !session.statement.columnMap.contain(col.Name) { + continue } if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime { val, t := session.engine.nowTime(col) @@ -211,38 +204,33 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error } cleanupProcessorsClosures(&session.beforeClosures) - var sql = "INSERT INTO %s (%v%v%v) VALUES (%v)" - var statement string - var tableName = session.statement.TableName() + var sql string if session.engine.dialect.DBType() == core.ORACLE { - sql = "INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL" temp := fmt.Sprintf(") INTO %s (%v%v%v) VALUES (", session.engine.Quote(tableName), session.engine.QuoteStr(), strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), session.engine.QuoteStr()) - statement = fmt.Sprintf(sql, + sql = fmt.Sprintf("INSERT ALL INTO %s (%v%v%v) VALUES (%v) SELECT 1 FROM DUAL", session.engine.Quote(tableName), session.engine.QuoteStr(), strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), session.engine.QuoteStr(), strings.Join(colMultiPlaces, temp)) } else { - statement = fmt.Sprintf(sql, + sql = fmt.Sprintf("INSERT INTO %s (%v%v%v) VALUES (%v)", session.engine.Quote(tableName), session.engine.QuoteStr(), strings.Join(colNames, session.engine.QuoteStr()+", "+session.engine.QuoteStr()), session.engine.QuoteStr(), strings.Join(colMultiPlaces, "),(")) } - res, err := session.exec(statement, args...) + res, err := session.exec(sql, args...) if err != nil { return 0, err } - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { - session.cacheInsert(table, tableName) - } + session.cacheInsert(tableName) lenAfterClosures := len(session.afterClosures) for i := 0; i < size; i++ { @@ -298,7 +286,7 @@ func (session *Session) InsertMulti(rowsSlicePtr interface{}) (int64, error) { } func (session *Session) innerInsert(bean interface{}) (int64, error) { - if err := session.statement.setRefValue(rValue(bean)); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return 0, err } if len(session.statement.TableName()) <= 0 { @@ -316,8 +304,8 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { if processor, ok := interface{}(bean).(BeforeInsertProcessor); ok { processor.BeforeInsert() } - // -- - colNames, args, err := genCols(session.statement.RefTable, session, bean, false, false) + + colNames, args, err := session.genInsertColumns(bean) if err != nil { return 0, err } @@ -402,9 +390,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { defer handleAfterInsertProcessorFunc(bean) - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { - session.cacheInsert(table, tableName) - } + session.cacheInsert(tableName) if table.Version != "" && session.statement.checkVersion { verValue, err := table.VersionColumn().ValueOf(bean) @@ -447,9 +433,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { } defer handleAfterInsertProcessorFunc(bean) - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { - session.cacheInsert(table, tableName) - } + session.cacheInsert(tableName) if table.Version != "" && session.statement.checkVersion { verValue, err := table.VersionColumn().ValueOf(bean) @@ -490,9 +474,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { defer handleAfterInsertProcessorFunc(bean) - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { - session.cacheInsert(table, tableName) - } + session.cacheInsert(tableName) if table.Version != "" && session.statement.checkVersion { verValue, err := table.VersionColumn().ValueOf(bean) @@ -539,16 +521,104 @@ func (session *Session) InsertOne(bean interface{}) (int64, error) { return session.innerInsert(bean) } -func (session *Session) cacheInsert(table *core.Table, tables ...string) error { - if table == nil { - return ErrCacheFailed +func (session *Session) cacheInsert(table string) error { + if !session.statement.UseCache { + return nil } - - cacher := session.engine.getCacher2(table) - for _, t := range tables { - session.engine.logger.Debug("[cache] clear sql:", t) - cacher.ClearIds(t) + cacher := session.engine.getCacher(table) + if cacher == nil { + return nil } - + session.engine.logger.Debug("[cache] clear sql:", table) + cacher.ClearIds(table) return nil } + +// genInsertColumns generates insert needed columns +func (session *Session) genInsertColumns(bean interface{}) ([]string, []interface{}, error) { + table := session.statement.RefTable + colNames := make([]string, 0, len(table.ColumnsSeq())) + args := make([]interface{}, 0, len(table.ColumnsSeq())) + + for _, col := range table.Columns() { + if col.MapType == core.ONLYFROMDB { + continue + } + + if col.IsDeleted { + continue + } + + if session.statement.omitColumnMap.contain(col.Name) { + continue + } + + if len(session.statement.columnMap) > 0 && !session.statement.columnMap.contain(col.Name) { + continue + } + + if _, ok := session.statement.incrColumns[col.Name]; ok { + continue + } else if _, ok := session.statement.decrColumns[col.Name]; ok { + continue + } + + fieldValuePtr, err := col.ValueOf(bean) + if err != nil { + return nil, nil, err + } + fieldValue := *fieldValuePtr + + if col.IsAutoIncrement { + switch fieldValue.Type().Kind() { + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int, reflect.Int64: + if fieldValue.Int() == 0 { + continue + } + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint, reflect.Uint64: + if fieldValue.Uint() == 0 { + continue + } + case reflect.String: + if len(fieldValue.String()) == 0 { + continue + } + case reflect.Ptr: + if fieldValue.Pointer() == 0 { + continue + } + } + } + + // !evalphobia! set fieldValue as nil when column is nullable and zero-value + if _, ok := getFlagForColumn(session.statement.nullableMap, col); ok { + if col.Nullable && isZero(fieldValue.Interface()) { + var nilValue *int + fieldValue = reflect.ValueOf(nilValue) + } + } + + if (col.IsCreated || col.IsUpdated) && session.statement.UseAutoTime /*&& isZero(fieldValue.Interface())*/ { + // if time is non-empty, then set to auto time + val, t := session.engine.nowTime(col) + args = append(args, val) + + var colName = col.Name + session.afterClosures = append(session.afterClosures, func(bean interface{}) { + col := table.GetColumn(colName) + setColumnTime(bean, col, t) + }) + } else if col.IsVersion && session.statement.checkVersion { + args = append(args, 1) + } else { + arg, err := session.value2Interface(col, fieldValue) + if err != nil { + return colNames, args, err + } + args = append(args, arg) + } + + colNames = append(colNames, col.Name) + } + return colNames, args, nil +} diff --git a/vendor/github.com/go-xorm/xorm/session_query.go b/vendor/github.com/go-xorm/xorm/session_query.go index f8098f849c03..5c9aeb3916ce 100644 --- a/vendor/github.com/go-xorm/xorm/session_query.go +++ b/vendor/github.com/go-xorm/xorm/session_query.go @@ -64,13 +64,17 @@ func (session *Session) genQuerySQL(sqlorArgs ...interface{}) (string, []interfa } } + if err := session.statement.processIDParam(); err != nil { + return "", nil, err + } + condSQL, condArgs, err := builder.ToSQL(session.statement.cond) if err != nil { return "", nil, err } args := append(session.statement.joinArgs, condArgs...) - sqlStr, err := session.statement.genSelectSQL(columnStr, condSQL) + sqlStr, err := session.statement.genSelectSQL(columnStr, condSQL, true, true) if err != nil { return "", nil, err } diff --git a/vendor/github.com/go-xorm/xorm/session_schema.go b/vendor/github.com/go-xorm/xorm/session_schema.go index a2708b736c0c..369ec72a4d8a 100644 --- a/vendor/github.com/go-xorm/xorm/session_schema.go +++ b/vendor/github.com/go-xorm/xorm/session_schema.go @@ -6,9 +6,7 @@ package xorm import ( "database/sql" - "errors" "fmt" - "reflect" "strings" "github.com/go-xorm/core" @@ -34,8 +32,7 @@ func (session *Session) CreateTable(bean interface{}) error { } func (session *Session) createTable(bean interface{}) error { - v := rValue(bean) - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } @@ -54,8 +51,7 @@ func (session *Session) CreateIndexes(bean interface{}) error { } func (session *Session) createIndexes(bean interface{}) error { - v := rValue(bean) - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } @@ -78,8 +74,7 @@ func (session *Session) CreateUniques(bean interface{}) error { } func (session *Session) createUniques(bean interface{}) error { - v := rValue(bean) - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } @@ -103,8 +98,7 @@ func (session *Session) DropIndexes(bean interface{}) error { } func (session *Session) dropIndexes(bean interface{}) error { - v := rValue(bean) - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return err } @@ -128,11 +122,7 @@ func (session *Session) DropTable(beanOrTableName interface{}) error { } func (session *Session) dropTable(beanOrTableName interface{}) error { - tableName, err := session.engine.tableName(beanOrTableName) - if err != nil { - return err - } - + tableName := session.engine.TableName(beanOrTableName) var needDrop = true if !session.engine.dialect.SupportDropIfExists() { sqlStr, args := session.engine.dialect.TableCheckSql(tableName) @@ -144,8 +134,8 @@ func (session *Session) dropTable(beanOrTableName interface{}) error { } if needDrop { - sqlStr := session.engine.Dialect().DropTableSql(tableName) - _, err = session.exec(sqlStr) + sqlStr := session.engine.Dialect().DropTableSql(session.engine.TableName(tableName, true)) + _, err := session.exec(sqlStr) return err } return nil @@ -157,10 +147,7 @@ func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) defer session.Close() } - tableName, err := session.engine.tableName(beanOrTableName) - if err != nil { - return false, err - } + tableName := session.engine.TableName(beanOrTableName) return session.isTableExist(tableName) } @@ -173,24 +160,15 @@ func (session *Session) isTableExist(tableName string) (bool, error) { // IsTableEmpty if table have any records func (session *Session) IsTableEmpty(bean interface{}) (bool, error) { - v := rValue(bean) - t := v.Type() - - if t.Kind() == reflect.String { - if session.isAutoClose { - defer session.Close() - } - return session.isTableEmpty(bean.(string)) - } else if t.Kind() == reflect.Struct { - rows, err := session.Count(bean) - return rows == 0, err + if session.isAutoClose { + defer session.Close() } - return false, errors.New("bean should be a struct or struct's point") + return session.isTableEmpty(session.engine.TableName(bean)) } func (session *Session) isTableEmpty(tableName string) (bool, error) { var total int64 - sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(tableName)) + sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(session.engine.TableName(tableName, true))) err := session.queryRow(sqlStr).Scan(&total) if err != nil { if err == sql.ErrNoRows { @@ -255,6 +233,12 @@ func (session *Session) Sync2(beans ...interface{}) error { return err } + session.autoResetStatement = false + defer func() { + session.autoResetStatement = true + session.resetStatement() + }() + var structTables []*core.Table for _, bean := range beans { @@ -264,7 +248,8 @@ func (session *Session) Sync2(beans ...interface{}) error { return err } structTables = append(structTables, table) - var tbName = session.tbNameNoSchema(table) + tbName := engine.TableName(bean) + tbNameWithSchema := engine.TableName(tbName, true) var oriTable *core.Table for _, tb := range tables { @@ -309,32 +294,32 @@ func (session *Session) Sync2(beans ...interface{}) error { if engine.dialect.DBType() == core.MYSQL || engine.dialect.DBType() == core.POSTGRES { engine.logger.Infof("Table %s column %s change type from %s to %s\n", - tbName, col.Name, curType, expectedType) - _, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col)) + tbNameWithSchema, col.Name, curType, expectedType) + _, err = session.exec(engine.dialect.ModifyColumnSql(tbNameWithSchema, col)) } else { engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s\n", - tbName, col.Name, curType, expectedType) + tbNameWithSchema, col.Name, curType, expectedType) } } else if strings.HasPrefix(curType, core.Varchar) && strings.HasPrefix(expectedType, core.Varchar) { if engine.dialect.DBType() == core.MYSQL { if oriCol.Length < col.Length { engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n", - tbName, col.Name, oriCol.Length, col.Length) - _, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col)) + tbNameWithSchema, col.Name, oriCol.Length, col.Length) + _, err = session.exec(engine.dialect.ModifyColumnSql(tbNameWithSchema, col)) } } } else { if !(strings.HasPrefix(curType, expectedType) && curType[len(expectedType)] == '(') { engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s", - tbName, col.Name, curType, expectedType) + tbNameWithSchema, col.Name, curType, expectedType) } } } else if expectedType == core.Varchar { if engine.dialect.DBType() == core.MYSQL { if oriCol.Length < col.Length { engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n", - tbName, col.Name, oriCol.Length, col.Length) - _, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col)) + tbNameWithSchema, col.Name, oriCol.Length, col.Length) + _, err = session.exec(engine.dialect.ModifyColumnSql(tbNameWithSchema, col)) } } } @@ -348,7 +333,7 @@ func (session *Session) Sync2(beans ...interface{}) error { } } else { session.statement.RefTable = table - session.statement.tableName = tbName + session.statement.tableName = tbNameWithSchema err = session.addColumn(col.Name) } if err != nil { @@ -371,7 +356,7 @@ func (session *Session) Sync2(beans ...interface{}) error { if oriIndex != nil { if oriIndex.Type != index.Type { - sql := engine.dialect.DropIndexSql(tbName, oriIndex) + sql := engine.dialect.DropIndexSql(tbNameWithSchema, oriIndex) _, err = session.exec(sql) if err != nil { return err @@ -387,7 +372,7 @@ func (session *Session) Sync2(beans ...interface{}) error { for name2, index2 := range oriTable.Indexes { if _, ok := foundIndexNames[name2]; !ok { - sql := engine.dialect.DropIndexSql(tbName, index2) + sql := engine.dialect.DropIndexSql(tbNameWithSchema, index2) _, err = session.exec(sql) if err != nil { return err @@ -398,12 +383,12 @@ func (session *Session) Sync2(beans ...interface{}) error { for name, index := range addedNames { if index.Type == core.UniqueType { session.statement.RefTable = table - session.statement.tableName = tbName - err = session.addUnique(tbName, name) + session.statement.tableName = tbNameWithSchema + err = session.addUnique(tbNameWithSchema, name) } else if index.Type == core.IndexType { session.statement.RefTable = table - session.statement.tableName = tbName - err = session.addIndex(tbName, name) + session.statement.tableName = tbNameWithSchema + err = session.addIndex(tbNameWithSchema, name) } if err != nil { return err @@ -428,7 +413,7 @@ func (session *Session) Sync2(beans ...interface{}) error { for _, colName := range table.ColumnsSeq() { if oriTable.GetColumn(colName) == nil { - engine.logger.Warnf("Table %s has column %s but struct has not related field", table.Name, colName) + engine.logger.Warnf("Table %s has column %s but struct has not related field", engine.TableName(table.Name, true), colName) } } } diff --git a/vendor/github.com/go-xorm/xorm/session_tx.go b/vendor/github.com/go-xorm/xorm/session_tx.go index 84d2f7f9dcf2..c8d759a31ace 100644 --- a/vendor/github.com/go-xorm/xorm/session_tx.go +++ b/vendor/github.com/go-xorm/xorm/session_tx.go @@ -24,6 +24,7 @@ func (session *Session) Rollback() error { if !session.isAutoCommit && !session.isCommitedOrRollbacked { session.saveLastSQL(session.engine.dialect.RollBackStr()) session.isCommitedOrRollbacked = true + session.isAutoCommit = true return session.tx.Rollback() } return nil @@ -34,6 +35,7 @@ func (session *Session) Commit() error { if !session.isAutoCommit && !session.isCommitedOrRollbacked { session.saveLastSQL("COMMIT") session.isCommitedOrRollbacked = true + session.isAutoCommit = true var err error if err = session.tx.Commit(); err == nil { // handle processors after tx committed diff --git a/vendor/github.com/go-xorm/xorm/session_update.go b/vendor/github.com/go-xorm/xorm/session_update.go index f558745667f9..84c7e7fecfff 100644 --- a/vendor/github.com/go-xorm/xorm/session_update.go +++ b/vendor/github.com/go-xorm/xorm/session_update.go @@ -40,7 +40,7 @@ func (session *Session) cacheUpdate(table *core.Table, tableName, sqlStr string, } } - cacher := session.engine.getCacher2(table) + cacher := session.engine.getCacher(tableName) session.engine.logger.Debug("[cacheUpdate] get cache sql", newsql, args[nStart:]) ids, err := core.GetCacheSql(cacher, tableName, newsql, args[nStart:]) if err != nil { @@ -167,7 +167,7 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 var isMap = t.Kind() == reflect.Map var isStruct = t.Kind() == reflect.Struct if isStruct { - if err := session.statement.setRefValue(v); err != nil { + if err := session.statement.setRefBean(bean); err != nil { return 0, err } @@ -176,12 +176,10 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 } if session.statement.ColumnStr == "" { - colNames, args = buildUpdates(session.engine, session.statement.RefTable, bean, false, false, - false, false, session.statement.allUseBool, session.statement.useAllCols, - session.statement.mustColumnMap, session.statement.nullableMap, - session.statement.columnMap, true, session.statement.unscoped) + colNames, args = session.statement.buildUpdates(bean, false, false, + false, false, true) } else { - colNames, args, err = genCols(session.statement.RefTable, session, bean, true, true) + colNames, args, err = session.genUpdateColumns(bean) if err != nil { return 0, err } @@ -202,7 +200,8 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 table := session.statement.RefTable if session.statement.UseAutoTime && table != nil && table.Updated != "" { - if _, ok := session.statement.columnMap[strings.ToLower(table.Updated)]; !ok { + if !session.statement.columnMap.contain(table.Updated) && + !session.statement.omitColumnMap.contain(table.Updated) { colNames = append(colNames, session.engine.Quote(table.Updated)+" = ?") col := table.UpdatedColumn() val, t := session.engine.nowTime(col) @@ -362,12 +361,11 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 } } - if table != nil { - if cacher := session.engine.getCacher2(table); cacher != nil && session.statement.UseCache { - //session.cacheUpdate(table, tableName, sqlStr, args...) - cacher.ClearIds(tableName) - cacher.ClearBeans(tableName) - } + if cacher := session.engine.getCacher(tableName); cacher != nil && session.statement.UseCache { + //session.cacheUpdate(table, tableName, sqlStr, args...) + session.engine.logger.Debug("[cacheUpdate] clear table ", tableName) + cacher.ClearIds(tableName) + cacher.ClearBeans(tableName) } // handle after update processors @@ -402,3 +400,92 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6 return res.RowsAffected() } + +func (session *Session) genUpdateColumns(bean interface{}) ([]string, []interface{}, error) { + table := session.statement.RefTable + colNames := make([]string, 0, len(table.ColumnsSeq())) + args := make([]interface{}, 0, len(table.ColumnsSeq())) + + for _, col := range table.Columns() { + if !col.IsVersion && !col.IsCreated && !col.IsUpdated { + if session.statement.omitColumnMap.contain(col.Name) { + continue + } + } + if col.MapType == core.ONLYFROMDB { + continue + } + + fieldValuePtr, err := col.ValueOf(bean) + if err != nil { + return nil, nil, err + } + fieldValue := *fieldValuePtr + + if col.IsAutoIncrement { + switch fieldValue.Type().Kind() { + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int, reflect.Int64: + if fieldValue.Int() == 0 { + continue + } + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint, reflect.Uint64: + if fieldValue.Uint() == 0 { + continue + } + case reflect.String: + if len(fieldValue.String()) == 0 { + continue + } + case reflect.Ptr: + if fieldValue.Pointer() == 0 { + continue + } + } + } + + if col.IsDeleted || col.IsCreated { + continue + } + + if len(session.statement.columnMap) > 0 { + if !session.statement.columnMap.contain(col.Name) { + continue + } else if _, ok := session.statement.incrColumns[col.Name]; ok { + continue + } else if _, ok := session.statement.decrColumns[col.Name]; ok { + continue + } + } + + // !evalphobia! set fieldValue as nil when column is nullable and zero-value + if _, ok := getFlagForColumn(session.statement.nullableMap, col); ok { + if col.Nullable && isZero(fieldValue.Interface()) { + var nilValue *int + fieldValue = reflect.ValueOf(nilValue) + } + } + + if col.IsUpdated && session.statement.UseAutoTime /*&& isZero(fieldValue.Interface())*/ { + // if time is non-empty, then set to auto time + val, t := session.engine.nowTime(col) + args = append(args, val) + + var colName = col.Name + session.afterClosures = append(session.afterClosures, func(bean interface{}) { + col := table.GetColumn(colName) + setColumnTime(bean, col, t) + }) + } else if col.IsVersion && session.statement.checkVersion { + args = append(args, 1) + } else { + arg, err := session.value2Interface(col, fieldValue) + if err != nil { + return colNames, args, err + } + args = append(args, arg) + } + + colNames = append(colNames, session.engine.Quote(col.Name)+" = ?") + } + return colNames, args, nil +} diff --git a/vendor/github.com/go-xorm/xorm/statement.go b/vendor/github.com/go-xorm/xorm/statement.go index 6400425b20e8..7856936f5cb3 100644 --- a/vendor/github.com/go-xorm/xorm/statement.go +++ b/vendor/github.com/go-xorm/xorm/statement.go @@ -5,7 +5,6 @@ package xorm import ( - "bytes" "database/sql/driver" "encoding/json" "errors" @@ -18,21 +17,6 @@ import ( "github.com/go-xorm/core" ) -type incrParam struct { - colName string - arg interface{} -} - -type decrParam struct { - colName string - arg interface{} -} - -type exprParam struct { - colName string - expr string -} - // Statement save all the sql info for executing SQL type Statement struct { RefTable *core.Table @@ -47,7 +31,6 @@ type Statement struct { HavingStr string ColumnStr string selectStr string - columnMap map[string]bool useAllCols bool OmitStr string AltTableName string @@ -67,6 +50,8 @@ type Statement struct { allUseBool bool checkVersion bool unscoped bool + columnMap columnMap + omitColumnMap columnMap mustColumnMap map[string]bool nullableMap map[string]bool incrColumns map[string]incrParam @@ -89,7 +74,8 @@ func (statement *Statement) Init() { statement.HavingStr = "" statement.ColumnStr = "" statement.OmitStr = "" - statement.columnMap = make(map[string]bool) + statement.columnMap = columnMap{} + statement.omitColumnMap = columnMap{} statement.AltTableName = "" statement.tableName = "" statement.idParam = nil @@ -221,34 +207,33 @@ func (statement *Statement) setRefValue(v reflect.Value) error { if err != nil { return err } - statement.tableName = statement.Engine.tbName(v) + statement.tableName = statement.Engine.TableName(v, true) return nil } -// Table tempororily set table name, the parameter could be a string or a pointer of struct -func (statement *Statement) Table(tableNameOrBean interface{}) *Statement { - v := rValue(tableNameOrBean) - t := v.Type() - if t.Kind() == reflect.String { - statement.AltTableName = tableNameOrBean.(string) - } else if t.Kind() == reflect.Struct { - var err error - statement.RefTable, err = statement.Engine.autoMapType(v) - if err != nil { - statement.Engine.logger.Error(err) - return statement - } - statement.AltTableName = statement.Engine.tbName(v) +func (statement *Statement) setRefBean(bean interface{}) error { + var err error + statement.RefTable, err = statement.Engine.autoMapType(rValue(bean)) + if err != nil { + return err } - return statement + statement.tableName = statement.Engine.TableName(bean, true) + return nil } // Auto generating update columnes and values according a struct -func buildUpdates(engine *Engine, table *core.Table, bean interface{}, - includeVersion bool, includeUpdated bool, includeNil bool, - includeAutoIncr bool, allUseBool bool, useAllCols bool, - mustColumnMap map[string]bool, nullableMap map[string]bool, - columnMap map[string]bool, update, unscoped bool) ([]string, []interface{}) { +func (statement *Statement) buildUpdates(bean interface{}, + includeVersion, includeUpdated, includeNil, + includeAutoIncr, update bool) ([]string, []interface{}) { + engine := statement.Engine + table := statement.RefTable + allUseBool := statement.allUseBool + useAllCols := statement.useAllCols + mustColumnMap := statement.mustColumnMap + nullableMap := statement.nullableMap + columnMap := statement.columnMap + omitColumnMap := statement.omitColumnMap + unscoped := statement.unscoped var colNames = make([]string, 0) var args = make([]interface{}, 0) @@ -268,7 +253,14 @@ func buildUpdates(engine *Engine, table *core.Table, bean interface{}, if col.IsDeleted && !unscoped { continue } - if use, ok := columnMap[strings.ToLower(col.Name)]; ok && !use { + if omitColumnMap.contain(col.Name) { + continue + } + if len(columnMap) > 0 && !columnMap.contain(col.Name) { + continue + } + + if col.MapType == core.ONLYFROMDB { continue } @@ -604,17 +596,10 @@ func (statement *Statement) col2NewColsWithQuote(columns ...string) []string { } func (statement *Statement) colmap2NewColsWithQuote() []string { - newColumns := make([]string, 0, len(statement.columnMap)) - for col := range statement.columnMap { - fields := strings.Split(strings.TrimSpace(col), ".") - if len(fields) == 1 { - newColumns = append(newColumns, statement.Engine.quote(fields[0])) - } else if len(fields) == 2 { - newColumns = append(newColumns, statement.Engine.quote(fields[0])+"."+ - statement.Engine.quote(fields[1])) - } else { - panic(errors.New("unwanted colnames")) - } + newColumns := make([]string, len(statement.columnMap), len(statement.columnMap)) + copy(newColumns, statement.columnMap) + for i := 0; i < len(statement.columnMap); i++ { + newColumns[i] = statement.Engine.Quote(newColumns[i]) } return newColumns } @@ -642,10 +627,11 @@ func (statement *Statement) Select(str string) *Statement { func (statement *Statement) Cols(columns ...string) *Statement { cols := col2NewCols(columns...) for _, nc := range cols { - statement.columnMap[strings.ToLower(nc)] = true + statement.columnMap.add(nc) } newColumns := statement.colmap2NewColsWithQuote() + statement.ColumnStr = strings.Join(newColumns, ", ") statement.ColumnStr = strings.Replace(statement.ColumnStr, statement.Engine.quote("*"), "*", -1) return statement @@ -680,7 +666,7 @@ func (statement *Statement) UseBool(columns ...string) *Statement { func (statement *Statement) Omit(columns ...string) { newColumns := col2NewCols(columns...) for _, nc := range newColumns { - statement.columnMap[strings.ToLower(nc)] = false + statement.omitColumnMap = append(statement.omitColumnMap, nc) } statement.OmitStr = statement.Engine.Quote(strings.Join(newColumns, statement.Engine.Quote(", "))) } @@ -719,10 +705,9 @@ func (statement *Statement) OrderBy(order string) *Statement { // Desc generate `ORDER BY xx DESC` func (statement *Statement) Desc(colNames ...string) *Statement { - var buf bytes.Buffer - fmt.Fprintf(&buf, statement.OrderStr) + var buf builder.StringBuilder if len(statement.OrderStr) > 0 { - fmt.Fprint(&buf, ", ") + fmt.Fprint(&buf, statement.OrderStr, ", ") } newColNames := statement.col2NewColsWithQuote(colNames...) fmt.Fprintf(&buf, "%v DESC", strings.Join(newColNames, " DESC, ")) @@ -732,10 +717,9 @@ func (statement *Statement) Desc(colNames ...string) *Statement { // Asc provide asc order by query condition, the input parameters are columns. func (statement *Statement) Asc(colNames ...string) *Statement { - var buf bytes.Buffer - fmt.Fprintf(&buf, statement.OrderStr) + var buf builder.StringBuilder if len(statement.OrderStr) > 0 { - fmt.Fprint(&buf, ", ") + fmt.Fprint(&buf, statement.OrderStr, ", ") } newColNames := statement.col2NewColsWithQuote(colNames...) fmt.Fprintf(&buf, "%v ASC", strings.Join(newColNames, " ASC, ")) @@ -743,48 +727,35 @@ func (statement *Statement) Asc(colNames ...string) *Statement { return statement } +// Table tempororily set table name, the parameter could be a string or a pointer of struct +func (statement *Statement) Table(tableNameOrBean interface{}) *Statement { + v := rValue(tableNameOrBean) + t := v.Type() + if t.Kind() == reflect.Struct { + var err error + statement.RefTable, err = statement.Engine.autoMapType(v) + if err != nil { + statement.Engine.logger.Error(err) + return statement + } + } + + statement.AltTableName = statement.Engine.TableName(tableNameOrBean, true) + return statement +} + // Join The joinOP should be one of INNER, LEFT OUTER, CROSS etc - this will be prepended to JOIN func (statement *Statement) Join(joinOP string, tablename interface{}, condition string, args ...interface{}) *Statement { - var buf bytes.Buffer + var buf builder.StringBuilder if len(statement.JoinStr) > 0 { fmt.Fprintf(&buf, "%v %v JOIN ", statement.JoinStr, joinOP) } else { fmt.Fprintf(&buf, "%v JOIN ", joinOP) } - switch tablename.(type) { - case []string: - t := tablename.([]string) - if len(t) > 1 { - fmt.Fprintf(&buf, "%v AS %v", statement.Engine.Quote(t[0]), statement.Engine.Quote(t[1])) - } else if len(t) == 1 { - fmt.Fprintf(&buf, statement.Engine.Quote(t[0])) - } - case []interface{}: - t := tablename.([]interface{}) - l := len(t) - var table string - if l > 0 { - f := t[0] - v := rValue(f) - t := v.Type() - if t.Kind() == reflect.String { - table = f.(string) - } else if t.Kind() == reflect.Struct { - table = statement.Engine.tbName(v) - } - } - if l > 1 { - fmt.Fprintf(&buf, "%v AS %v", statement.Engine.Quote(table), - statement.Engine.Quote(fmt.Sprintf("%v", t[1]))) - } else if l == 1 { - fmt.Fprintf(&buf, statement.Engine.Quote(table)) - } - default: - fmt.Fprintf(&buf, statement.Engine.Quote(fmt.Sprintf("%v", tablename))) - } + tbName := statement.Engine.TableName(tablename, true) - fmt.Fprintf(&buf, " ON %v", condition) + fmt.Fprintf(&buf, "%s ON %v", tbName, condition) statement.JoinStr = buf.String() statement.joinArgs = append(statement.joinArgs, args...) return statement @@ -809,18 +780,20 @@ func (statement *Statement) Unscoped() *Statement { } func (statement *Statement) genColumnStr() string { - var buf bytes.Buffer if statement.RefTable == nil { return "" } + var buf builder.StringBuilder columns := statement.RefTable.Columns() for _, col := range columns { - if statement.OmitStr != "" { - if _, ok := getFlagForColumn(statement.columnMap, col); ok { - continue - } + if statement.omitColumnMap.contain(col.Name) { + continue + } + + if len(statement.columnMap) > 0 && !statement.columnMap.contain(col.Name) { + continue } if col.MapType == core.ONLYTODB { @@ -831,10 +804,6 @@ func (statement *Statement) genColumnStr() string { buf.WriteString(", ") } - if col.IsPrimaryKey && statement.Engine.Dialect().DBType() == "ql" { - buf.WriteString("id() AS ") - } - if statement.JoinStr != "" { if statement.TableAlias != "" { buf.WriteString(statement.TableAlias) @@ -859,11 +828,13 @@ func (statement *Statement) genCreateTableSQL() string { func (statement *Statement) genIndexSQL() []string { var sqls []string tbName := statement.TableName() - quote := statement.Engine.Quote - for idxName, index := range statement.RefTable.Indexes { + for _, index := range statement.RefTable.Indexes { if index.Type == core.IndexType { - sql := fmt.Sprintf("CREATE INDEX %v ON %v (%v);", quote(indexName(tbName, idxName)), - quote(tbName), quote(strings.Join(index.Cols, quote(",")))) + sql := statement.Engine.dialect.CreateIndexSql(tbName, index) + /*idxTBName := strings.Replace(tbName, ".", "_", -1) + idxTBName = strings.Replace(idxTBName, `"`, "", -1) + sql := fmt.Sprintf("CREATE INDEX %v ON %v (%v);", quote(indexName(idxTBName, idxName)), + quote(tbName), quote(strings.Join(index.Cols, quote(","))))*/ sqls = append(sqls, sql) } } @@ -889,16 +860,18 @@ func (statement *Statement) genUniqueSQL() []string { func (statement *Statement) genDelIndexSQL() []string { var sqls []string tbName := statement.TableName() + idxPrefixName := strings.Replace(tbName, `"`, "", -1) + idxPrefixName = strings.Replace(idxPrefixName, `.`, "_", -1) for idxName, index := range statement.RefTable.Indexes { var rIdxName string if index.Type == core.UniqueType { - rIdxName = uniqueName(tbName, idxName) + rIdxName = uniqueName(idxPrefixName, idxName) } else if index.Type == core.IndexType { - rIdxName = indexName(tbName, idxName) + rIdxName = indexName(idxPrefixName, idxName) } - sql := fmt.Sprintf("DROP INDEX %v", statement.Engine.Quote(rIdxName)) + sql := fmt.Sprintf("DROP INDEX %v", statement.Engine.Quote(statement.Engine.TableName(rIdxName, true))) if statement.Engine.dialect.IndexOnTable() { - sql += fmt.Sprintf(" ON %v", statement.Engine.Quote(statement.TableName())) + sql += fmt.Sprintf(" ON %v", statement.Engine.Quote(tbName)) } sqls = append(sqls, sql) } @@ -949,7 +922,7 @@ func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{}, v := rValue(bean) isStruct := v.Kind() == reflect.Struct if isStruct { - statement.setRefValue(v) + statement.setRefBean(bean) } var columnStr = statement.ColumnStr @@ -982,13 +955,17 @@ func (statement *Statement) genGetSQL(bean interface{}) (string, []interface{}, if err := statement.mergeConds(bean); err != nil { return "", nil, err } + } else { + if err := statement.processIDParam(); err != nil { + return "", nil, err + } } condSQL, condArgs, err := builder.ToSQL(statement.cond) if err != nil { return "", nil, err } - sqlStr, err := statement.genSelectSQL(columnStr, condSQL) + sqlStr, err := statement.genSelectSQL(columnStr, condSQL, true, true) if err != nil { return "", nil, err } @@ -1001,7 +978,7 @@ func (statement *Statement) genCountSQL(beans ...interface{}) (string, []interfa var condArgs []interface{} var err error if len(beans) > 0 { - statement.setRefValue(rValue(beans[0])) + statement.setRefBean(beans[0]) condSQL, condArgs, err = statement.genConds(beans[0]) } else { condSQL, condArgs, err = builder.ToSQL(statement.cond) @@ -1018,7 +995,7 @@ func (statement *Statement) genCountSQL(beans ...interface{}) (string, []interfa selectSQL = "count(*)" } } - sqlStr, err := statement.genSelectSQL(selectSQL, condSQL) + sqlStr, err := statement.genSelectSQL(selectSQL, condSQL, false, false) if err != nil { return "", nil, err } @@ -1027,7 +1004,7 @@ func (statement *Statement) genCountSQL(beans ...interface{}) (string, []interfa } func (statement *Statement) genSumSQL(bean interface{}, columns ...string) (string, []interface{}, error) { - statement.setRefValue(rValue(bean)) + statement.setRefBean(bean) var sumStrs = make([]string, 0, len(columns)) for _, colName := range columns { @@ -1043,7 +1020,7 @@ func (statement *Statement) genSumSQL(bean interface{}, columns ...string) (stri return "", nil, err } - sqlStr, err := statement.genSelectSQL(sumSelect, condSQL) + sqlStr, err := statement.genSelectSQL(sumSelect, condSQL, true, true) if err != nil { return "", nil, err } @@ -1051,27 +1028,20 @@ func (statement *Statement) genSumSQL(bean interface{}, columns ...string) (stri return sqlStr, append(statement.joinArgs, condArgs...), nil } -func (statement *Statement) genSelectSQL(columnStr, condSQL string) (a string, err error) { - var distinct string +func (statement *Statement) genSelectSQL(columnStr, condSQL string, needLimit, needOrderBy bool) (string, error) { + var ( + distinct string + dialect = statement.Engine.Dialect() + quote = statement.Engine.Quote + fromStr = " FROM " + top, mssqlCondi, whereStr string + ) if statement.IsDistinct && !strings.HasPrefix(columnStr, "count") { distinct = "DISTINCT " } - - var dialect = statement.Engine.Dialect() - var quote = statement.Engine.Quote - var top string - var mssqlCondi string - - if err := statement.processIDParam(); err != nil { - return "", err - } - - var buf bytes.Buffer if len(condSQL) > 0 { - fmt.Fprintf(&buf, " WHERE %v", condSQL) + whereStr = " WHERE " + condSQL } - var whereStr = buf.String() - var fromStr = " FROM " if dialect.DBType() == core.MSSQL && strings.Contains(statement.TableName(), "..") { fromStr += statement.TableName() @@ -1118,9 +1088,10 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string) (a string, e } var orderStr string - if len(statement.OrderStr) > 0 { + if needOrderBy && len(statement.OrderStr) > 0 { orderStr = " ORDER BY " + statement.OrderStr } + var groupStr string if len(statement.GroupByStr) > 0 { groupStr = " GROUP BY " + statement.GroupByStr @@ -1130,45 +1101,50 @@ func (statement *Statement) genSelectSQL(columnStr, condSQL string) (a string, e } } - // !nashtsai! REVIEW Sprintf is considered slowest mean of string concatnation, better to work with builder pattern - a = fmt.Sprintf("SELECT %v%v%v%v%v", distinct, top, columnStr, fromStr, whereStr) + var buf builder.StringBuilder + fmt.Fprintf(&buf, "SELECT %v%v%v%v%v", distinct, top, columnStr, fromStr, whereStr) if len(mssqlCondi) > 0 { if len(whereStr) > 0 { - a += " AND " + mssqlCondi + fmt.Fprint(&buf, " AND ", mssqlCondi) } else { - a += " WHERE " + mssqlCondi + fmt.Fprint(&buf, " WHERE ", mssqlCondi) } } if statement.GroupByStr != "" { - a = fmt.Sprintf("%v GROUP BY %v", a, statement.GroupByStr) + fmt.Fprint(&buf, " GROUP BY ", statement.GroupByStr) } if statement.HavingStr != "" { - a = fmt.Sprintf("%v %v", a, statement.HavingStr) + fmt.Fprint(&buf, " ", statement.HavingStr) } - if statement.OrderStr != "" { - a = fmt.Sprintf("%v ORDER BY %v", a, statement.OrderStr) + if needOrderBy && statement.OrderStr != "" { + fmt.Fprint(&buf, " ORDER BY ", statement.OrderStr) } - if dialect.DBType() != core.MSSQL && dialect.DBType() != core.ORACLE { - if statement.Start > 0 { - a = fmt.Sprintf("%v LIMIT %v OFFSET %v", a, statement.LimitN, statement.Start) - } else if statement.LimitN > 0 { - a = fmt.Sprintf("%v LIMIT %v", a, statement.LimitN) - } - } else if dialect.DBType() == core.ORACLE { - if statement.Start != 0 || statement.LimitN != 0 { - a = fmt.Sprintf("SELECT %v FROM (SELECT %v,ROWNUM RN FROM (%v) at WHERE ROWNUM <= %d) aat WHERE RN > %d", columnStr, columnStr, a, statement.Start+statement.LimitN, statement.Start) + if needLimit { + if dialect.DBType() != core.MSSQL && dialect.DBType() != core.ORACLE { + if statement.Start > 0 { + fmt.Fprintf(&buf, " LIMIT %v OFFSET %v", statement.LimitN, statement.Start) + } else if statement.LimitN > 0 { + fmt.Fprint(&buf, " LIMIT ", statement.LimitN) + } + } else if dialect.DBType() == core.ORACLE { + if statement.Start != 0 || statement.LimitN != 0 { + oldString := buf.String() + buf.Reset() + fmt.Fprintf(&buf, "SELECT %v FROM (SELECT %v,ROWNUM RN FROM (%v) at WHERE ROWNUM <= %d) aat WHERE RN > %d", + columnStr, columnStr, oldString, statement.Start+statement.LimitN, statement.Start) + } } } if statement.IsForUpdate { - a = dialect.ForUpdateSql(a) + return dialect.ForUpdateSql(buf.String()), nil } - return + return buf.String(), nil } func (statement *Statement) processIDParam() error { - if statement.idParam == nil { + if statement.idParam == nil || statement.RefTable == nil { return nil } diff --git a/vendor/github.com/go-xorm/xorm/xorm.go b/vendor/github.com/go-xorm/xorm/xorm.go index 4fdadf2fadeb..141c4897d538 100644 --- a/vendor/github.com/go-xorm/xorm/xorm.go +++ b/vendor/github.com/go-xorm/xorm/xorm.go @@ -17,7 +17,7 @@ import ( const ( // Version show the xorm's version - Version string = "0.6.4.0910" + Version string = "0.7.0.0504" ) func regDrvsNDialects() bool { @@ -31,7 +31,7 @@ func regDrvsNDialects() bool { "mysql": {"mysql", func() core.Driver { return &mysqlDriver{} }, func() core.Dialect { return &mysql{} }}, "mymysql": {"mysql", func() core.Driver { return &mymysqlDriver{} }, func() core.Dialect { return &mysql{} }}, "postgres": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, - "pgx": {"postgres", func() core.Driver { return &pqDriver{} }, func() core.Dialect { return &postgres{} }}, + "pgx": {"postgres", func() core.Driver { return &pqDriverPgx{} }, func() core.Dialect { return &postgres{} }}, "sqlite3": {"sqlite3", func() core.Driver { return &sqlite3Driver{} }, func() core.Dialect { return &sqlite3{} }}, "oci8": {"oracle", func() core.Driver { return &oci8Driver{} }, func() core.Dialect { return &oracle{} }}, "goracle": {"oracle", func() core.Driver { return &goracleDriver{} }, func() core.Dialect { return &oracle{} }}, @@ -90,6 +90,7 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { TagIdentifier: "xorm", TZLocation: time.Local, tagHandlers: defaultTagHandlers, + cachers: make(map[string]core.Cacher), } if uri.DbType == core.SQLITE { @@ -108,6 +109,13 @@ func NewEngine(driverName string, dataSourceName string) (*Engine, error) { return engine, nil } +// NewEngineWithParams new a db manager with params. The params will be passed to dialect. +func NewEngineWithParams(driverName string, dataSourceName string, params map[string]string) (*Engine, error) { + engine, err := NewEngine(driverName, dataSourceName) + engine.dialect.SetParams(params) + return engine, err +} + // Clone clone an engine func (engine *Engine) Clone() (*Engine, error) { return NewEngine(engine.DriverName(), engine.DataSourceName()) From 53dea1d1751f988f4ed45d178075aef6a03d907d Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 20 Jul 2018 02:11:33 +0000 Subject: [PATCH 128/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 2 +- options/locale/locale_uk-UA.ini | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 62d21fee52a0..055ba994f6bb 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -930,7 +930,7 @@ activity.new_issues_count_n=Novas issues activity.new_issue_label=Aberto activity.title.unresolved_conv_1=%d conversa não resolvida activity.title.unresolved_conv_n=%d conversas não resolvidas -activity.unresolved_conv_desc=Estes problemas foram recentemente alterados e pull requests ainda não foram resolvidos. +activity.unresolved_conv_desc=Estas issues foram recentemente alteradas e pull requests ainda não foram resolvidos. activity.unresolved_conv_label=Abrir activity.title.releases_1=%d Versão activity.title.releases_n=%d Versões diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 20985668e4fd..8efcc4c15402 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -781,8 +781,17 @@ issues.due_date_added=додав(ла) дату завершення %s %s issues.due_date_modified=термін змінено з %s %s на %s issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено +issues.due_date_invalid=Термін дії не дійсний або не відповідає дійсності. Будь ласка, використовуйте формат yyyy-mm-dd. +issues.dependency.title=Залежності +issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей. +issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей. +issues.dependency.add=Додати нову залежність... issues.dependency.cancel=Відмінити issues.dependency.remove=Видалити +issues.dependency.issue_number=Номер проблеми +issues.dependency.added_dependency=
0%
[2]s додано нову залежність %[3]s' +issues.dependency.removed_dependency=
0%
[2]s видалено залежність %[3]s' +issues.dependency.blocks_short=Блоки pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. pulls.new=Новий запит на злиття From 6f88c4d79592770b70bb0942e58c553d23df584f Mon Sep 17 00:00:00 2001 From: bugreport0 <32939607+bugreport0@users.noreply.github.com> Date: Fri, 20 Jul 2018 16:40:08 +0000 Subject: [PATCH 129/447] Improve English translation for new features. (#4481) --- options/locale/locale_en-US.ini | 65 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 72e79cf90dcd..629d84e0585e 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -32,16 +32,16 @@ twofa_scratch = Two-Factor Scratch Code passcode = Passcode u2f_insert_key = Insert your security key -u2f_sign_in = Press the button on your security key. If you can't find a button, re-insert it. +u2f_sign_in = Press the button on your security key. If your security key has no button, re-insert it. u2f_press_button = Please press the button on your security key… u2f_use_twofa = Use a two-factor code from your phone -u2f_error = We can't read your security key! -u2f_unsupported_browser = Your browser don't support U2F keys. Please try another browser. -u2f_error_1 = An unknown error occured. Please retry. -u2f_error_2 = Please make sure that you're using an encrypted connection (https://) and visiting the correct URL. -u2f_error_3 = The server could not proceed your request. -u2f_error_4 = The presented key is not eligible for this request. If you try to register it, make sure that the key isn't already registered. -u2f_error_5 = Timeout reached before your key could be read. Please reload to retry. +u2f_error = Could not read your security key. +u2f_unsupported_browser = Your browser does not support U2F security keys. +u2f_error_1 = An unknown error occurred. Please retry. +u2f_error_2 = Please make sure to use the correct, encrypted (https://) URL. +u2f_error_3 = The server could not process your request. +u2f_error_4 = The security key is not permitted for this request. Please make sure that the key is not already registered. +u2f_error_5 = Timeout reached before your key could be read. Please reload this page and retry. u2f_reload = Reload repository = Repository @@ -130,7 +130,7 @@ federated_avatar_lookup = Enable Federated Avatars federated_avatar_lookup_popup = Enable federated avatar lookup using Libravatar. disable_registration = Disable Self-Registration disable_registration_popup = Disable user self-registration. Only administrators will be able to create new user accounts. -allow_only_external_registration_popup=Enable the registration only through external services. +allow_only_external_registration_popup = Allow Registration Only Through External Services openid_signin = Enable OpenID Sign-In openid_signin_popup = Enable user sign-in via OpenID. openid_signup = Enable OpenID Self-Registration @@ -463,13 +463,13 @@ then_enter_passcode = And enter the passcode shown in the application: passcode_invalid = The passcode is incorrect. Try again. twofa_enrolled = Your account has been enrolled into two-factor authentication. Store your scratch token (%s) in a safe place as it is only shown once! -u2f_desc = Security keys are hardware devices containing cryptographic keys. They could be used for two factor authentication. The security key must support the FIDO U2F standard. -u2f_require_twofa = Two-Factor-Authentication must be enrolled in order to use security keys. +u2f_desc = Security keys are hardware devices containing cryptographic keys. They can be used for two-factor authentication. Security keys must support the FIDO U2F standard. +u2f_require_twofa = Your account must be enrolled in two-factor authentication to use security keys. u2f_register_key = Add Security Key u2f_nickname = Nickname u2f_press_button = Press the button on your security key to register it. u2f_delete_key = Remove Security Key -u2f_delete_key_desc= If you remove a security key you cannot login with it anymore. Are you sure? +u2f_delete_key_desc = If you remove a security key you can no longer sign in with it. Continue? manage_account_links = Manage Linked Accounts manage_account_links_desc = These external accounts are linked to your Gitea account. @@ -650,7 +650,7 @@ issues.new.open_milestone = Open Milestones issues.new.closed_milestone = Closed Milestones issues.new.assignees = Assignees issues.new.clear_assignees = Clear assignees -issues.new.no_assignees = Nobody assigned +issues.new.no_assignees = No Assignees issues.no_ref = No Branch/Tag Specified issues.create = Create Issue issues.new_label = New Label @@ -781,34 +781,33 @@ issues.due_date_added = "added the due date %s %s" issues.due_date_modified = "modified the due date to %s from %s %s" issues.due_date_remove = "removed the due date %s %s" issues.due_date_overdue = "Overdue" -issues.due_date_invalid = "The due date is invalid or out of range. Please use the format yyyy-mm-dd." +issues.due_date_invalid = "The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'." issues.dependency.title = Dependencies issues.dependency.issue_no_dependencies = This issue currently doesn't have any dependencies. issues.dependency.pr_no_dependencies = This pull request currently doesn't have any dependencies. -issues.dependency.add = Add a new dependency... +issues.dependency.add = Add dependency... issues.dependency.cancel = Cancel issues.dependency.remove = Remove -issues.dependency.issue_number = Issuenumber issues.dependency.added_dependency = `%[2]s added a new dependency %[3]s` issues.dependency.removed_dependency = `%[2]s removed a dependency %[3]s` issues.dependency.issue_closing_blockedby = Closing this pull request is blocked by the following issues issues.dependency.pr_closing_blockedby = Closing this issue is blocked by the following issues issues.dependency.issue_close_blocks = This issue blocks closing of the following issues issues.dependency.pr_close_blocks = This pull request blocks closing of the following issues -issues.dependency.issue_close_blocked = You need to close all issues blocking this issue before you can close it! -issues.dependency.pr_close_blocked = You need to close all issues blocking this pull request before you can merge it! +issues.dependency.issue_close_blocked = You need to close all issues blocking this issue before you can close it. +issues.dependency.pr_close_blocked = You need to close all issues blocking this pull request before you can merge it. issues.dependency.blocks_short = Blocks issues.dependency.blocked_by_short = Depends on issues.dependency.remove_header = Remove Dependency -issues.dependency.issue_remove_text = This will remove the dependency to this issue. Are you sure? You cannot undo this! -issues.dependency.pr_remove_text = This will remove the dependency to this pull request. Are you sure? You cannot undo this! -issues.dependency.setting = Issues & PRs can have dependencies -issues.dependency.add_error_same_issue = You cannot make an issue depend on itself! -issues.dependency.add_error_dep_issue_not_exist = Dependent issue does not exist! -issues.dependency.add_error_dep_not_exist = Dependency does not exist! -issues.dependency.add_error_dep_exists = Dependency already exists! -issues.dependency.add_error_cannot_create_circular = You cannot create a dependency with two issues blocking each other! -issues.dependency.add_error_dep_not_same_repo = Both issues must be in the same repo! +issues.dependency.issue_remove_text = This will remove the dependency from this issue. Continue? +issues.dependency.pr_remove_text = This will remove the dependency from this pull request. Continue? +issues.dependency.setting = Enable Dependencies For Issues and Pull Requests +issues.dependency.add_error_same_issue = You cannot make an issue depend on itself. +issues.dependency.add_error_dep_issue_not_exist = Dependent issue does not exist. +issues.dependency.add_error_dep_not_exist = Dependency does not exist. +issues.dependency.add_error_dep_exists = Dependency already exists. +issues.dependency.add_error_cannot_create_circular = You cannot create a dependency with two issues blocking each other. +issues.dependency.add_error_dep_not_same_repo = Both issues must be in the same repository. pulls.desc = Enable merge requests and code reviews. pulls.new = New Pull Request @@ -1196,8 +1195,8 @@ branch.protected_deletion_failed = Branch '%s' is protected. It cannot be delete topic.manage_topics = Manage Topics topic.done = Done -topic.count_prompt = You can't select more than 25 topics -topic.format_prompt = Topics must start with a letter or number, can include hyphens(-) and must be no more than 35 characters long +topic.count_prompt = You can not select more than 25 topics +topic.format_prompt = Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long. [org] org_name_holder = Organization Name @@ -1302,8 +1301,8 @@ dashboard.operation_switch = Switch dashboard.operation_run = Run dashboard.clean_unbind_oauth = Clean unbound OAuth connections dashboard.clean_unbind_oauth_success = All unbound OAuth connections have been deleted. -dashboard.delete_inactivate_accounts = Delete all not activated accounts -dashboard.delete_inactivate_accounts_success = All not activated accounts have been deleted. +dashboard.delete_inactivate_accounts = Delete all unactivated accounts +dashboard.delete_inactivate_accounts_success = All unactivated accounts have been deleted. dashboard.delete_repo_archives = Delete all repository archives dashboard.delete_repo_archives_success = All repository archives have been deleted. dashboard.delete_missing_repos = Delete all repositories missing their Git files @@ -1511,7 +1510,7 @@ config.db_path = Path config.service_config = Service Configuration config.register_email_confirm = Require Email Confirmation to Register config.disable_register = Disable Self-Registration -config.allow_only_external_registration = Enable the registration only through external services +config.allow_only_external_registration = Allow Registration Only Through External Services config.enable_openid_signup = Enable OpenID Self-Registration config.enable_openid_signin = Enable OpenID Sign-In config.show_registration_button = Show Register Button @@ -1527,7 +1526,7 @@ config.enable_timetracking = Enable Time Tracking config.default_enable_timetracking = Enable Time Tracking by Default config.default_allow_only_contributors_to_track_time = Let Only Contributors Track Time config.no_reply_address = Hidden Email Domain -config.default_enable_dependencies = Enable issue dependencies by default +config.default_enable_dependencies = Enable Issue Dependencies by Default config.webhook_config = Webhook Configuration config.queue_length = Queue Length From 59bace111b1491e16fce59df11ee16a9374a6a17 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 21 Jul 2018 05:08:15 +0800 Subject: [PATCH 130/447] Add csv file render support defaultly (#4105) * add csv file render support defaultly * escaping csv column content --- main.go | 1 + modules/markup/csv/csv.go | 58 ++++++++++++++++++++++++++++++++++ modules/markup/csv/csv_test.go | 25 +++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 modules/markup/csv/csv.go create mode 100644 modules/markup/csv/csv_test.go diff --git a/main.go b/main.go index 179132f58798..e73f1d60a922 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" // register supported doc types + _ "code.gitea.io/gitea/modules/markup/csv" _ "code.gitea.io/gitea/modules/markup/markdown" _ "code.gitea.io/gitea/modules/markup/orgmode" diff --git a/modules/markup/csv/csv.go b/modules/markup/csv/csv.go new file mode 100644 index 000000000000..077947e77442 --- /dev/null +++ b/modules/markup/csv/csv.go @@ -0,0 +1,58 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package markup + +import ( + "bytes" + "encoding/csv" + "html" + "io" + + "code.gitea.io/gitea/modules/markup" +) + +func init() { + markup.RegisterParser(Parser{}) +} + +// Parser implements markup.Parser for orgmode +type Parser struct { +} + +// Name implements markup.Parser +func (Parser) Name() string { + return "csv" +} + +// Extensions implements markup.Parser +func (Parser) Extensions() []string { + return []string{".csv"} +} + +// Render implements markup.Parser +func (Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { + rd := csv.NewReader(bytes.NewReader(rawBytes)) + var tmpBlock bytes.Buffer + tmpBlock.WriteString(``) + for { + fields, err := rd.Read() + if err == io.EOF { + break + } + if err != nil { + continue + } + tmpBlock.WriteString("") + for _, field := range fields { + tmpBlock.WriteString("") + } + tmpBlock.WriteString("") + } + tmpBlock.WriteString("
") + tmpBlock.WriteString(html.EscapeString(field)) + tmpBlock.WriteString("
") + + return tmpBlock.Bytes() +} diff --git a/modules/markup/csv/csv_test.go b/modules/markup/csv/csv_test.go new file mode 100644 index 000000000000..f050296cee1b --- /dev/null +++ b/modules/markup/csv/csv_test.go @@ -0,0 +1,25 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package markup + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRenderCSV(t *testing.T) { + var parser Parser + var kases = map[string]string{ + "a": "
a
", + "1,2": "
12
", + "
": "
<br/>
", + } + + for k, v := range kases { + res := parser.Render([]byte(k), "", nil, false) + assert.EqualValues(t, v, string(res)) + } +} From 31ff2f624bde0583be96c17e2da960dc05bc4f85 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 20 Jul 2018 21:09:20 +0000 Subject: [PATCH 131/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 18 ----------- options/locale/locale_es-ES.ini | 5 ---- options/locale/locale_fr-FR.ini | 16 ---------- options/locale/locale_id-ID.ini | 8 ----- options/locale/locale_it-IT.ini | 17 ----------- options/locale/locale_lv-LV.ini | 18 ----------- options/locale/locale_nl-NL.ini | 6 ---- options/locale/locale_pt-BR.ini | 53 ++++++++++++++++----------------- options/locale/locale_ru-RU.ini | 18 ----------- options/locale/locale_sv-SE.ini | 18 ----------- options/locale/locale_uk-UA.ini | 21 ------------- options/locale/locale_zh-CN.ini | 18 ----------- options/locale/locale_zh-TW.ini | 14 --------- 13 files changed, 26 insertions(+), 204 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 6206db445575..f77ae2e09024 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -32,16 +32,8 @@ twofa_scratch=Zwei-Faktor-Einmalpasswort passcode=PIN u2f_insert_key=Hardware-Sicherheitsschlüssel einstecken -u2f_sign_in=Drücke den Knopf auf deinem Sicherheitsschlüssel. Wenn deiner keinen Knopf hat, stecke ihn erneut ein. u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel… u2f_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden -u2f_error=Wir können deinen Hardware-Sicherheitsschlüssel nicht lesen! -u2f_unsupported_browser=Dein Browser unterstützt keine U2F-Geräte. Bitte benutze einen anderen Browser. -u2f_error_1=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut. -u2f_error_2=Stelle sicher, dass du einen verschlüsselte Verbindung (https://) benutzt und die richtige URL eingeben hast. -u2f_error_3=Der Server kann deine Anfrage nicht bearbeiten. -u2f_error_4=Dieser Sicherheitsschlüssel ist nicht berechtigt. Wenn du versuchst, einen neuen Sicherheitsschlüssel zu registrieren, stelle bitte sicher, dass du ihn nicht bereits registriert hast. -u2f_error_5=Das Zeitlimit wurde erreicht bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite neu. u2f_reload=Neu laden repository=Repository @@ -130,7 +122,6 @@ federated_avatar_lookup=Föderierte Profilbilder einschalten federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren. disable_registration=Registrierung deaktivieren disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können. -allow_only_external_registration_popup=Registrierung nur über externe Services aktiveren. openid_signin=OpenID-Anmeldung aktivieren openid_signin_popup=Benutzeranmeldung via OpenID aktivieren. openid_signup=OpenID-Selbstregistrierung aktivieren @@ -463,13 +454,10 @@ then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird. -u2f_desc=Hardware-Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard FIDO U2F unterstützen. -u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung aktivieren, um Hardware-Sicherheitsschlüssel nutzen zu können. u2f_register_key=Sicherheitsschlüssel hinzufügen u2f_nickname=Nickname u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel, um diesen zu registrieren. u2f_delete_key=Sicherheitsschlüssel entfernen -u2f_delete_key_desc=Wenn du den Sicherheitsschlüssel entfernst, kannst du dich nicht mehr mit diesem einloggen. Bist du sicher? manage_account_links=Verknüpfte Accounts verwalten manage_account_links_desc=Diese externen Accounts sind mit deinem Gitea-Account verknüpft. @@ -650,7 +638,6 @@ issues.new.open_milestone=Offene Meilensteine issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständig issues.new.clear_assignees=Zuständige entfernen -issues.new.no_assignees=Niemand zugewiesen issues.no_ref=Keine Branch/Tag angegeben issues.create=Issue erstellen issues.new_label=Neues Label @@ -1167,8 +1154,6 @@ branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht g topic.manage_topics=Themen verwalten topic.done=Fertig -topic.count_prompt=Du kannst nicht mehr als 25 Themen auswählen -topic.format_prompt=Themen müssen mit einem Buchstaben oder einer Zahl beginnen. Sie können Bindestriche (-) enthalten und dürfen nicht länger als 35 Zeichen sein [org] org_name_holder=Name der Organisation @@ -1273,8 +1258,6 @@ dashboard.operation_switch=Wechseln dashboard.operation_run=Ausführen dashboard.clean_unbind_oauth=Nicht verbundene OAuth-Verbindungen löschen dashboard.clean_unbind_oauth_success=Alle unverbundene OAuth-Verbindungen wurden gelöscht. -dashboard.delete_inactivate_accounts=Lösche alle nicht-aktivierten Accounts -dashboard.delete_inactivate_accounts_success=Alle nicht-aktivierten Accounts wurden gelöscht. dashboard.delete_repo_archives=Alle Repository-Archive löschen dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen @@ -1482,7 +1465,6 @@ config.db_path=Verzeichnis config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren config.disable_register=Selbstegistrierung deaktivieren -config.allow_only_external_registration=Registrierung nur über externe Services aktiveren config.enable_openid_signup=OpenID-Selbstregistrierung aktivieren config.enable_openid_signin=OpenID-Anmeldung aktivieren config.show_registration_button=Schaltfläche zum Registrieren anzeigen diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index 65240c87dc86..a69aad09a2e7 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -32,11 +32,6 @@ passcode=Contraseña u2f_insert_key=Inserte su clave de seguridad u2f_use_twofa=Use un código de dos factores de su celular -u2f_error=No podemos leer su llave de seguridad! -u2f_unsupported_browser=Su navegador no soporta llaves U2F. Por favor utilicé otro navegador. -u2f_error_1=Un error desconocido ha ocurrido. Por favor vuelva a intentarlo. -u2f_error_2=Por favor asegúrese de que está utilizando una conexión cifrada (https://) y que esta visitando la dirección URL correcta. -u2f_error_3=El servidor no pudo procesar su petición. u2f_reload=Recargar repository=Repositorio diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 3f8a6c2a9585..098ff005a13a 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -32,16 +32,8 @@ twofa_scratch=Code de secours pour l'authentification à deux facteurs passcode=Code d'accès u2f_insert_key=Insérez votre clef de sécurité -u2f_sign_in=Appuyez sur le bouton de votre clef de sécurité. Si vous ne voyez pas de bouton, ré-insérez là. u2f_press_button=Veuillez appuyer sur le bouton de votre clef de sécurité… u2f_use_twofa=Utilisez l'authentification à deux facteurs avec votre téléphone -u2f_error=Nous ne pouvons pas lire votre clé de sécurité ! -u2f_unsupported_browser=Votre navigateur n'est pas compatible avec les clefs U2F. Veuillez réessayer avec un autre navigateur. -u2f_error_1=Une erreur inconnue s'est produite. Veuillez réessayer. -u2f_error_2=Veuillez vous assurer que vous utilisez une connexion chiffrée (https) et que vous visitez la bonne adresse. -u2f_error_3=Le serveur n'a pas pu répondre à votre requête. -u2f_error_4=Cette clef n'est pas compatible avec votre requête. Si vous êtes en train de l'enregistrer, veuillez vous assurer que cette clef n'est pas déjà enregistrée. -u2f_error_5=Le délai d'attente imparti a été atteint avant que votre clef ne puisse être lue. Veuillez recharger la page pour réessayer. u2f_reload=Recharger repository=Dépôt @@ -129,7 +121,6 @@ federated_avatar_lookup=Activer les avatars unifiés federated_avatar_lookup_popup=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar. disable_registration=Désactiver le formulaire d'inscription disable_registration_popup=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs. -allow_only_external_registration_popup=N'autoriser l'inscription qu'à partir des services externes. openid_signin=Activer l'inscription OpenID openid_signin_popup=Activer l'authentification via OpenID. openid_signup=Activer l'inscription OpenID @@ -462,13 +453,10 @@ then_enter_passcode=Et entrez le mot de passe s'affichant dans l'application : passcode_invalid=Le mot de passe est invalide. Réessayez. twofa_enrolled=L'authentification à deux facteurs a été activée pour votre compte. Gardez votre jeton de secours (%s) en lieu sûr car il ne vous sera montré qu'une seule fois ! -u2f_desc=Les clefs de sécurité sont des dispositifs matériels contenant des clefs cryptographiques. Elles peuvent être utilisées pour l'authentification à deux facteurs. La clef de sécurité doit supporter le standard FIDO U2F. -u2f_require_twofa=L'authentification à deux facteurs doit être activée afin d'utiliser une clef de sécurité. u2f_register_key=Ajouter une clef de sécurité u2f_nickname=Pseudonyme u2f_press_button=Appuyer sur le bouton de votre clef de sécurité pour l'enregistrer. u2f_delete_key=Supprimer une clef de sécurité -u2f_delete_key_desc=Si vous supprimez une clef de sécurité vous ne pourrez plus l'utiliser pour vous connecter. Continuer? manage_account_links=Gérer les comptes liés manage_account_links_desc=Ces comptes externes sont liés à votre compte Gitea. @@ -643,7 +631,6 @@ issues.new.open_milestone=Ouvrir un jalon issues.new.closed_milestone=Jalons fermés issues.new.assignees=Affecté à issues.new.clear_assignees=Supprimer les affectations -issues.new.no_assignees=Aucune affectation issues.no_ref=Aucune branche/tag spécifiés issues.create=Créer un ticket issues.new_label=Nouvelle étiquette @@ -1158,8 +1145,6 @@ branch.protected_deletion_failed=La branche '%s' est protégé. Il ne peut pas topic.manage_topics=Gérer les sujets topic.done=Terminé -topic.count_prompt=Vous ne pouvez pas sélectionner plus de 25 sujets -topic.format_prompt=Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets (-), sans dépasser 35 caractères [org] org_name_holder=Nom de l'organisation @@ -1471,7 +1456,6 @@ config.db_path=Emplacement config.service_config=Configuration du service config.register_email_confirm=Exiger la confirmation de l'e-mail lors de l'inscription config.disable_register=Désactiver le formulaire d'inscription -config.allow_only_external_registration=N'autoriser l'inscription qu'à partir des services externes config.enable_openid_signup=Activer l'inscription avec OpenID config.enable_openid_signin=Activer la connexion avec OpenID config.show_registration_button=Afficher le bouton d'enregistrement diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini index 50aa4c65675c..8d0961b97c33 100644 --- a/options/locale/locale_id-ID.ini +++ b/options/locale/locale_id-ID.ini @@ -32,16 +32,8 @@ twofa_scratch=Kode Awal Dua Faktor passcode=Kode Akses u2f_insert_key=Masukkan kunci keamanan anda -u2f_sign_in=Tekan tombol pada kunci keamanan anda. Jika anda tidak menemukan tombol, masukkan kembali. u2f_press_button=Silahkan tekan tombol pada kunci keamanan anda… u2f_use_twofa=Menggunakan kode dua faktor dari telepon anda -u2f_error=Kami tidak bisa membaca kunci keamanan anda! -u2f_unsupported_browser=Browser anda tidak mendukung kunci U2F. Silakan mencoba browser lain. -u2f_error_1=Terdapat kesalahan yang tidak diketahui. Mohon coba lagi. -u2f_error_2=Pastikan bahwa anda menggunakan koneksi terenkripsi (https://) dan mengunjungi URL yang benar. -u2f_error_3=Server tidak bisa melanjutkan permintaan anda. -u2f_error_4=Kunci tidak layak untuk permintaan ini. Jika Anda mencoba untuk mendaftarkanya, pastikan bahwa kunci sudah tidak terdaftar. -u2f_error_5=Timeout tercapai sebelum kunci anda bisa terbaca. Silahkan muat ulang untuk mencoba kembali. u2f_reload=Muat Ulang repository=Repositori diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 7a89098005d9..980c3770cee4 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -32,16 +32,8 @@ twofa_scratch=Codice di recupero per la verifica in due passaggi passcode=Codice di sicurezza u2f_insert_key=Inserisci la chiave di sicurezza -u2f_sign_in=Premi il pulsante sulla tua chiave di sicurezza. Se non riesci a trovare alcun pulsante, reinseriscilo. u2f_press_button=Si prega di premere il pulsante sulla tua chiave di sicurezza… u2f_use_twofa=Usa un codice di verifica in due passaggi dal tuo telefono -u2f_error=Non riusciamo a leggere la tua chiave di sicurezza! -u2f_unsupported_browser=Il tuo browser non supporta le chiavi U2F. Si prega di provare un altro browser. -u2f_error_1=Si è verificato un errore sconosciuto. Si prega di riprovare. -u2f_error_2=Si prega di assicurarsi che si sta utilizza una connessione crittografata (https://) e visitando l'URL corretto. -u2f_error_3=Il server non ha potuto eseguire la richiesta. -u2f_error_4=La chiave data non è idonea per questa richiesta. Se stai provando a registrarla, assicurati che la chiave non sia già stata registrata. -u2f_error_5=Timeout raggiunto prima che la tua chiave potesse essere letta. Si prega di ricaricare per riprovare. u2f_reload=Ricarica repository=Repository @@ -129,7 +121,6 @@ federated_avatar_lookup=Attiva i Federated Avatar federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. disable_registration=Disattiva Self-Registration disable_registration_popup=Disattiva la user self-registration. Solo gli amministratori saranno in grado di creare account. -allow_only_external_registration_popup=Attiva la registrazione solo tramite servizi esterni. openid_signin=Attiva l'accesso OpenID openid_signin_popup=Attiva registrazione utente via OpenID. openid_signup=Attiva OpenID Self-Registration @@ -462,14 +453,10 @@ then_enter_passcode=E immetti il codice di accesso indicato nell'applicazione: passcode_invalid=Il codice di accesso non è corretto. Riprova. twofa_enrolled=Il tuo account è stato registrato alla verifica in due passaggi. Conserva il token di sicurezza (%s) in un luogo sicuro in quanto viene visualizzato sono una volta! -u2f_desc=Le chiavi di sicurezza sono dispositivi hardware contenenti chiavi crittografiche. Potrebbero essere usate per la verifica in due passaggi. -La chiave di sicurezza deve supportare lo standard FIDO U2F. -u2f_require_twofa=La verifica in due passaggi deve essere attiva per poter utilizzare le chiavi di protezione. u2f_register_key=Aggiungi chiave di sicurezza u2f_nickname=Nickname u2f_press_button=Premi il pulsante sulla tua chiave di sicurezza per registrarla. u2f_delete_key=Rimuovi chiave di sicurezza -u2f_delete_key_desc=Se si rimuove una chiave di sicurezza non sarà più possibile effettuare l'accesso con essa. Sei sicuro? manage_account_links=Gestisci gli account collegati manage_account_links_desc=Questi account esterni sono collegati al tuo account Gitea. @@ -644,7 +631,6 @@ issues.new.open_milestone=Apri Milestone issues.new.closed_milestone=Milestone chiuse issues.new.assignees=Assegnatari issues.new.clear_assignees=Cancella assegnatari -issues.new.no_assignees=Nessuno assegnato issues.no_ref=Nessun Branch/Tag specificato issues.create=Crea Problema issues.new_label=Nuova etichetta @@ -1159,8 +1145,6 @@ branch.protected_deletion_failed=Il branch '%s' è protetto. Non può essere eli topic.manage_topics=Gestisci argomenti topic.done=Fatto -topic.count_prompt=Non puoi selezione più di 25 argomenti -topic.format_prompt=Gli argomenti devono iniziare con una lettera o un numero, possono includere il carattere hiphens(-) e non possono essere più lunghi di 35 caratteri [org] org_name_holder=Nome dell'Organizzazione @@ -1472,7 +1456,6 @@ config.db_path=Percorso config.service_config=Configurazione Servizio config.register_email_confirm=Richiedere la conferma Email per registrarsi config.disable_register=Disattiva Self-Registration -config.allow_only_external_registration=Attiva la registrazione solo tramite servizi esterni config.enable_openid_signup=Attiva OpenID Self-Registration config.enable_openid_signin=Attiva l'accesso tramite OpenID config.show_registration_button=Mostra Pulsane Registrazione diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index 4bb962cb01d0..d835c6478cb0 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -32,16 +32,8 @@ twofa_scratch=Divu faktoru vienreizējais kods passcode=Kods u2f_insert_key=Ievietojiet Jūsu drošības atslēgu -u2f_sign_in=Nospiediet drošības atslēgas pogu. Ja nevarat to atrast, ievietojiet atkārtoti. u2f_press_button=Nospiediet drošības atslēgas pogu… u2f_use_twofa=Izmantot divu faktoru kodu no tālruņa -u2f_error=Nav iespējams nolasīt drošības atslēgu! -u2f_unsupported_browser=Jūsu pārlūks neatbalsta U2F atslēgas. Izmantojiet citu pārlūku. -u2f_error_1=Notikusi nezināma kļūda. Atkārtojiet darbību vēlreiz. -u2f_error_2=Pārliecinieties, ka izmantojat šifrētu savienojumu (https://) un apmeklējat pareizo URL. -u2f_error_3=Serveris nevar apstrādāt Jūsu pieprasījumu. -u2f_error_4=Nav iespējams izmantot atslēgu šim pieprasījumam. Ja mēģināt to reģistrēt, pārliecinieties, ka atslēga jau nav reģistrēta. -u2f_error_5=Iestājusies noildze nolasot atslēgu. Pārlādējiet lapu, lai atkārtotu vēlreiz. u2f_reload=Pārlādēt repository=Repozitorijs @@ -130,7 +122,6 @@ federated_avatar_lookup=Iespējot apvienotās profila bildes federated_avatar_lookup_popup=Iespējot apvienoto profila bilžu meklētāju, lai izmantotu atvērtā koda apvienoto servisu balstītu uz libravatar. disable_registration=Atspējot lietotāju reģistrāciju disable_registration_popup=Atspējot iespēju reģistrēties. Tikai administratori varēs izveidot jaunus kontus. -allow_only_external_registration_popup=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus. openid_signin=Iespējot OpenID autorizāciju openid_signin_popup=Iespējot lietotāju autorizāciju ar OpenID. openid_signup=Iespējot reģistrāciju, izmantojot OpenID @@ -463,13 +454,10 @@ then_enter_passcode=Ievadiet piekļuves kodu no lietojumprogrammas: passcode_invalid=Nederīgs piekļuves kods. Mēģiniet ievadīt atkārtoti. twofa_enrolled=Kontam tagad ir ieslēgta divu faktoru autentifikācija. Saglabājiet savu vienreizējo kodu (%s), jo tas vairāk netiks parādīts! -u2f_desc=Drošības atslēgas ir aparatūras ierīces, kas satur kriptogrāfiskās atslēgas. Tās var tikt izmantotas, lai nodrošinātu divu faktoru autentifikāciju. Drošības atslēgām ir jāatbalsta FIDO U2F standarts. -u2f_require_twofa=Jābūt iespējotai divu faktoru autentifikācija, lai varētu izmantot drošības atslēgas. u2f_register_key=Pievienot drošības atslēgu u2f_nickname=Segvārds u2f_press_button=Nospiediet pogu uz Jūsu drošības atslēgas, lai to reģistrētu. u2f_delete_key=Noņemt drošības atslēgu -u2f_delete_key_desc=Noņemot drošības atslēgu ar to vairs nebūs iespējams autorizēties. Vai turpināt? manage_account_links=Pārvaldīt saistītos kontus manage_account_links_desc=Šādi ārējie konti ir piesaistīti Jūsu Gitea kontam. @@ -646,7 +634,6 @@ issues.new.open_milestone=Atvērtie atskaites punktus issues.new.closed_milestone=Aizvērtie atskaites punkti issues.new.assignees=Atbildīgie issues.new.clear_assignees=Noņemt atbildīgo -issues.new.no_assignees=Nav atbildīgā issues.no_ref=Nav norādīts atzars/tags issues.create=Pieteikt problēmu issues.new_label=Jauna etiķete @@ -1163,8 +1150,6 @@ branch.protected_deletion_failed=Atzars '%s' ir aizsargāts. To nevar izdzēst. topic.manage_topics=Pārvaldīt tēmas topic.done=Gatavs -topic.count_prompt=Nevar pievienot vairāk kā 25 tēmas -topic.format_prompt=Tēmas nosaukumam ir jāsākas ar burtu vai ciparu, tas var saturēt defisi(-), kā arī tas nevar būt garāks par 35 simboliem [org] org_name_holder=Organizācijas nosaukums @@ -1269,8 +1254,6 @@ dashboard.operation_switch=Pārslēgt dashboard.operation_run=Palaist dashboard.clean_unbind_oauth=Notīrīt nepiesaistītos OAuth savienojumus dashboard.clean_unbind_oauth_success=Visi nepiesaistītie OAuth savienojumu tika izdzēsti. -dashboard.delete_inactivate_accounts=Dzēst visus neaktivizētos kontus -dashboard.delete_inactivate_accounts_success=Visi neaktivizētie konti tika izdzēsti. dashboard.delete_repo_archives=Dzēst visu repozitoriju arhīvus dashboard.delete_repo_archives_success=Visu repozitoriju arhīvi tika izdzēsti. dashboard.delete_missing_repos=Dzēst visus repozitorijus, kam trūkst Git failu @@ -1478,7 +1461,6 @@ config.db_path=Ceļš config.service_config=Pakalpojuma konfigurācija config.register_email_confirm=Reģistrējoties pieprasīt apstiprināt e-pasta adresi config.disable_register=Atspējot lietotāju reģistrāciju -config.allow_only_external_registration=Ļaut reģistrēties tikai izmantojot ārējos pakalpojumus config.enable_openid_signup=Iespējot reģistrāciju, izmantojot OpenID config.enable_openid_signin=Iespējot OpenID autorizāciju config.show_registration_button=Rādīt reģistrēšanās pogu diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index 82b323077669..c5898a999d1b 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -32,14 +32,8 @@ twofa_scratch=Eenmalige twee factor authenticatie code passcode=PIN u2f_insert_key=Uw beveiligingssleutel invoegen -u2f_sign_in=Druk op de knop op uw beveiligingssleutel. Als u een knop niet kunt vinden, deze opnieuw invoegen. u2f_press_button=Druk op de knop op uw beveiligingssleutel… u2f_use_twofa=Gebruik een twee-factor code van uw telefoon -u2f_error=Wij kunnen niet uw beveiligingssleutel lezen! -u2f_unsupported_browser=Uw browser geen ondersteund U2F keys. Probeer een andere browser. -u2f_error_1=Er is een onbekende fout opgetreden. Probeer het opnieuw. -u2f_error_2=Zorg voor een versleutelde verbinding (https://) en een bezoek aan de juiste URL. -u2f_error_3=De server kan uw aanvraag niet verhandelen. u2f_reload=Herladen repository=Repository diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 055ba994f6bb..4590c7cf5f31 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -32,16 +32,16 @@ twofa_scratch=Código de backup da autenticação de dois fatores passcode=Senha u2f_insert_key=Insira sua chave de segurança -u2f_sign_in=Pressione o botão na sua chave de segurança. Se você não encontrar um botão, insira-o novamente. +u2f_sign_in=Pressione o botão na sua chave de segurança. Se a sua chave de segurança não tiver um botão, insira-a novamente. u2f_press_button=Por favor, pressione o botão na sua chave de segurança... u2f_use_twofa=Use um código de dois fatores no seu telefone -u2f_error=Não conseguimos ler sua chave de segurança! -u2f_unsupported_browser=Seu navegador não suporta chaves U2F. Por favor, tente outro navegador. +u2f_error=Não foi possível ler sua chave de segurança. +u2f_unsupported_browser=Seu navegador não suporta chaves de segurança U2F. u2f_error_1=Ocorreu um erro desconhecido. Por favor, tente novamente. -u2f_error_2=Por favor, certifique-se de que você está usando uma conexão criptografada (https://) e visite a URL correta. -u2f_error_3=O servidor não pôde prosseguir com sua solicitação. -u2f_error_4=A chave apresentada não é elegível para esta solicitação. Se você tentar registrá-la, certifique-se de que a chave já não é registrada. -u2f_error_5=Tempo limite atingido antes de sua chave poder ser lida. Por favor, recarregue para tentar novamente. +u2f_error_2=Por favor, certifique-se de usar a URL correto, criptografado (https://). +u2f_error_3=O servidor não pôde processar sua solicitação. +u2f_error_4=A chave de segurança não é permitida para esta solicitação. Por favor, certifique-se que a chave já não está registrada. +u2f_error_5=Tempo limite atingido antes de sua chave poder ser lida. Por favor, recarregue esta página e tente novamente. u2f_reload=Recarregar repository=Repositório @@ -130,7 +130,7 @@ federated_avatar_lookup=Habilitar avatares federativos federated_avatar_lookup_popup=Habilitar a busca federativa de avatares a usar o serviço federativo de código aberto baseado no libravatar. disable_registration=Desabilitar auto-cadastro disable_registration_popup=Desabilitar auto-cadastro de usuário. Somente os administradores serão capazes de criar novas contas de usuário. -allow_only_external_registration_popup=Habilitar o cadastro apenas por meio de serviços externos. +allow_only_external_registration_popup=Permitir cadastro somente por meio de serviços externos openid_signin=Habilitar acesso via OpenID openid_signin_popup=Habilitar o acesso de usuários via OpenID. openid_signup=Habilitar o auto-cadastro via OpenID @@ -463,13 +463,13 @@ then_enter_passcode=E insira a senha mostrada no aplicativo: passcode_invalid=Esse código de acesso é inválido. Tente novamente. twofa_enrolled=Sua conta foi inscrita na autenticação de dois fatores. Armazene seu token de backup (%s) em um local seguro, pois ele é exibido apenas uma vez! -u2f_desc=Chaves de segurança são dispositivos de hardware que contém chaves de criptografia. Elas podem ser usadas para autenticação de dois fatores. A chave de segurança deve suportar o padrão FIDO U2F. -u2f_require_twofa=Autenticação de dois fatores deve estar inscrita para usar chaves de segurança. +u2f_desc=Chaves de segurança são dispositivos de hardware contendo chaves criptográficas. Eles podem ser usados para autenticação de dois fatores. As chaves de segurança devem suportar o padrão FIDO U2F. +u2f_require_twofa=Sua conta deve estar inscrita na autenticação de dois fatores para usar as chaves de segurança. u2f_register_key=Adicionar chave de segurança u2f_nickname=Apelido u2f_press_button=Pressione o botão na sua chave de segurança para registrá-la. u2f_delete_key=Remover chave de segurança -u2f_delete_key_desc=Se você remover uma chave de segurança você não poderá mais acessar com ela. Tem certeza? +u2f_delete_key_desc=Se você remover uma chave de segurança, não poderá mais entrar com ela. Continuar? manage_account_links=Gerenciar contas vinculadas manage_account_links_desc=Estas contas externas estão vinculadas a sua conta de Gitea. @@ -650,7 +650,7 @@ issues.new.open_milestone=Marcos abertos issues.new.closed_milestone=Marcos fechados issues.new.assignees=Responsáveis issues.new.clear_assignees=Limpar responsáveis -issues.new.no_assignees=Nenhum responsável +issues.new.no_assignees=Sem responsável issues.no_ref=Nenhum branch/tag especificado issues.create=Criar issue issues.new_label=Nova etiqueta @@ -781,34 +781,33 @@ issues.due_date_added=adicionou a data limite %s %s issues.due_date_modified=modificou a data limite para %s ao invés de %s %s issues.due_date_remove=removeu a data limite %s %s issues.due_date_overdue=Em atraso -issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. Por favor, use o formato dd/mm/aaaa. +issues.due_date_invalid=A data limite é inválida ou está fora do intervalo. Por favor, use o formato 'dd/mm/aaaa'. issues.dependency.title=Dependências issues.dependency.issue_no_dependencies=Esta issue atualmente não tem dependências. issues.dependency.pr_no_dependencies=Este pull request atualmente não tem dependências. issues.dependency.add=Adicione... issues.dependency.cancel=Cancelar issues.dependency.remove=Remover -issues.dependency.issue_number=Número da issue issues.dependency.added_dependency=`%[2]s adicionou uma nova dependência %[3]s` issues.dependency.removed_dependency=`%[2]s removeu uma dependência %[3]s` issues.dependency.issue_closing_blockedby=Fechamento deste pull request está bloqueado pelas seguintes issues issues.dependency.pr_closing_blockedby=Fechamento desta issue está bloqueado pelas seguintes issues issues.dependency.issue_close_blocks=Esta issue bloqueia o fechamento das seguintes issues issues.dependency.pr_close_blocks=Este pull request bloqueia o fechamento das seguintes issues -issues.dependency.issue_close_blocked=Você precisa fechar todas as issues que bloqueiam esta issue antes de poder fechá-la! -issues.dependency.pr_close_blocked=Você precisa fechar todas issues que bloqueiam este pull request antes de poder fazer o merge! +issues.dependency.issue_close_blocked=Você precisa fechar todas as issues que bloqueiam esta issue antes de poder fechá-la. +issues.dependency.pr_close_blocked=Você precisa fechar todas issues que bloqueiam este pull request antes de poder fazer o merge. issues.dependency.blocks_short=Bloqueia issues.dependency.blocked_by_short=Depende de issues.dependency.remove_header=Remover dependência -issues.dependency.issue_remove_text=Isto irá remover a dependência desta issue. Tem certeza? Você não pode desfazer isso! -issues.dependency.pr_remove_text=Isto irá remover a dependência deste pull request. Tem certeza? Você não pode desfazer isso! -issues.dependency.setting=Issues & PRs podem ter dependências -issues.dependency.add_error_same_issue=Você não pode fazer uma issue depender dela mesma! -issues.dependency.add_error_dep_issue_not_exist=Issue dependente não existe! -issues.dependency.add_error_dep_not_exist=Dependência não existe! -issues.dependency.add_error_dep_exists=Dependência já existe! -issues.dependency.add_error_cannot_create_circular=Você não pode criar uma dependência entre duas issues bloqueando uma a outra! -issues.dependency.add_error_dep_not_same_repo=Ambas as issues devem estar no mesmo repositório! +issues.dependency.issue_remove_text=Isto removerá a dependência desta issue. Continuar? +issues.dependency.pr_remove_text=Isto removerá a dependência deste pull request. Continuar? +issues.dependency.setting=Habilitar dependências para issues e pull requests +issues.dependency.add_error_same_issue=Você não pode fazer uma issue depender de si mesma. +issues.dependency.add_error_dep_issue_not_exist=Issue dependente não existe. +issues.dependency.add_error_dep_not_exist=Dependência não existe. +issues.dependency.add_error_dep_exists=Dependência já existe. +issues.dependency.add_error_cannot_create_circular=Você não pode criar uma dependência com duas issues bloqueando uma a outra. +issues.dependency.add_error_dep_not_same_repo=Ambas as issues devem estar no mesmo repositório. pulls.desc=Habilitar solicitações de merge e revisões de código. pulls.new=Novo pull request @@ -1197,7 +1196,7 @@ branch.protected_deletion_failed=A branch '%s' está protegida. Ela não pode se topic.manage_topics=Gerenciar Tópicos topic.done=Feito topic.count_prompt=Você não pode selecionar mais de 25 tópicos -topic.format_prompt=Tópicos devem começar com uma letra ou um número, podem incluir hífens (-) e não devem ter mais de 35 caracteres +topic.format_prompt=Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres. [org] org_name_holder=Nome da organização @@ -1511,7 +1510,7 @@ config.db_path=Caminho config.service_config=Configuração do serviço config.register_email_confirm=Exigir confirmação de e-mail para se cadastrar config.disable_register=Desabilitar auto-cadastro -config.allow_only_external_registration=Habilitar o cadastro apenas por meio de serviços externos +config.allow_only_external_registration=Permitir cadastro somente por meio de serviços externos config.enable_openid_signup=Habilitar o auto-cadastro via OpenID config.enable_openid_signin=Habilitar acesso via OpenID config.show_registration_button=Mostrar botão de cadastro diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 73a929759e3c..5b932f327f14 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -32,16 +32,8 @@ twofa_scratch=Двухфакторный scratch-код passcode=Пароль u2f_insert_key=Вставьте ключ безопасности -u2f_sign_in=Нажмите кнопку на ключе безопасности. Если вы не можете найти кнопку, вставьте его снова. u2f_press_button=Пожалуйста нажмите кнопку на вашем ключе безопасности… u2f_use_twofa=Используйте двухфакторный код с телефона -u2f_error=Мы не можем прочитать ваш ключ безопасности! -u2f_unsupported_browser=Ваш браузер не поддерживает U2F ключи. Попробуйте другой браузер. -u2f_error_1=Произошла неизвестная ошибка. Повторите попытку. -u2f_error_2=Пожалуйста, убедитесь, что вы используете зашифрованное соединение (https://) и используете правильный URL. -u2f_error_3=Серверу не удалось обработать ваш запрос. -u2f_error_4=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ еще не зарегистрирован. -u2f_error_5=Таймаут достигнут до того, как ваш ключ был прочитан. Перезагрузите, чтобы повторить попытку. u2f_reload=Обновить repository=Репозиторий @@ -130,7 +122,6 @@ federated_avatar_lookup=Включить федеративные аватары federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. disable_registration=Отключить самостоятельную регистрацию disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. -allow_only_external_registration_popup=Включить регистрацию только через сторонние сервисы. openid_signin=Включение входа через OpenID openid_signin_popup=Включение входа через OpenID. openid_signup=Включить саморегистрацию OpenID @@ -463,13 +454,10 @@ then_enter_passcode=И введите пароль, показанный в пр passcode_invalid=Неверный пароль. попробуйте снова. twofa_enrolled=Для вашего аккаунта была включена двухфакторная аутентификация. Сохраните ваш scratch-токен (%s), он не сохраняется на сервере! -u2f_desc=Ключами безопасности являются аппаратные устройства, содержащие криптографические ключи. Они могут использоваться для двухфакторной аутентификации. Ключ безопасности должен поддерживать стандарт FIDO U2F. -u2f_require_twofa=Для использования ключей безопасности необходимо включить двухфакторную аутентификацию. u2f_register_key=Добавить ключ безопасности u2f_nickname=Имя пользователя u2f_press_button=Нажмите кнопку на ключе безопасности, чтобы зарегистрировать его. u2f_delete_key=Удалить ключ безопасности -u2f_delete_key_desc=Если вы удалите ключ безопасности, вы не сможете использовать его для входа. Вы уверены? manage_account_links=Управление привязанными аккаунтами manage_account_links_desc=Эти внешние аккаунты привязаны к вашему аккаунту Gitea. @@ -650,7 +638,6 @@ issues.new.open_milestone=Открыть этап issues.new.closed_milestone=Завершенные этапы issues.new.assignees=Назначенные issues.new.clear_assignees=Убрать ответственных -issues.new.no_assignees=Никто не назначен issues.no_ref=Не указана ветка или тэг issues.create=Добавить задачу issues.new_label=Новая метка @@ -1168,8 +1155,6 @@ branch.protected_deletion_failed=Ветка '%s' защищена. Её нель topic.manage_topics=Редактировать тематические метки topic.done=Сохранить -topic.count_prompt=Вы не можете выбрать более 25 тем -topic.format_prompt=Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов [org] org_name_holder=Название организации @@ -1274,8 +1259,6 @@ dashboard.operation_switch=Переключить dashboard.operation_run=Запуск dashboard.clean_unbind_oauth=Очистить список незавершённых авторизаций OAuth dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены. -dashboard.delete_inactivate_accounts=Удалить все неактивированные учетные записи -dashboard.delete_inactivate_accounts_success=Все не активированные учетные записи были удалены. dashboard.delete_repo_archives=Удаление всех архивов репозиториев dashboard.delete_repo_archives_success=Все архивы репозиториев удалены. dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git @@ -1483,7 +1466,6 @@ config.db_path=Путь config.service_config=Сервисная конфигурация config.register_email_confirm=Требуется подтверждение по электронной почте config.disable_register=Отключить самостоятельную регистрацию -config.allow_only_external_registration=Включить регистрацию только через сторонние сервисы config.enable_openid_signup=Включить cамостоятельную регистрацию OpenID config.enable_openid_signin=Включение входа через OpenID config.show_registration_button=Показать кнопку регистрации diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index b6b0d2e91704..7146f0219d38 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -32,16 +32,8 @@ twofa_scratch=Tvåfaktorsskrapkod passcode=Kod u2f_insert_key=Sätt i din säkerhetsnyckel -u2f_sign_in=Tryck på knappen på din säkerhetsnyckel. Om du inte kan hitta en knapp, dra ur och sätt i nyckeln igen. u2f_press_button=Vänligen tryck på knappen på din säkerhetsnyckel… u2f_use_twofa=Använd en tvåfaktorskod från din telefon -u2f_error=Vi kan inte läsa din säkerhetsnyckel! -u2f_unsupported_browser=Din webbläsare stödjer inte U2F-nycklar. Vänligen prova en annan webbläsare. -u2f_error_1=Ett okänt fel uppstod. Vänligen försök igen. -u2f_error_2=Kontrollera att du använder en krypterad anslutning (https://) och besöker korrekt länk. -u2f_error_3=Servern kunde inte hantera din förfrågan. -u2f_error_4=Den givna nyckeln är inte behörig för denna förfrågan. Om du försöker registrera den, se till att den inte redan är registrerad. -u2f_error_5=Timeout uppnådd innan nyckeln kunde bli läst. Vänligen ladda om sidan och för att försök igen. u2f_reload=Ladda om repository=Utvecklingskatalog @@ -129,7 +121,6 @@ disable_gravatar_popup=Inaktivera Gravatar- och avatarskällor från tredjepart. federated_avatar_lookup_popup=Använd libravatar vid förenad uppslagning av avatarer. disable_registration=Inaktivera Självregistrering disable_registration_popup=Inaktivera självregistrering av användare. Endast administratörer kommer kunna skapa nya konton. -allow_only_external_registration_popup=Aktivera registrering enbart via externa tjänster. openid_signin=Aktivera OpenID-inloggning openid_signin_popup=Aktivera användarinloggning via OpenID. openid_signup=Aktivera självregistrering genom OpenID @@ -462,13 +453,10 @@ then_enter_passcode=Och ange den lösenkod som visas i programmet: passcode_invalid=Koden är ogiltig. Försök igen. twofa_enrolled=Tvåfaktorsautentisering har aktiverats för ditt konto. Förvara din skrapkod (%s) på en säker plats eftersom den bara visas en gång! -u2f_desc=Säkerhetsnycklar är maskinvaruenheter som innehåller kryptografiska nycklar. De kan användas för tvåfaktorautentisering. Säkerhetsnyckeln måste dock stödja FIDO U2F standarden. -u2f_require_twofa=Tvåfaktorautentisering måste aktiveras för att kunna använda säkerhetsnycklar. u2f_register_key=Lägg till säkerhetsnyckel u2f_nickname=Smeknamn u2f_press_button=Tryck på knappen på din säkerhetsnyckel för att registrera den. u2f_delete_key=Ta Bort Säkerhetsnyckel -u2f_delete_key_desc=Om du tar bort en säkerhetsnyckel kommer du inte kunna logga in med den längre. Är du säker? manage_account_links=Hantera Länkade Konton manage_account_links_desc=Dessa externa konton är länkade till ditt Gitea-konto. @@ -646,7 +634,6 @@ issues.new.open_milestone=Öppna Milstenar issues.new.closed_milestone=Stängda Milstenar issues.new.assignees=Tilldelade issues.new.clear_assignees=Rensa tilldelade -issues.new.no_assignees=Ingen tilldelad issues.no_ref=Ingen branch/Tag specificerad issues.create=Skapa Ärende issues.new_label=Ny etikett @@ -1127,8 +1114,6 @@ branch.protected_deletion_failed=Branch '%s' är skyddad. Den kan inte bli bortt topic.manage_topics=Hantera ämnen topic.done=Klar -topic.count_prompt=Du kan inte markera mer än 25 ämnen -topic.format_prompt=Ämnen måste starta med en bokstav eller nummer, kan inkludera bindestreck(-) och får inte vara längre än 35 tecken långt [org] org_name_holder=Organisationsnamn @@ -1229,8 +1214,6 @@ dashboard.operation_switch=Byt till dashboard.operation_run=Kör dashboard.clean_unbind_oauth=Rena obundna OAuth anslutningar dashboard.clean_unbind_oauth_success=Alla obundna OAuth anslutningar har raderats. -dashboard.delete_inactivate_accounts=Ta bort alla inaktiva konton -dashboard.delete_inactivate_accounts_success=Alla inaktiva konton har tagits bort. dashboard.delete_repo_archives=Ta bort alla utvecklingskatalogers arkiv dashboard.delete_missing_repos=Ta bort alla utvecklingskataloger som saknar filer specifika för Git dashboard.delete_missing_repos_success=Alla utvecklingskataloger som saknade sina Git-filer har tagits bort. @@ -1417,7 +1400,6 @@ config.db_path=Sökväg config.service_config=Tjänstkonfiguration config.register_email_confirm=Kräv mejlbekräftelse för att registrera config.disable_register=Inaktivera självregistrering -config.allow_only_external_registration=Aktivera registrering enbart genom externa tjänster config.enable_openid_signup=Aktivera självregistrering genom OpenID config.enable_openid_signin=Aktivera OpenID-inloggning config.show_registration_button=Visa registreringsknapp diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 8efcc4c15402..e32a4ecb1b1b 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -32,16 +32,8 @@ twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу u2f_insert_key=Вставте ключ безпеки -u2f_sign_in=Натисніть кнопку на ключі безпеки. Якщо не вдається знайти кнопки, повторно вставте ключ. u2f_press_button=Будь ласка, натисніть кнопку на ключі захисту... u2f_use_twofa=Використовуйте дво-факторний код з вашого телефону -u2f_error=Неможливо прочитати ваш ключ безпеки! -u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі. Будь ласка, спробуйте інший браузер. -u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. -u2f_error_2=Переконайтеся, що ви використовуєте зашифроване з'єднання (https://) та відвідуєте правильну URL-адресу. -u2f_error_3=Сервер не може обробити, ваш запит. -u2f_error_4=Представлений ключ не дає право на цей запит. Якщо спробуєте зареєструвати його, переконайтеся, що ключ ще не зареєстровано. -u2f_error_5=Таймаут досягнуто до того, як ваш ключ можна буде прочитати. Перезавантажте, щоб повторити спробу. u2f_reload=Оновити repository=Репозиторій @@ -130,7 +122,6 @@ federated_avatar_lookup=Увімкнути федеративні аватари federated_avatar_lookup_popup=Увімкнути зовнішний Аватар за допомогою Libravatar. disable_registration=Вимкнути самостійну реєстрацію disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи. -allow_only_external_registration_popup=Включити реєстрацію тільки через зовнішні сервіси. openid_signin=Увімкнути реєстрацію за допомогою OpenID openid_signin_popup=Увімкнути вхід за допомогою OpenID. openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID @@ -463,13 +454,10 @@ then_enter_passcode=І введіть пароль, який відобража passcode_invalid=Некоректний пароль. Спробуй ще раз. twofa_enrolled=Для вашого облікового запису було включена двофакторна автентифікація. Зберігайте свій scratch-токен (%s) у безпечному місці, оскільки він показується лише один раз! -u2f_desc=Ключами безпеки є апаратні пристрої, що містять криптографічні ключі. Вони можуть використовуватися для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. -u2f_require_twofa=Для використання ключів безпеки необхідно зареєструвати двофакторну аутентифікацію. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім u2f_press_button=Натисніть кнопку на ключі безпеки, щоб зареєструвати його. u2f_delete_key=Видалити ключ безпеки -u2f_delete_key_desc=Якщо ви видалите ключ безпеки, ви не зможете використати його для входу. Ти впевнені? manage_account_links=Керування обліковими записами manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. @@ -650,7 +638,6 @@ issues.new.open_milestone=Активні етапи issues.new.closed_milestone=Закриті етапи issues.new.assignees=Виконавеці issues.new.clear_assignees=Прибрати виконавеців -issues.new.no_assignees=Ніхто не призначений issues.no_ref=Не вказана гілка або тег issues.create=Створити проблему issues.new_label=Нова мітка @@ -781,14 +768,11 @@ issues.due_date_added=додав(ла) дату завершення %s %s issues.due_date_modified=термін змінено з %s %s на %s issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено -issues.due_date_invalid=Термін дії не дійсний або не відповідає дійсності. Будь ласка, використовуйте формат yyyy-mm-dd. issues.dependency.title=Залежності issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей. issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей. -issues.dependency.add=Додати нову залежність... issues.dependency.cancel=Відмінити issues.dependency.remove=Видалити -issues.dependency.issue_number=Номер проблеми issues.dependency.added_dependency=
0%
[2]s додано нову залежність %[3]s' issues.dependency.removed_dependency=
0%
[2]s видалено залежність %[3]s' issues.dependency.blocks_short=Блоки @@ -1179,8 +1163,6 @@ branch.protected_deletion_failed=Гілка '%s' захищена. Її не м topic.manage_topics=Керувати тематичними мітками topic.done=Готово -topic.count_prompt=Ви не можете вибрати більше 25 тем -topic.format_prompt=Теми мають починатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів [org] org_name_holder=Назва організації @@ -1285,8 +1267,6 @@ dashboard.operation_switch=Перемкнути dashboard.operation_run=Запустити dashboard.clean_unbind_oauth=Очистити список незавершених авторизацій OAuth dashboard.clean_unbind_oauth_success=Всі незавершені зв'язки OAuth були видалені. -dashboard.delete_inactivate_accounts=Видалити всі неактивовані облікові записи -dashboard.delete_inactivate_accounts_success=Усі неактивовані облікові записи успішно видалено. dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв dashboard.delete_repo_archives_success=Всі архіви репозиторіїв були видалені. dashboard.delete_missing_repos=Видалити всі записи про репозиторії з відсутніми файлами Git @@ -1494,7 +1474,6 @@ config.db_path=Шлях config.service_config=Конфігурація сервісу config.register_email_confirm=Потрібно підтвердити електронну пошту для реєстрації config.disable_register=Вимкнути самостійну реєстрацію -config.allow_only_external_registration=Включити реєстрацію тільки через сторонні сервіси config.enable_openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID config.enable_openid_signin=Увімкнути реєстрацію за допомогою OpenID config.show_registration_button=Показувати кнопку "Реєстрація diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index 53a4a0426628..1c956558025e 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -32,16 +32,8 @@ twofa_scratch=两步验证口令 passcode=验证码 u2f_insert_key=插入安全密钥 -u2f_sign_in=按下安全密钥上的按钮。如果找不到按钮, 请重新插入。 u2f_press_button=请按下安全密钥上的按钮。 u2f_use_twofa=使用来自你手机中的两步验证码 -u2f_error=没有找到你的安全密钥! -u2f_unsupported_browser=您的浏览器不支持 U2F 密钥。请尝试其他浏览器。 -u2f_error_1=发生未知错误。请重试。 -u2f_error_2=请确保您使用的是加密连接 (https://) 并访问正确的 URL。 -u2f_error_3=服务器无法执行您的请求。 -u2f_error_4=所提交的密钥不符合此请求。如果您尝试注册它, 请确保该密钥尚未注册。 -u2f_error_5=在读取到密钥之前超时。请重新加载以重试。 u2f_reload=重新加载 repository=仓库 @@ -130,7 +122,6 @@ federated_avatar_lookup=启用 Federated 头像 federated_avatar_lookup_popup=启用 Federated Avatars 查找以使用开源的 Libravatar 服务。 disable_registration=禁止用户自助注册 disable_registration_popup=禁用用户自助注册。只有管理员才能创建新的用户帐户。 -allow_only_external_registration_popup=仅允许通过外部服务注册。 openid_signin=启用 OpenID 登录 openid_signin_popup=启用通过 OpenID 登录 openid_signup=启用 OpenID 自助注册 @@ -463,13 +454,10 @@ then_enter_passcode=并输入应用程序中显示的密码: passcode_invalid=密码不正确。再试一次。 twofa_enrolled=你的账号已经启用了两步验证。请保存初始令牌(%s)到一个安全的地方,此令牌仅当前显示一次。 -u2f_desc=安全密钥是包含加密算法的硬件设备。它们可以用于两步验证。安全密钥必须支持 FIDO U2F 标准。 -u2f_require_twofa=必须开启两步验证才能使用安全密钥。 u2f_register_key=添加安全密钥 u2f_nickname=昵称 u2f_press_button=按安全密钥上的按钮进行注册。 u2f_delete_key=移除安全密钥 -u2f_delete_key_desc=如果移除安全密钥, 则无法再使用它登录。是否确定? manage_account_links=管理绑定过的账号 manage_account_links_desc=这些外部帐户已经绑定到您的 Gitea 帐户。 @@ -650,7 +638,6 @@ issues.new.open_milestone=开启中的里程碑 issues.new.closed_milestone=已关闭的里程碑 issues.new.assignees=指派成员 issues.new.clear_assignees=取消指派成员 -issues.new.no_assignees=未指派成员 issues.no_ref=分支/标记未指定 issues.create=创建工单 issues.new_label=创建标签 @@ -1167,8 +1154,6 @@ branch.protected_deletion_failed=分支 '%s' 已被保护,不可删除。 topic.manage_topics=管理主题 topic.done=保存 -topic.count_prompt=您最多选择25个主题 -topic.format_prompt=主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符 [org] org_name_holder=组织名称 @@ -1273,8 +1258,6 @@ dashboard.operation_switch=开关 dashboard.operation_run=执行 dashboard.clean_unbind_oauth=清理未绑定的 OAuth 连接 dashboard.clean_unbind_oauth_success=所有未绑定的 OAuth 连接已被删除。 -dashboard.delete_inactivate_accounts=删除所有未激活的帐户 -dashboard.delete_inactivate_accounts_success=所有未激活的帐户都已删除。 dashboard.delete_repo_archives=删除所有仓库存档 dashboard.delete_repo_archives_success=所有仓库存档清除成功! dashboard.delete_missing_repos=删除所有丢失 Git 文件的仓库 @@ -1482,7 +1465,6 @@ config.db_path=数据库路径 config.service_config=服务配置 config.register_email_confirm=需要电子邮件确认注册 config.disable_register=禁止用户注册 -config.allow_only_external_registration=仅允许通过外部服务注册 config.enable_openid_signup=启用 OpenID 自注册 config.enable_openid_signin=启用 OpenID 登录 config.show_registration_button=显示注册按钮 diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index 7c0242f707dc..f26a4a6c87b5 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -32,16 +32,8 @@ twofa_scratch=兩步驟驗證備用碼 passcode=驗證碼 u2f_insert_key=插入安全金鑰 -u2f_sign_in=按下安全金鑰上的按鈕。如果找不到按鈕, 請重新插入。 u2f_press_button=請按下安全金鑰上的按鈕… u2f_use_twofa=使用來自手機的兩步驟驗證碼 -u2f_error=找不到您的安全金鑰! -u2f_unsupported_browser=您的瀏覽器不支援 U2F 二步驟驗證技術。請嘗試其他瀏覽器。 -u2f_error_1=發生未知的錯誤,請重試。 -u2f_error_2=請確保您使用的是加密連接 (https://) 並且 URL 是正確的。 -u2f_error_3=伺服器無法執行您的請求。 -u2f_error_4=所提交的金鑰不符合此請求。如果您嘗試註冊它, 請確保該金鑰尚未註冊。 -u2f_error_5=在讀取金鑰之前已逾時,請重新載入以重試。 u2f_reload=重新載入 repository=儲存庫 @@ -129,7 +121,6 @@ federated_avatar_lookup=開啟聯合大頭貼 federated_avatar_lookup_popup=開啟聯合頭像查詢並使用基於開放源碼的 libravatar 服務 disable_registration=關閉註冊功能 disable_registration_popup=關閉註冊功能,只有管理員可以新增帳號。 -allow_only_external_registration_popup=僅允許通過外部服務註冊。 openid_signin=啟用 OpenID 登入 openid_signin_popup=啟用 OpenID 登入 openid_signup=啟用 OpenID 註冊 @@ -432,13 +423,10 @@ or_enter_secret=或者輸入密碼: %s then_enter_passcode=然後輸入應用程序中顯示的驗證碼: passcode_invalid=無效的驗證碼,請重試。 -u2f_desc=安全密鑰是包含加密密鑰的硬體設備。 它們可以用於兩步驟認證。 安全密鑰必須符合 FIDO U2F 標準。 -u2f_require_twofa=必須先開啟兩步驟驗證才能使用安全密鑰。 u2f_register_key=新增安全密鑰 u2f_nickname=暱稱 u2f_press_button=按下安全密鑰上的密碼進行註冊。 u2f_delete_key=移除安全密鑰 -u2f_delete_key_desc=如果您移除安全密鑰,則無法再使用它登錄。 確定嗎? manage_account_links=管理已連結的帳號 manage_account_links_desc=這些外部帳號與您的 Gitea 帳號相關聯。 @@ -591,7 +579,6 @@ issues.new.open_milestone=開啟中的里程碑 issues.new.closed_milestone=已關閉的里程碑 issues.new.assignees=指派成員 issues.new.clear_assignees=取消指派成員 -issues.new.no_assignees=未指派成員 issues.no_ref=未指定分支或標籤 issues.create=建立問題 issues.new_label=建立標籤 @@ -1260,7 +1247,6 @@ config.db_path=資料庫路徑 config.service_config=服務設定 config.register_email_confirm=要求註冊時確認電子郵件 config.disable_register=關閉註冊功能 -config.allow_only_external_registration=僅允許通過外部服務註冊 config.enable_openid_signup=啟用 OpenID 註冊 config.enable_openid_signin=啟用 OpenID 登入 config.show_registration_button=顯示註冊按鈕 From d1412e44de86849a6e8a5d2d85d98ed0f0d06bde Mon Sep 17 00:00:00 2001 From: Kjell Kvinge Date: Sat, 21 Jul 2018 20:17:10 +0200 Subject: [PATCH 132/447] Accept 'Data:' in commit graph (#4487) --- models/graph.go | 2 +- models/graph_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/models/graph.go b/models/graph.go index cfd583ca8b93..8ecea9c09334 100644 --- a/models/graph.go +++ b/models/graph.go @@ -66,7 +66,7 @@ func graphItemFromString(s string, r *git.Repository) (GraphItem, error) { var ascii string var data = "|||||||" - lines := strings.Split(s, "DATA:") + lines := strings.SplitN(s, "DATA:", 2) switch len(lines) { case 1: diff --git a/models/graph_test.go b/models/graph_test.go index 47c9dbb084dd..0f6e33879296 100644 --- a/models/graph_test.go +++ b/models/graph_test.go @@ -5,6 +5,7 @@ package models import ( + "fmt" "testing" "code.gitea.io/git" @@ -43,3 +44,32 @@ func BenchmarkParseCommitString(b *testing.B) { } } } + +func TestCommitStringParsing(t *testing.T) { + dataFirstPart := "* DATA:||4e61bacab44e9b4730e44a6615d04098dd3a8eaf|2016-12-20 21:10:41 +0100|Author|user@mail.something|4e61bac|" + tests := []struct { + shouldPass bool + testName string + commitMessage string + }{ + {true, "normal", "not a fancy message"}, + {true, "extra pipe", "An extra pipe: |"}, + {true, "extra 'Data:'", "DATA: might be trouble"}, + } + + for _, test := range tests { + + t.Run(test.testName, func(t *testing.T) { + testString := fmt.Sprintf("%s%s", dataFirstPart, test.commitMessage) + graphItem, err := graphItemFromString(testString, nil) + if err != nil && test.shouldPass { + t.Errorf("Could not parse %s", testString) + return + } + + if test.commitMessage != graphItem.Subject { + t.Errorf("%s does not match %s", test.commitMessage, graphItem.Subject) + } + }) + } +} From c34d37660c483bcf5d461bf58704c5197cb72e5f Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sat, 21 Jul 2018 18:18:18 +0000 Subject: [PATCH 133/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_es-ES.ini | 2 +- options/locale/locale_nl-NL.ini | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index a69aad09a2e7..cc2c17dce65e 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -27,7 +27,7 @@ email=Correo electrónico password=Contraseña re_type=Vuelva a escribir la contraseña captcha=CAPTCHA -twofa=Autenticación de dos factores +twofa=Autenticación en dos pasos passcode=Contraseña u2f_insert_key=Inserte su clave de seguridad diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini index c5898a999d1b..404ce41acb95 100644 --- a/options/locale/locale_nl-NL.ini +++ b/options/locale/locale_nl-NL.ini @@ -32,8 +32,16 @@ twofa_scratch=Eenmalige twee factor authenticatie code passcode=PIN u2f_insert_key=Uw beveiligingssleutel invoegen +u2f_sign_in=Druk op de knop op uw beveiligingssleutel. Als u geen knop kunt vinden, voeg deze opnieuw in. u2f_press_button=Druk op de knop op uw beveiligingssleutel… u2f_use_twofa=Gebruik een twee-factor code van uw telefoon +u2f_error=Wij kunnen uw beveiligingssleutel niet lezen. +u2f_unsupported_browser=Uw browser ondersteunt geen U2F beveiligingssleutels. +u2f_error_1=Er is een onbekende fout opgetreden. Probeer het opnieuw. +u2f_error_2=Zorg ervoor dat u de juiste URL (https://) gebruikt. +u2f_error_3=De server kan uw aanvraag niet verwerken. +u2f_error_4=De beveiligingssleutel is niet toegestaan voor dit verzoek. Gelieve ervoor te zorgen dat de sleutel niet al is geregistreerd. +u2f_error_5=Timeout bereikt voordat uw sleutel kon worden gelezen. Gelieve deze pagina opnieuw laden en probeer opnieuw. u2f_reload=Herladen repository=Repository @@ -45,9 +53,11 @@ new_mirror=Nieuwe kopie new_fork=Nieuwe Repository Fork new_org=Nieuwe organisatie manage_org=Beheer organisaties +admin_panel=Website Administratie account_settings=Accountinstellingen settings=Instellingen your_profile=Profiel +your_starred=Favoriet your_settings=Instellingen all=Alles @@ -65,6 +75,7 @@ cancel=Annuleren [install] install=Installatie title=Initiële configuratie +docker_helper=Als je gitea draait in Docker, Lees eerst de documentatie voordat je een instelling aanpast. requite_db_desc=Gitea vereist MySQL, PostgreSQL, MSSQL, SQLite3 of TiDB. db_title=Database-instellingen db_type=Database-type @@ -72,25 +83,53 @@ host=Server user=Gebruikersnaam password=Wachtwoord db_name=Database naam +db_helper=Opmerking voor MySQL-gebruikers: gebruik het InnoDB opslagsysteem en de "utf8_general_ci" tekenset. ssl_mode=SSL path=Pad +sqlite_helper=Bestandspad voor de SQLite3 of TiDB database.
Vul een volledig pad in als je Gitea als een service runt. err_empty_db_path=Het SQLite3 of TiDB database pad mag niet leeg zijn. +err_invalid_tidb_name=De naam van de database van de TiDB mag geen '.' en '-' tekens bevatten. +no_admin_and_disable_registration=U kunt zelf-registratie van de gebruiker niet uitschakelen zonder het maken van een administrator-account. err_empty_admin_password=Het administrator-wachtwoord mag niet leeg zijn. general_title=Algemene Instellingen app_name=Naam site +app_name_helper=U kan de naam van uw bedrijf hier invullen. repo_path=Repositories basis map +repo_path_helper=Externe git repositories worden opgeslagen in deze map. lfs_path=Git LFS root pad +lfs_path_helper=Bestanden bijgehouden door Git LFS zullenworden opgeslagen in deze map. Laat leeg om uit te schakelen. +run_user=Uitvoeren als gebruiker +run_user_helper=Geef de gebruikersnaam van het besturingssysteem waarop Gitea wordt uitgevoerd. Realiseer u dat deze gebruiker toegang tot het pad van de hoofdmap moet hebben. +domain=SSH server-domein +domain_helper=Domein of ip-adres voor SSH kloon URLs. +ssh_port=SSH server-poort +ssh_port_helper=Nummer van de poort die uw SSH-server gebruikt. Laat dit veld leeg om de SSH functie uit te schakelen. +http_port=Gitea HTTP-poort +http_port_helper=De poort waar de web server van Gitea naar gaat luisteren. app_url=Gitea base URL +app_url_helper=Basisadres voor HTTP(S) kloon URL's en e-mailmeldingen. log_root_path=Log-pad +log_root_path_helper=Logboekbestanden worden geschreven naar deze map. optional_title=Optionele instellingen email_title=E-mail instellingen smtp_host=SMTP host smtp_from=E-mails versturen als +smtp_from_helper=E-mailadres dat Gitea gaat gebruiken. Voer een gewoon e-mailadres in of gebruik de "Naam" -indeling. mailer_user=SMTP gebruikersnaam mailer_password=SMTP wachtwoord +register_confirm=E-mailbevestiging vereist bij registreren +mail_notify=Activeer e-mailnotificaties +server_service_title=Server en Third-Party Service-instellingen +offline_mode=Lokale modus inschakelen +offline_mode_popup=Schakel third-party content uit en gebruik alleen lokale middelen. +disable_gravatar=Gravatar uitschakelen +disable_gravatar_popup=Gravatar en derden avatar bronnen uitschakelen. Een standaard avatar zal worden gebruikt, tenzij een gebruiker een lokale avatar uploadt. +federated_avatar_lookup=Federated Avatars toestaan federated_avatar_lookup_popup=Enable federated avatars lookup to use federated open source service based on libravatar. +disable_registration=Schakel zelf registratie uit +disable_registration_popup=Schakel zelfregistratie uit, alleen admins kunnen accounts maken. openid_signin=OpenID-inloggen inschakelen enable_captcha_popup=Vereis captcha validatie voor zelf-registratie van gebruiker. admin_name=Admin gebruikersnaam @@ -99,8 +138,10 @@ confirm_password=Verifieer wachtwoord admin_email=E-mail adres install_btn_confirm=Installeer Gitea test_git_failed=Git test niet gelukt: 'git' commando %v +invalid_db_setting=De database instelling zijn niet correct: %v save_config_failed=Kan de configuratie niet opslaan: %v invalid_log_root_path=Ongeldig log-pad: %v +default_keep_email_private=Verberg standaard alle e-mailadressen [home] password_holder=Wachtwoord @@ -198,6 +239,7 @@ auth_failed=Verificatie mislukt: %v target_branch_not_exist=Doel branch bestaat niet [user] +change_avatar=Wijzig je profielfoto… join_on=Aangemeld op repositories=repositories activity=Openbare activiteit @@ -216,6 +258,7 @@ security=Beveiliging avatar=Profielfoto ssh_gpg_keys=SSH / GPG sleutels social=Sociale netwerk-accounts +orgs=Beheer organisaties repos=Repositories delete=Verwijder account twofa=Twee factor authenticatie @@ -242,12 +285,16 @@ delete_current_avatar=Verwijder huidige avatar change_password=Wachtwoord bijwerken old_password=Huidige wachtwoord new_password=Nieuw wachtwoord +retype_new_password=Herhaal Nieuw Wachtwoord emails=E-mailadressen email_desc=Uw primaire e-mailadres zal worden gebruikt voor meldingen en andere administratieve taken. primary=Primair delete_email=Verwijder +email_deletion=Verwijder e-mailadres +add_new_email=Nieuw e-mailadres toevoegen add_openid=Voeg OpenID URL toe +keep_email_private=Verberg e-mailadres manage_ssh_keys=Beheer SSH sleutels manage_gpg_keys=Beheer GPG sleutels @@ -294,6 +341,7 @@ repos_none=U bezit geen repositories delete_account=Verwijder uw account confirm_delete_account=Bevestig verwijdering +delete_account_title=Verwijder gebruikers account [repo] owner=Eigenaar @@ -331,6 +379,7 @@ watch=Volgen unstar=Ontster star=Ster fork=Vork +download_archive=Download repository no_desc=Geen omschrijving quick_guide=Snelstart gids @@ -454,6 +503,7 @@ issues.delete_comment_confirm=Weet u zeker dat u deze reactie wilt verwijderen? issues.no_content=Er is nog geen inhoud. issues.close_issue=Sluit issues.reopen_issue=Heropen +issues.reopen_comment_issue=Heropen en geef commentaar issues.create_comment=Reageer issues.closed_at=`gesloten om %[2]s` issues.reopened_at=`heropend om %[2]s` @@ -600,6 +650,7 @@ settings.tracker_issue_style.numeric=Nummeriek settings.tracker_issue_style.alphanumeric=Alfanummeriek settings.danger_zone=Gevaren zone settings.new_owner_has_same_repo=De nieuwe eigenaar heeft al een repository met deze naam +settings.convert_confirm=Converteer Repository settings.transfer=Eigendom overdragen settings.delete=Verwijder deze repository settings.delete_notices_1=- Deze bewerking kan NIET ongedaan gemaakt worden. @@ -629,6 +680,7 @@ settings.event_send_everything=Alle gebeurtenissen settings.event_create=Creëer settings.event_delete=Verwijder settings.event_fork=Fork +settings.event_fork_desc=Repository geforked settings.event_release=Release settings.event_pull_request=Pull request settings.event_push=Push @@ -641,6 +693,7 @@ settings.slack_domain=Slack domein settings.slack_channel=Slack kanaal settings.deploy_keys=Installeer sleutels settings.add_deploy_key=Toevoegen deploy sleutel +settings.is_writable=Schrijf toegang inschakelen settings.title=Titel settings.deploy_key_content=Inhoud settings.branches=Branches @@ -689,6 +742,7 @@ release.downloads=Downloads branch.name=Branch naam branch.search=Zoek branches branch.delete_head=Verwijder +branch.delete=Verwijder branch '%s' branch.delete_html=Verwijder branch branch.create_branch=Maak branch %s branch.create_from=van '%s' @@ -724,6 +778,7 @@ settings.update_setting_success=Organisatie instellingen zijn succesvol bijgewer settings.delete=Verwijder organisatie settings.delete_account=Verwijder deze organisatie settings.confirm_delete_account=Bevestig verwijdering +settings.delete_org_title=Verwijder organisatie members.membership_visibility=Zichtbaarheid lidmaatschap: members.public=Zichtbaar @@ -801,6 +856,7 @@ dashboard.total_gc_pause=Totaal GC verwerkingstijd dashboard.last_gc_pause=Laatste GC verwerkingstijd dashboard.gc_times=GC verwerkingen +users.new_account=Nieuw account aanmaken users.name=Gebruikersnaam users.activated=Geactiveerd users.admin=Beheerder @@ -810,6 +866,8 @@ users.last_login=Laatste keer ingelogd users.edit=Bewerken users.auth_source=Authenticatiebron users.local=Lokaal +users.update_profile=Update gebruikers account +users.delete_account=Verwijder gebruikers account orgs.org_manage_panel=Organisaties beheren orgs.name=Naam @@ -838,6 +896,7 @@ auths.host=Host auths.port=Poort auths.bind_dn=Binden DN auths.bind_password=Bind wachtwoord +auths.attribute_username=Gebruikersnaam attribuut auths.search_page_size=Paginagrootte auths.filter=Gebruikersfilter auths.admin_filter=Beheerdersfilter @@ -903,6 +962,7 @@ config.mailer_host=Host config.mailer_user=Gebruiker config.mailer_use_sendmail=Gebruik Sendmail config.mailer_sendmail_path=Sendmail pad +config.send_test_mail=Test e-mail verzenden config.oauth_config=OAuth-configuratie config.oauth_enabled=Ingeschakeld From 862645a1b9a6c68b62a4d6599786b9e1a1b63c62 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Sun, 22 Jul 2018 06:15:11 +0300 Subject: [PATCH 134/447] Fix migration from older releases (#4495) --- models/migrations/v39.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/migrations/v39.go b/models/migrations/v39.go index 42197e80f282..9fb7390c7dbe 100644 --- a/models/migrations/v39.go +++ b/models/migrations/v39.go @@ -34,7 +34,7 @@ func releaseAddColumnIsTagAndSyncTags(x *xorm.Engine) error { pageSize := models.RepositoryListDefaultPageSize for { repos := make([]*models.Repository, 0, pageSize) - if err := x.Table("repository").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil { + if err := x.Table("repository").Cols("id", "name", "owner_id").Asc("id").Limit(pageSize, offset).Find(&repos); err != nil { return fmt.Errorf("select repos [offset: %d]: %v", offset, err) } for _, repo := range repos { From 9365837dc53f205250938745f5355e192cb06826 Mon Sep 17 00:00:00 2001 From: Kjell Kvinge Date: Mon, 23 Jul 2018 16:12:06 +0200 Subject: [PATCH 135/447] Make max commits in graph configurable (#4498) --- custom/conf/app.ini.sample | 2 ++ docs/content/doc/advanced/config-cheat-sheet.en-us.md | 1 + models/graph.go | 3 ++- modules/setting/setting.go | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index f087e9913b43..12e50e8cb770 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -67,6 +67,8 @@ EXPLORE_PAGING_NUM = 20 ISSUE_PAGING_NUM = 10 ; Number of maximum commits displayed in one activity feed FEED_MAX_COMMIT_NUM = 5 +; Number of maximum commits displayed in commit graph. +GRAPH_MAX_COMMIT_NUM = 100 ; Value of `theme-color` meta tag, used by Android >= 5.0 ; An invalid color like "none" or "disable" will have the default style ; More info: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 5ed2ce43e7ee..29489d885520 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -68,6 +68,7 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `EXPLORE_PAGING_NUM`: **20**: Number of repositories that are shown in one explore page. - `ISSUE_PAGING_NUM`: **10**: Number of issues that are shown in one page (for all pages that list issues). - `FEED_MAX_COMMIT_NUM`: **5**: Number of maximum commits shown in one activity feed. +- `GRAPH_MAX_COMMIT_NUM`: **100**: Number of maximum commits shown in the commit graph. - `DEFAULT_THEME`: **gitea**: \[gitea, arc-green\]: Set the default theme for the Gitea install. ### UI - Admin (`ui.admin`) diff --git a/models/graph.go b/models/graph.go index 8ecea9c09334..90b9ff11f8c2 100644 --- a/models/graph.go +++ b/models/graph.go @@ -9,6 +9,7 @@ import ( "strings" "code.gitea.io/git" + "code.gitea.io/gitea/modules/setting" ) // GraphItem represent one commit, or one relation in timeline @@ -41,7 +42,7 @@ func GetCommitGraph(r *git.Repository) (GraphItems, error) { "--all", "-C", "-M", - "-n 100", + fmt.Sprintf("-n %d", setting.UI.GraphMaxCommitNum), "--date=iso", fmt.Sprintf("--pretty=format:%s", format), ) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index b44ba4d11b1f..396dec2546bb 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -276,6 +276,7 @@ var ( IssuePagingNum int RepoSearchPagingNum int FeedMaxCommitNum int + GraphMaxCommitNum int ReactionMaxUserNum int ThemeColorMetaTag string MaxDisplayFileSize int64 @@ -301,6 +302,7 @@ var ( IssuePagingNum: 10, RepoSearchPagingNum: 10, FeedMaxCommitNum: 5, + GraphMaxCommitNum: 100, ReactionMaxUserNum: 10, ThemeColorMetaTag: `#6cc644`, MaxDisplayFileSize: 8388608, From 755a5875166911ce7268076387c2fe8585ca3c0c Mon Sep 17 00:00:00 2001 From: Michael Kuhn Date: Tue, 24 Jul 2018 12:20:52 +0200 Subject: [PATCH 136/447] Add shortcut to save wiki page (#4452) This allows saving the wiki page with Ctrl-Enter. --- public/js/index.js | 3 ++- templates/repo/wiki/new.tmpl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/js/index.js b/public/js/index.js index 696b63e7787d..5f4a7bc774aa 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -790,7 +790,7 @@ function initTeamSettings() { function initWikiForm() { var $editArea = $('.repository.wiki textarea#edit_area'); if ($editArea.length > 0) { - new SimpleMDE({ + var simplemde = new SimpleMDE({ autoDownloadFontAwesome: false, element: $editArea[0], forceSync: true, @@ -825,6 +825,7 @@ function initWikiForm() { "link", "image", "table", "horizontal-rule", "|", "clean-block", "preview", "fullscreen"] }) + $(simplemde.codemirror.getInputField()).addClass("js-quick-submit"); } } diff --git a/templates/repo/wiki/new.tmpl b/templates/repo/wiki/new.tmpl index 34c6b2d0cacb..7dc066ffb86b 100644 --- a/templates/repo/wiki/new.tmpl +++ b/templates/repo/wiki/new.tmpl @@ -17,7 +17,7 @@
- +
From 1c0484dbc12ba5f4362fad0b7856c3534659993a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 24 Jul 2018 10:22:04 +0000 Subject: [PATCH 137/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 49 ++++++++++++++++++++++++++++++++- options/locale/locale_uk-UA.ini | 5 ++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index f77ae2e09024..1082e53dcc12 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -32,8 +32,16 @@ twofa_scratch=Zwei-Faktor-Einmalpasswort passcode=PIN u2f_insert_key=Hardware-Sicherheitsschlüssel einstecken +u2f_sign_in=Drücke den Knopf auf deinem Sicherheitsschlüssel. Wenn dein Sicherheitsschlüssel keinen Knopf hat, stecke ihn erneut ein. u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel… u2f_use_twofa=Zwei-Faktor-Authentifizierung via Handy verwenden +u2f_error=Dein Sicherheitsschlüssel konnte nicht gelesen werden. +u2f_unsupported_browser=Dein Browser unterstützt keine U2F-Sicherheitsschlüssel. +u2f_error_1=Ein unbekannter Fehler ist aufgetreten. Bitte versuche es erneut. +u2f_error_2=Bitte stell sicher, dass die korrekte verschlüsselte URL benutzt wird (https://). +u2f_error_3=Der Server konnte deine Anfrage nicht bearbeiten. +u2f_error_4=Für diese Anfrage ist der Sicherheitsschlüssel nicht erlaubt. Bitte stell sicher, dass er nicht bereits registriert ist. +u2f_error_5=Das Zeitlimit wurde erreicht, bevor dein Schlüssel gelesen werden konnte. Bitte lade die Seite erneut. u2f_reload=Neu laden repository=Repository @@ -122,6 +130,7 @@ federated_avatar_lookup=Föderierte Profilbilder einschalten federated_avatar_lookup_popup=Föderierte Profilbilder via Libravatar aktivieren. disable_registration=Registrierung deaktivieren disable_registration_popup=Registrierung neuer Benutzer deaktivieren. Nur Administratoren werden neue Benutzerkonten anlegen können. +allow_only_external_registration_popup=Registrierung nur über externe Services erlauben openid_signin=OpenID-Anmeldung aktivieren openid_signin_popup=Benutzeranmeldung via OpenID aktivieren. openid_signup=OpenID-Selbstregistrierung aktivieren @@ -454,10 +463,13 @@ then_enter_passcode=Und gebe dann die angezeigte PIN der Anwendung ein: passcode_invalid=Die PIN ist falsch. Probiere es erneut. twofa_enrolled=Die Zwei-Faktor-Authentifizierung wurde für dein Konto aktiviert. Bewahre dein Einmalpasswort (%s) an einem sicheren Ort auf, da es nicht wieder angezeigt werden wird. +u2f_desc=Sicherheitsschlüssel sind Geräte, die kryptografische Schlüssel beeinhalten. Diese können für die Zwei-Faktor-Authentifizierung verwendet werden. Der Sicherheitsschlüssel muss den Standard „FIDO U2F“ unterstützen. +u2f_require_twofa=Du musst die Zwei-Faktor-Authentifizierung für deinen Account aktivieren, um Sicherheitsschlüssel benutzen zu können. u2f_register_key=Sicherheitsschlüssel hinzufügen u2f_nickname=Nickname u2f_press_button=Drücke den Knopf auf deinem Sicherheitsschlüssel, um diesen zu registrieren. u2f_delete_key=Sicherheitsschlüssel entfernen +u2f_delete_key_desc=Wenn du einen Sicherheitsschlüssel entfernst, kannst du dich nicht mehr mit ihm anmelden. Fortfahren? manage_account_links=Verknüpfte Accounts verwalten manage_account_links_desc=Diese externen Accounts sind mit deinem Gitea-Account verknüpft. @@ -638,6 +650,7 @@ issues.new.open_milestone=Offene Meilensteine issues.new.closed_milestone=Geschlossene Meilensteine issues.new.assignees=Zuständig issues.new.clear_assignees=Zuständige entfernen +issues.new.no_assignees=Niemand zuständig issues.no_ref=Keine Branch/Tag angegeben issues.create=Issue erstellen issues.new_label=Neues Label @@ -746,7 +759,7 @@ issues.stop_tracking_history=hat die Zeiterfassung %s angehalten issues.add_time=Zeit manuell hinzufügen issues.add_time_short=Zeit hinzufügen issues.add_time_cancel=Abbrechen -issues.add_time_history=hat %s gearbeitete Zeit hinzugefügt +issues.add_time_history=`hat %s gearbeitete Zeit hinzugefügt` issues.add_time_hours=Stunden issues.add_time_minutes=Minuten issues.add_time_sum_to_small=Es wurde keine Zeit eingegeben. @@ -768,6 +781,33 @@ issues.due_date_added=hat %[2]s das Fälligkeitsdatum %[1]s hinzugefügt issues.due_date_modified=hat %[3]s das Fälligkeitsdatum von %[2]s zu %[1]s geändert issues.due_date_remove=hat %[2]s das Fälligkeitsdatum %[1]s entfernt issues.due_date_overdue=Überfällig +issues.due_date_invalid=Das Fälligkeitsdatum ist ungültig oder außerhalb des zulässigen Bereichs. Bitte verwende das Format „jjjj-mm-tt“. +issues.dependency.title=Abhängigkeiten +issues.dependency.issue_no_dependencies=Dieses Issue hat momentan keine Abhängigkeiten. +issues.dependency.pr_no_dependencies=Dieser Pull-Request hat momentan keine Abhängigkeiten. +issues.dependency.add=Abhängigkeit hinzufügen… +issues.dependency.cancel=Abbrechen +issues.dependency.remove=Entfernen +issues.dependency.added_dependency=`%[2]s hat %[3]s eine neue Abhängigkeit hinzugefügt` +issues.dependency.removed_dependency=`%[2]s hat %[3]s eine Abhängigkeit entfernt` +issues.dependency.issue_closing_blockedby=Das Schließen dieses Pull-Requests wird von den folgenden Issues blockiert +issues.dependency.pr_closing_blockedby=Das Schließen dieses Issues wird von den folgenden Issues blockiert +issues.dependency.issue_close_blocks=Dieses Issue blockiert die Schließung der folgenden Issues +issues.dependency.pr_close_blocks=Dieser Pull-Request blockiert die Schließung der folgenden Issues +issues.dependency.issue_close_blocked=Du musst alle Issues, die dieses Issue blockieren, schließen, bevor du es schließen kannst. +issues.dependency.pr_close_blocked=Du musst alle Issues, die diesen Pull-Request blockieren, schließen, bevor du ihn mergen kannst. +issues.dependency.blocks_short=Blockiert +issues.dependency.blocked_by_short=Abhängig von +issues.dependency.remove_header=Abhängigkeit löschen +issues.dependency.issue_remove_text=Dies entfernt die Abhängigkeit von diesem Issue. Fortfahren? +issues.dependency.pr_remove_text=Dies entfernt die Abhängigkeit von diesem Pull-Request. Fortfahren? +issues.dependency.setting=Abhängigkeiten für Issues und Pull-Requests aktivieren +issues.dependency.add_error_same_issue=Du kannst ein Issue nicht von sich selbst abhängig machen. +issues.dependency.add_error_dep_issue_not_exist=Abhängiges Issue existiert nicht. +issues.dependency.add_error_dep_not_exist=Abhängigkeit existiert nicht. +issues.dependency.add_error_dep_exists=Abhängigkeit existiert bereits. +issues.dependency.add_error_cannot_create_circular=Du kannst keine Abhängigkeit erstellen, bei welcher sich zwei Issues gegenseitig blockieren. +issues.dependency.add_error_dep_not_same_repo=Beide Issues müssen sich im selben Repository befinden. pulls.desc=Merge-Requests und Code-Reviews aktivieren. pulls.new=Neuer Pull-Request @@ -1084,6 +1124,7 @@ settings.protected_branch_deletion_desc=Wenn du den Branch-Schutz deaktivierst, settings.default_branch_desc=Wähle einen Standardbranch für Pull-Requests und Code-Commits: settings.choose_branch=Wähle einen Branch … settings.no_protected_branch=Es gibt keine geschützten Branches. +settings.edit_protected_branch=Bearbeiten diff.browse_source=Quellcode durchsuchen diff.parent=Ursprung @@ -1154,6 +1195,8 @@ branch.protected_deletion_failed=Branch „%s“ ist geschützt und kann nicht g topic.manage_topics=Themen verwalten topic.done=Fertig +topic.count_prompt=Du kannst nicht mehr als 25 Themen auswählen +topic.format_prompt=Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein. [org] org_name_holder=Name der Organisation @@ -1258,6 +1301,8 @@ dashboard.operation_switch=Wechseln dashboard.operation_run=Ausführen dashboard.clean_unbind_oauth=Nicht verbundene OAuth-Verbindungen löschen dashboard.clean_unbind_oauth_success=Alle unverbundene OAuth-Verbindungen wurden gelöscht. +dashboard.delete_inactivate_accounts=Alle nicht aktivierten Accounts löschen +dashboard.delete_inactivate_accounts_success=Alle nicht aktivierten Accounts wurden gelöscht. dashboard.delete_repo_archives=Alle Repository-Archive löschen dashboard.delete_repo_archives_success=Alle Repository-Archive wurden gelöscht. dashboard.delete_missing_repos=Alle Repository-Datensätze mit verlorenen gegangenen Git-Dateien löschen @@ -1465,6 +1510,7 @@ config.db_path=Verzeichnis config.service_config=Service-Konfiguration config.register_email_confirm=E-Mail-Bestätigung benötigt zum Registrieren config.disable_register=Selbstegistrierung deaktivieren +config.allow_only_external_registration=Registrierung nur über externe Services erlauben config.enable_openid_signup=OpenID-Selbstregistrierung aktivieren config.enable_openid_signin=OpenID-Anmeldung aktivieren config.show_registration_button=Schaltfläche zum Registrieren anzeigen @@ -1480,6 +1526,7 @@ config.enable_timetracking=Zeiterfassung aktivieren config.default_enable_timetracking=Zeiterfassung standardmäßig aktivieren config.default_allow_only_contributors_to_track_time=Nur Mitarbeitern erlauben, die Zeiterfassung zu nutzen config.no_reply_address=Versteckte E-Mail-Domain +config.default_enable_dependencies=Issue-Abhängigkeiten standardmäßig aktivieren config.webhook_config=Webhook-Konfiguration config.queue_length=Warteschlangenlänge diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index e32a4ecb1b1b..062830dbe452 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -638,6 +638,7 @@ issues.new.open_milestone=Активні етапи issues.new.closed_milestone=Закриті етапи issues.new.assignees=Виконавеці issues.new.clear_assignees=Прибрати виконавеців +issues.new.no_assignees=Немає виконавеця issues.no_ref=Не вказана гілка або тег issues.create=Створити проблему issues.new_label=Нова мітка @@ -771,10 +772,13 @@ issues.due_date_overdue=Прострочено issues.dependency.title=Залежності issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей. issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей. +issues.dependency.add=Додати залежність... issues.dependency.cancel=Відмінити issues.dependency.remove=Видалити issues.dependency.added_dependency=
0%
[2]s додано нову залежність %[3]s' issues.dependency.removed_dependency=
0%
[2]s видалено залежність %[3]s' +issues.dependency.issue_closing_blockedby=Закриття цього запиту на злиття заблокує наступні проблеми +issues.dependency.pr_closing_blockedby=Закриття цієї проблеми заблокує наступні проблеми issues.dependency.blocks_short=Блоки pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. @@ -1267,6 +1271,7 @@ dashboard.operation_switch=Перемкнути dashboard.operation_run=Запустити dashboard.clean_unbind_oauth=Очистити список незавершених авторизацій OAuth dashboard.clean_unbind_oauth_success=Всі незавершені зв'язки OAuth були видалені. +dashboard.delete_inactivate_accounts=Видалити всі неактивовані облікові записи dashboard.delete_repo_archives=Видалити всі архіви репозиторіїв dashboard.delete_repo_archives_success=Всі архіви репозиторіїв були видалені. dashboard.delete_missing_repos=Видалити всі записи про репозиторії з відсутніми файлами Git From 97ee5db750a47c97f2a1689d826f31f49ab1aa27 Mon Sep 17 00:00:00 2001 From: Lanre Adelowo Date: Wed, 25 Jul 2018 13:11:22 +0100 Subject: [PATCH 138/447] Respect email privacy option in user search via API (#4512) * respect user's email privacy option * make email visible to admin irrespective of privacy option --- routers/api/v1/user/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 0453a455f4de..49e5f3413644 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -60,7 +60,7 @@ func Search(ctx *context.APIContext) { AvatarURL: users[i].AvatarLink(), FullName: markup.Sanitize(users[i].FullName), } - if ctx.IsSigned { + if ctx.IsSigned && (!users[i].KeepEmailPrivate || ctx.User.IsAdmin) { results[i].Email = users[i].Email } } From 56762263a6decfd4553dd2f3caf0f0d0b9253783 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 25 Jul 2018 12:12:34 +0000 Subject: [PATCH 139/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_zh-TW.ini | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini index f26a4a6c87b5..c03523bb90d3 100644 --- a/options/locale/locale_zh-TW.ini +++ b/options/locale/locale_zh-TW.ini @@ -67,6 +67,7 @@ cancel=取消 [install] install=安裝頁面 title=初始設定 +docker_helper=如果您正在使用 Docker 容器運行 Gitea,請務必先仔細閱讀 官方文件後再對本頁面進行填寫。 requite_db_desc=Gitea 需要安裝 MySQL、PostgreSQL、SQLite3、MSSQL 或 TiDB 其中一項。 db_title=資料庫設定 db_type=資料庫類型 @@ -845,6 +846,7 @@ settings.tracker_url_format=外部問題管理系統的 URL 格式 settings.tracker_issue_style.numeric=數字 settings.tracker_issue_style.alphanumeric=字母及數字 settings.enable_timetracker=啟用時間追蹤 +settings.admin_settings=管理員設定 settings.danger_zone=危險操作區 settings.new_owner_has_same_repo=新的儲存庫擁有者已經存在同名儲存庫! settings.convert=轉換為普通儲存庫 @@ -852,8 +854,11 @@ settings.convert_desc=您可以將此鏡像轉成普通儲存庫。此動作不 settings.convert_confirm=轉換儲存庫 settings.convert_succeed=鏡像儲存庫已成功轉換為一般儲存庫。 settings.transfer=轉移儲存庫所有權 +settings.wiki_delete=刪除 Wiki 資料 +settings.confirm_wiki_delete=刪除 Wiki 資料 settings.delete=刪除本儲存庫 settings.delete_notices_1=- 此操作 不可以 被回滾。 +settings.deletion_success=這個儲存庫已被刪除。 settings.transfer_owner=新擁有者 settings.confirm_delete=刪除儲存庫 settings.add_collaborator=增加協作者 @@ -875,6 +880,8 @@ settings.githook_edit_desc=如果 Hook 未啟動,則會顯示樣例文件中 settings.githook_name=Hook 名稱 settings.githook_content=Hook 內容 settings.update_githook=更新 Hook 設定 +settings.payload_url=目標 URL +settings.content_type=POST Content Type settings.secret=金鑰文本 settings.slack_username=服務名稱 settings.slack_icon_url=圖標 URL @@ -910,6 +917,7 @@ settings.deploy_keys=管理部署金鑰 settings.add_deploy_key=新增部署金鑰 settings.title=標題 settings.deploy_key_content=金鑰文本 +settings.deploy_key_deletion=刪除部署金鑰 settings.branches=分支列表 settings.protected_branch=分支保護 settings.protected_branch_can_push=允許推送? @@ -920,6 +928,7 @@ settings.protect_whitelist_search_teams=搜尋團隊... settings.add_protected_branch=啟用保護 settings.delete_protected_branch=停用保護 settings.choose_branch=選擇一個分支... +settings.edit_protected_branch=編輯 diff.browse_source=瀏覽代碼 diff.parent=父節點 @@ -949,6 +958,7 @@ release.content=內容 release.write=內容編輯 release.preview=效果預覽 release.loading=載入中… +release.prerelease_desc=標記為 Pre-Release release.prerelease_helper=標記此版本不適合生產使用。 release.cancel=取消 release.publish=發佈版本 @@ -974,7 +984,10 @@ branch.create_branch=建立分支 %s branch.create_from=從 '%s' branch.branch_already_exists=分支 '%s' 已存在此儲存庫 branch.deleted_by=刪除人: %s +branch.restore_failed=還原分支 %s 失敗 +branch.protected_deletion_failed=分支 '%s' 已被保護,不能刪除。 +topic.manage_topics=管理主題 topic.done=完成 [org] @@ -1068,6 +1081,8 @@ dashboard.operation_switch=開關 dashboard.operation_run=執行 dashboard.clean_unbind_oauth=清理未綁定OAuth的連結 dashboard.clean_unbind_oauth_success=所有未綁定 OAuth 的連結已刪除。 +dashboard.delete_inactivate_accounts=刪除所有未啟用的帳戶 +dashboard.delete_inactivate_accounts_success=所有未啟用的帳號已被清除! dashboard.delete_repo_archives=刪除所有儲存庫存檔 dashboard.delete_repo_archives_success=所有儲存庫存檔已刪除。 dashboard.delete_missing_repos=刪除所有遺失 Git 檔案的儲存庫記錄 @@ -1116,9 +1131,12 @@ users.repos=儲存庫數 users.created=建立時間 users.last_login=上次登入 users.never_login=從未登入 +users.send_register_notify=寄送使用者註冊通知 +users.new_success=已建立新帳戶 '%s'。 users.edit=編輯 users.auth_source=認證源 users.local=本地 +users.password_helper=密碼留空則不修改。 users.edit_account=編輯帳號 users.max_repo_creation=最大儲存庫數量 users.max_repo_creation_desc=(設定 -1 使用全域預設限制) @@ -1129,6 +1147,7 @@ users.allow_import_local=允許匯入本地儲存庫 users.allow_create_organization=允許建立組織 users.update_profile=更新帳號 users.delete_account=刪除帳號 +users.still_own_repo=這個使用者還擁有一個或更多的儲存庫。請先刪除或是轉移這些儲存庫。 users.deletion_success=使用者帳號已被刪除。 orgs.org_manage_panel=組織管理 @@ -1267,6 +1286,7 @@ config.queue_length=隊列長度 config.deliver_timeout=推送超時 config.skip_tls_verify=略過 TLS 驗證 +config.mailer_config=SMTP 設定 config.mailer_enabled=啟用服務 config.mailer_disable_helo=禁用 HELO 操作 config.mailer_name=發送者名稱 @@ -1274,6 +1294,7 @@ config.mailer_host=郵件主機地址 config.mailer_user=發送者帳號 config.mailer_use_sendmail=使用 Sendmail config.mailer_sendmail_path=Sendmail 路徑 +config.mailer_sendmail_args=Sendmail 參數 config.send_test_mail=傳送測試郵件 config.test_mail_failed=傳送測試郵件到 '%s' 時失敗:'%v config.test_mail_sent=測試郵件已發送到 '%s' @@ -1380,6 +1401,7 @@ raw_seconds=秒 raw_minutes=分鐘 [dropzone] +default_message=拖放檔案或是點擊此處上傳。 invalid_input_type=您無法上傳此類型的檔案 file_too_big=檔案大小({{filesize}} MB) 超過了最大允許大小({{maxFilesize}} MB) remove_file=移除文件 @@ -1398,8 +1420,11 @@ mark_all_as_read=標記所有為已讀 [gpg] error.extract_sign=無法提取簽署 error.generate_hash=無法產生提交的雜湊值 +error.no_committer_account=沒有連結到貢獻者的電子郵件帳戶。 error.no_gpg_keys_found=沒有發現已知的金鑰在資料庫的簽署中 error.not_signed_commit=未簽名的提交 +error.failed_retrieval_gpg_keys=找不到任何與該提交者帳戶相關的金鑰 [units] +error.unit_not_allowed=您未被允許訪問此儲存庫區域 From f5a03df17e9110f56dec331c12499509b46e303c Mon Sep 17 00:00:00 2001 From: Lanre Adelowo Date: Wed, 25 Jul 2018 18:54:56 +0100 Subject: [PATCH 140/447] Add flash message after an account has been successfully activated (#4510) * added new locale text --- options/locale/locale_en-US.ini | 1 + routers/user/auth.go | 1 + 2 files changed, 2 insertions(+) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 629d84e0585e..96d450b5ca8d 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -203,6 +203,7 @@ sign_up_now = Need an account? Register now. confirmation_mail_sent_prompt = A new confirmation email has been sent to %s. Please check your inbox within the next %s to complete the registration process. reset_password_mail_sent_prompt = A confirmation email has been sent to %s. Please check your inbox within the next %s to complete the password reset process. active_your_account = Activate Your Account +account_activated = Account has been activated prohibit_login = Sign In Prohibited prohibit_login_desc = Your account is prohibited to sign in, please contact your site administrator. resent_limit_prompt = You have already requested an activation email recently. Please wait 3 minutes and try again. diff --git a/routers/user/auth.go b/routers/user/auth.go index 9a24108c731e..b24c56745d35 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -1035,6 +1035,7 @@ func Activate(ctx *context.Context) { ctx.Session.Set("uid", user.ID) ctx.Session.Set("uname", user.Name) + ctx.Flash.Success(ctx.Tr("auth.account_activated")) ctx.Redirect(setting.AppSubURL + "/") return } From f0dd8733f30b2e664e3933647bc8bd0778f64b15 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 25 Jul 2018 17:55:49 +0000 Subject: [PATCH 141/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ru-RU.ini | 46 +++++++++++++++++++++++++++++++++ options/locale/locale_uk-UA.ini | 9 ++++--- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index 5b932f327f14..95cf4f6a7e69 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -32,8 +32,16 @@ twofa_scratch=Двухфакторный scratch-код passcode=Пароль u2f_insert_key=Вставьте ключ безопасности +u2f_sign_in=Нажмите кнопку на ключе безопасности. Если ваш ключ безопасности не имеет кнопки, вставьте его снова. u2f_press_button=Пожалуйста нажмите кнопку на вашем ключе безопасности… u2f_use_twofa=Используйте двухфакторный код с телефона +u2f_error=Не удалось прочитать ваш ключ безопасности. +u2f_unsupported_browser=Ваш браузер не поддерживает ключи безопасности U2F. +u2f_error_1=Произошла неизвестная ошибка. Повторите попытку. +u2f_error_2=Обязательно используйте правильный, защищённый (https://) URL-адрес. +u2f_error_3=Сервер не смог обработать ваш запрос. +u2f_error_4=Представленный ключ не подходит для этого запроса. Если вы пытаетесь зарегистрировать его, убедитесь, что ключ ещё не зарегистрирован. +u2f_error_5=Тайм-аут достигнут до того, как ваш ключ был прочитан. Перезагрузите эту страницу и повторите попытку. u2f_reload=Обновить repository=Репозиторий @@ -122,6 +130,7 @@ federated_avatar_lookup=Включить федеративные аватары federated_avatar_lookup_popup=Включите поиск федеративного аватара для использования службы с открытым исходным кодом на основе libravatar. disable_registration=Отключить самостоятельную регистрацию disable_registration_popup=Запретить самостоятельную регистрацию. Только администраторы смогут создавать новые учетные записи пользователей. +allow_only_external_registration_popup=Разрешить регистрацию только через сторонние сервисы openid_signin=Включение входа через OpenID openid_signin_popup=Включение входа через OpenID. openid_signup=Включить саморегистрацию OpenID @@ -454,10 +463,13 @@ then_enter_passcode=И введите пароль, показанный в пр passcode_invalid=Неверный пароль. попробуйте снова. twofa_enrolled=Для вашего аккаунта была включена двухфакторная аутентификация. Сохраните ваш scratch-токен (%s), он не сохраняется на сервере! +u2f_desc=Ключами безопасности являются аппаратные устройства, содержащие криптографические ключи. Они могут использоваться для двухфакторной аутентификации. Ключи безопасности должны поддерживать стандарт FIDO U2F. +u2f_require_twofa=Для использования ключей безопасности ваша учетная запись должна использовать двухфакторную аутентификацию. u2f_register_key=Добавить ключ безопасности u2f_nickname=Имя пользователя u2f_press_button=Нажмите кнопку на ключе безопасности, чтобы зарегистрировать его. u2f_delete_key=Удалить ключ безопасности +u2f_delete_key_desc=Если вы удалите ключ безопасности, вы больше не сможете войти с помощью него. Продолжить? manage_account_links=Управление привязанными аккаунтами manage_account_links_desc=Эти внешние аккаунты привязаны к вашему аккаунту Gitea. @@ -638,6 +650,7 @@ issues.new.open_milestone=Открыть этап issues.new.closed_milestone=Завершенные этапы issues.new.assignees=Назначенные issues.new.clear_assignees=Убрать ответственных +issues.new.no_assignees=Нет назначенных лиц issues.no_ref=Не указана ветка или тэг issues.create=Добавить задачу issues.new_label=Новая метка @@ -768,6 +781,33 @@ issues.due_date_added=добавлено в срок выполнения %s %s issues.due_date_modified=срок изменён c %s %s на %s issues.due_date_remove=удалён срок выполнения %s %s issues.due_date_overdue=Просроченные +issues.due_date_invalid=Срок действия недействителен или находится за пределами допустимого диапазона. Пожалуйста, используйте формат 'гггг-мм-дд'. +issues.dependency.title=Зависимости +issues.dependency.issue_no_dependencies=В настоящее время эта задача не имеет зависимостей. +issues.dependency.pr_no_dependencies=Этот запрос на слияние в настоящее время не имеет никаких зависимостей. +issues.dependency.add=Добавить зависимость... +issues.dependency.cancel=Отменить +issues.dependency.remove=Удалить +issues.dependency.added_dependency=`%[2]s добавил(а) новую зависимость %[3]s` +issues.dependency.removed_dependency=`%[2]s удалил(а) зависимость %[3]s` +issues.dependency.issue_closing_blockedby=Закрытие этого запроса на слияние невозможно до закрытия следующих задач +issues.dependency.pr_closing_blockedby=Закрытие этой задачи блокируется следующими задачами +issues.dependency.issue_close_blocks=Эта задача блокирует закрытие следующих задач +issues.dependency.pr_close_blocks=Этот запрос на слияние блокирует закрытие следующих задач +issues.dependency.issue_close_blocked=Вам необходимо закрыть все задачи, блокирующие эту задачу, прежде чем вы сможете её закрыть. +issues.dependency.pr_close_blocked=Вам необходимо закрыть все задачи, блокирующие этот запрос на слияние, прежде чем вы сможете принять его. +issues.dependency.blocks_short=Блоки +issues.dependency.blocked_by_short=Зависит от +issues.dependency.remove_header=Удалить зависимость +issues.dependency.issue_remove_text=Это приведет к удалению зависимости от этой задачи. Продолжить? +issues.dependency.pr_remove_text=Это приведет к удалению зависимости от этого запроса на слияние. Продолжить? +issues.dependency.setting=Включение зависимостей для проблем и запросов на слияние +issues.dependency.add_error_same_issue=Вы не можете заставить задачу зависеть от самой себя. +issues.dependency.add_error_dep_issue_not_exist=Зависимая задача не существует. +issues.dependency.add_error_dep_not_exist=Зависимости не существует. +issues.dependency.add_error_dep_exists=Зависимость уже существует. +issues.dependency.add_error_cannot_create_circular=Вы не можете создать зависимость с двумя задачами, блокирующими друг друга. +issues.dependency.add_error_dep_not_same_repo=Обе задачи должны находиться в одном репозитории. pulls.desc=Включить Pull Request'ы и интерфейс согласования правок. pulls.new=Новый Pull Request @@ -1155,6 +1195,8 @@ branch.protected_deletion_failed=Ветка '%s' защищена. Её нель topic.manage_topics=Редактировать тематические метки topic.done=Сохранить +topic.count_prompt=Вы не можете выбрать более 25 тем +topic.format_prompt=Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов. [org] org_name_holder=Название организации @@ -1259,6 +1301,8 @@ dashboard.operation_switch=Переключить dashboard.operation_run=Запуск dashboard.clean_unbind_oauth=Очистить список незавершённых авторизаций OAuth dashboard.clean_unbind_oauth_success=Все незавершённые связи OAuth были удалены. +dashboard.delete_inactivate_accounts=Удалить все неактивированные учётные записи +dashboard.delete_inactivate_accounts_success=Все неактивированные учётные записи были удалены. dashboard.delete_repo_archives=Удаление всех архивов репозиториев dashboard.delete_repo_archives_success=Все архивы репозиториев удалены. dashboard.delete_missing_repos=Удалить все записи о репозиториях с отсутствующими файлами Git @@ -1466,6 +1510,7 @@ config.db_path=Путь config.service_config=Сервисная конфигурация config.register_email_confirm=Требуется подтверждение по электронной почте config.disable_register=Отключить самостоятельную регистрацию +config.allow_only_external_registration=Разрешить регистрацию только через сторонние сервисы config.enable_openid_signup=Включить cамостоятельную регистрацию OpenID config.enable_openid_signin=Включение входа через OpenID config.show_registration_button=Показать кнопку регистрации @@ -1481,6 +1526,7 @@ config.enable_timetracking=Включить отслеживание време config.default_enable_timetracking=Включить отслеживание времени по умолчанию config.default_allow_only_contributors_to_track_time=Учитывать только участников разработки в подсчёте времени config.no_reply_address=No-reply адрес +config.default_enable_dependencies=Включение зависимостей для задач по умолчанию config.webhook_config=Конфигурация Webhooks config.queue_length=Длина очереди diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 062830dbe452..320156b3105e 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -800,7 +800,8 @@ pulls.tab_files=Змінені файли pulls.reopen_to_merge=Будь ласка перевідкрийте цей запит щоб здіснити операцію злиття. pulls.merged=Злито pulls.has_merged=Запит на злиття було об'єднано. -pulls.data_broken=Вміст цього запиту було порушено внаслідок видалення інформації ФОРКОМ. +pulls.data_broken=Зміст цього запиту було порушено внаслідок видалення інформації Форком. +Цей запит тягнеться через відсутність інформації про вилучення. pulls.is_checking=Триває перевірка конфліктів, будь ласка обновіть сторінку дещо пізніше. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. @@ -1006,13 +1007,13 @@ settings.webhook.headers=Заголовки settings.webhook.payload=Зміст settings.webhook.body=Тіло settings.githooks_desc=Git-хукі надаються Git самим по собі, ви можете змінювати файли підтримуваних хуков зі списку нижче щоб виконувати зовнішні операції. -settings.githook_edit_desc=Якщо хук неактивний, буде представлено зразок вмісту. Порожнє значення у цьому полі призведе до вимкнення хуку. +settings.githook_edit_desc=Якщо хук неактивний, буде представлено зразок змісту. Порожнє значення у цьому полі призведе до вимкнення хуку. settings.githook_name=Ім'я хуку settings.githook_content=Зміст хука settings.update_githook=Оновити хук settings.add_webhook_desc=Gitea буде відправляти POST запити на вказану URL адресу, з інформацією про події, що відбуваються. Подробиці на сторінці інструкції по використанню web-хуків . settings.payload_url=Цільова URL-адреса -settings.content_type=Тип вмісту +settings.content_type=Тип змісту settings.secret=Секрет settings.slack_username=Ім'я кристувача settings.slack_icon_url=URL іконки @@ -1063,7 +1064,7 @@ settings.is_writable_info=Чи може цей ключ бути викорис settings.no_deploy_keys=Ви не додавали ключі розгортання. settings.title=Заголовок settings.deploy_key_content=Зміст -settings.key_been_used=Вміст ключа розгортання вже використовується. +settings.key_been_used=Зміст ключа розгортання вже використовується. settings.key_name_used=Ключ розгортання з таким заголовком вже існує. settings.add_key_success=Новий ключ розгортання '%s' успішно доданий. settings.deploy_key_deletion=Видалити ключ для розгортування From c45de63546c2caa7d4764a39597c429667ad7cd3 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 26 Jul 2018 13:30:56 +0300 Subject: [PATCH 142/447] Fix uk-UA locale. Fixes #4518 --- options/locale/locale_uk-UA.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index 320156b3105e..a9a2bc521b5f 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -800,8 +800,7 @@ pulls.tab_files=Змінені файли pulls.reopen_to_merge=Будь ласка перевідкрийте цей запит щоб здіснити операцію злиття. pulls.merged=Злито pulls.has_merged=Запит на злиття було об'єднано. -pulls.data_broken=Зміст цього запиту було порушено внаслідок видалення інформації Форком. -Цей запит тягнеться через відсутність інформації про вилучення. +pulls.data_broken=Зміст цього запиту було порушено внаслідок видалення інформації Форком. Цей запит тягнеться через відсутність інформації про вилучення. pulls.is_checking=Триває перевірка конфліктів, будь ласка обновіть сторінку дещо пізніше. pulls.can_auto_merge_desc=Цей запит можна об'єднати автоматично. pulls.cannot_auto_merge_desc=Цей запит на злиття не може бути злитий автоматично через конфлікти. From a10984aba5a384f7e3754ff70fd77d5ec5064941 Mon Sep 17 00:00:00 2001 From: William Le Pommelet Date: Thu, 26 Jul 2018 12:57:45 +0200 Subject: [PATCH 143/447] Fix doc typo (#4517) * fix language list Standardized the languages' names within the list displayed when picking up a language at the bottom of the webpages * typo fix a typo into documentation (template rather than templete) * fix languages list --- docs/content/doc/advanced/customizing-gitea.en-us.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/content/doc/advanced/customizing-gitea.en-us.md b/docs/content/doc/advanced/customizing-gitea.en-us.md index f9a0d0d9fd3d..fed48ca988ab 100644 --- a/docs/content/doc/advanced/customizing-gitea.en-us.md +++ b/docs/content/doc/advanced/customizing-gitea.en-us.md @@ -59,7 +59,7 @@ to override can be found in the `templates` directory of Gitea source. Override making a copy of the file under `custom/templates` using a full path structure matching source. -Any statement contained inside `{{` and `}}` are Gitea's templete syntax and +Any statement contained inside `{{` and `}}` are Gitea's template syntax and shouldn't be touched without fully understanding these components. ### Adding links and tabs From 4a17b27808a289fee70725657cd644de5e66d64d Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 26 Jul 2018 17:25:41 +0200 Subject: [PATCH 144/447] Responsive design fixes (#4508) * reset to master * build css * Fixed spacing --- public/css/index.css | 2 +- public/less/_dashboard.less | 13 +++++++++- public/less/_form.less | 43 ++++++++++++++++++++++++++++++--- public/less/_home.less | 13 ++++++++++ public/less/_repository.less | 31 ++++++++++++++++++++++++ public/less/_user.less | 16 ++++++++++++ templates/repo/release/new.tmpl | 2 +- 7 files changed, 113 insertions(+), 7 deletions(-) diff --git a/public/css/index.css b/public/css/index.css index dc8ed248c6c9..9e9b08a7b902 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}@media only screen and (min-width:768px){.g-recaptcha{margin:0 auto!important;width:304px;padding-left:30px}}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.77);-webkit-transform:scale(.77);transform-origin:0 0;-webkit-transform-origin:0 0}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px!important}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .metas #deadlineForm input{width:12.8rem;border-radius:4px 0 0 4px;border-right:0;white-space:nowrap}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}.repository #clone-panel input{border-radius:0;padding:5px 10px}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518 18}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580 80}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}@media only screen and (max-width:880px){footer{text-align:center}}@media only screen and (max-width:880px){footer .ui.container .left,footer .ui.container .right{display:inline;float:none}}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}@media only screen and (min-width:768px){.g-recaptcha{margin:0 auto!important;width:304px;padding-left:30px}}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.77);-webkit-transform:scale(.77);transform-origin:0 0;-webkit-transform-origin:0 0}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px}@media only screen and (max-width:768px){.user.activate form .inline.field>label,.user.activate form input,.user.forgot.password form .inline.field>label,.user.forgot.password form input,.user.reset.password form .inline.field>label,.user.reset.password form input,.user.signin form .inline.field>label,.user.signin form input,.user.signup form .inline.field>label,.user.signup form input{width:100%!important}}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}@media only screen and (max-width:768px){.repository.new.fork form .selection.dropdown,.repository.new.fork form input,.repository.new.fork form label,.repository.new.migrate form .selection.dropdown,.repository.new.migrate form input,.repository.new.migrate form label,.repository.new.repo form .selection.dropdown,.repository.new.repo form input,.repository.new.repo form label{width:100%!important}.repository.new.fork form .field a,.repository.new.fork form .field button,.repository.new.migrate form .field a,.repository.new.migrate form .field button,.repository.new.repo form .field a,.repository.new.repo form .field button{margin-bottom:1em;width:100%}}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (max-width:768px){.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:100%!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}@media only screen and (max-width:768px){.new.org .ui.form .field a,.new.org .ui.form .field button{margin-bottom:1em;width:100%}.new.org .ui.form .field input{width:100%!important}}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .metas #deadlineForm input{width:12.8rem;border-radius:4px 0 0 4px;border-right:0;white-space:nowrap}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}@media only screen and (max-width:768px){.repository #clone-panel{width:100%}}.repository #clone-panel input{border-radius:0;padding:5px 10px;width:50%}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}@media only screen and (max-width:768px){.repository.file.list #file-buttons .ui.tiny.blue.buttons{width:100%}}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:#21BA4518 18}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid #21BA4580 80}.repository .diff-detail-box{margin:15px 0;line-height:30px}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .ui.right{margin-bottom:15px}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}@media only screen and (max-width:438px){.repository.new.release .field button,.repository.new.release .field input{width:100%}}@media only screen and (max-width:768px){.repository.new.release .field button{margin-bottom:1em}}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45!important}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px;display:none}#repo-topic{margin-top:5px}@media only screen and (max-width:768px){.new-dependency-drop-list{width:100%}}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}@media only screen and (max-width:768px){.user.profile .ui.card #profile-avatar{height:250px;overflow:hidden}.user.profile .ui.card #profile-avatar img{max-height:768px;max-width:768px}}@media only screen and (max-width:768px){.user.profile .ui.card{width:100%}}.user.profile .ui.repository.list{margin-top:25px}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:10px;left:auto;width:auto;right:13px}}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu,.dashboard.issues .filter.menu{width:100%}}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline} \ No newline at end of file diff --git a/public/less/_dashboard.less b/public/less/_dashboard.less index 85787ce2be0c..8fcdb6b385d9 100644 --- a/public/less/_dashboard.less +++ b/public/less/_dashboard.less @@ -26,6 +26,13 @@ top: 7px; left: 90%; width: 15%; + + @media only screen and (max-width: 768px) { + top: 10px; + left: auto; + width: auto; + right: 13px; + } } } @@ -40,12 +47,16 @@ right: 0!important; left: auto!important; } + + @media only screen and (max-width: 768px) { + width: 100%; + } } .right.stackable.menu > .item.active { color: #d9453d; } } - + /* Accomodate for Semantic's 1px hacks on .attached elements */ .dashboard-repos { margin: 0 1px; diff --git a/public/less/_form.less b/public/less/_form.less index db9f8f38a5e2..9b9b7879b4aa 100644 --- a/public/less/_form.less +++ b/public/less/_form.less @@ -102,7 +102,7 @@ .user.reset.password, .user.signin, .user.signup { - @input-padding: 200px!important; + @input-padding: 200px; #create-page-form; form { width: 700px!important; @@ -113,6 +113,12 @@ .inline.field > label { width: @input-padding; } + + .inline.field > label, input { + @media only screen and (max-width: 768px) { + width: 100% !important; + } + } } } @@ -137,19 +143,35 @@ padding-left: 0 !important; text-align: center; } + + @media only screen and (max-width: 768px) { + label, input, .selection.dropdown { + width: 100% !important; + } + + .field button, .field a { + margin-bottom: 1em; + width: 100%; + } + } } } &.new.repo { .ui.form { - .selection.dropdown:not(.owner) { - width: 50%!important; - } @media only screen and (min-width: 768px) { #auto-init { margin-left: @create-page-form-input-padding+15px; } } + + .selection.dropdown:not(.owner) { + width: 50%!important; + + @media only screen and (max-width: 768px) { + width: 100% !important; + } + } } } } @@ -175,3 +197,16 @@ font-family: monospace; } } + +.new.org .ui.form { + @media only screen and (max-width: 768px) { + .field button, .field a{ + margin-bottom: 1em; + width: 100%; + } + + .field input { + width: 100% !important; + } + } +} diff --git a/public/less/_home.less b/public/less/_home.less index c90e8ec41494..d0ce34fb86a2 100644 --- a/public/less/_home.less +++ b/public/less/_home.less @@ -47,3 +47,16 @@ padding-top: 15px; padding-bottom: @footer-margin * 2; } + +footer { + @media only screen and (max-width: 880px) { + text-align: center; + } + + .ui.container .left, .ui.container .right { + @media only screen and (max-width: 880px) { + display: inline; + float: none; + } + } +} diff --git a/public/less/_repository.less b/public/less/_repository.less index 6082844d2540..b242de3ae53e 100644 --- a/public/less/_repository.less +++ b/public/less/_repository.less @@ -172,9 +172,14 @@ #clone-panel { width: 350px; + @media only screen and (max-width: 768px) { + width: 100%; + } + input { border-radius: 0; padding: 5px 10px; + width: 50%; } .clone.button { @@ -220,6 +225,12 @@ padding: 8px 10px; font-weight: normal; } + + .ui.tiny.blue.buttons { + @media only screen and (max-width: 768px) { + width: 100%; + } + } } #repo-files-table { @@ -1229,6 +1240,20 @@ .prerelease.field { margin-bottom: 0; } + + .field { + button, input { + @media only screen and (max-width: 438px) { + width: 100%; + } + } + + button { + @media only screen and (max-width: 768px) { + margin-bottom: 1em; + } + } + } } &.forks { @@ -1756,3 +1781,9 @@ tbody.commit-list { #repo-topic { margin-top: 5px; } + +.new-dependency-drop-list { + @media only screen and (max-width: 768px) { + width: 100%; + } +} diff --git a/public/less/_user.less b/public/less/_user.less index cc57239b5959..3b29436bf79e 100644 --- a/public/less/_user.less +++ b/public/less/_user.less @@ -37,6 +37,22 @@ } } } + + #profile-avatar { + @media only screen and (max-width: 768px) { + height: 250px; + overflow: hidden; + + img { + max-height: 768px; + max-width: 768px; + } + } + } + + @media only screen and (max-width: 768px) { + width: 100%; + } } .ui.repository.list { diff --git a/templates/repo/release/new.tmpl b/templates/repo/release/new.tmpl index 5f82cf2f526a..cdead92b9d29 100644 --- a/templates/repo/release/new.tmpl +++ b/templates/repo/release/new.tmpl @@ -12,7 +12,7 @@ {{end}} {{template "base/alert" .}} -
+ {{.CsrfTokenHtml}}
From 2c380649b949ccaf207d9ba95c0d5e2fae0bd3fd Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 26 Jul 2018 15:26:44 +0000 Subject: [PATCH 145/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 4590c7cf5f31..0f25d24f80b4 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -203,6 +203,7 @@ sign_up_now=Precisa de uma conta? Cadastre-se agora. confirmation_mail_sent_prompt=Um novo e-mail de confirmação foi enviado para %s. Por favor, verifique sua caixa de e-mail nas próximas %s horas para finalizar o processo de cadastro. reset_password_mail_sent_prompt=Um email de confirmação foi enviado para %s. Por favor, verifique sua caixa de e-mail nas próximas %s horas para finalizar o processo de troca de senha. active_your_account=Ativar sua conta +account_activated=Conta foi ativada prohibit_login=Acesso proibido prohibit_login_desc=Sua conta foi proibida de acessar, por favor entre em conato com o administrador do site. resent_limit_prompt=Você já solicitou recentemente um e-mail de ativação. Por favor, aguarde 3 minutos e tente novamente. From 3d0afbd3469e8587018d24a03c9feaf3d69d7892 Mon Sep 17 00:00:00 2001 From: Lukas Treyer Date: Thu, 26 Jul 2018 18:38:55 +0200 Subject: [PATCH 146/447] env var GITEA_PUSHER_EMAIL (#4516) * env var GITEA_PUSHER_EMAIL * set pusher email only if email address is not private --- models/update.go | 1 + routers/repo/http.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/models/update.go b/models/update.go index b1bbe0754a3b..0f71cd1e709a 100644 --- a/models/update.go +++ b/models/update.go @@ -23,6 +23,7 @@ const ( EnvRepoUsername = "GITEA_REPO_USER_NAME" EnvRepoIsWiki = "GITEA_REPO_IS_WIKI" EnvPusherName = "GITEA_PUSHER_NAME" + EnvPusherEmail = "GITEA_PUSHER_EMAIL" EnvPusherID = "GITEA_PUSHER_ID" ) diff --git a/routers/repo/http.go b/routers/repo/http.go index e4e26e4f09ee..1c3453a3a982 100644 --- a/routers/repo/http.go +++ b/routers/repo/http.go @@ -226,6 +226,11 @@ func HTTP(ctx *context.Context) { models.EnvPusherID + fmt.Sprintf("=%d", authUser.ID), models.ProtectedBranchRepoID + fmt.Sprintf("=%d", repo.ID), } + + if !authUser.KeepEmailPrivate { + environ = append(environ, models.EnvPusherEmail+"="+authUser.Email) + } + if isWiki { environ = append(environ, models.EnvRepoIsWiki+"=true") } else { From 48922cf93695ee4040ca041d5c2934e638bf2622 Mon Sep 17 00:00:00 2001 From: SagePtr Date: Fri, 27 Jul 2018 01:41:36 +0200 Subject: [PATCH 147/447] Fix out-of-transaction query in removeOrgUser (#4521) (#4522) --- models/org.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/org.go b/models/org.go index bd5fc825b88b..a62c67deb77e 100644 --- a/models/org.go +++ b/models/org.go @@ -454,7 +454,7 @@ func AddOrgUser(orgID, uid int64) error { func removeOrgUser(sess *xorm.Session, orgID, userID int64) error { ou := new(OrgUser) - has, err := x. + has, err := sess. Where("uid=?", userID). And("org_id=?", orgID). Get(ou) From 3087b436db2fc9e9068700aac754c07fca42ca92 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 27 Jul 2018 08:54:50 -0400 Subject: [PATCH 148/447] Switch plaintext scratch tokens to use hash instead (#4331) --- models/migrations/migrations.go | 2 + models/migrations/v71.go | 88 ++++++++++++++++++++++++++ models/twofactor.go | 25 ++++++-- routers/user/auth.go | 6 +- routers/user/setting/security_twofa.go | 9 +-- 5 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 models/migrations/v71.go diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 48c4228fe178..b4e1a67187f9 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -194,6 +194,8 @@ var migrations = []Migration{ NewMigration("move team units to team_unit table", moveTeamUnitsToTeamUnitTable), // v70 -> v71 NewMigration("add issue_dependencies", addIssueDependencies), + // v70 -> v71 + NewMigration("protect each scratch token", addScratchHash), } // Migrate database to current version diff --git a/models/migrations/v71.go b/models/migrations/v71.go new file mode 100644 index 000000000000..c725908bd579 --- /dev/null +++ b/models/migrations/v71.go @@ -0,0 +1,88 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package migrations + +import ( + "crypto/sha256" + "fmt" + + "github.com/go-xorm/xorm" + "golang.org/x/crypto/pbkdf2" + + "code.gitea.io/gitea/modules/generate" + "code.gitea.io/gitea/modules/util" +) + +func addScratchHash(x *xorm.Engine) error { + // TwoFactor see models/twofactor.go + type TwoFactor struct { + ID int64 `xorm:"pk autoincr"` + UID int64 `xorm:"UNIQUE"` + Secret string + ScratchToken string + ScratchSalt string + ScratchHash string + LastUsedPasscode string `xorm:"VARCHAR(10)"` + CreatedUnix util.TimeStamp `xorm:"INDEX created"` + UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` + } + + if err := x.Sync2(new(TwoFactor)); err != nil { + return fmt.Errorf("Sync2: %v", err) + } + + sess := x.NewSession() + defer sess.Close() + + if err := sess.Begin(); err != nil { + return err + } + + // transform all tokens to hashes + const batchSize = 100 + for start := 0; ; start += batchSize { + tfas := make([]*TwoFactor, 0, batchSize) + if err := x.Limit(batchSize, start).Find(&tfas); err != nil { + return err + } + if len(tfas) == 0 { + break + } + + for _, tfa := range tfas { + // generate salt + salt, err := generate.GetRandomString(10) + if err != nil { + return err + } + tfa.ScratchSalt = salt + tfa.ScratchHash = hashToken(tfa.ScratchToken, salt) + + if _, err := sess.ID(tfa.ID).Cols("scratch_salt, scratch_hash").Update(tfa); err != nil { + return fmt.Errorf("couldn't add in scratch_hash and scratch_salt: %v", err) + } + + } + } + + // Commit and begin new transaction for dropping columns + if err := sess.Commit(); err != nil { + return err + } + if err := sess.Begin(); err != nil { + return err + } + + if err := dropTableColumns(sess, "two_factor", "scratch_token"); err != nil { + return err + } + return sess.Commit() + +} + +func hashToken(token, salt string) string { + tempHash := pbkdf2.Key([]byte(token), []byte(salt), 10000, 50, sha256.New) + return fmt.Sprintf("%x", tempHash) +} diff --git a/models/twofactor.go b/models/twofactor.go index 5f3c6efc21bb..be37c50b4691 100644 --- a/models/twofactor.go +++ b/models/twofactor.go @@ -9,12 +9,15 @@ import ( "crypto/cipher" "crypto/md5" "crypto/rand" + "crypto/sha256" "crypto/subtle" "encoding/base64" "errors" + "fmt" "io" "github.com/pquerna/otp/totp" + "golang.org/x/crypto/pbkdf2" "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/setting" @@ -26,20 +29,27 @@ type TwoFactor struct { ID int64 `xorm:"pk autoincr"` UID int64 `xorm:"UNIQUE"` Secret string - ScratchToken string + ScratchSalt string + ScratchHash string LastUsedPasscode string `xorm:"VARCHAR(10)"` CreatedUnix util.TimeStamp `xorm:"INDEX created"` UpdatedUnix util.TimeStamp `xorm:"INDEX updated"` } // GenerateScratchToken recreates the scratch token the user is using. -func (t *TwoFactor) GenerateScratchToken() error { +func (t *TwoFactor) GenerateScratchToken() (string, error) { token, err := generate.GetRandomString(8) if err != nil { - return err + return "", err } - t.ScratchToken = token - return nil + t.ScratchSalt, _ = generate.GetRandomString(10) + t.ScratchHash = hashToken(token, t.ScratchSalt) + return token, nil +} + +func hashToken(token, salt string) string { + tempHash := pbkdf2.Key([]byte(token), []byte(salt), 10000, 50, sha256.New) + return fmt.Sprintf("%x", tempHash) } // VerifyScratchToken verifies if the specified scratch token is valid. @@ -47,7 +57,8 @@ func (t *TwoFactor) VerifyScratchToken(token string) bool { if len(token) == 0 { return false } - return subtle.ConstantTimeCompare([]byte(token), []byte(t.ScratchToken)) == 1 + tempHash := hashToken(token, t.ScratchSalt) + return subtle.ConstantTimeCompare([]byte(t.ScratchHash), []byte(tempHash)) == 1 } func (t *TwoFactor) getEncryptionKey() []byte { @@ -118,7 +129,7 @@ func aesDecrypt(key, text []byte) ([]byte, error) { // NewTwoFactor creates a new two-factor authentication token. func NewTwoFactor(t *TwoFactor) error { - err := t.GenerateScratchToken() + _, err := t.GenerateScratchToken() if err != nil { return err } diff --git a/routers/user/auth.go b/routers/user/auth.go index b24c56745d35..e99f9d5de156 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -306,7 +306,11 @@ func TwoFactorScratchPost(ctx *context.Context, form auth.TwoFactorScratchAuthFo // Validate the passcode with the stored TOTP secret. if twofa.VerifyScratchToken(form.Token) { // Invalidate the scratch token. - twofa.ScratchToken = "" + _, err = twofa.GenerateScratchToken() + if err != nil { + ctx.ServerError("UserSignIn", err) + return + } if err = models.UpdateTwoFactor(twofa); err != nil { ctx.ServerError("UserSignIn", err) return diff --git a/routers/user/setting/security_twofa.go b/routers/user/setting/security_twofa.go index cb61b9e27025..3a590f0b0886 100644 --- a/routers/user/setting/security_twofa.go +++ b/routers/user/setting/security_twofa.go @@ -32,7 +32,8 @@ func RegenerateScratchTwoFactor(ctx *context.Context) { return } - if err = t.GenerateScratchToken(); err != nil { + token, err := t.GenerateScratchToken() + if err != nil { ctx.ServerError("SettingsTwoFactor", err) return } @@ -42,7 +43,7 @@ func RegenerateScratchTwoFactor(ctx *context.Context) { return } - ctx.Flash.Success(ctx.Tr("settings.twofa_scratch_token_regenerated", t.ScratchToken)) + ctx.Flash.Success(ctx.Tr("settings.twofa_scratch_token_regenerated", token)) ctx.Redirect(setting.AppSubURL + "/user/settings/security") } @@ -170,7 +171,7 @@ func EnrollTwoFactorPost(ctx *context.Context, form auth.TwoFactorAuthForm) { ctx.ServerError("SettingsTwoFactor", err) return } - err = t.GenerateScratchToken() + token, err := t.GenerateScratchToken() if err != nil { ctx.ServerError("SettingsTwoFactor", err) return @@ -183,6 +184,6 @@ func EnrollTwoFactorPost(ctx *context.Context, form auth.TwoFactorAuthForm) { ctx.Session.Delete("twofaSecret") ctx.Session.Delete("twofaUri") - ctx.Flash.Success(ctx.Tr("settings.twofa_enrolled", t.ScratchToken)) + ctx.Flash.Success(ctx.Tr("settings.twofa_enrolled", token)) ctx.Redirect(setting.AppSubURL + "/user/settings/security") } From eb6b85f1cc684beb6202f851ffb055596a6fe9f5 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 27 Jul 2018 12:55:56 +0000 Subject: [PATCH 149/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_uk-UA.ini | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index a9a2bc521b5f..51b05e7d218d 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -32,8 +32,16 @@ twofa_scratch=Двофакторний одноразовий пароль passcode=Код доступу u2f_insert_key=Вставте ключ безпеки +u2f_sign_in=Натисніть кнопку на вашому ключі безпеки. Якщо не вдається знайти кнопки, повторно вставте ключ. u2f_press_button=Будь ласка, натисніть кнопку на ключі захисту... u2f_use_twofa=Використовуйте дво-факторний код з вашого телефону +u2f_error=Не вдалося прочитати ваш ключ безпеки. +u2f_unsupported_browser=Ваш браузер не підтримує U2F ключі безпеки. +u2f_error_1=Сталася невідома помилка. Спробуйте ще раз. +u2f_error_2=Будь ласка, не забудьте використовувати правильний, шифрований (https://) URL. +u2f_error_3=Серверу не вдалося обробити ваш запит. +u2f_error_4=Пред'явлений ключ безпеки не підходить для цього запиту. Переконайтеся, що ключ ще не зареєстровано. +u2f_error_5=Тайм-аут досягнуто до того, як ваш ключ безпеки було прочитано. Перезавантажте сторінку та спробуйте ще раз. u2f_reload=Оновити repository=Репозиторій @@ -122,6 +130,7 @@ federated_avatar_lookup=Увімкнути федеративні аватари federated_avatar_lookup_popup=Увімкнути зовнішний Аватар за допомогою Libravatar. disable_registration=Вимкнути самостійну реєстрацію disable_registration_popup=Вимкнути самостійну реєстрацію користувачів, тільки адміністратор може створювати нові облікові записи. +allow_only_external_registration_popup=Дозволити реєстрацію тільки через сторонні сервіси openid_signin=Увімкнути реєстрацію за допомогою OpenID openid_signin_popup=Увімкнути вхід за допомогою OpenID. openid_signup=Увімкнути самостійну реєстрацію за допомогою OpenID @@ -194,6 +203,7 @@ sign_up_now=Потрібен обліковий запис? Зареєструй confirmation_mail_sent_prompt=Новий лист для підтвердження було відправлено на %s, будь ласка, перевірте вашу поштову скриньку протягом %s для завершення реєстрації. reset_password_mail_sent_prompt=Лист для підтвердження було відправлено на %s. Будь ласка, перевірте вашу поштову скриньку протягом %s для скидання пароля. active_your_account=Активувати обліковий запис +account_activated=Обліковий запис активовано prohibit_login=Вхід заборонений prohibit_login_desc=Вхід для вашого профілю був заборонений, будь ласка, зв'яжіться з адміністратором сайту. resent_limit_prompt=Вибачте, ви вже запросили активацію по електронній пошті нещодавно. Будь ласка, зачекайте 3 хвилини, а потім спробуйте ще раз. @@ -454,10 +464,13 @@ then_enter_passcode=І введіть пароль, який відобража passcode_invalid=Некоректний пароль. Спробуй ще раз. twofa_enrolled=Для вашого облікового запису було включена двофакторна автентифікація. Зберігайте свій scratch-токен (%s) у безпечному місці, оскільки він показується лише один раз! +u2f_desc=Ключами безпеки є апаратні пристрої що містять криптографічні ключі. Вони можуть бути використані для двофакторної автентифікації. Ключ безпеки повинен підтримувати стандарт FIDO U2F. +u2f_require_twofa=Для використання ключів безпеки ваш обліковий запис має використовувати двофакторну автентифікацію. u2f_register_key=Додати ключ безпеки u2f_nickname=Псевдонім u2f_press_button=Натисніть кнопку на ключі безпеки, щоб зареєструвати його. u2f_delete_key=Видалити ключ безпеки +u2f_delete_key_desc=Якщо ви видалите ключ безпеки, ви більше не зможете увійти за допомогою нього. Продовжити? manage_account_links=Керування обліковими записами manage_account_links_desc=Ці зовнішні акаунти прив'язані до вашого аккаунту Gitea. @@ -769,6 +782,7 @@ issues.due_date_added=додав(ла) дату завершення %s %s issues.due_date_modified=термін змінено з %s %s на %s issues.due_date_remove=видалив(ла) дату завершення %s %s issues.due_date_overdue=Прострочено +issues.due_date_invalid=Термін дії не дійсний або знаходиться за межами допустимого діапазону. Будь ласка використовуйте формат 'yyyy-mm-dd'. issues.dependency.title=Залежності issues.dependency.issue_no_dependencies=Ця проблема в даний час не має залежностей. issues.dependency.pr_no_dependencies=Цей запит на злиття в даний час не має залежностей. @@ -779,7 +793,10 @@ issues.dependency.added_dependency=
0%
[2]s д issues.dependency.removed_dependency=
0%
[2]s видалено залежність %[3]s' issues.dependency.issue_closing_blockedby=Закриття цього запиту на злиття заблокує наступні проблеми issues.dependency.pr_closing_blockedby=Закриття цієї проблеми заблокує наступні проблеми +issues.dependency.issue_close_blocks=Ця проблема блокує закриття залежних проблем +issues.dependency.issue_close_blocked=Вам потрібно закрити всі проблеми, що блокують цю проблему, перед її закриттям. issues.dependency.blocks_short=Блоки +issues.dependency.remove_header=Видалити залежність pulls.desc=Увімкнути запити на злиття та інтерфейс узгодження правок. pulls.new=Новий запит на злиття @@ -1167,6 +1184,7 @@ branch.protected_deletion_failed=Гілка '%s' захищена. Її не м topic.manage_topics=Керувати тематичними мітками topic.done=Готово +topic.count_prompt=Ви не можете вибрати більше 25 тем [org] org_name_holder=Назва організації From 0ca027853b91b9e6167b055ca63df9d70842cbfc Mon Sep 17 00:00:00 2001 From: SagePtr Date: Fri, 27 Jul 2018 21:11:24 +0200 Subject: [PATCH 150/447] Fix incorrect MergeWhitelistTeamIDs check in CanUserMerge function (#4519) (#4525) --- models/branches.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/branches.go b/models/branches.go index faa3ba6af855..ade5de8e0e93 100644 --- a/models/branches.go +++ b/models/branches.go @@ -74,7 +74,7 @@ func (protectBranch *ProtectedBranch) CanUserMerge(userID int64) bool { return true } - if len(protectBranch.WhitelistTeamIDs) == 0 { + if len(protectBranch.MergeWhitelistTeamIDs) == 0 { return false } From ae4bae74b80f3cbb8135662b1660f4d91c3375ec Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 27 Jul 2018 19:12:26 +0000 Subject: [PATCH 151/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 + options/locale/locale_fr-FR.ini | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 1082e53dcc12..14236fbe7271 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -203,6 +203,7 @@ sign_up_now=Noch kein Konto? Jetzt registrieren. confirmation_mail_sent_prompt=Eine neue Bestätigungs-E-Mail wurde an %s gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um die Registrierung abzuschließen. reset_password_mail_sent_prompt=Eine E-Mail wurde an %s gesendet. Bitte überprüfe dein Postfach innerhalb der nächsten %s, um das Passwort zurückzusetzen. active_your_account=Aktiviere dein Konto +account_activated=Konto wurde aktiviert prohibit_login=Anmelden verboten prohibit_login_desc=Dein Account wurde gesperrt, bitte wende dich an den Administrator. resent_limit_prompt=Du hast bereits eine Aktivierungs-E-Mail angefordert. Bitte warte 3 Minuten und probiere es dann nochmal. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 098ff005a13a..1fb9dc224fd2 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -32,8 +32,16 @@ twofa_scratch=Code de secours pour l'authentification à deux facteurs passcode=Code d'accès u2f_insert_key=Insérez votre clef de sécurité +u2f_sign_in=Appuyez sur le bouton de votre clef de sécurité. Si votre clef n'a pas de bouton, ré-insérez là. u2f_press_button=Veuillez appuyer sur le bouton de votre clef de sécurité… u2f_use_twofa=Utilisez l'authentification à deux facteurs avec votre téléphone +u2f_error=Impossible de lire votre clef de sécurité. +u2f_unsupported_browser=Votre navigateur ne supporte pas les clefs de sécurité U2F. +u2f_error_1=Une erreur inconnue s'est produite. Veuillez réessayer. +u2f_error_2=Veuillez vous assurer d'utiliser l'URL correcte et chiffrée (https://). +u2f_error_3=Le serveur n'a pas pu traiter votre demande. +u2f_error_4=Cette clef de sécurité n'est pas autorisée pour cette requête. Veuillez vous assurer que la clef n'est pas déjà enregistrée. +u2f_error_5=Le délai d'attente imparti a été atteint avant que votre clef ne puisse être lue. Veuillez recharger la page pour réessayer. u2f_reload=Recharger repository=Dépôt @@ -67,6 +75,7 @@ cancel=Annuler [install] install=Installation title=Configuration initiale +docker_helper=Si vous exécutez Gitea dans Docker, veuillez lire la documentation avant de modifier les paramètres. requite_db_desc=Gitea requiert MySQL, PostgreSQL, MSSQL, SQLite3 ou TiDB. db_title=Paramètres de la base de données db_type=Type de base de données @@ -121,6 +130,7 @@ federated_avatar_lookup=Activer les avatars unifiés federated_avatar_lookup_popup=Activer la recherche unifiée d'avatars en utilisant le service open source unifié basé sur libravatar. disable_registration=Désactiver le formulaire d'inscription disable_registration_popup=Désactiver les nouvelles inscriptions. Seuls les administrateurs pourront créer de nouveaux comptes utilisateurs. +allow_only_external_registration_popup=N'autoriser l'inscription qu'à partir des services externes openid_signin=Activer l'inscription OpenID openid_signin_popup=Activer l'authentification via OpenID. openid_signup=Activer l'inscription OpenID @@ -193,6 +203,7 @@ sign_up_now=Pas de compte ? Inscrivez-vous maintenant. confirmation_mail_sent_prompt=Un nouveau mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour valider votre enregistrement. reset_password_mail_sent_prompt=Un mail de confirmation a été envoyé à %s. Veuillez vérifier votre boîte de réception dans les prochaines %s pour terminer la réinitialisation du mot de passe. active_your_account=Activer votre compte +account_activated=Le compte a été activé prohibit_login=Connexion interdite prohibit_login_desc=Votre compte n'est pas autorisé à se connecter, contactez l’administrateur du site. resent_limit_prompt=Désolé, vous avez récemment demandé un e-mail d'activation. Veuillez réessayer dans 3 minutes. @@ -453,10 +464,13 @@ then_enter_passcode=Et entrez le mot de passe s'affichant dans l'application : passcode_invalid=Le mot de passe est invalide. Réessayez. twofa_enrolled=L'authentification à deux facteurs a été activée pour votre compte. Gardez votre jeton de secours (%s) en lieu sûr car il ne vous sera montré qu'une seule fois ! +u2f_desc=Les clefs de sécurité sont des dispositifs matériels contenant des clefs cryptographiques. Elles peuvent être utilisées pour l'authentification à deux facteurs. La clef de sécurité doit supporter le standard FIDO U2F. +u2f_require_twofa=L'authentification à deux facteurs doit être activée pour votre compte afin d’utiliser des clés de sécurité. u2f_register_key=Ajouter une clef de sécurité u2f_nickname=Pseudonyme u2f_press_button=Appuyer sur le bouton de votre clef de sécurité pour l'enregistrer. u2f_delete_key=Supprimer une clef de sécurité +u2f_delete_key_desc=Si vous retirez une clef de sécurité vous ne pourrez plus l'utiliser pour vous connecter. Continuer ? manage_account_links=Gérer les comptes liés manage_account_links_desc=Ces comptes externes sont liés à votre compte Gitea. @@ -479,8 +493,13 @@ owner=Propriétaire repo_name=Nom du dépôt repo_name_helper=Idéalement, le nom d'un dépôt devrait être court, mémorisable et unique. visibility=Visibilité +visibility_helper=Rendre le dépôt privé +visibility_helper_forced=L'administrateur de votre serveur impose que les nouveaux dépôts soient privés. +visibility_fork_helper=(Changer ceci affectera toutes les bifurcations.) +clone_helper=Besoin d'aide pour dupliquer ? Visitez l'aide. fork_repo=Créer une bifurcation du dépôt fork_from=Bifurquer depuis +fork_visibility_helper=La visibilité d'un dépôt bifurqué ne peut pas être modifiée. repo_desc=Description repo_lang=Langue repo_gitignore_helper=Choisissez un modèle de fichier .gitignore. @@ -595,6 +614,7 @@ editor.directory_is_a_file=Le nom de dossier '%s' est déjà utilisé comme nom editor.file_is_a_symlink='%s' est un lien symbolique. Les liens symboliques ne peuvent être édités dans l'interface web editor.filename_is_a_directory=Le nom de fichier '%s' est déjà utilisé comme nom de dossier dans ce dépôt. editor.file_editing_no_longer_exists=Le fichier en cours d'édition, '%s', n'existe plus dans ce dépôt. +editor.file_changed_while_editing=Le contenu du fichier a changé depuis que vous avez commencé à éditer. Cliquez ici pour voir les changements ou soumettez de nouveau pour les écraser. editor.file_already_exists=Un fichier nommé '%s' existe déjà dans ce dépôt. editor.no_changes_to_show=Il n’y a aucun changement à afficher. editor.fail_to_update_file=Échec lors de la mise à jour/création du fichier '%s' avec l’erreur : %v @@ -631,6 +651,7 @@ issues.new.open_milestone=Ouvrir un jalon issues.new.closed_milestone=Jalons fermés issues.new.assignees=Affecté à issues.new.clear_assignees=Supprimer les affectations +issues.new.no_assignees=Pas d'assignataires issues.no_ref=Aucune branche/tag spécifiés issues.create=Créer un ticket issues.new_label=Nouvelle étiquette @@ -761,6 +782,16 @@ issues.due_date_added=a ajouté l'échéance %s %s issues.due_date_modified=a modifié l'échéance de %[2]s vers %[1]s %[3]s issues.due_date_remove=a supprimé l'échéance %s %s issues.due_date_overdue=En retard +issues.due_date_invalid=La date d’échéance est invalide ou hors plage. Veuillez utiliser le format 'aaaa-mm-dd'. +issues.dependency.title=Dépendances +issues.dependency.issue_no_dependencies=Ce ticket n'a actuellement pas de dépendance. +issues.dependency.pr_no_dependencies=La demande de fusion n'a actuellement pas de dépendance. +issues.dependency.add=Ajouter une dépendance... +issues.dependency.cancel=Annuler +issues.dependency.remove=Supprimer +issues.dependency.added_dependency=%[2]s a ajouté une nouvelle dépendance %[3]s` +issues.dependency.removed_dependency=%[2]s a retiré une dépendance %[3]s` +issues.dependency.blocked_by_short=Dépend de pulls.desc=Activer les demandes de fusion et la revue de code. pulls.new=Nouvelle demande d'ajout @@ -974,6 +1005,7 @@ settings.search_user_placeholder=Rechercher un utilisateur… settings.org_not_allowed_to_be_collaborator=Les organisations ne peuvent être ajoutées en tant que collaborateur. settings.user_is_org_member=L'utilisateur est un membre d'organisation qui ne peut être ajouté comme collaborateur. settings.add_webhook=Ajouter un déclencheur Web +settings.hooks_desc=Les Webhooks font automatiquement des requêtes HTTP POST à un serveur lorsque certains événements Gitea se déclenchent. Lire la suite dans le guide des Webhooks. settings.webhook_deletion=Retirer le Webhook settings.webhook_deletion_desc=Supprimer un webhook supprime ses paramètres et son historique. Continuer ? settings.webhook_deletion_success=Le webhook a été supprimé. @@ -990,6 +1022,7 @@ settings.githook_edit_desc=Si un Hook est inactif, un exemple de contenu vous se settings.githook_name=Nom du Hook settings.githook_content=Contenu du Hook settings.update_githook=Mettre le Hook à jour +settings.add_webhook_desc=Gitea enverra à l'URL cible des requêtes POSTavec un type de contenu spécifié. Lire la suite dans le guide des Webhooks. settings.payload_url=URL cible settings.content_type=Type de contenu POST settings.secret=Confidentiel @@ -1075,6 +1108,7 @@ settings.protected_branch_deletion_desc=Désactiver la protection de branche per settings.default_branch_desc=Sélectionnez une branche par défaut pour les demandes de fusion et les révisions : settings.choose_branch=Choisissez une branche… settings.no_protected_branch=Il n'y a pas de branche protégée. +settings.edit_protected_branch=Éditer diff.browse_source=Parcourir la source diff.parent=Parent @@ -1145,6 +1179,8 @@ branch.protected_deletion_failed=La branche '%s' est protégé. Il ne peut pas topic.manage_topics=Gérer les sujets topic.done=Terminé +topic.count_prompt=Vous ne pouvez pas sélectionner plus de 25 sujets +topic.format_prompt=Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères. [org] org_name_holder=Nom de l'organisation @@ -1249,6 +1285,8 @@ dashboard.operation_switch=Basculer dashboard.operation_run=Exécuter dashboard.clean_unbind_oauth=Effacer les connexions OAuth associées dashboard.clean_unbind_oauth_success=Toutes les connexions OAuth associées ont été supprimées. +dashboard.delete_inactivate_accounts=Supprimer tous les comptes non-activés +dashboard.delete_inactivate_accounts_success=Tous les comptes non activés ont été supprimés. dashboard.delete_repo_archives=Supprimer toutes les archives du dépôt dashboard.delete_repo_archives_success=Toutes les archives du dépôt ont été supprimées. dashboard.delete_missing_repos=Supprimer tous les dépôts dont les fichiers Git sont manquants @@ -1456,6 +1494,7 @@ config.db_path=Emplacement config.service_config=Configuration du service config.register_email_confirm=Exiger la confirmation de l'e-mail lors de l'inscription config.disable_register=Désactiver le formulaire d'inscription +config.allow_only_external_registration=N'autoriser l'inscription qu'à partir des services externes config.enable_openid_signup=Activer l'inscription avec OpenID config.enable_openid_signin=Activer la connexion avec OpenID config.show_registration_button=Afficher le bouton d'enregistrement From fe09a0d561c8990f2d584a192e9b1f9c1374059e Mon Sep 17 00:00:00 2001 From: Piotr Orzechowski Date: Sat, 28 Jul 2018 02:19:01 +0200 Subject: [PATCH 152/447] Swagger.v1.json template (#3572) * Turn swagger.v1.json into template * Rename ENABLE_SWAGGER_ENDPOINT option to ENABLE_SWAGGER --- Makefile | 13 +++++++++--- custom/conf/app.ini.sample | 4 ++-- docs/.gitignore | 1 + modules/context/context.go | 2 +- modules/setting/setting.go | 8 +++---- modules/templates/dynamic.go | 16 ++++++++++++-- modules/templates/static.go | 21 ++++++++++++++++--- routers/api/v1/api.go | 4 ++-- routers/api/v1/misc/swagger.go | 2 +- routers/routes/routes.go | 6 +++++- routers/swagger_json.go | 14 +++++++++++++ templates/base/footer.tmpl | 2 +- templates/{swagger.tmpl => swagger/ui.tmpl} | 0 .../swagger/v1_json.tmpl | 2 +- 14 files changed, 74 insertions(+), 21 deletions(-) create mode 100644 routers/swagger_json.go rename templates/{swagger.tmpl => swagger/ui.tmpl} (100%) rename public/swagger.v1.json => templates/swagger/v1_json.tmpl (99%) diff --git a/Makefile b/Makefile index 256e872adc7c..4eb5873e4214 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,10 @@ TAGS ?= TMPDIR := $(shell mktemp -d 2>/dev/null || mktemp -d -t 'gitea-temp') +SWAGGER_SPEC := templates/swagger/v1_json.tmpl +SWAGGER_SPEC_S_TMPL := s|"basePath":\s*"/api/v1"|"basePath": "{{AppSubUrl}}/api/v1"|g +SWAGGER_SPEC_S_JSON := s|"basePath":\s*"{{AppSubUrl}}/api/v1"|"basePath": "/api/v1"|g + TEST_MYSQL_HOST ?= mysql:3306 TEST_MYSQL_DBNAME ?= testgitea TEST_MYSQL_USERNAME ?= root @@ -94,11 +98,12 @@ generate-swagger: @hash swagger > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ $(GO) get -u github.com/go-swagger/go-swagger/cmd/swagger; \ fi - swagger generate spec -o ./public/swagger.v1.json + swagger generate spec -o './$(SWAGGER_SPEC)' + $(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)' .PHONY: swagger-check swagger-check: generate-swagger - @diff=$$(git diff public/swagger.v1.json); \ + @diff=$$(git diff '$(SWAGGER_SPEC)'); \ if [ -n "$$diff" ]; then \ echo "Please run 'make generate-swagger' and commit the result:"; \ echo "$${diff}"; \ @@ -110,7 +115,9 @@ swagger-validate: @hash swagger > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ $(GO) get -u github.com/go-swagger/go-swagger/cmd/swagger; \ fi - swagger validate ./public/swagger.v1.json + $(SED_INPLACE) '$(SWAGGER_SPEC_S_JSON)' './$(SWAGGER_SPEC)' + swagger validate './$(SWAGGER_SPEC)' + $(SED_INPLACE) '$(SWAGGER_SPEC_S_TMPL)' './$(SWAGGER_SPEC)' .PHONY: errcheck errcheck: diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 12e50e8cb770..97a0eac02c53 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -581,8 +581,8 @@ DEFAULT_INTERVAL = 8h MIN_INTERVAL = 10m [api] -; Enables /api/swagger, /api/v1/swagger etc. endpoints. True or false; default is true. -ENABLE_SWAGGER_ENDPOINT = true +; Enables Swagger. True or false; default is true. +ENABLE_SWAGGER = true ; Max number of items in a page MAX_RESPONSE_ITEMS = 50 diff --git a/docs/.gitignore b/docs/.gitignore index a6dcbcccb5d1..55ec469a426c 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,2 +1,3 @@ public/ +templates/swagger/v1_json.tmpl themes/ diff --git a/modules/context/context.go b/modules/context/context.go index 7f9193f82110..a8318736530a 100644 --- a/modules/context/context.go +++ b/modules/context/context.go @@ -264,7 +264,7 @@ func Contexter() macaron.Handler { ctx.Data["ShowRegistrationButton"] = setting.Service.ShowRegistrationButton ctx.Data["ShowFooterBranding"] = setting.ShowFooterBranding ctx.Data["ShowFooterVersion"] = setting.ShowFooterVersion - ctx.Data["EnableSwaggerEndpoint"] = setting.API.EnableSwaggerEndpoint + ctx.Data["EnableSwagger"] = setting.API.EnableSwagger ctx.Data["EnableOpenIDSignIn"] = setting.Service.EnableOpenIDSignIn c.Map(ctx) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 396dec2546bb..1b9919404cfe 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -527,11 +527,11 @@ var ( // API settings API = struct { - EnableSwaggerEndpoint bool - MaxResponseItems int + EnableSwagger bool + MaxResponseItems int }{ - EnableSwaggerEndpoint: true, - MaxResponseItems: 50, + EnableSwagger: true, + MaxResponseItems: 50, } U2F = struct { diff --git a/modules/templates/dynamic.go b/modules/templates/dynamic.go index c127b6947080..d70a465c1cda 100644 --- a/modules/templates/dynamic.go +++ b/modules/templates/dynamic.go @@ -22,8 +22,8 @@ var ( templates = template.New("") ) -// Renderer implements the macaron handler for serving the templates. -func Renderer() macaron.Handler { +// HTMLRenderer implements the macaron handler for serving HTML templates. +func HTMLRenderer() macaron.Handler { return macaron.Renderer(macaron.RenderOptions{ Funcs: NewFuncMap(), Directory: path.Join(setting.StaticRootPath, "templates"), @@ -33,6 +33,18 @@ func Renderer() macaron.Handler { }) } +// JSONRenderer implements the macaron handler for serving JSON templates. +func JSONRenderer() macaron.Handler { + return macaron.Renderer(macaron.RenderOptions{ + Funcs: NewFuncMap(), + Directory: path.Join(setting.StaticRootPath, "templates"), + AppendDirectories: []string{ + path.Join(setting.CustomPath, "templates"), + }, + HTMLContentType: "application/json", + }) +} + // Mailer provides the templates required for sending notification mails. func Mailer() *template.Template { for _, funcs := range NewFuncMap() { diff --git a/modules/templates/static.go b/modules/templates/static.go index 65b82053fd92..c16b18cc0883 100644 --- a/modules/templates/static.go +++ b/modules/templates/static.go @@ -43,8 +43,7 @@ func (templates templateFileSystem) Get(name string) (io.Reader, error) { return nil, fmt.Errorf("file '%s' not found", name) } -// Renderer implements the macaron handler for serving the templates. -func Renderer() macaron.Handler { +func NewTemplateFileSystem() templateFileSystem { fs := templateFileSystem{} fs.files = make([]macaron.TemplateFile, 0, 10) @@ -110,9 +109,25 @@ func Renderer() macaron.Handler { } } + return fs +} + +var tplFileSys = NewTemplateFileSystem() + +// HTMLRenderer implements the macaron handler for serving HTML templates. +func HTMLRenderer() macaron.Handler { + return macaron.Renderer(macaron.RenderOptions{ + Funcs: NewFuncMap(), + TemplateFileSystem: tplFileSys, + }) +} + +// JSONRenderer implements the macaron handler for serving JSON templates. +func JSONRenderer() macaron.Handler { return macaron.Renderer(macaron.RenderOptions{ Funcs: NewFuncMap(), - TemplateFileSystem: fs, + TemplateFileSystem: tplFileSys, + HTMLContentType: "application/json", }) } diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 9f7ecf76493a..32ebc79e5211 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -278,13 +278,13 @@ func mustAllowPulls(ctx *context.Context) { func RegisterRoutes(m *macaron.Macaron) { bind := binding.Bind - if setting.API.EnableSwaggerEndpoint { + if setting.API.EnableSwagger { m.Get("/swagger", misc.Swagger) //Render V1 by default } m.Group("/v1", func() { // Miscellaneous - if setting.API.EnableSwaggerEndpoint { + if setting.API.EnableSwagger { m.Get("/swagger", misc.Swagger) } m.Get("/version", misc.Version) diff --git a/routers/api/v1/misc/swagger.go b/routers/api/v1/misc/swagger.go index 0599f85154ae..e17b77522769 100644 --- a/routers/api/v1/misc/swagger.go +++ b/routers/api/v1/misc/swagger.go @@ -10,7 +10,7 @@ import ( ) // tplSwagger swagger page template -const tplSwagger base.TplName = "swagger" +const tplSwagger base.TplName = "swagger/ui" // Swagger render swagger-ui page with v1 json func Swagger(ctx *context.Context) { diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 3eaaff60b6a5..8c196d8bb23f 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -79,7 +79,7 @@ func NewMacaron() *macaron.Macaron { }, )) - m.Use(templates.Renderer()) + m.Use(templates.HTMLRenderer()) models.InitMailRender(templates.Mailer()) localeNames, err := options.Dir("locale") @@ -755,6 +755,10 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/purge", user.NotificationPurgePost) }, reqSignIn) + if setting.API.EnableSwagger { + m.Get("/swagger.v1.json", templates.JSONRenderer(), routers.SwaggerV1Json) + } + m.Group("/api", func() { apiv1.RegisterRoutes(m) }, ignSignIn) diff --git a/routers/swagger_json.go b/routers/swagger_json.go new file mode 100644 index 000000000000..896f1afa2af7 --- /dev/null +++ b/routers/swagger_json.go @@ -0,0 +1,14 @@ +package routers + +import ( + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/context" +) + +// tplSwaggerV1Json swagger v1 json template +const tplSwaggerV1Json base.TplName = "swagger/v1_json" + +// SwaggerV1Json render swagger v1 json +func SwaggerV1Json(ctx *context.Context) { + ctx.HTML(200, tplSwaggerV1Json) +} diff --git a/templates/base/footer.tmpl b/templates/base/footer.tmpl index a23ae57303c5..26ba3421fdd7 100644 --- a/templates/base/footer.tmpl +++ b/templates/base/footer.tmpl @@ -29,7 +29,7 @@
JavaScript licenses - {{if .EnableSwaggerEndpoint}}API{{end}} + {{if .EnableSwagger}}API{{end}} {{.i18n.Tr "website"}} {{if (or .ShowFooterVersion .PageIsAdmin)}}{{GoVer}}{{end}}
diff --git a/templates/swagger.tmpl b/templates/swagger/ui.tmpl similarity index 100% rename from templates/swagger.tmpl rename to templates/swagger/ui.tmpl diff --git a/public/swagger.v1.json b/templates/swagger/v1_json.tmpl similarity index 99% rename from public/swagger.v1.json rename to templates/swagger/v1_json.tmpl index 8ce6488cb35b..c1026904ee53 100644 --- a/public/swagger.v1.json +++ b/templates/swagger/v1_json.tmpl @@ -21,7 +21,7 @@ }, "version": "1.1.1" }, - "basePath": "/api/v1", + "basePath": "{{AppSubUrl}}/api/v1", "paths": { "/admin/users": { "post": { From 866af03c17e793f2364ad2469ba435033eac4071 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Mon, 30 Jul 2018 02:04:24 -0400 Subject: [PATCH 153/447] Update jQuery to v1.12.4 (#4551) Fix #4384 --- public/vendor/VERSIONS | 2 +- public/vendor/librejs.html | 2 +- public/vendor/plugins/jquery/jquery.min.js | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/public/vendor/VERSIONS b/public/vendor/VERSIONS index 991a3e9d2278..38355b5217fe 100644 --- a/public/vendor/VERSIONS +++ b/public/vendor/VERSIONS @@ -6,7 +6,7 @@ File(s): /vendor/plugins/jquery.areyousure/jquery.are-you-sure.js Version: 1.9.0 File(s): /vendor/plugins/jquery/jquery.min.js -Version: 1.11.3 +Version: 1.12.4 File(s): /vendor/plugins/semantic/semantic.min.js Version: 2.3.1 diff --git a/public/vendor/librejs.html b/public/vendor/librejs.html index 9b0363875f9d..f34cc2b8ade0 100644 --- a/public/vendor/librejs.html +++ b/public/vendor/librejs.html @@ -18,7 +18,7 @@ jquery.min.js Expat - jquery-1.11.3.min.js + jquery-1.12.4.min.js semantic.min.js diff --git a/public/vendor/plugins/jquery/jquery.min.js b/public/vendor/plugins/jquery/jquery.min.js index 0f60b7bd0d9c..e836475870da 100644 --- a/public/vendor/plugins/jquery/jquery.min.js +++ b/public/vendor/plugins/jquery/jquery.min.js @@ -1,5 +1,5 @@ -/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; - -return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m(" {{else}} From 56c8314ef7cc182ee93ae1bd1e7d1b88a8b4a04a Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 30 Oct 2018 03:08:04 +0000 Subject: [PATCH 383/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ja-JP.ini | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index f47731291d81..9adc6efd6d88 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -229,6 +229,12 @@ twofa_passcode_incorrect=パスコードが正しくありません。デバイ twofa_scratch_token_incorrect=スクラッチコードが正しくありません。 login_userpass=サインイン login_openid=OpenID +oauth_signup_tab=新規アカウント登録 +oauth_signup_title=メールアドレスとパスワードの追加 (アカウント復旧用) +oauth_signup_submit=アカウント登録完了 +oauth_signin_tab=既存アカウントにリンク +oauth_signin_title=サインインしてリンク先アカウントを認可 +oauth_signin_submit=アカウントにリンク openid_connect_submit=接続 openid_connect_title=既存のアカウントに接続 openid_connect_desc=選択したOpenID URIは未登録です。 ここで新しいアカウントと関連付けます。 From c93f12cd88e9729d36e0a9e0106a7c33bc8fe6ce Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 30 Oct 2018 07:20:13 +0100 Subject: [PATCH 384/447] Make gitea serv use api/internal (#4886) * Start to move to internal/private * Add GetPublicKeyByID * Add HasDeployKey * Add private.UpdateDeployKeyUpdated * Add private.GetUserByKeyID * Add private.AccessLevel * Add private.CheckUnitUser * Fix mistakes I made * Some cleaning + moving code to separate files * Fix error handling * Remove useless error handling for setup * lint: fix comment on exported func * fix copyright header * Fix order of args --- cmd/serv.go | 55 +++++++---------- modules/private/branch.go | 2 +- modules/private/internal.go | 67 +++++++++++++++++---- modules/private/key.go | 116 ++++++++++++++++++++++++++++++++++++ routers/private/internal.go | 58 ++++++++++++++++-- routers/private/key.go | 84 ++++++++++++++++++++++++++ 6 files changed, 331 insertions(+), 51 deletions(-) create mode 100644 modules/private/key.go create mode 100644 routers/private/key.go diff --git a/cmd/serv.go b/cmd/serv.go index b532b95494e5..ca042e2b2b70 100644 --- a/cmd/serv.go +++ b/cmd/serv.go @@ -19,7 +19,6 @@ import ( "code.gitea.io/gitea/modules/pprof" "code.gitea.io/gitea/modules/private" "code.gitea.io/gitea/modules/setting" - "code.gitea.io/gitea/modules/util" "github.com/Unknwon/com" "github.com/dgrijalva/jwt-go" @@ -49,20 +48,9 @@ var CmdServ = cli.Command{ }, } -func setup(logPath string) error { +func setup(logPath string) { setting.NewContext() log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) - models.LoadConfigs() - - if setting.UseSQLite3 || setting.UseTiDB { - workPath := setting.AppWorkPath - if err := os.Chdir(workPath); err != nil { - log.GitLogger.Fatal(4, "Failed to change directory %s: %v", workPath, err) - } - } - - setting.NewXORMLogService(true) - return models.SetEngine() } func parseCmd(cmd string) (string, string) { @@ -101,10 +89,7 @@ func runServ(c *cli.Context) error { if c.IsSet("config") { setting.CustomConf = c.String("config") } - - if err := setup("serv.log"); err != nil { - fail("System init failed", fmt.Sprintf("setup: %v", err)) - } + setup("serv.log") if setting.SSH.Disabled { println("Gitea: SSH has been disabled") @@ -175,9 +160,9 @@ func runServ(c *cli.Context) error { } os.Setenv(models.EnvRepoName, reponame) - repo, err := models.GetRepositoryByOwnerAndName(username, reponame) + repo, err := private.GetRepositoryByOwnerAndName(username, reponame) if err != nil { - if models.IsErrRepoNotExist(err) { + if strings.Contains(err.Error(), "Failed to get repository: repository does not exist") { fail(accessDenied, "Repository does not exist: %s/%s", username, reponame) } fail("Internal error", "Failed to get repository: %v", err) @@ -214,7 +199,7 @@ func runServ(c *cli.Context) error { fail("Key ID format error", "Invalid key argument: %s", c.Args()[0]) } - key, err := models.GetPublicKeyByID(com.StrTo(keys[1]).MustInt64()) + key, err := private.GetPublicKeyByID(com.StrTo(keys[1]).MustInt64()) if err != nil { fail("Invalid key ID", "Invalid key ID[%s]: %v", c.Args()[0], err) } @@ -225,23 +210,22 @@ func runServ(c *cli.Context) error { if key.Mode < requestedMode { fail("Key permission denied", "Cannot push with deployment key: %d", key.ID) } + // Check if this deploy key belongs to current repository. - if !models.HasDeployKey(key.ID, repo.ID) { + has, err := private.HasDeployKey(key.ID, repo.ID) + if err != nil { + fail("Key access denied", "Failed to access internal api: [key_id: %d, repo_id: %d]", key.ID, repo.ID) + } + if !has { fail("Key access denied", "Deploy key access denied: [key_id: %d, repo_id: %d]", key.ID, repo.ID) } // Update deploy key activity. - deployKey, err := models.GetDeployKeyByRepo(key.ID, repo.ID) - if err != nil { - fail("Internal error", "GetDeployKey: %v", err) - } - - deployKey.UpdatedUnix = util.TimeStampNow() - if err = models.UpdateDeployKeyCols(deployKey, "updated_unix"); err != nil { + if err = private.UpdateDeployKeyUpdated(key.ID, repo.ID); err != nil { fail("Internal error", "UpdateDeployKey: %v", err) } } else { - user, err = models.GetUserByKeyID(key.ID) + user, err = private.GetUserByKeyID(key.ID) if err != nil { fail("internal error", "Failed to get user by key ID(%d): %v", keyID, err) } @@ -252,12 +236,12 @@ func runServ(c *cli.Context) error { user.Name, repoPath) } - mode, err := models.AccessLevel(user.ID, repo) + mode, err := private.AccessLevel(user.ID, repo.ID) if err != nil { fail("Internal error", "Failed to check access: %v", err) - } else if mode < requestedMode { + } else if *mode < requestedMode { clientMessage := accessDenied - if mode >= models.AccessModeRead { + if *mode >= models.AccessModeRead { clientMessage = "You do not have sufficient authorization for this action" } fail(clientMessage, @@ -265,7 +249,11 @@ func runServ(c *cli.Context) error { user.Name, requestedMode, repoPath) } - if !repo.CheckUnitUser(user.ID, user.IsAdmin, unitType) { + check, err := private.CheckUnitUser(user.ID, repo.ID, user.IsAdmin, unitType) + if err != nil { + fail("You do not have allowed for this action", "Failed to access internal api: [user.Name: %s, repoPath: %s]", user.Name, repoPath) + } + if !check { fail("You do not have allowed for this action", "User %s does not have allowed access to repository %s 's code", user.Name, repoPath) @@ -325,7 +313,6 @@ func runServ(c *cli.Context) error { } else { gitcmd = exec.Command(verb, repoPath) } - if isWiki { if err = repo.InitWiki(); err != nil { fail("Internal error", "Failed to init wiki repo: %v", err) diff --git a/modules/private/branch.go b/modules/private/branch.go index fed66d29ffb3..cadbf6c88c2a 100644 --- a/modules/private/branch.go +++ b/modules/private/branch.go @@ -33,7 +33,7 @@ func GetProtectedBranchBy(repoID int64, branchName string) (*models.ProtectedBra // All 2XX status codes are accepted and others will return an error if resp.StatusCode/100 != 2 { - return nil, fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + return nil, fmt.Errorf("Failed to get protected branch: %s", decodeJSONError(resp).Err) } return &branch, nil diff --git a/modules/private/internal.go b/modules/private/internal.go index ac2fe56b871e..f4ac1c515a4b 100644 --- a/modules/private/internal.go +++ b/modules/private/internal.go @@ -11,6 +11,7 @@ import ( "net" "net/http" + "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/httplib" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" @@ -49,22 +50,66 @@ func newInternalRequest(url, method string) *httplib.Request { return req } -// UpdatePublicKeyUpdated update publick key updates -func UpdatePublicKeyUpdated(keyID int64) error { - // Ask for running deliver hook and test pull request tasks. - reqURL := setting.LocalURL + fmt.Sprintf("api/internal/ssh/%d/update", keyID) - log.GitLogger.Trace("UpdatePublicKeyUpdated: %s", reqURL) +// CheckUnitUser check whether user could visit the unit of this repository +func CheckUnitUser(userID, repoID int64, isAdmin bool, unitType models.UnitType) (bool, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repositories/%d/user/%d/checkunituser?isAdmin=%t&unitType=%d", repoID, userID, isAdmin, unitType) + log.GitLogger.Trace("AccessLevel: %s", reqURL) - resp, err := newInternalRequest(reqURL, "POST").Response() + resp, err := newInternalRequest(reqURL, "GET").Response() if err != nil { - return err + return false, err } + defer resp.Body.Close() + + if resp.StatusCode == 200 { + return true, nil + } + return false, nil +} + +// AccessLevel returns the Access a user has to a repository. Will return NoneAccess if the +// user does not have access. +func AccessLevel(userID, repoID int64) (*models.AccessMode, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repositories/%d/user/%d/accesslevel", repoID, userID) + log.GitLogger.Trace("AccessLevel: %s", reqURL) + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, err + } defer resp.Body.Close() - // All 2XX status codes are accepted and others will return an error - if resp.StatusCode/100 != 2 { - return fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + if resp.StatusCode != 200 { + return nil, fmt.Errorf("Failed to get user access level: %s", decodeJSONError(resp).Err) + } + + var a models.AccessMode + if err := json.NewDecoder(resp.Body).Decode(&a); err != nil { + return nil, err } - return nil + + return &a, nil +} + +// GetRepositoryByOwnerAndName returns the repository by given ownername and reponame. +func GetRepositoryByOwnerAndName(ownerName, repoName string) (*models.Repository, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repo/%s/%s", ownerName, repoName) + log.GitLogger.Trace("GetRepositoryByOwnerAndName: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("Failed to get repository: %s", decodeJSONError(resp).Err) + } + + var repo models.Repository + if err := json.NewDecoder(resp.Body).Decode(&repo); err != nil { + return nil, err + } + + return &repo, nil } diff --git a/modules/private/key.go b/modules/private/key.go new file mode 100644 index 000000000000..86d0a730d16c --- /dev/null +++ b/modules/private/key.go @@ -0,0 +1,116 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "encoding/json" + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" +) + +// UpdateDeployKeyUpdated update deploy key updates +func UpdateDeployKeyUpdated(keyID int64, repoID int64) error { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repositories/%d/keys/%d/update", repoID, keyID) + log.GitLogger.Trace("UpdateDeployKeyUpdated: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "POST").Response() + if err != nil { + return err + } + + defer resp.Body.Close() + + // All 2XX status codes are accepted and others will return an error + if resp.StatusCode/100 != 2 { + return fmt.Errorf("Failed to update deploy key: %s", decodeJSONError(resp).Err) + } + return nil +} + +// HasDeployKey check if repo has deploy key +func HasDeployKey(keyID, repoID int64) (bool, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/repositories/%d/has-keys/%d", repoID, keyID) + log.GitLogger.Trace("HasDeployKey: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return false, err + } + defer resp.Body.Close() + + if resp.StatusCode == 200 { + return true, nil + } + return false, nil +} + +// GetPublicKeyByID get public ssh key by his ID +func GetPublicKeyByID(keyID int64) (*models.PublicKey, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/ssh/%d", keyID) + log.GitLogger.Trace("GetPublicKeyByID: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("Failed to get repository: %s", decodeJSONError(resp).Err) + } + + var pKey models.PublicKey + if err := json.NewDecoder(resp.Body).Decode(&pKey); err != nil { + return nil, err + } + return &pKey, nil +} + +// GetUserByKeyID get user attached to key +func GetUserByKeyID(keyID int64) (*models.User, error) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/ssh/%d/user", keyID) + log.GitLogger.Trace("GetUserByKeyID: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("Failed to get user: %s", decodeJSONError(resp).Err) + } + + var user models.User + if err := json.NewDecoder(resp.Body).Decode(&user); err != nil { + return nil, err + } + + return &user, nil +} + +// UpdatePublicKeyUpdated update public key updates +func UpdatePublicKeyUpdated(keyID int64) error { + // Ask for running deliver hook and test pull request tasks. + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/ssh/%d/update", keyID) + log.GitLogger.Trace("UpdatePublicKeyUpdated: %s", reqURL) + + resp, err := newInternalRequest(reqURL, "POST").Response() + if err != nil { + return err + } + + defer resp.Body.Close() + + // All 2XX status codes are accepted and others will return an error + if resp.StatusCode/100 != 2 { + return fmt.Errorf("Failed to update public key: %s", decodeJSONError(resp).Err) + } + return nil +} diff --git a/routers/private/internal.go b/routers/private/internal.go index 96021d8feb7a..23e0122642b3 100644 --- a/routers/private/internal.go +++ b/routers/private/internal.go @@ -23,26 +23,74 @@ func CheckInternalToken(ctx *macaron.Context) { } } -// UpdatePublicKey update publick key updates -func UpdatePublicKey(ctx *macaron.Context) { - keyID := ctx.ParamsInt64(":id") - if err := models.UpdatePublicKeyUpdated(keyID); err != nil { +//GetRepositoryByOwnerAndName chainload to models.GetRepositoryByOwnerAndName +func GetRepositoryByOwnerAndName(ctx *macaron.Context) { + //TODO use repo.Get(ctx *context.APIContext) ? + ownerName := ctx.Params(":owner") + repoName := ctx.Params(":repo") + repo, err := models.GetRepositoryByOwnerAndName(ownerName, repoName) + if err != nil { ctx.JSON(500, map[string]interface{}{ "err": err.Error(), }) return } + ctx.JSON(200, repo) +} + +//AccessLevel chainload to models.AccessLevel +func AccessLevel(ctx *macaron.Context) { + repoID := ctx.ParamsInt64(":repoid") + userID := ctx.ParamsInt64(":userid") + repo, err := models.GetRepositoryByID(repoID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + al, err := models.AccessLevel(userID, repo) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + ctx.JSON(200, al) +} - ctx.PlainText(200, []byte("success")) +//CheckUnitUser chainload to models.CheckUnitUser +func CheckUnitUser(ctx *macaron.Context) { + repoID := ctx.ParamsInt64(":repoid") + userID := ctx.ParamsInt64(":userid") + repo, err := models.GetRepositoryByID(repoID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + if repo.CheckUnitUser(userID, ctx.QueryBool("isAdmin"), models.UnitType(ctx.QueryInt("unitType"))) { + ctx.PlainText(200, []byte("success")) + return + } + ctx.PlainText(404, []byte("no access")) } // RegisterRoutes registers all internal APIs routes to web application. // These APIs will be invoked by internal commands for example `gitea serv` and etc. func RegisterRoutes(m *macaron.Macaron) { m.Group("/", func() { + m.Get("/ssh/:id", GetPublicKeyByID) + m.Get("/ssh/:id/user", GetUserByKeyID) m.Post("/ssh/:id/update", UpdatePublicKey) + m.Post("/repositories/:repoid/keys/:keyid/update", UpdateDeployKey) + m.Get("/repositories/:repoid/user/:userid/accesslevel", AccessLevel) + m.Get("/repositories/:repoid/user/:userid/checkunituser", CheckUnitUser) + m.Get("/repositories/:repoid/has-keys/:keyid", HasDeployKey) m.Post("/push/update", PushUpdate) m.Get("/protectedbranch/:pbid/:userid", CanUserPush) + m.Get("/repo/:owner/:repo", GetRepositoryByOwnerAndName) m.Get("/branch/:id/*", GetProtectedBranchBy) m.Get("/repository/:rid", GetRepository) m.Get("/active-pull-request", GetActivePullRequest) diff --git a/routers/private/key.go b/routers/private/key.go new file mode 100644 index 000000000000..9cc11657807d --- /dev/null +++ b/routers/private/key.go @@ -0,0 +1,84 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +// Package private includes all internal routes. The package name internal is ideal but Golang is not allowed, so we use private as package name instead. +package private + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/util" + + macaron "gopkg.in/macaron.v1" +) + +// UpdateDeployKey update deploy key updates +func UpdateDeployKey(ctx *macaron.Context) { + repoID := ctx.ParamsInt64(":repoid") + keyID := ctx.ParamsInt64(":keyid") + deployKey, err := models.GetDeployKeyByRepo(keyID, repoID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + deployKey.UpdatedUnix = util.TimeStampNow() + if err = models.UpdateDeployKeyCols(deployKey, "updated_unix"); err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + ctx.PlainText(200, []byte("success")) +} + +// UpdatePublicKey update publick key updates +func UpdatePublicKey(ctx *macaron.Context) { + keyID := ctx.ParamsInt64(":id") + if err := models.UpdatePublicKeyUpdated(keyID); err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + + ctx.PlainText(200, []byte("success")) +} + +//GetPublicKeyByID chainload to models.GetPublicKeyByID +func GetPublicKeyByID(ctx *macaron.Context) { + keyID := ctx.ParamsInt64(":id") + key, err := models.GetPublicKeyByID(keyID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + ctx.JSON(200, key) +} + +//GetUserByKeyID chainload to models.GetUserByKeyID +func GetUserByKeyID(ctx *macaron.Context) { + keyID := ctx.ParamsInt64(":id") + user, err := models.GetUserByKeyID(keyID) + if err != nil { + ctx.JSON(500, map[string]interface{}{ + "err": err.Error(), + }) + return + } + ctx.JSON(200, user) +} + +//HasDeployKey chainload to models.HasDeployKey +func HasDeployKey(ctx *macaron.Context) { + repoID := ctx.ParamsInt64(":repoid") + keyID := ctx.ParamsInt64(":keyid") + if models.HasDeployKey(keyID, repoID) { + ctx.PlainText(200, []byte("success")) + return + } + ctx.PlainText(404, []byte("not found")) +} From 43acff4b799d8df26200b53c88375131ce7152b5 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 30 Oct 2018 06:22:29 +0000 Subject: [PATCH 385/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ja-JP.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 9adc6efd6d88..2d3c15a9299f 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -233,7 +233,7 @@ oauth_signup_tab=新規アカウント登録 oauth_signup_title=メールアドレスとパスワードの追加 (アカウント復旧用) oauth_signup_submit=アカウント登録完了 oauth_signin_tab=既存アカウントにリンク -oauth_signin_title=サインインしてリンク先アカウントを認可 +oauth_signin_title=リンク先アカウント認可のためサインイン oauth_signin_submit=アカウントにリンク openid_connect_submit=接続 openid_connect_title=既存のアカウントに接続 @@ -592,6 +592,7 @@ file_view_raw=Rawデータを見る file_permalink=パーマリンク file_too_large=このファイルは大きすぎるため、表示できません。 video_not_supported_in_browser=このブラウザはHTML5のvideoタグをサポートしていません。 +audio_not_supported_in_browser=このブラウザーはHTML5のaudioタグをサポートしていません。 stored_lfs=Git LFSで保管されています commit_graph=コミットグラフ From 40015e797a4afd119abccb6ef2985e25420a0ddf Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 30 Oct 2018 18:41:25 +0800 Subject: [PATCH 386/447] remove unused db init on commands serv, update, hooks (#5225) --- cmd/hook.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/hook.go b/cmd/hook.go index 27500f9c666d..fb54ca186a3a 100644 --- a/cmd/hook.go +++ b/cmd/hook.go @@ -66,7 +66,6 @@ var ( func hookSetup(logPath string) { setting.NewContext() log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) - models.LoadConfigs() } func runHookPreReceive(c *cli.Context) error { From cc2fd48fef416dbd091158c4de5ee2a9e6afe3c3 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 30 Oct 2018 22:06:01 +0800 Subject: [PATCH 387/447] fix data race on migrate repository (#5224) --- models/repo.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/models/repo.go b/models/repo.go index 1bdd1581f2ee..3e1877604606 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1043,7 +1043,6 @@ func MigrateRepository(doer, u *User, opts MigrateRepoOptions) (*Repository, err if err = SyncReleasesWithTags(repo, gitRepo); err != nil { log.Error(4, "Failed to synchronize tags to releases for repository: %v", err) } - UpdateRepoIndexer(repo) } if err = repo.UpdateSize(); err != nil { @@ -1061,10 +1060,16 @@ func MigrateRepository(doer, u *User, opts MigrateRepoOptions) (*Repository, err } repo.IsMirror = true - return repo, UpdateRepository(repo, false) + err = UpdateRepository(repo, false) + } else { + repo, err = CleanUpMigrateInfo(repo) + } + + if err != nil && !repo.IsBare { + UpdateRepoIndexer(repo) } - return CleanUpMigrateInfo(repo) + return repo, err } // cleanUpMigrateGitConfig removes mirror info which prevents "push --all". From 5a6daf75085265cdccbbd26f28e92f72c93445f1 Mon Sep 17 00:00:00 2001 From: Nicolas Lenz Date: Tue, 30 Oct 2018 15:34:12 +0100 Subject: [PATCH 388/447] Pass link prefixes to external markup parsers (#5201) * Pass environment variables for URL prefixes to external markup parser Signed-off-by: Nicolas Lenz * Document external markup link prefix environment variables Signed-off-by: Nicolas Lenz * Run format on link prefix changes Signed-off-by: Nicolas Lenz --- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 4 ++++ modules/markup/external/external.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 4dbc4c0d7cdf..1c327f6073a6 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -359,6 +359,10 @@ IS_INPUT_FILE = false - RENDER\_COMMAND: External command to render all matching extensions. - IS\_INPUT\_FILE: **false** Input is not a standard input but a file param followed `RENDER_COMMAND`. +Two special environment variables are passed to the render command: +- `GITEA_PREFIX_SRC`, which contains the current URL prefix in the `src` path tree. To be used as prefix for links. +- `GITEA_PREFIX_RAW`, which contains the current URL prefix in the `raw` path tree. To be used as prefix for image paths. + ## Other (`other`) - `SHOW_FOOTER_BRANDING`: **false**: Show Gitea branding in the footer. diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go index 676ec4b4c5b8..73bf7a327e7a 100644 --- a/modules/markup/external/external.go +++ b/modules/markup/external/external.go @@ -76,6 +76,11 @@ func (p *Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]stri } cmd := exec.Command(commands[0], args...) + cmd.Env = append( + os.Environ(), + "GITEA_PREFIX_SRC="+urlPrefix, + "GITEA_PREFIX_RAW="+strings.Replace(urlPrefix, "/src/", "/raw/", 1), + ) if !p.IsInputFile { cmd.Stdin = rd } From 5fadd11ba8b8b685c2c914a4274d7df42a819d92 Mon Sep 17 00:00:00 2001 From: zeripath Date: Tue, 30 Oct 2018 15:08:49 +0000 Subject: [PATCH 389/447] Add AutoHead functionality. (#5186) Fixes #5153 --- routers/routes/routes.go | 1 + 1 file changed, 1 insertion(+) diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 4ca421065e79..5e54934a3627 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -134,6 +134,7 @@ func NewMacaron() *macaron.Macaron { DisableDebug: !setting.EnablePprof, })) m.Use(context.Contexter()) + m.SetAutoHead(true) return m } From 46da812abf7c53ac66c9987a89be16b0cff59af7 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Tue, 30 Oct 2018 15:20:31 +0000 Subject: [PATCH 390/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index b94e9d9f578e..a3de69906c53 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -592,6 +592,7 @@ file_view_raw=Ver original file_permalink=Link permanente file_too_large=O arquivo é muito grande para ser mostrado. video_not_supported_in_browser=Seu navegador não suporta a tag 'video' do HTML5. +audio_not_supported_in_browser=Seu navegador não suporta a tag 'audio' do HTML5. stored_lfs=Armazenado com Git LFS commit_graph=Gráfico de commits From 92030cdf4a659c00b6a5b5104a08966554859d4f Mon Sep 17 00:00:00 2001 From: Fabian Braun Date: Tue, 30 Oct 2018 16:41:41 +0100 Subject: [PATCH 391/447] only chown directories during docker setup if necessary. Fix #4425 (#5064) Signed-off-by: Fabian Braun --- docker/etc/s6/gitea/setup | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/etc/s6/gitea/setup b/docker/etc/s6/gitea/setup index 03758ed819ac..2b0fb6c37bb3 100755 --- a/docker/etc/s6/gitea/setup +++ b/docker/etc/s6/gitea/setup @@ -39,5 +39,8 @@ if [ ! -f /data/gitea/conf/app.ini ]; then envsubst < /etc/templates/app.ini > /data/gitea/conf/app.ini fi -chown -R ${USER}:git /data/gitea /app/gitea /data/git +# only chown if current owner is not already the gitea ${USER}. No recursive check to save time +if ! [[ $(ls -ld /data/gitea | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /data/gitea; fi +if ! [[ $(ls -ld /app/gitea | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /app/gitea; fi +if ! [[ $(ls -ld /data/git | awk '{print $3}') = ${USER} ]]; then chown -R ${USER}:git /data/git; fi chmod 0755 /data/gitea /app/gitea /data/git From c012fd5c58f754dbdb511e4227ccbd2417d234d5 Mon Sep 17 00:00:00 2001 From: Lanre Adelowo Date: Tue, 30 Oct 2018 22:34:25 +0100 Subject: [PATCH 392/447] Generate random password (#5023) * add random-password flag * run make fmt * add length cli flag rather than use a default value --- cmd/admin.go | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/cmd/admin.go b/cmd/admin.go index 5ee20860aba4..d8acce778881 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -6,6 +6,7 @@ package cmd import ( + "errors" "fmt" "os" "text/tabwriter" @@ -13,6 +14,7 @@ import ( "code.gitea.io/git" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/auth/oauth2" + "code.gitea.io/gitea/modules/generate" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" @@ -59,10 +61,19 @@ var ( Value: "custom/conf/app.ini", Usage: "Custom configuration file path", }, + cli.BoolFlag{ + Name: "random-password", + Usage: "Generate a random password for the user", + }, cli.BoolFlag{ Name: "must-change-password", Usage: "Force the user to change his/her password after initial login", }, + cli.IntFlag{ + Name: "random-password-length", + Usage: "Length of the random password to be generated", + Value: 12, + }, }, } @@ -277,10 +288,29 @@ func runChangePassword(c *cli.Context) error { } func runCreateUser(c *cli.Context) error { - if err := argsSet(c, "name", "password", "email"); err != nil { + if err := argsSet(c, "name", "email"); err != nil { return err } + if c.IsSet("password") && c.IsSet("random-password") { + return errors.New("cannot set both -random-password and -password flags") + } + + var password string + + if c.IsSet("password") { + password = c.String("password") + } else if c.IsSet("random-password") { + password, err := generate.GetRandomString(c.Int("random-password-length")) + if err != nil { + return err + } + + fmt.Printf("generated random password is '%s'\n", password) + } else { + return errors.New("must set either password or random-password flag") + } + if c.IsSet("config") { setting.CustomConf = c.String("config") } @@ -299,7 +329,7 @@ func runCreateUser(c *cli.Context) error { if err := models.CreateUser(&models.User{ Name: c.String("name"), Email: c.String("email"), - Passwd: c.String("password"), + Passwd: password, IsActive: true, IsAdmin: c.Bool("admin"), MustChangePassword: changePassword, From 51623fc7f41426ab161facbcd5e0707faf86f598 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 31 Oct 2018 05:48:37 +0800 Subject: [PATCH 393/447] This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql (#5136) * This commit will reduce join star, repo_topic, topic tables on repo search, so that fix extra columns problem on mssql * fix tests --- models/repo_list.go | 52 +++++++++++++--------------------------- models/repo_list_test.go | 2 +- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/models/repo_list.go b/models/repo_list.go index 4368057e04fe..049d1834f7cc 100644 --- a/models/repo_list.go +++ b/models/repo_list.go @@ -173,11 +173,9 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err cond = cond.And(builder.Eq{"is_private": false}) } - var starred bool if opts.OwnerID > 0 { if opts.Starred { - starred = true - cond = builder.Eq{"star.uid": opts.OwnerID} + cond = cond.And(builder.In("id", builder.Select("repo_id").From("star").Where(builder.Eq{"uid": opts.OwnerID}))) } else { var accessCond = builder.NewCond() if opts.Collaborate != util.OptionalBoolTrue { @@ -204,15 +202,23 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err } if opts.Keyword != "" { - var keywordCond = builder.NewCond() // separate keyword + var subQueryCond = builder.NewCond() for _, v := range strings.Split(opts.Keyword, ",") { - if opts.TopicOnly { - keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) - } else { - keywordCond = keywordCond.Or(builder.Like{"lower_name", strings.ToLower(v)}) - keywordCond = keywordCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) + subQueryCond = subQueryCond.Or(builder.Like{"topic.name", strings.ToLower(v)}) + } + subQuery := builder.Select("repo_topic.repo_id").From("repo_topic"). + Join("INNER", "topic", "topic.id = repo_topic.topic_id"). + Where(subQueryCond). + GroupBy("repo_topic.repo_id") + + var keywordCond = builder.In("id", subQuery) + if !opts.TopicOnly { + var likes = builder.NewCond() + for _, v := range strings.Split(opts.Keyword, ",") { + likes = likes.Or(builder.Like{"lower_name", strings.ToLower(v)}) } + keywordCond = keywordCond.Or(likes) } cond = cond.And(keywordCond) } @@ -232,15 +238,6 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err sess := x.NewSession() defer sess.Close() - if starred { - sess.Join("INNER", "star", "star.repo_id = repository.id") - } - - if opts.Keyword != "" { - sess.Join("LEFT", "repo_topic", "repo_topic.repo_id = repository.id") - sess.Join("LEFT", "topic", "repo_topic.topic_id = topic.id") - } - count, err := sess. Where(cond). Count(new(Repository)) @@ -249,27 +246,10 @@ func SearchRepositoryByName(opts *SearchRepoOptions) (RepositoryList, int64, err return nil, 0, fmt.Errorf("Count: %v", err) } - // Set again after reset by Count() - if starred { - sess.Join("INNER", "star", "star.repo_id = repository.id") - } - - if opts.Keyword != "" { - sess.Join("LEFT", "repo_topic", "repo_topic.repo_id = repository.id") - sess.Join("LEFT", "topic", "repo_topic.topic_id = topic.id") - } - - if opts.Keyword != "" { - sess.Select("repository.*") - sess.GroupBy("repository.id") - sess.OrderBy("repository." + opts.OrderBy.String()) - } else { - sess.OrderBy(opts.OrderBy.String()) - } - repos := make(RepositoryList, 0, opts.PageSize) if err = sess. Where(cond). + OrderBy(opts.OrderBy.String()). Limit(opts.PageSize, (opts.Page-1)*opts.PageSize). Find(&repos); err != nil { return nil, 0, fmt.Errorf("Repo: %v", err) diff --git a/models/repo_list_test.go b/models/repo_list_test.go index 2f9a1491887b..c032af2b80ce 100644 --- a/models/repo_list_test.go +++ b/models/repo_list_test.go @@ -239,7 +239,7 @@ func TestSearchRepositoryByTopicName(t *testing.T) { count: 1}, {name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic", opts: &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true}, - count: 3}, + count: 2}, } for _, testCase := range testCases { From 2ab56e1f4841981964ea1b4474e6e97070b19c1a Mon Sep 17 00:00:00 2001 From: "L.E.R" Date: Tue, 30 Oct 2018 17:26:28 -0500 Subject: [PATCH 394/447] Fix markdown image with link (#4675) * Fix markdown image with link * Add gitea copyright notice * add a test for markdown image with link * remove svg related variables --- modules/markup/markdown/markdown.go | 39 +++++++++++------------- modules/markup/markdown/markdown_test.go | 4 +++ 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index 3f94aa08b43b..5022e0e23567 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -38,7 +39,16 @@ func (r *Renderer) Link(out *bytes.Buffer, link []byte, title []byte, content [] link = []byte(mLink) } - r.Renderer.Link(out, link, title, content) + if len(content) > 10 && string(content[0:9]) == " 0 { - if markup.IsLink(link) { - // External link with .svg suffix usually means CI status. - // TODO: define a keyword to allow non-svg images render as external link. - if bytes.HasSuffix(link, svgSuffix) || bytes.Contains(link, svgSuffixWithMark) { - r.Renderer.Image(out, link, title, alt) - return - } - } else { - lnk := string(link) - lnk = util.URLJoin(prefix, lnk) - lnk = strings.Replace(lnk, " ", "+", -1) - link = []byte(lnk) - } + if len(link) > 0 && !markup.IsLink(link) { + lnk := string(link) + lnk = util.URLJoin(prefix, lnk) + lnk = strings.Replace(lnk, " ", "+", -1) + link = []byte(lnk) } + // Put a link around it pointing to itself by default out.WriteString(``) diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index 605094df4627..a5ab84e0ec14 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -73,6 +73,7 @@ func TestRender_Images(t *testing.T) { url := "../../.images/src/02/train.jpg" title := "Train" + href := "https://gitea.io" result := util.URLJoin(AppSubURL, url) test( @@ -82,6 +83,9 @@ func TestRender_Images(t *testing.T) { test( "[["+title+"|"+url+"]]", `

`+title+`

`) + test( + "[!["+title+"]("+url+")]("+href+")", + `

`+title+`

`) } func testAnswers(baseURLContent, baseURLImages string) []string { From 6cd41ec8f84cf21805037184ac6e9f25a69bf57c Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Wed, 31 Oct 2018 01:08:30 +0100 Subject: [PATCH 395/447] Fix issue where ecdsa and other key types are not synced from LDAP (#5092) (#5094) * Fix issue where ecdsa and other key types are not synced from LDAP authentication provider fixes #5092 * integrations/auth_ldap_test.go: Add Hermes Conrad new ecdsa-sha2-nistp256 publickey fingerprint * integrations/auth_ldap_test.go: Use ssh-keygen -lf -E sha256 --- integrations/auth_ldap_test.go | 1 + models/user.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/integrations/auth_ldap_test.go b/integrations/auth_ldap_test.go index f31f598fa463..52fe0fd73f75 100644 --- a/integrations/auth_ldap_test.go +++ b/integrations/auth_ldap_test.go @@ -43,6 +43,7 @@ var gitLDAPUsers = []ldapUser{ SSHKeys: []string{ "SHA256:qLY06smKfHoW/92yXySpnxFR10QFrLdRjf/GNPvwcW8", "SHA256:QlVTuM5OssDatqidn2ffY+Lc4YA5Fs78U+0KOHI51jQ", + "SHA256:DXdeUKYOJCSSmClZuwrb60hUq7367j4fA+udNC3FdRI", }, IsAdmin: true, }, diff --git a/models/user.go b/models/user.go index 32e7dda2cb3d..9469d6e793d3 100644 --- a/models/user.go +++ b/models/user.go @@ -29,6 +29,7 @@ import ( "github.com/go-xorm/xorm" "github.com/nfnt/resize" "golang.org/x/crypto/pbkdf2" + "golang.org/x/crypto/ssh" "code.gitea.io/git" api "code.gitea.io/sdk/gitea" @@ -1454,7 +1455,8 @@ func deleteKeysMarkedForDeletion(keys []string) (bool, error) { func addLdapSSHPublicKeys(s *LoginSource, usr *User, SSHPublicKeys []string) bool { var sshKeysNeedUpdate bool for _, sshKey := range SSHPublicKeys { - if strings.HasPrefix(strings.ToLower(sshKey), "ssh") { + _, _, _, _, err := ssh.ParseAuthorizedKey([]byte(sshKey)) + if err == nil { sshKeyName := fmt.Sprintf("%s-%s", s.Name, sshKey[0:40]) if _, err := AddPublicKey(usr.ID, sshKeyName, sshKey, s.ID); err != nil { log.Error(4, "addLdapSSHPublicKeys[%s]: Error adding LDAP Public SSH Key for user %s: %v", s.Name, usr.Name, err) From b9bff47c6b8a174b5bbd0cf19da105e4c0341726 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Wed, 31 Oct 2018 04:13:14 +0200 Subject: [PATCH 396/447] Add changelog for 1.5.3 release (#5227) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67de6b764dff..d32531db7819 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -139,6 +139,10 @@ been added to each release, please refer to the [blog](https://blog.gitea.io). * Fix punctuation in English translation (#4958) * Fix translation (#4355) +## [1.5.3](https://github.com/go-gitea/gitea/releases/tag/v1.5.3) - 2018-10-31 +* SECURITY + * Fix remote command execution vulnerability in upstream library (#5177) (#5196) + ## [1.5.2](https://github.com/go-gitea/gitea/releases/tag/v1.5.2) - 2018-10-09 * SECURITY * Enforce token on api routes (#4840) (#4905) From 72e798624ead80f5088b7b5dba289c9e7affa216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20=C8=98tefan?= <32664920+rstefan1@users.noreply.github.com> Date: Wed, 31 Oct 2018 05:14:42 +0200 Subject: [PATCH 397/447] Add command for migrating database (#4954) --- cmd/migrate.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 1 + 2 files changed, 53 insertions(+) create mode 100644 cmd/migrate.go diff --git a/cmd/migrate.go b/cmd/migrate.go new file mode 100644 index 000000000000..d5dd3068cf00 --- /dev/null +++ b/cmd/migrate.go @@ -0,0 +1,52 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/models/migrations" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli" +) + +// CmdMigrate represents the available migrate sub-command. +var CmdMigrate = cli.Command{ + Name: "migrate", + Usage: "Migrate the database", + Description: "This is a command for migrating the database, so that you can run gitea admin create-user before starting the server.", + Action: runMigrate, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Value: "custom/conf/app.ini", + Usage: "Custom configuration file path", + }, + }, +} + +func runMigrate(ctx *cli.Context) error { + if ctx.IsSet("config") { + setting.CustomConf = ctx.String("config") + } + + if err := initDB(); err != nil { + return err + } + + log.Trace("AppPath: %s", setting.AppPath) + log.Trace("AppWorkPath: %s", setting.AppWorkPath) + log.Trace("Custom path: %s", setting.CustomPath) + log.Trace("Log path: %s", setting.LogRootPath) + models.LoadConfigs() + + if err := models.NewEngine(migrations.Migrate); err != nil { + log.Fatal(4, "Failed to initialize ORM engine: %v", err) + return err + } + + return nil +} diff --git a/main.go b/main.go index e73f1d60a922..a331de4733d3 100644 --- a/main.go +++ b/main.go @@ -47,6 +47,7 @@ arguments - which can alternatively be run by running the subcommand web.` cmd.CmdCert, cmd.CmdAdmin, cmd.CmdGenerate, + cmd.CmdMigrate, } app.Flags = append(app.Flags, []cli.Flag{}...) app.Action = cmd.CmdWeb.Action From 60de076920eef73a8c9067ce85a76c5092691519 Mon Sep 17 00:00:00 2001 From: Stanislav Date: Wed, 31 Oct 2018 23:56:32 +0300 Subject: [PATCH 398/447] fix compatibility heatmap with mysql 8 (#5232) --- models/user_heatmap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/user_heatmap.go b/models/user_heatmap.go index a86ae39fce1f..f9575ed50fc4 100644 --- a/models/user_heatmap.go +++ b/models/user_heatmap.go @@ -23,7 +23,7 @@ func GetUserHeatmapDataByUser(user *User) ([]*UserHeatmapData, error) { case setting.UseSQLite3: groupBy = "strftime('%s', strftime('%Y-%m-%d', created_unix, 'unixepoch'))" case setting.UseMySQL: - groupBy = "UNIX_TIMESTAMP(DATE_FORMAT(FROM_UNIXTIME(created_unix), '%Y%m%d'))" + groupBy = "UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(created_unix)))" case setting.UsePostgreSQL: groupBy = "extract(epoch from date_trunc('day', to_timestamp(created_unix)))" case setting.UseMSSQL: From 5ae50c6d6cdb17601ac3163e15255122b19ce886 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Wed, 31 Oct 2018 20:58:56 +0000 Subject: [PATCH 399/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 8a776db135fe..6636ed74e928 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -229,6 +229,12 @@ twofa_passcode_incorrect=Ungültige PIN. Wenn du dein Gerät verloren hast, verw twofa_scratch_token_incorrect=Das Einmalpasswort ist falsch. login_userpass=Anmelden login_openid=OpenID +oauth_signup_tab=Neues Konto registrieren +oauth_signup_title=E-Mail und Password hinzufügen (für Kontowiederherstellung) +oauth_signup_submit=Konto vervollständigen +oauth_signin_tab=Mit existierendem Konto verbinden +oauth_signin_title=Anmelden um verbundenes Konto zu autorisieren +oauth_signin_submit=Konto verbinden openid_connect_submit=Verbinden openid_connect_title=Mit bestehendem Konto verbinden openid_connect_desc=Die gewählte OpenID-URI ist unbekannt. Ordne sie hier einem neuen Account zu. @@ -586,6 +592,7 @@ file_view_raw=Originalformat anzeigen file_permalink=Permalink file_too_large=Die Datei ist zu groß zum Anzeigen. video_not_supported_in_browser=Dein Browser unterstützt das HTML5 'video'-Tag nicht. +audio_not_supported_in_browser=Dein Browser unterstützt den HTML5 'audio'-Tag nicht. stored_lfs=Gespeichert mit Git LFS commit_graph=Commit graph From e75fe1b09ca6c8113dc683283f6a1c17629a9bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Br=C3=B6ms?= <9416498+cez81@users.noreply.github.com> Date: Thu, 1 Nov 2018 01:18:28 +0100 Subject: [PATCH 400/447] Update API link in README (#5241) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b8e6e8fed6ec..c16eb876074d 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ More info: https://docs.gitea.io/en-us/install-from-source/ ./gitea web NOTE: If you're interested in using our APIs, we have experimental -support with [documentation](https://godoc.org/code.gitea.io/sdk/gitea). +support with [documentation](https://try.gitea.io/api/swagger). ## Contributing From 3a408b864bf3da0862e05856fbb2cc39a4d706a5 Mon Sep 17 00:00:00 2001 From: Peter Hoffmann Date: Thu, 1 Nov 2018 01:36:41 +0100 Subject: [PATCH 401/447] fix: Accept web-command cli flags if web-command is commited (#5200) * fix: Accept web-command cli flags if web-command is commited * Added flags of default cmd CmdWeb to app-wide flags * If command *is* specified app-wide flags are ignored Resolves: #5065 Signed-off-by: Berengar W. Lehr * Removed style breaking newline * broken windows need to be fixed * provides requested change --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index a331de4733d3..a0a52c3ae81a 100644 --- a/main.go +++ b/main.go @@ -49,7 +49,7 @@ arguments - which can alternatively be run by running the subcommand web.` cmd.CmdGenerate, cmd.CmdMigrate, } - app.Flags = append(app.Flags, []cli.Flag{}...) + app.Flags = append(app.Flags, cmd.CmdWeb.Flags...) app.Action = cmd.CmdWeb.Action err := app.Run(os.Args) if err != nil { From 215b63b604d469402a0db92de7f8ffc6d3ffd16e Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 1 Nov 2018 03:40:49 +0000 Subject: [PATCH 402/447] Keys API changes (#4960) * Add private information to the deploy keys api This commit adds more information to the deploy keys to allow for back reference in to the main keys list. It also adds information about the repository that the key is referring to. Signed-off-by: Andrew Thornton * Add private information to the user keys API This adjusts the keys API to give out private information to user keys if the current user is the owner or an admin. Signed-off-by: Andrew Thornton * Add ability to search keys by fingerprint This commit adds the functionality to search ssh-keys by fingerprint of the ssh-key. Deploy keys per repository can also be searched. There is no current clear API point to allow search of all deploy keys by fingerprint or keyID. Signed-off-by: Andrew Thornton * Add integration test --- integrations/api_keys_test.go | 102 ++++++++++++++++++++++++++++++ models/ssh_key.go | 30 +++++++++ routers/api/v1/convert/convert.go | 14 ++-- routers/api/v1/repo/key.go | 44 ++++++++++++- routers/api/v1/user/key.go | 74 ++++++++++++++++++++-- templates/swagger/v1_json.tmpl | 26 ++++++++ 6 files changed, 276 insertions(+), 14 deletions(-) diff --git a/integrations/api_keys_test.go b/integrations/api_keys_test.go index 8c83ae42c500..91cbd72f917f 100644 --- a/integrations/api_keys_test.go +++ b/integrations/api_keys_test.go @@ -7,8 +7,11 @@ package integrations import ( "fmt" "net/http" + "net/url" "testing" + "github.com/stretchr/testify/assert" + "code.gitea.io/gitea/models" api "code.gitea.io/sdk/gitea" ) @@ -90,3 +93,102 @@ func TestCreateReadWriteDeployKey(t *testing.T) { Mode: models.AccessModeWrite, }) } + +func TestCreateUserKey(t *testing.T) { + prepareTestEnv(t) + user := models.AssertExistsAndLoadBean(t, &models.User{Name: "user1"}).(*models.User) + + session := loginUser(t, "user1") + token := url.QueryEscape(getTokenForLoggedInUser(t, session)) + keysURL := fmt.Sprintf("/api/v1/user/keys?token=%s", token) + keyType := "ssh-rsa" + keyContent := "AAAAB3NzaC1yc2EAAAADAQABAAABAQCyTiPTeHJl6Gs5D1FyHT0qTWpVkAy9+LIKjctQXklrePTvUNVrSpt4r2exFYXNMPeA8V0zCrc3Kzs1SZw3jWkG3i53te9onCp85DqyatxOD2pyZ30/gPn1ZUg40WowlFM8gsUFMZqaH7ax6d8nsBKW7N/cRyqesiOQEV9up3tnKjIB8XMTVvC5X4rBWgywz7AFxSv8mmaTHnUgVW4LgMPwnTWo0pxtiIWbeMLyrEE4hIM74gSwp6CRQYo6xnG3fn4yWkcK2X2mT9adQ241IDdwpENJHcry/T6AJ8dNXduEZ67egnk+rVlQ2HM4LpymAv9DAAFFeaQK0hT+3aMDoumV" + rawKeyBody := api.CreateKeyOption{ + Title: "test-key", + Key: keyType + " " + keyContent, + } + req := NewRequestWithJSON(t, "POST", keysURL, rawKeyBody) + resp := session.MakeRequest(t, req, http.StatusCreated) + + var newPublicKey api.PublicKey + DecodeJSON(t, resp, &newPublicKey) + models.AssertExistsAndLoadBean(t, &models.PublicKey{ + ID: newPublicKey.ID, + OwnerID: user.ID, + Name: rawKeyBody.Title, + Content: rawKeyBody.Key, + Mode: models.AccessModeWrite, + }) + + // Search by fingerprint + fingerprintURL := fmt.Sprintf("/api/v1/user/keys?token=%s&fingerprint=%s", token, newPublicKey.Fingerprint) + + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + var fingerprintPublicKeys []api.PublicKey + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint) + assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID) + assert.Equal(t, user.ID, fingerprintPublicKeys[0].Owner.ID) + + fingerprintURL = fmt.Sprintf("/api/v1/users/%s/keys?token=%s&fingerprint=%s", user.Name, token, newPublicKey.Fingerprint) + + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint) + assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID) + assert.Equal(t, user.ID, fingerprintPublicKeys[0].Owner.ID) + + // Fail search by fingerprint + fingerprintURL = fmt.Sprintf("/api/v1/user/keys?token=%s&fingerprint=%sA", token, newPublicKey.Fingerprint) + + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Len(t, fingerprintPublicKeys, 0) + + // Fail searching for wrong users key + fingerprintURL = fmt.Sprintf("/api/v1/users/%s/keys?token=%s&fingerprint=%s", "user2", token, newPublicKey.Fingerprint) + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Len(t, fingerprintPublicKeys, 0) + + // Now login as user 2 + session2 := loginUser(t, "user2") + token2 := url.QueryEscape(getTokenForLoggedInUser(t, session2)) + + // Should find key even though not ours, but we shouldn't know whose it is + fingerprintURL = fmt.Sprintf("/api/v1/user/keys?token=%s&fingerprint=%s", token2, newPublicKey.Fingerprint) + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint) + assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID) + assert.Nil(t, fingerprintPublicKeys[0].Owner) + + // Should find key even though not ours, but we shouldn't know whose it is + fingerprintURL = fmt.Sprintf("/api/v1/users/%s/keys?token=%s&fingerprint=%s", user.Name, token2, newPublicKey.Fingerprint) + + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Equal(t, newPublicKey.Fingerprint, fingerprintPublicKeys[0].Fingerprint) + assert.Equal(t, newPublicKey.ID, fingerprintPublicKeys[0].ID) + assert.Nil(t, fingerprintPublicKeys[0].Owner) + + // Fail when searching for key if it is not ours + fingerprintURL = fmt.Sprintf("/api/v1/users/%s/keys?token=%s&fingerprint=%s", "user2", token2, newPublicKey.Fingerprint) + req = NewRequest(t, "GET", fingerprintURL) + resp = session.MakeRequest(t, req, http.StatusOK) + + DecodeJSON(t, resp, &fingerprintPublicKeys) + assert.Len(t, fingerprintPublicKeys, 0) +} diff --git a/models/ssh_key.go b/models/ssh_key.go index 2592209b4d7a..0368ffad33e6 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -24,6 +24,7 @@ import ( "code.gitea.io/gitea/modules/util" "github.com/Unknwon/com" + "github.com/go-xorm/builder" "github.com/go-xorm/xorm" "golang.org/x/crypto/ssh" ) @@ -465,6 +466,19 @@ func SearchPublicKeyByContent(content string) (*PublicKey, error) { return key, nil } +// SearchPublicKey returns a list of public keys matching the provided arguments. +func SearchPublicKey(uid int64, fingerprint string) ([]*PublicKey, error) { + keys := make([]*PublicKey, 0, 5) + cond := builder.NewCond() + if uid != 0 { + cond = cond.And(builder.Eq{"owner_id": uid}) + } + if fingerprint != "" { + cond = cond.And(builder.Eq{"fingerprint": fingerprint}) + } + return keys, x.Where(cond).Find(&keys) +} + // ListPublicKeys returns a list of public keys belongs to given user. func ListPublicKeys(uid int64) ([]*PublicKey, error) { keys := make([]*PublicKey, 0, 5) @@ -833,3 +847,19 @@ func ListDeployKeys(repoID int64) ([]*DeployKey, error) { Where("repo_id = ?", repoID). Find(&keys) } + +// SearchDeployKeys returns a list of deploy keys matching the provided arguments. +func SearchDeployKeys(repoID int64, keyID int64, fingerprint string) ([]*DeployKey, error) { + keys := make([]*DeployKey, 0, 5) + cond := builder.NewCond() + if repoID != 0 { + cond = cond.And(builder.Eq{"repo_id": repoID}) + } + if keyID != 0 { + cond = cond.And(builder.Eq{"key_id": keyID}) + } + if fingerprint != "" { + cond = cond.And(builder.Eq{"fingerprint": fingerprint}) + } + return keys, x.Where(cond).Find(&keys) +} diff --git a/routers/api/v1/convert/convert.go b/routers/api/v1/convert/convert.go index 19b966971a40..1bfeae34bfe3 100644 --- a/routers/api/v1/convert/convert.go +++ b/routers/api/v1/convert/convert.go @@ -167,12 +167,14 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook { // ToDeployKey convert models.DeployKey to api.DeployKey func ToDeployKey(apiLink string, key *models.DeployKey) *api.DeployKey { return &api.DeployKey{ - ID: key.ID, - Key: key.Content, - URL: apiLink + com.ToStr(key.ID), - Title: key.Name, - Created: key.CreatedUnix.AsTime(), - ReadOnly: true, // All deploy keys are read-only. + ID: key.ID, + KeyID: key.KeyID, + Key: key.Content, + Fingerprint: key.Fingerprint, + URL: apiLink + com.ToStr(key.ID), + Title: key.Name, + Created: key.CreatedUnix.AsTime(), + ReadOnly: key.Mode == models.AccessModeRead, // All deploy keys are read-only. } } diff --git a/routers/api/v1/repo/key.go b/routers/api/v1/repo/key.go index 89a550cfd318..2caca887aadd 100644 --- a/routers/api/v1/repo/key.go +++ b/routers/api/v1/repo/key.go @@ -15,6 +15,21 @@ import ( api "code.gitea.io/sdk/gitea" ) +// appendPrivateInformation appends the owner and key type information to api.PublicKey +func appendPrivateInformation(apiKey *api.DeployKey, key *models.DeployKey, repository *models.Repository) (*api.DeployKey, error) { + apiKey.ReadOnly = key.Mode == models.AccessModeRead + if repository.ID == key.RepoID { + apiKey.Repository = repository.APIFormat(key.Mode) + } else { + repo, err := models.GetRepositoryByID(key.RepoID) + if err != nil { + return apiKey, err + } + apiKey.Repository = repo.APIFormat(key.Mode) + } + return apiKey, nil +} + func composeDeployKeysAPILink(repoPath string) string { return setting.AppURL + "api/v1/repos/" + repoPath + "/keys/" } @@ -37,10 +52,28 @@ func ListDeployKeys(ctx *context.APIContext) { // description: name of the repo // type: string // required: true + // - name: key_id + // in: query + // description: the key_id to search for + // type: integer + // - name: fingerprint + // in: query + // description: fingerprint of the key + // type: string // responses: // "200": // "$ref": "#/responses/DeployKeyList" - keys, err := models.ListDeployKeys(ctx.Repo.Repository.ID) + var keys []*models.DeployKey + var err error + + fingerprint := ctx.Query("fingerprint") + keyID := ctx.QueryInt64("key_id") + if fingerprint != "" || keyID != 0 { + keys, err = models.SearchDeployKeys(ctx.Repo.Repository.ID, keyID, fingerprint) + } else { + keys, err = models.ListDeployKeys(ctx.Repo.Repository.ID) + } + if err != nil { ctx.Error(500, "ListDeployKeys", err) return @@ -54,6 +87,9 @@ func ListDeployKeys(ctx *context.APIContext) { return } apiKeys[i] = convert.ToDeployKey(apiLink, keys[i]) + if ctx.User.IsAdmin || ((ctx.Repo.Repository.ID == keys[i].RepoID) && (ctx.User.ID == ctx.Repo.Owner.ID)) { + apiKeys[i], _ = appendPrivateInformation(apiKeys[i], keys[i], ctx.Repo.Repository) + } } ctx.JSON(200, &apiKeys) @@ -102,7 +138,11 @@ func GetDeployKey(ctx *context.APIContext) { } apiLink := composeDeployKeysAPILink(ctx.Repo.Owner.Name + "/" + ctx.Repo.Repository.Name) - ctx.JSON(200, convert.ToDeployKey(apiLink, key)) + apiKey := convert.ToDeployKey(apiLink, key) + if ctx.User.IsAdmin || ((ctx.Repo.Repository.ID == key.RepoID) && (ctx.User.ID == ctx.Repo.Owner.ID)) { + apiKey, _ = appendPrivateInformation(apiKey, key, ctx.Repo.Repository) + } + ctx.JSON(200, apiKey) } // HandleCheckKeyStringError handle check key error diff --git a/routers/api/v1/user/key.go b/routers/api/v1/user/key.go index e5d1b08f0dab..d8ab752b2be4 100644 --- a/routers/api/v1/user/key.go +++ b/routers/api/v1/user/key.go @@ -14,6 +14,29 @@ import ( "code.gitea.io/gitea/routers/api/v1/repo" ) +// appendPrivateInformation appends the owner and key type information to api.PublicKey +func appendPrivateInformation(apiKey *api.PublicKey, key *models.PublicKey, defaultUser *models.User) (*api.PublicKey, error) { + if key.Type == models.KeyTypeDeploy { + apiKey.KeyType = "deploy" + } else if key.Type == models.KeyTypeUser { + apiKey.KeyType = "user" + + if defaultUser.ID == key.OwnerID { + apiKey.Owner = defaultUser.APIFormat() + } else { + user, err := models.GetUserByID(key.OwnerID) + if err != nil { + return apiKey, err + } + apiKey.Owner = user.APIFormat() + } + } else { + apiKey.KeyType = "unknown" + } + apiKey.ReadOnly = key.Mode == models.AccessModeRead + return apiKey, nil +} + // GetUserByParamsName get user by name func GetUserByParamsName(ctx *context.APIContext, name string) *models.User { user, err := models.GetUserByName(ctx.Params(name)) @@ -37,8 +60,27 @@ func composePublicKeysAPILink() string { return setting.AppURL + "api/v1/user/keys/" } -func listPublicKeys(ctx *context.APIContext, uid int64) { - keys, err := models.ListPublicKeys(uid) +func listPublicKeys(ctx *context.APIContext, user *models.User) { + var keys []*models.PublicKey + var err error + + fingerprint := ctx.Query("fingerprint") + username := ctx.Params("username") + + if fingerprint != "" { + // Querying not just listing + if username != "" { + // Restrict to provided uid + keys, err = models.SearchPublicKey(user.ID, fingerprint) + } else { + // Unrestricted + keys, err = models.SearchPublicKey(0, fingerprint) + } + } else { + // Use ListPublicKeys + keys, err = models.ListPublicKeys(user.ID) + } + if err != nil { ctx.Error(500, "ListPublicKeys", err) return @@ -48,6 +90,9 @@ func listPublicKeys(ctx *context.APIContext, uid int64) { apiKeys := make([]*api.PublicKey, len(keys)) for i := range keys { apiKeys[i] = convert.ToPublicKey(apiLink, keys[i]) + if ctx.User.IsAdmin || ctx.User.ID == keys[i].OwnerID { + apiKeys[i], _ = appendPrivateInformation(apiKeys[i], keys[i], user) + } } ctx.JSON(200, &apiKeys) @@ -58,12 +103,17 @@ func ListMyPublicKeys(ctx *context.APIContext) { // swagger:operation GET /user/keys user userCurrentListKeys // --- // summary: List the authenticated user's public keys + // parameters: + // - name: fingerprint + // in: query + // description: fingerprint of the key + // type: string // produces: // - application/json // responses: // "200": // "$ref": "#/responses/PublicKeyList" - listPublicKeys(ctx, ctx.User.ID) + listPublicKeys(ctx, ctx.User) } // ListPublicKeys list the given user's public keys @@ -79,6 +129,10 @@ func ListPublicKeys(ctx *context.APIContext) { // description: username of user // type: string // required: true + // - name: fingerprint + // in: query + // description: fingerprint of the key + // type: string // responses: // "200": // "$ref": "#/responses/PublicKeyList" @@ -86,7 +140,7 @@ func ListPublicKeys(ctx *context.APIContext) { if ctx.Written() { return } - listPublicKeys(ctx, user.ID) + listPublicKeys(ctx, user) } // GetPublicKey get a public key @@ -119,7 +173,11 @@ func GetPublicKey(ctx *context.APIContext) { } apiLink := composePublicKeysAPILink() - ctx.JSON(200, convert.ToPublicKey(apiLink, key)) + apiKey := convert.ToPublicKey(apiLink, key) + if ctx.User.IsAdmin || ctx.User.ID == key.OwnerID { + apiKey, _ = appendPrivateInformation(apiKey, key, ctx.User) + } + ctx.JSON(200, apiKey) } // CreateUserPublicKey creates new public key to given user by ID. @@ -136,7 +194,11 @@ func CreateUserPublicKey(ctx *context.APIContext, form api.CreateKeyOption, uid return } apiLink := composePublicKeysAPILink() - ctx.JSON(201, convert.ToPublicKey(apiLink, key)) + apiKey := convert.ToPublicKey(apiLink, key) + if ctx.User.IsAdmin || ctx.User.ID == key.OwnerID { + apiKey, _ = appendPrivateInformation(apiKey, key, ctx.User) + } + ctx.JSON(201, apiKey) } // CreatePublicKey create one public key for me diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index efba90b18b5a..56a169c295d5 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -2682,6 +2682,18 @@ "name": "repo", "in": "path", "required": true + }, + { + "type": "integer", + "description": "the key_id to search for", + "name": "key_id", + "in": "query" + }, + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" } ], "responses": { @@ -4976,6 +4988,14 @@ ], "summary": "List the authenticated user's public keys", "operationId": "userCurrentListKeys", + "parameters": [ + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" + } + ], "responses": { "200": { "$ref": "#/responses/PublicKeyList" @@ -5540,6 +5560,12 @@ "name": "username", "in": "path", "required": true + }, + { + "type": "string", + "description": "fingerprint of the key", + "name": "fingerprint", + "in": "query" } ], "responses": { From 3a6972caed0b3a65e695fceae42ba1837b04bd79 Mon Sep 17 00:00:00 2001 From: zeripath Date: Thu, 1 Nov 2018 13:41:07 +0000 Subject: [PATCH 403/447] Create AuthorizedKeysCommand (#5236) --- cmd/cmd.go | 6 +- cmd/keys.go | 85 ++++++++++++++++++++++++++ custom/conf/app.ini.sample | 3 + docs/content/doc/usage/command-line.md | 21 +++++++ main.go | 2 + models/ssh_key.go | 2 +- modules/setting/setting.go | 36 +++++------ 7 files changed, 136 insertions(+), 19 deletions(-) create mode 100644 cmd/keys.go diff --git a/cmd/cmd.go b/cmd/cmd.go index 15dd085247a1..1ca885a42bc5 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -27,10 +27,14 @@ func argsSet(c *cli.Context, args ...string) error { } func initDB() error { + return initDBDisableConsole(false) +} + +func initDBDisableConsole(disableConsole bool) error { setting.NewContext() models.LoadConfigs() - setting.NewXORMLogService(false) + setting.NewXORMLogService(disableConsole) if err := models.SetEngine(); err != nil { return fmt.Errorf("models.SetEngine: %v", err) } diff --git a/cmd/keys.go b/cmd/keys.go new file mode 100644 index 000000000000..66565cc56324 --- /dev/null +++ b/cmd/keys.go @@ -0,0 +1,85 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package cmd + +import ( + "errors" + "fmt" + "strings" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/setting" + + "github.com/urfave/cli" +) + +// CmdKeys represents the available keys sub-command +var CmdKeys = cli.Command{ + Name: "keys", + Usage: "This command queries the Gitea database to get the authorized command for a given ssh key fingerprint", + Action: runKeys, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "expected, e", + Value: "git", + Usage: "Expected user for whom provide key commands", + }, + cli.StringFlag{ + Name: "username, u", + Value: "", + Usage: "Username trying to log in by SSH", + }, + cli.StringFlag{ + Name: "type, t", + Value: "", + Usage: "Type of the SSH key provided to the SSH Server (requires content to be provided too)", + }, + cli.StringFlag{ + Name: "content, k", + Value: "", + Usage: "Base64 encoded content of the SSH key provided to the SSH Server (requires type to be provided too)", + }, + cli.StringFlag{ + Name: "config, c", + Value: "custom/conf/app.ini", + Usage: "Custom configuration file path", + }, + }, +} + +func runKeys(c *cli.Context) error { + if c.IsSet("config") { + setting.CustomConf = c.String("config") + } + + if !c.IsSet("username") { + return errors.New("No username provided") + } + // Check username matches the expected username + if strings.TrimSpace(c.String("username")) != strings.TrimSpace(c.String("expected")) { + return nil + } + + content := "" + + if c.IsSet("type") && c.IsSet("content") { + content = fmt.Sprintf("%s %s", strings.TrimSpace(c.String("type")), strings.TrimSpace(c.String("content"))) + } + + if content == "" { + return errors.New("No key type and content provided") + } + + if err := initDBDisableConsole(true); err != nil { + return err + } + + publicKey, err := models.SearchPublicKeyByContent(content) + if err != nil { + return err + } + fmt.Println(publicKey.AuthorizedString()) + return nil +} diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 1a85f9364d64..a5925b48da26 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -154,6 +154,9 @@ SSH_PORT = 22 SSH_LISTEN_PORT = %(SSH_PORT)s ; Root path of SSH directory, default is '~/.ssh', but you have to use '/home/git/.ssh'. SSH_ROOT_PATH = +; Gitea will create a authorized_keys file by default when it is not using the internal ssh server +; If you intend to use the AuthorizedKeysCommand functionality then you should turn this off. +SSH_CREATE_AUTHORIZED_KEYS_FILE = true ; For the built-in SSH server, choose the ciphers to support for SSH connections, ; for system SSH this setting has no effect SSH_SERVER_CIPHERS = aes128-ctr, aes192-ctr, aes256-ctr, aes128-gcm@openssh.com, arcfour256, arcfour128 diff --git a/docs/content/doc/usage/command-line.md b/docs/content/doc/usage/command-line.md index 90e1ae251496..904a395e8c5e 100644 --- a/docs/content/doc/usage/command-line.md +++ b/docs/content/doc/usage/command-line.md @@ -163,3 +163,24 @@ for automatic deployments. - `gitea generate secret INTERNAL_TOKEN` - `gitea generate secret LFS_JWT_SECRET` - `gitea generate secret SECRET_KEY` + +#### keys + +Provides an SSHD AuthorizedKeysCommand. Needs to be configured in the sshd config file: + +```ini +... +# The value of -e and the AuthorizedKeysCommandUser should match the +# username running gitea +AuthorizedKeysCommandUser git +AuthorizedKeysCommand /path/to/gitea keys -e git -u %u -t %t -k %k +``` + +The command will return the appropriate authorized_keys line for the +provided key. You should also set the value +`SSH_CREATE_AUTHORIZED_KEYS_FILE=false` in the `[server]` section of +`app.ini`. + +NB: opensshd requires the gitea program to be owned by root and not +writable by group or others. The program must be specified by an absolute +path. diff --git a/main.go b/main.go index a0a52c3ae81a..ccfc884b1c9e 100644 --- a/main.go +++ b/main.go @@ -13,6 +13,7 @@ import ( "code.gitea.io/gitea/cmd" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + // register supported doc types _ "code.gitea.io/gitea/modules/markup/csv" _ "code.gitea.io/gitea/modules/markup/markdown" @@ -48,6 +49,7 @@ arguments - which can alternatively be run by running the subcommand web.` cmd.CmdAdmin, cmd.CmdGenerate, cmd.CmdMigrate, + cmd.CmdKeys, } app.Flags = append(app.Flags, cmd.CmdWeb.Flags...) app.Action = cmd.CmdWeb.Action diff --git a/models/ssh_key.go b/models/ssh_key.go index 0368ffad33e6..5d046c020113 100644 --- a/models/ssh_key.go +++ b/models/ssh_key.go @@ -558,7 +558,7 @@ func DeletePublicKey(doer *User, id int64) (err error) { // outside any session scope independently. func RewriteAllPublicKeys() error { //Don't rewrite key if internal server - if setting.SSH.StartBuiltinServer { + if setting.SSH.StartBuiltinServer || !setting.SSH.CreateAuthorizedKeysFile { return nil } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 0eaf58988fe3..a15dc116af68 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -118,23 +118,24 @@ var ( LetsEncryptEmail string SSH = struct { - Disabled bool `ini:"DISABLE_SSH"` - StartBuiltinServer bool `ini:"START_SSH_SERVER"` - BuiltinServerUser string `ini:"BUILTIN_SSH_SERVER_USER"` - Domain string `ini:"SSH_DOMAIN"` - Port int `ini:"SSH_PORT"` - ListenHost string `ini:"SSH_LISTEN_HOST"` - ListenPort int `ini:"SSH_LISTEN_PORT"` - RootPath string `ini:"SSH_ROOT_PATH"` - ServerCiphers []string `ini:"SSH_SERVER_CIPHERS"` - ServerKeyExchanges []string `ini:"SSH_SERVER_KEY_EXCHANGES"` - ServerMACs []string `ini:"SSH_SERVER_MACS"` - KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` - KeygenPath string `ini:"SSH_KEYGEN_PATH"` - AuthorizedKeysBackup bool `ini:"SSH_AUTHORIZED_KEYS_BACKUP"` - MinimumKeySizeCheck bool `ini:"-"` - MinimumKeySizes map[string]int `ini:"-"` - ExposeAnonymous bool `ini:"SSH_EXPOSE_ANONYMOUS"` + Disabled bool `ini:"DISABLE_SSH"` + StartBuiltinServer bool `ini:"START_SSH_SERVER"` + BuiltinServerUser string `ini:"BUILTIN_SSH_SERVER_USER"` + Domain string `ini:"SSH_DOMAIN"` + Port int `ini:"SSH_PORT"` + ListenHost string `ini:"SSH_LISTEN_HOST"` + ListenPort int `ini:"SSH_LISTEN_PORT"` + RootPath string `ini:"SSH_ROOT_PATH"` + ServerCiphers []string `ini:"SSH_SERVER_CIPHERS"` + ServerKeyExchanges []string `ini:"SSH_SERVER_KEY_EXCHANGES"` + ServerMACs []string `ini:"SSH_SERVER_MACS"` + KeyTestPath string `ini:"SSH_KEY_TEST_PATH"` + KeygenPath string `ini:"SSH_KEYGEN_PATH"` + AuthorizedKeysBackup bool `ini:"SSH_AUTHORIZED_KEYS_BACKUP"` + MinimumKeySizeCheck bool `ini:"-"` + MinimumKeySizes map[string]int `ini:"-"` + CreateAuthorizedKeysFile bool `ini:"SSH_CREATE_AUTHORIZED_KEYS_FILE"` + ExposeAnonymous bool `ini:"SSH_EXPOSE_ANONYMOUS"` }{ Disabled: false, StartBuiltinServer: false, @@ -863,6 +864,7 @@ func NewContext() { } } SSH.AuthorizedKeysBackup = sec.Key("SSH_AUTHORIZED_KEYS_BACKUP").MustBool(true) + SSH.CreateAuthorizedKeysFile = sec.Key("SSH_CREATE_AUTHORIZED_KEYS_FILE").MustBool(true) SSH.ExposeAnonymous = sec.Key("SSH_EXPOSE_ANONYMOUS").MustBool(false) sec = Cfg.Section("server") From 9cd224cdb47dffc55a50648ce04e5b07ce0d5ebd Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 1 Nov 2018 13:42:58 +0000 Subject: [PATCH 404/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 6636ed74e928..2c9cee227f8f 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -140,7 +140,7 @@ openid_signup_popup=OpenID-basierte Selbstregistrierung aktivieren. enable_captcha=CAPTCHA aktivieren enable_captcha_popup=Captcha-Eingabe bei der Registrierung erforderlich. require_sign_in_view=Ansehen erfordert Anmeldung -require_sign_in_view_popup=Beschänkt den Zugriff auf angemeldete Nutzer. Andere Besucher sehen nur die Anmelde- und Registierungsseite. +require_sign_in_view_popup=Beschränkt den Zugriff auf angemeldete Nutzer. Andere Besucher sehen nur die Anmelde- und Registrierungsseite. admin_setting_desc=Das Erstellen eines Administrator-Kontos ist optional. Der erste registrierte Benutzer wird automatisch Administrator. admin_title=Administratoreinstellungen admin_name=Administrator-Benutzername @@ -159,7 +159,7 @@ install_success=Willkommen! Danke, dass du Gitea gewählt hast. Viel Spaß! invalid_log_root_path=Pfad zum Log-Verzeichnis ist ungültig: %v default_keep_email_private=E-Mail-Adressen standardmäßig verbergen default_keep_email_private_popup=E-Mail-Adressen von neuen Benutzern standardmäßig verbergen. -default_allow_create_organization=Erstellen von Organisationen standarmäßig erlauben +default_allow_create_organization=Erstellen von Organisationen standardmäßig erlauben default_allow_create_organization_popup=Neuen Nutzern das Erstellen von Organisationen standardmäßig erlauben. default_enable_timetracking=Zeiterfassung standardmäßig aktivieren default_enable_timetracking_popup=Zeiterfassung standardmäßig für neue Repositories aktivieren. @@ -188,7 +188,7 @@ search=Suche code=Code repo_no_results=Keine passenden Repositories gefunden. user_no_results=Keine passenden Benutzer gefunden. -org_no_results=Keine passenden Organisatioen gefunden. +org_no_results=Keine passenden Organisationen gefunden. code_no_results=Es konnte kein passender Code für deinen Suchbegriff gefunden werden. code_search_results=Suchergebnisse für „%s“ @@ -624,7 +624,7 @@ editor.cancel=Abbrechen editor.filename_cannot_be_empty=Der Dateiname darf nicht leer sein. editor.branch_already_exists=Branch „%s“ existiert bereits in diesem Repository. editor.directory_is_a_file=Der Verzeichnisname „%s“ wird bereits als Dateiname in diesem Repository verwendet. -editor.file_is_a_symlink='%s' ist ein symolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden. +editor.file_is_a_symlink='%s' ist ein symbolischer Link. Symbolische Links können mit dem Web Editor nicht bearbeitet werden editor.filename_is_a_directory=Der Dateiname „%s“ wird bereits als Verzeichnisname in diesem Repository verwendet. editor.file_editing_no_longer_exists=Die bearbeitete Datei „%s“ existiert nicht mehr in diesem Repository. editor.file_changed_while_editing=Der Inhalt der Datei hat sich seit dem Beginn der Bearbeitung geändert. Hier klicken, um die Änderungen anzusehen, oder Änderungen erneut comitten, um sie zu überschreiben. @@ -1135,7 +1135,7 @@ settings.protected_branch_can_push=Push erlauben? settings.protected_branch_can_push_yes=Du kannst pushen settings.protected_branch_can_push_no=Du kannst nicht pushen settings.branch_protection=Branch-Schutz für Branch „%s“ -settings.protect_this_branch=Brach-Schutz aktivieren +settings.protect_this_branch=Branch-Schutz aktivieren settings.protect_this_branch_desc=Verhindere Löschen und deaktiviere das „force pushing” von Git auf diesen Branch. settings.protect_whitelist_committers=Push-Whitelist aktivieren settings.protect_whitelist_committers_desc=Erlaube Nutzern oder Teams auf der Whitelist Push-Beschränkungen zu umgehen. @@ -1227,7 +1227,7 @@ branch.delete_html=Branch löschen branch.delete_desc=Das Löschen eines Branches ist permanent. Es KANN NICHT rückgängig gemacht werden. Fortfahren? branch.deletion_success=Branch „%s“ wurde gelöscht. branch.deletion_failed=Branch „%s“ konnte nicht gelöscht werden. -branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht weden, da seit dem letzten Merge neue Commits hinzugefügt wurden. +branch.delete_branch_has_new_commits=Der Branch „%s“ kann nicht gelöscht werden, da seit dem letzten Merge neue Commits hinzugefügt wurden. branch.create_branch=Erstelle Branch %s branch.create_from=von „%s“ branch.create_success=Branch „%s“ wurde erstellt. @@ -1411,7 +1411,7 @@ users.edit=Bearbeiten users.auth_source=Authentifizierungsquelle users.local=Lokal users.auth_login_name=Anmeldename zur Authentifizierung -users.password_helper=Passwort leerlassen, um es nicht zu verändern. +users.password_helper=Passwort leer lassen, um es nicht zu verändern. users.update_profile_success=Der Account „%s“ wurde aktualisiert. users.edit_account=Benutzerkonto bearbeiten users.max_repo_creation=Maximale Anzahl Repositories @@ -1463,7 +1463,7 @@ auths.bind_password_helper=Achtung: Das Passwort wird im Klartext gespeichert. B auths.user_base=Basis für Benutzersuche auths.user_dn=Benutzer-DN auths.attribute_username=Benutzernamens-Attribut -auths.attribute_username_placeholder=Leerlassen, um den in Gitea eingegebenen Benutzernamen zu verwenden. +auths.attribute_username_placeholder=Leer lassen, um den in Gitea eingegebenen Benutzernamen zu verwenden. auths.attribute_name=Vornamensattribut auths.attribute_surname=Nachnamensattribut auths.attribute_mail=E-Mail-Attribut @@ -1478,7 +1478,7 @@ auths.smtp_auth=SMTP-Authentifizierungstyp auths.smtphost=SMTP-Host auths.smtpport=SMTP-Port auths.allowed_domains=Erlaubte Domains -auths.allowed_domains_helper=Leerlassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma („,“). +auths.allowed_domains_helper=Leer lassen, um alle Domains zuzulassen. Trenne mehrere Domänen mit einem Komma („,“). auths.enable_tls=TLS-Verschlüsselung aktivieren auths.skip_tls_verify=TLS-Verifikation überspringen auths.pam_service_name=PAM-Dienstname From bacbc57f5d4c87c0bcbd3802cd4cb52adb468219 Mon Sep 17 00:00:00 2001 From: Stanislav Date: Thu, 1 Nov 2018 19:43:17 +0300 Subject: [PATCH 405/447] Update golang version in Dockerfile (#5246) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a5b91074ea00..40299809c4de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ################################### #Build stage -FROM golang:1.10-alpine3.7 AS build-env +FROM golang:1.11-alpine3.7 AS build-env ARG GITEA_VERSION ARG TAGS="sqlite sqlite_unlock_notify" From b3a7c2c22c3ff6d8512a8a99edb06a1e343ff40f Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 1 Nov 2018 19:12:17 +0100 Subject: [PATCH 406/447] Fixed heatmap not working in mssql (#5248) --- models/user_heatmap.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/models/user_heatmap.go b/models/user_heatmap.go index f9575ed50fc4..9e603f4fe179 100644 --- a/models/user_heatmap.go +++ b/models/user_heatmap.go @@ -19,6 +19,7 @@ type UserHeatmapData struct { func GetUserHeatmapDataByUser(user *User) ([]*UserHeatmapData, error) { hdata := make([]*UserHeatmapData, 0) var groupBy string + var groupByName = "timestamp" // We need this extra case because mssql doesn't allow grouping by alias switch { case setting.UseSQLite3: groupBy = "strftime('%s', strftime('%Y-%m-%d', created_unix, 'unixepoch'))" @@ -28,13 +29,14 @@ func GetUserHeatmapDataByUser(user *User) ([]*UserHeatmapData, error) { groupBy = "extract(epoch from date_trunc('day', to_timestamp(created_unix)))" case setting.UseMSSQL: groupBy = "dateadd(DAY,0, datediff(day,0, dateadd(s, created_unix, '19700101')))" + groupByName = groupBy } - err := x.Select(groupBy+" as timestamp, count(user_id) as contributions"). + err := x.Select(groupBy+" AS timestamp, count(user_id) as contributions"). Table("action"). Where("user_id = ?", user.ID). And("created_unix > ?", (util.TimeStampNow() - 31536000)). - GroupBy("timestamp"). + GroupBy(groupByName). OrderBy("timestamp"). Find(&hdata) return hdata, err From 1be16271205bad5cce475b75522ad0765dc6997b Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 3 Nov 2018 13:20:02 +0100 Subject: [PATCH 407/447] Fixed wrong api request url for instances running in subfolders (#5247) --- public/js/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/js/index.js b/public/js/index.js index 0bc28c4f9654..9aafa7d6464b 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -2626,7 +2626,7 @@ function initIssueList() { $('.new-dependency-drop-list') .dropdown({ apiSettings: { - url: '/api/v1/repos' + repolink + '/issues?q={query}', + url: suburl + '/api/v1/repos' + repolink + '/issues?q={query}', onResponse: function(response) { var filteredResponse = {'success': true, 'results': []}; // Parse the response from the api to work with our dropdown From 023d812276c434e31172a629d7e076e33f2e59ee Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sat, 3 Nov 2018 23:06:09 +0100 Subject: [PATCH 408/447] Update gitignore list (#5258) * update gitignore * Handle symlink in tar * Add some logs --- options/gitignore/Actionscript | 5 +- options/gitignore/Android | 16 ++++++- options/gitignore/Archives | 5 +- options/gitignore/Autotools | 12 ++++- options/gitignore/Backup | 5 ++ options/gitignore/C | 1 + options/gitignore/Clojure | 14 ++++++ options/gitignore/CodeKit | 1 + options/gitignore/Composer | 2 +- options/gitignore/CraftCMS | 5 +- options/gitignore/Dart | 13 +++++- options/gitignore/Delphi | 5 +- options/gitignore/Diff | 2 + options/gitignore/Drupal | 3 ++ options/gitignore/Eagle | 9 +++- options/gitignore/Eclipse | 10 ++-- options/gitignore/Elixir | 3 ++ options/gitignore/ExtJs | 2 + options/gitignore/Fortran | 32 +++++++++++++ options/gitignore/GWT | 3 -- options/gitignore/Go | 4 +- options/gitignore/Godot | 8 ++++ options/gitignore/Haskell | 2 + options/gitignore/Images | 63 ++++++++++++++++++++++++++ options/gitignore/JEnv | 5 ++ options/gitignore/Java | 1 + options/gitignore/Jekyll | 1 + options/gitignore/JetBrains | 42 ++++++++++++----- options/gitignore/Joomla | 3 +- options/gitignore/{KiCAD => KiCad} | 4 ++ options/gitignore/Kotlin | 23 ++++++++++ options/gitignore/LabVIEW | 1 + options/gitignore/Laravel | 9 ++-- options/gitignore/Leiningen | 1 + options/gitignore/Magento | 29 ++++++++++++ options/gitignore/Matlab | 24 ++++++---- options/gitignore/Maven | 4 +- options/gitignore/MicrosoftOffice | 5 +- options/gitignore/Nanoc | 2 +- options/gitignore/NetBeans | 2 +- options/gitignore/Node | 23 ++++++++-- options/gitignore/OCaml | 3 ++ options/gitignore/Objective-C | 5 +- options/gitignore/PSoCCreator | 18 ++++++++ options/gitignore/Patch | 2 + options/gitignore/Perl | 2 +- options/gitignore/Perl6 | 7 +++ options/gitignore/Prestashop | 4 +- options/gitignore/Processing | 2 + options/gitignore/Python | 30 ++++++++++-- options/gitignore/Qt | 17 ++++--- options/gitignore/R | 3 ++ options/gitignore/ROS | 4 ++ options/gitignore/Rails | 20 +++++++- options/gitignore/Rust | 2 +- options/gitignore/Sass | 2 + options/gitignore/Smalltalk | 4 ++ options/gitignore/SublimeText | 10 ++-- options/gitignore/SugarCRM | 4 +- options/gitignore/Swift | 13 +++++- options/gitignore/Symfony | 11 +++++ options/gitignore/SynopsysVCS | 8 ++-- options/gitignore/TeX | 40 +++++++++++++++- options/gitignore/Terraform | 28 ++++++++++-- options/gitignore/Typo3 | 5 +- options/gitignore/Umbraco | 13 ++++-- options/gitignore/Unity | 19 ++++---- options/gitignore/UnrealEngine | 10 ++-- options/gitignore/Vagrant | 4 ++ options/gitignore/Vim | 15 ++++-- options/gitignore/VisualStudio | 73 ++++++++++++++++++++++++------ options/gitignore/Windows | 6 ++- options/gitignore/WordPress | 1 + options/gitignore/Xcode | 56 +++++++++++++++++++++++ options/gitignore/ZendFramework | 1 - options/gitignore/macOS | 52 ++++++++++----------- scripts/generate-gitignores.go | 24 ++++++++++ 77 files changed, 765 insertions(+), 157 deletions(-) create mode 100644 options/gitignore/Backup create mode 100644 options/gitignore/Diff create mode 100644 options/gitignore/Godot create mode 100644 options/gitignore/Images create mode 100644 options/gitignore/JEnv rename options/gitignore/{KiCAD => KiCad} (72%) create mode 100644 options/gitignore/Kotlin create mode 100644 options/gitignore/PSoCCreator create mode 100644 options/gitignore/Patch create mode 100644 options/gitignore/Perl6 diff --git a/options/gitignore/Actionscript b/options/gitignore/Actionscript index 11e612e98537..5d947ca8879f 100644 --- a/options/gitignore/Actionscript +++ b/options/gitignore/Actionscript @@ -1,9 +1,8 @@ # Build and Release Folders -bin/ bin-debug/ bin-release/ -[Oo]bj/ # FlashDevelop obj -[Bb]in/ # FlashDevelop bin +[Oo]bj/ +[Bb]in/ # Other files and folders .settings/ diff --git a/options/gitignore/Android b/options/gitignore/Android index 520a86352f74..69eda01429a8 100644 --- a/options/gitignore/Android +++ b/options/gitignore/Android @@ -1,6 +1,7 @@ # Built application files *.apk *.ap_ +*.aab # Files for the ART/Dalvik VM *.dex @@ -32,16 +33,20 @@ proguard/ # Android Studio captures folder captures/ -# Intellij +# IntelliJ *.iml .idea/workspace.xml .idea/tasks.xml .idea/gradle.xml +.idea/assetWizardSettings.xml .idea/dictionaries .idea/libraries +.idea/caches # Keystore files -*.jks +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore # External native build folder generated in Android Studio 2.2 and later .externalNativeBuild @@ -53,3 +58,10 @@ google-services.json freeline.py freeline/ freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md diff --git a/options/gitignore/Archives b/options/gitignore/Archives index e9eda68baf2e..43fd5582f915 100644 --- a/options/gitignore/Archives +++ b/options/gitignore/Archives @@ -5,17 +5,18 @@ *.rar *.zip *.gz +*.tgz *.bzip *.bz2 *.xz *.lzma *.cab -#packing-only formats +# Packing-only formats *.iso *.tar -#package management formats +# Package management formats *.dmg *.xpi *.gem diff --git a/options/gitignore/Autotools b/options/gitignore/Autotools index e3923f96fcef..f4f545c9ca4b 100644 --- a/options/gitignore/Autotools +++ b/options/gitignore/Autotools @@ -9,13 +9,15 @@ Makefile.in # http://www.gnu.org/software/autoconf -/autom4te.cache +autom4te.cache /autoscan.log /autoscan-*.log /aclocal.m4 /compile /config.guess /config.h.in +/config.log +/config.status /config.sub /configure /configure.scan @@ -31,3 +33,11 @@ Makefile.in # http://www.gnu.org/software/texinfo /texinfo.tex + +# http://www.gnu.org/software/m4/ + +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 diff --git a/options/gitignore/Backup b/options/gitignore/Backup new file mode 100644 index 000000000000..825ce52db53d --- /dev/null +++ b/options/gitignore/Backup @@ -0,0 +1,5 @@ +*.bak +*.gho +*.ori +*.orig +*.tmp diff --git a/options/gitignore/C b/options/gitignore/C index 8a365b3d8297..c6127b38c1aa 100644 --- a/options/gitignore/C +++ b/options/gitignore/C @@ -45,6 +45,7 @@ # Kernel Module Compile Results *.mod* *.cmd +.tmp_versions/ modules.order Module.symvers Mkfile.old diff --git a/options/gitignore/Clojure b/options/gitignore/Clojure index e69de29bb2d1..a4cb69a32ccc 100644 --- a/options/gitignore/Clojure +++ b/options/gitignore/Clojure @@ -0,0 +1,14 @@ +pom.xml +pom.xml.asc +*.jar +*.class +/lib/ +/classes/ +/target/ +/checkouts/ +.lein-deps-sum +.lein-repl-history +.lein-plugins/ +.lein-failures +.nrepl-port +.cpcache/ diff --git a/options/gitignore/CodeKit b/options/gitignore/CodeKit index bd9e67fcca23..09b84126cea5 100644 --- a/options/gitignore/CodeKit +++ b/options/gitignore/CodeKit @@ -1,3 +1,4 @@ # General CodeKit files to ignore config.codekit +config.codekit3 /min diff --git a/options/gitignore/Composer b/options/gitignore/Composer index c42226784240..a67d42b32f86 100644 --- a/options/gitignore/Composer +++ b/options/gitignore/Composer @@ -1,6 +1,6 @@ composer.phar /vendor/ -# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file +# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file # composer.lock diff --git a/options/gitignore/CraftCMS b/options/gitignore/CraftCMS index a70d4772c46c..0d81b397e35e 100644 --- a/options/gitignore/CraftCMS +++ b/options/gitignore/CraftCMS @@ -1,3 +1,4 @@ -# Craft Storage (cache) [http://buildwithcraft.com/help/craft-storage-gitignore] +# Craft 2 Storage (https://craftcms.com/support/craft-storage-gitignore) +# not necessary for Craft 3 (https://github.com/craftcms/craft/issues/26) /craft/storage/* -!/craft/storage/logo/* \ No newline at end of file +!/craft/storage/rebrand diff --git a/options/gitignore/Dart b/options/gitignore/Dart index 4d2a4d6db7cd..dbef116d224d 100644 --- a/options/gitignore/Dart +++ b/options/gitignore/Dart @@ -1,8 +1,8 @@ -# See https://www.dartlang.org/tools/private-files.html +# See https://www.dartlang.org/guides/libraries/private-files # Files and directories created by pub +.dart_tool/ .packages -.pub/ build/ # If you're building an application, you may want to check-in your pubspec.lock pubspec.lock @@ -10,3 +10,12 @@ pubspec.lock # Directory created by dartdoc # If you don't generate documentation locally you can remove this line. doc/api/ + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map diff --git a/options/gitignore/Delphi b/options/gitignore/Delphi index 19864c6bbefb..9532800ba224 100644 --- a/options/gitignore/Delphi +++ b/options/gitignore/Delphi @@ -20,7 +20,7 @@ # Deployment Manager configuration file for your project. Added in Delphi XE2. # Uncomment this if it is not mobile development and you do not use remote debug feature. #*.deployproj -# +# # C++ object files produced when C/C++ Output file generation is configured. # Uncomment this if you are not using external objects (zlib library for example). #*.obj @@ -64,3 +64,6 @@ __recovery/ # Castalia statistics file (since XE7 Castalia is distributed with Delphi) *.stat + +# Boss dependency manager vendor folder https://github.com/HashLoad/boss +modules/ diff --git a/options/gitignore/Diff b/options/gitignore/Diff new file mode 100644 index 000000000000..59491b4440cf --- /dev/null +++ b/options/gitignore/Diff @@ -0,0 +1,2 @@ +*.patch +*.diff diff --git a/options/gitignore/Drupal b/options/gitignore/Drupal index 0d2fe537f46d..072b683190f1 100644 --- a/options/gitignore/Drupal +++ b/options/gitignore/Drupal @@ -1,10 +1,12 @@ # Ignore configuration files that may contain sensitive information. sites/*/*settings*.php +sites/example.sites.php # Ignore paths that contain generated content. files/ sites/*/files sites/*/private +sites/*/translations # Ignore default text files robots.txt @@ -16,6 +18,7 @@ robots.txt /UPGRADE.txt /README.txt sites/README.txt +sites/all/libraries/README.txt sites/all/modules/README.txt sites/all/themes/README.txt diff --git a/options/gitignore/Eagle b/options/gitignore/Eagle index 9ced12602664..28f0b9715e61 100644 --- a/options/gitignore/Eagle +++ b/options/gitignore/Eagle @@ -4,6 +4,9 @@ *.s#? *.b#? *.l#? +*.b$? +*.s$? +*.l$? # Eagle project file # It contains a serial number and references to the file structure @@ -31,14 +34,18 @@ eagle.epf *.drl *.gpi *.pls +*.ger +*.xln *.drd *.drd.* +*.s#* +*.b#* + *.info *.eps # file locks introduced since 7.x *.lck - diff --git a/options/gitignore/Eclipse b/options/gitignore/Eclipse index 4f88399d2d82..a65649a9ed2b 100644 --- a/options/gitignore/Eclipse +++ b/options/gitignore/Eclipse @@ -11,9 +11,6 @@ local.properties .loadpath .recommenders -# Eclipse Core -.project - # External tool builders .externalToolBuilders/ @@ -26,8 +23,8 @@ local.properties # CDT-specific (C/C++ Development Tooling) .cproject -# JDT-specific (Eclipse Java Development Tools) -.classpath +# CDT- autotools +.autotools # Java annotation processor (APT) .factorypath @@ -50,6 +47,9 @@ local.properties # Code Recommenders .recommenders/ +# Annotation Processing +.apt_generated/ + # Scala IDE specific (Scala & Java development for Eclipse) .cache-main .scala_dependencies diff --git a/options/gitignore/Elixir b/options/gitignore/Elixir index ac67aaf32434..86e4c3f39059 100644 --- a/options/gitignore/Elixir +++ b/options/gitignore/Elixir @@ -1,6 +1,9 @@ /_build /cover /deps +/doc +/.fetch erl_crash.dump *.ez *.beam +/config/*.secret.exs diff --git a/options/gitignore/ExtJs b/options/gitignore/ExtJs index c92aea0fe0cf..ab97a8cc3e11 100644 --- a/options/gitignore/ExtJs +++ b/options/gitignore/ExtJs @@ -10,3 +10,5 @@ ext/ modern.json modern.jsonp resources/sass/.sass-cache/ +resources/.arch-internal-preview.css +.arch-internal-preview.css diff --git a/options/gitignore/Fortran b/options/gitignore/Fortran index e69de29bb2d1..259148fa18f9 100644 --- a/options/gitignore/Fortran +++ b/options/gitignore/Fortran @@ -0,0 +1,32 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app diff --git a/options/gitignore/GWT b/options/gitignore/GWT index 07704e54bbcd..a01e7fcd9219 100644 --- a/options/gitignore/GWT +++ b/options/gitignore/GWT @@ -18,9 +18,6 @@ war/WEB-INF/classes/ #compilation logs .gwt/ -#caching for already compiled files -gwt-unitCache/ - #gwt junit compilation files www-test/ diff --git a/options/gitignore/Go b/options/gitignore/Go index a1338d68517e..f1c181ec9c5c 100644 --- a/options/gitignore/Go +++ b/options/gitignore/Go @@ -1,5 +1,6 @@ # Binaries for programs and plugins *.exe +*.exe~ *.dll *.so *.dylib @@ -9,6 +10,3 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ diff --git a/options/gitignore/Godot b/options/gitignore/Godot new file mode 100644 index 000000000000..ba45ca4582e5 --- /dev/null +++ b/options/gitignore/Godot @@ -0,0 +1,8 @@ + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg + +# Mono-specific ignores +.mono/ diff --git a/options/gitignore/Haskell b/options/gitignore/Haskell index 450f32ec40cc..82f3a88e17b4 100644 --- a/options/gitignore/Haskell +++ b/options/gitignore/Haskell @@ -17,4 +17,6 @@ cabal.sandbox.config *.eventlog .stack-work/ cabal.project.local +cabal.project.local~ .HTF/ +.ghc.environment.* diff --git a/options/gitignore/Images b/options/gitignore/Images new file mode 100644 index 000000000000..97dcdbe6a957 --- /dev/null +++ b/options/gitignore/Images @@ -0,0 +1,63 @@ +# JPEG +*.jpg +*.jpeg +*.jpe +*.jif +*.jfif +*.jfi + +# JPEG 2000 +*.jp2 +*.j2k +*.jpf +*.jpx +*.jpm +*.mj2 + +# JPEG XR +*.jxr +*.hdp +*.wdp + +# Graphics Interchange Format +*.gif + +# RAW +*.raw + +# Web P +*.webp + +# Portable Network Graphics +*.png + +# Animated Portable Network Graphics +*.apng + +# Multiple-image Network Graphics +*.mng + +# Tagged Image File Format +*.tiff +*.tif + +# Scalable Vector Graphics +*.svg +*.svgz + +# Portable Document Format +*.pdf + +# X BitMap +*.xbm + +# BMP +*.bmp +*.dib + +# ICO +*.ico + +# 3D Images +*.3dm +*.max diff --git a/options/gitignore/JEnv b/options/gitignore/JEnv new file mode 100644 index 000000000000..d838300ad5ea --- /dev/null +++ b/options/gitignore/JEnv @@ -0,0 +1,5 @@ +# JEnv local Java version configuration file +.java-version + +# Used by previous versions of JEnv +.jenv-version diff --git a/options/gitignore/Java b/options/gitignore/Java index 6143e53f9e36..a1c2a238a965 100644 --- a/options/gitignore/Java +++ b/options/gitignore/Java @@ -13,6 +13,7 @@ # Package Files # *.jar *.war +*.nar *.ear *.zip *.tar.gz diff --git a/options/gitignore/Jekyll b/options/gitignore/Jekyll index 5c91b60c063e..2ca868298ced 100644 --- a/options/gitignore/Jekyll +++ b/options/gitignore/Jekyll @@ -1,3 +1,4 @@ _site/ .sass-cache/ +.jekyll-cache/ .jekyll-metadata diff --git a/options/gitignore/JetBrains b/options/gitignore/JetBrains index a5d4cc86d33d..72f4d988a193 100644 --- a/options/gitignore/JetBrains +++ b/options/gitignore/JetBrains @@ -1,34 +1,48 @@ -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 -# User-specific stuff: +# User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml -.idea/dictionaries +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf -# Sensitive or high-churn files: +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids -.idea/**/dataSources.xml .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml -# Gradle: +# Gradle .idea/**/gradle.xml .idea/**/libraries -# Mongo Explorer plugin: +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin .idea/**/mongoSettings.xml -## File-based project format: +# File-based project format *.iws -## Plugin-specific files: - # IntelliJ -/out/ +out/ # mpeltonen/sbt-idea plugin .idea_modules/ @@ -44,3 +58,9 @@ com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser diff --git a/options/gitignore/Joomla b/options/gitignore/Joomla index 53a74e746578..378c158bddf8 100644 --- a/options/gitignore/Joomla +++ b/options/gitignore/Joomla @@ -1,4 +1,3 @@ -/.gitignore /.htaccess /administrator/cache/* /administrator/components/com_admin/* @@ -251,7 +250,7 @@ /administrator/language/en-GB/en-GB.tpl_hathor.sys.ini /administrator/language/en-GB/en-GB.xml /administrator/language/overrides/* -/administrator/logs/index.html +/administrator/logs/* /administrator/manifests/* /administrator/modules/mod_custom/* /administrator/modules/mod_feed/* diff --git a/options/gitignore/KiCAD b/options/gitignore/KiCad similarity index 72% rename from options/gitignore/KiCAD rename to options/gitignore/KiCad index 208bc4fc591b..15fdf72ed481 100644 --- a/options/gitignore/KiCAD +++ b/options/gitignore/KiCad @@ -1,4 +1,5 @@ # For PCBs designed using KiCad: http://www.kicad-pcb.org/ +# Format documentation: http://kicad-pcb.org/help/file-formats/ # Temporary files *.000 @@ -8,6 +9,9 @@ *~ _autosave-* *.tmp +*-rescue.lib +*-save.pro +*-save.kicad_pcb # Netlist files (exported from Eeschema) *.net diff --git a/options/gitignore/Kotlin b/options/gitignore/Kotlin new file mode 100644 index 000000000000..a1c2a238a965 --- /dev/null +++ b/options/gitignore/Kotlin @@ -0,0 +1,23 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/options/gitignore/LabVIEW b/options/gitignore/LabVIEW index 122450865cf1..31619f598145 100644 --- a/options/gitignore/LabVIEW +++ b/options/gitignore/LabVIEW @@ -14,3 +14,4 @@ # Metadata *.aliases *.lvlps +.cache/ diff --git a/options/gitignore/Laravel b/options/gitignore/Laravel index a4854bef5348..6552ddf8a06a 100644 --- a/options/gitignore/Laravel +++ b/options/gitignore/Laravel @@ -1,6 +1,7 @@ -vendor/ +/vendor/ node_modules/ npm-debug.log +yarn-error.log # Laravel 4 specific bootstrap/compiled.php @@ -10,11 +11,7 @@ app/storage/ public/storage public/hot storage/*.key -.env.*.php -.env.php .env Homestead.yaml Homestead.json - -# Rocketeer PHP task runner and deployment package. https://github.com/rocketeers/rocketeer -.rocketeer/ +/.vagrant diff --git a/options/gitignore/Leiningen b/options/gitignore/Leiningen index a9fe6fba80d9..a4cb69a32ccc 100644 --- a/options/gitignore/Leiningen +++ b/options/gitignore/Leiningen @@ -11,3 +11,4 @@ pom.xml.asc .lein-plugins/ .lein-failures .nrepl-port +.cpcache/ diff --git a/options/gitignore/Magento b/options/gitignore/Magento index b282f5cf5470..abe6d79fedbb 100644 --- a/options/gitignore/Magento +++ b/options/gitignore/Magento @@ -2,15 +2,44 @@ # Magento Default Files # #--------------------------# +/PATCH_*.sh + /app/etc/local.xml + /media/* !/media/.htaccess + +!/media/customer +/media/customer/* !/media/customer/.htaccess + +!/media/dhl +/media/dhl/* !/media/dhl/logo.jpg + +!/media/downloadable +/media/downloadable/* !/media/downloadable/.htaccess + +!/media/xmlconnect +/media/xmlconnect/* + +!/media/xmlconnect/custom +/media/xmlconnect/custom/* !/media/xmlconnect/custom/ok.gif + +!/media/xmlconnect/original +/media/xmlconnect/original/* !/media/xmlconnect/original/ok.gif + +!/media/xmlconnect/system +/media/xmlconnect/system/* !/media/xmlconnect/system/ok.gif + /var/* !/var/.htaccess + +!/var/package +/var/package/* !/var/package/*.xml + diff --git a/options/gitignore/Matlab b/options/gitignore/Matlab index 09dfde64b5fa..46a83d635bab 100644 --- a/options/gitignore/Matlab +++ b/options/gitignore/Matlab @@ -1,8 +1,3 @@ -##--------------------------------------------------- -## Remove autosaves generated by the Matlab editor -## We have git for backups! -##--------------------------------------------------- - # Windows default autosave extension *.asv @@ -12,11 +7,22 @@ # Compiled MEX binaries (all platforms) *.mex* -# Simulink Code Generation +# Packaged app and toolbox files +*.mlappinstall +*.mltbx + +# Generated helpsearch folders +helpsearch*/ + +# Simulink code generation folders slprj/ +sccprj/ -# Session info -octave-workspace +# Matlab code generation folders +codegen/ # Simulink autosave extension -.autosave +*.autosave + +# Octave session info +octave-workspace diff --git a/options/gitignore/Maven b/options/gitignore/Maven index 5f2dbe11df91..e8d57d08088d 100644 --- a/options/gitignore/Maven +++ b/options/gitignore/Maven @@ -7,6 +7,4 @@ release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties - -# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) -!/.mvn/wrapper/maven-wrapper.jar +.mvn/wrapper/maven-wrapper.jar diff --git a/options/gitignore/MicrosoftOffice b/options/gitignore/MicrosoftOffice index cb8917456601..ddcc9cf6e382 100644 --- a/options/gitignore/MicrosoftOffice +++ b/options/gitignore/MicrosoftOffice @@ -3,6 +3,9 @@ # Word temporary ~$*.doc* +# Word Auto Backup File +Backup of *.doc* + # Excel temporary ~$*.xls* @@ -13,4 +16,4 @@ ~$*.ppt* # Visio autosave temporary files -*.~vsdx +*.~vsd* diff --git a/options/gitignore/Nanoc b/options/gitignore/Nanoc index 3f36ea2a8787..6f35daaf4782 100644 --- a/options/gitignore/Nanoc +++ b/options/gitignore/Nanoc @@ -4,7 +4,7 @@ output/ # Temporary file directory -tmp/ +tmp/nanoc/ # Crash Log crash.log diff --git a/options/gitignore/NetBeans b/options/gitignore/NetBeans index 254108cd23b0..863bc7fa66e6 100644 --- a/options/gitignore/NetBeans +++ b/options/gitignore/NetBeans @@ -1,4 +1,4 @@ -nbproject/private/ +**/nbproject/private/ build/ nbbuild/ dist/ diff --git a/options/gitignore/Node b/options/gitignore/Node index 00cbbdf53f6c..e1da6ae8ea58 100644 --- a/options/gitignore/Node +++ b/options/gitignore/Node @@ -20,7 +20,7 @@ coverage # nyc test coverage .nyc_output -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # Bower dependency directory (https://bower.io/) @@ -29,14 +29,14 @@ bower_components # node-waf configuration .lock-wscript -# Compiled binary addons (http://nodejs.org/api/addons.html) +# Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules/ jspm_packages/ -# Typescript v1 declaration files +# TypeScript v1 declaration files typings/ # Optional npm cache directory @@ -57,3 +57,20 @@ typings/ # dotenv environment variables file .env +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# FuseBox cache +.fusebox/ diff --git a/options/gitignore/OCaml b/options/gitignore/OCaml index f7817ae5c36f..da0b20424a03 100644 --- a/options/gitignore/OCaml +++ b/options/gitignore/OCaml @@ -18,3 +18,6 @@ _build/ # oasis generated files setup.data setup.log + +# Merlin configuring file for Vim and Emacs +.merlin diff --git a/options/gitignore/Objective-C b/options/gitignore/Objective-C index 09dfede48147..a0bd6b453a80 100644 --- a/options/gitignore/Objective-C +++ b/options/gitignore/Objective-C @@ -35,6 +35,9 @@ xcuserdata/ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace # Carthage # @@ -52,7 +55,7 @@ Carthage/Build fastlane/report.xml fastlane/Preview.html -fastlane/screenshots +fastlane/screenshots/**/*.png fastlane/test_output # Code Injection diff --git a/options/gitignore/PSoCCreator b/options/gitignore/PSoCCreator new file mode 100644 index 000000000000..15ae040bcda6 --- /dev/null +++ b/options/gitignore/PSoCCreator @@ -0,0 +1,18 @@ +# Project Settings +*.cywrk.* +*.cyprj.* + +# Generated Assets and Resources +Debug/ +Release/ +Export/ +*/codegentemp +*/Generated_Source +*_datasheet.pdf +*_timing.html +*.cycdx +*.cyfit +*.rpt +*.svd +*.log +*.zip diff --git a/options/gitignore/Patch b/options/gitignore/Patch new file mode 100644 index 000000000000..6ffab9ad2958 --- /dev/null +++ b/options/gitignore/Patch @@ -0,0 +1,2 @@ +*.orig +*.rej diff --git a/options/gitignore/Perl b/options/gitignore/Perl index 9bf1537f6aec..ecf66f842915 100644 --- a/options/gitignore/Perl +++ b/options/gitignore/Perl @@ -24,7 +24,7 @@ Build.bat # Module::Install inc/ -# ExtUitls::MakeMaker +# ExtUtils::MakeMaker /blib/ /_eumm/ /*.gz diff --git a/options/gitignore/Perl6 b/options/gitignore/Perl6 new file mode 100644 index 000000000000..7b2c018a5626 --- /dev/null +++ b/options/gitignore/Perl6 @@ -0,0 +1,7 @@ +# Gitignore for Perl 6 (http://www.perl6.org) +# As part of https://github.com/github/gitignore + +# precompiled files +.precomp +lib/.precomp + diff --git a/options/gitignore/Prestashop b/options/gitignore/Prestashop index 7c6ae1e31ccd..81f45e19ebad 100644 --- a/options/gitignore/Prestashop +++ b/options/gitignore/Prestashop @@ -7,8 +7,10 @@ config/settings.*.php # The following files are generated by PrestaShop. admin-dev/autoupgrade/ -/cache/ +/cache/* !/cache/index.php +!/cache/*/ +/cache/*/* !/cache/cachefs/index.php !/cache/purifier/index.php !/cache/push/index.php diff --git a/options/gitignore/Processing b/options/gitignore/Processing index 85f269a89f60..333c0e0890a8 100644 --- a/options/gitignore/Processing +++ b/options/gitignore/Processing @@ -1,5 +1,7 @@ .DS_Store applet +application.linux-arm64 +application.linux-armv6hf application.linux32 application.linux64 application.windows32 diff --git a/options/gitignore/Python b/options/gitignore/Python index 62c1e736924f..510c73d0fdb6 100644 --- a/options/gitignore/Python +++ b/options/gitignore/Python @@ -8,7 +8,6 @@ __pycache__/ # Distribution / packaging .Python -env/ build/ develop-eggs/ dist/ @@ -24,6 +23,7 @@ wheels/ *.egg-info/ .installed.cfg *.egg +MANIFEST # PyInstaller # Usually these files are written by a python script from a template @@ -38,13 +38,15 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ +.nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml -*,cover +*.cover .hypothesis/ +.pytest_cache/ # Translations *.mo @@ -53,6 +55,7 @@ coverage.xml # Django stuff: *.log local_settings.py +db.sqlite3 # Flask stuff: instance/ @@ -70,6 +73,10 @@ target/ # Jupyter Notebook .ipynb_checkpoints +# IPython +profile_default/ +ipython_config.py + # pyenv .python-version @@ -79,16 +86,29 @@ celerybeat-schedule # SageMath parsed files *.sage.py -# dotenv +# Environments .env - -# virtualenv .venv +env/ venv/ ENV/ +env.bak/ +venv.bak/ # Spyder project settings .spyderproject +.spyproject # Rope project settings .ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/options/gitignore/Qt b/options/gitignore/Qt index c7659c24f386..5291a385b259 100644 --- a/options/gitignore/Qt +++ b/options/gitignore/Qt @@ -1,5 +1,4 @@ # C++ objects and libs - *.slo *.lo *.o @@ -11,7 +10,9 @@ *.dylib # Qt-es - +object_script.*.Release +object_script.*.Debug +*_plugin_import.cpp /.qmake.cache /.qmake.stash *.pro.user @@ -20,19 +21,23 @@ *.qbs.user.* *.moc moc_*.cpp +moc_*.h qrc_*.cpp ui_*.h +*.qmlc +*.jsc Makefile* *build-* -# QtCreator +# Qt unit tests +target_wrapper.* +# QtCreator *.autosave -# QtCtreator Qml +# QtCreator Qml *.qmlproject.user *.qmlproject.user.* -# QtCtreator CMake +# QtCreator CMake CMakeLists.txt.user* - diff --git a/options/gitignore/R b/options/gitignore/R index fcff087aebb6..26fad6fadff1 100644 --- a/options/gitignore/R +++ b/options/gitignore/R @@ -31,3 +31,6 @@ vignettes/*.pdf # Temporary files created by R markdown *.utf8.md *.knit.md + +# Shiny token, see https://shiny.rstudio.com/articles/shinyapps.html +rsconnect/ diff --git a/options/gitignore/ROS b/options/gitignore/ROS index f8bcd1173710..35d74bb771f5 100644 --- a/options/gitignore/ROS +++ b/options/gitignore/ROS @@ -1,3 +1,5 @@ +devel/ +logs/ build/ bin/ lib/ @@ -11,6 +13,8 @@ msg/*Feedback.msg msg/*Goal.msg msg/*Result.msg msg/_*.py +build_isolated/ +devel_isolated/ # Generated by dynamic reconfigure *.cfgc diff --git a/options/gitignore/Rails b/options/gitignore/Rails index e97427608c1a..38ba1b5b38c5 100644 --- a/options/gitignore/Rails +++ b/options/gitignore/Rails @@ -8,12 +8,13 @@ capybara-*.html /public/system /coverage/ /spec/tmp -**.orig +*.orig rerun.txt pickle-email-*.html # TODO Comment out this rule if you are OK with secrets being uploaded to the repo config/initializers/secret_token.rb +config/master.key # Only include if you have production secrets in this file, which is no longer a Rails default # config/secrets.yml @@ -42,3 +43,20 @@ bower.json # Ignore Byebug command history file. .byebug_history + +# Ignore node_modules +node_modules/ + +# Ignore precompiled javascript packs +/public/packs +/public/packs-test +/public/assets + +# Ignore yarn files +/yarn-error.log +yarn-debug.log* +.yarn-integrity + +# Ignore uploaded files in development +/storage/* +!/storage/.keep \ No newline at end of file diff --git a/options/gitignore/Rust b/options/gitignore/Rust index 50281a44270e..088ba6ba7d34 100644 --- a/options/gitignore/Rust +++ b/options/gitignore/Rust @@ -3,7 +3,7 @@ /target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html Cargo.lock # These are backup files generated by rustfmt diff --git a/options/gitignore/Sass b/options/gitignore/Sass index 486b32ce90c3..159f515170b8 100644 --- a/options/gitignore/Sass +++ b/options/gitignore/Sass @@ -1,2 +1,4 @@ .sass-cache/ *.css.map +*.sass.map +*.scss.map diff --git a/options/gitignore/Smalltalk b/options/gitignore/Smalltalk index 75272b234725..943995e11726 100644 --- a/options/gitignore/Smalltalk +++ b/options/gitignore/Smalltalk @@ -13,6 +13,10 @@ SqueakDebug.log # Monticello package cache /package-cache +# playground cache +/play-cache +/play-stash + # Metacello-github cache /github-cache github-*.zip diff --git a/options/gitignore/SublimeText b/options/gitignore/SublimeText index 95ff2244c990..86c3fa455aa8 100644 --- a/options/gitignore/SublimeText +++ b/options/gitignore/SublimeText @@ -1,16 +1,16 @@ -# cache files for sublime text +# Cache files for Sublime Text *.tmlanguage.cache *.tmPreferences.cache *.stTheme.cache -# workspace files are user-specific +# Workspace files are user-specific *.sublime-workspace -# project files should be checked into the repository, unless a significant -# proportion of contributors will probably not be using SublimeText +# Project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using Sublime Text # *.sublime-project -# sftp configuration file +# SFTP configuration file sftp-config.json # Package control specific files diff --git a/options/gitignore/SugarCRM b/options/gitignore/SugarCRM index e9270205fd56..6a183d1c7485 100644 --- a/options/gitignore/SugarCRM +++ b/options/gitignore/SugarCRM @@ -6,7 +6,7 @@ # the misuse of the repository as backup replacement. # For development the cache directory can be safely ignored and # therefore it is ignored. -/cache/ +/cache/* !/cache/index.html # Ignore some files and directories from the custom directory. /custom/history/ @@ -22,6 +22,6 @@ # Logs files can safely be ignored. *.log # Ignore the new upload directories. -/upload/ +/upload/* !/upload/index.html /upload_backup/ diff --git a/options/gitignore/Swift b/options/gitignore/Swift index d53404493965..7b0d62bc23a5 100644 --- a/options/gitignore/Swift +++ b/options/gitignore/Swift @@ -37,6 +37,7 @@ playground.xcworkspace # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins +# Package.resolved .build/ # CocoaPods @@ -46,6 +47,9 @@ playground.xcworkspace # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace # Carthage # @@ -63,5 +67,12 @@ Carthage/Build fastlane/report.xml fastlane/Preview.html -fastlane/screenshots +fastlane/screenshots/**/*.png fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ diff --git a/options/gitignore/Symfony b/options/gitignore/Symfony index 6c224e024e95..3dab634c1880 100644 --- a/options/gitignore/Symfony +++ b/options/gitignore/Symfony @@ -15,6 +15,10 @@ !var/logs/.gitkeep !var/sessions/.gitkeep +# Logs (Symfony4) +/var/log/* +!var/log/.gitkeep + # Parameters /app/config/parameters.yml /app/config/parameters.ini @@ -25,6 +29,7 @@ /bin/* !bin/console !bin/symfony_requirements +/vendor/ # Assets and user uploads /web/bundles/ @@ -37,5 +42,11 @@ # Build data /build/ +# Composer PHAR +/composer.phar + # Backup entities generated with doctrine:generate:entities command **/Entity/*~ + +# Embedded web-server pid file +/.web-server-pid diff --git a/options/gitignore/SynopsysVCS b/options/gitignore/SynopsysVCS index eed2432fb787..ad751f6bd756 100644 --- a/options/gitignore/SynopsysVCS +++ b/options/gitignore/SynopsysVCS @@ -4,8 +4,8 @@ *.evcd *.fsdb -# Default name of the simulation executable. A different name can be -# specified with this switch (the associated daidir database name is +# Default name of the simulation executable. A different name can be +# specified with this switch (the associated daidir database name is # also taken from here): -o / simv @@ -13,7 +13,7 @@ simv simv.daidir/ simv.db.dir/ -# Infrastructure necessary to co-simulate SystemC models with +# Infrastructure necessary to co-simulate SystemC models with # Verilog/VHDL models. An alternate directory may be specified with this # switch: -Mdir= csrc/ @@ -22,7 +22,7 @@ csrc/ # used to write all messages from simulation: -l *.log -# Coverage results (generated with urg) and database location. The +# Coverage results (generated with urg) and database location. The # following switch can also be used: urg -dir .vdb simv.vdb/ urgReport/ diff --git a/options/gitignore/TeX b/options/gitignore/TeX index 57ed9f5d9722..753f2b954ff4 100644 --- a/options/gitignore/TeX +++ b/options/gitignore/TeX @@ -10,9 +10,11 @@ *.fot *.cb *.cb2 +.*.lb ## Intermediate documents: *.dvi +*.xdv *-converted-to.* # these rules might exclude image files for figures etc. # *.ps @@ -38,6 +40,10 @@ *.synctex.gz(busy) *.pdfsync +## Build tool directories for auxiliary files +# latexrun +latex.out/ + ## Auxiliary and intermediate files from other packages: # algorithms *.alg @@ -58,6 +64,9 @@ acs-*.bib # changes *.soc +# comment +*.cut + # cprotect *.cpt @@ -108,6 +117,14 @@ acs-*.bib *.gaux *.gtex +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + # hyperref *.brf @@ -143,11 +160,16 @@ _minted* *.mw # nomencl +*.nlg *.nlo +*.nls # pax *.pax +# pdfpcnotes +*.pdfpc + # sagetex *.sagetex.sage *.sagetex.py @@ -169,6 +191,9 @@ sympy-plots-for-*.tex/ *.pytxcode pythontex-files-*/ +# tcolorbox +*.listing + # thmtools *.loe @@ -183,6 +208,12 @@ pythontex-files-*/ # easy-todo *.lod +# xcolor +*.xcp + +# xmpincl +*.xmpi + # xindy *.xdy @@ -204,6 +235,9 @@ TSWLatexianTemp* # Texpad .texpadtmp +# LyX +*.lyx~ + # Kile *.backup @@ -211,7 +245,11 @@ TSWLatexianTemp* *~[0-9]* # auto folder when using emacs and auctex -/auto/* +./auto/* +*.el # expex forward references with \gathertags *-tags.tex + +# standalone packages +*.sta diff --git a/options/gitignore/Terraform b/options/gitignore/Terraform index 41859c81f1c2..a8935803468f 100644 --- a/options/gitignore/Terraform +++ b/options/gitignore/Terraform @@ -1,6 +1,26 @@ -# Compiled files +# Local .terraform directories +**/.terraform/* + +# .tfstate files *.tfstate -*.tfstate.backup +*.tfstate.* + +# Crash log files +crash.log + +# Ignore any .tfvars files that are generated automatically for each Terraform run. Most +# .tfvars files are managed as part of configuration and so should be included in +# version control. +# +# example.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json -# Module directory -.terraform/ +# Include override files you do wish to add to version control using negated pattern +# +# !example_override.tf diff --git a/options/gitignore/Typo3 b/options/gitignore/Typo3 index cb024fefe996..200c2a2bf79d 100644 --- a/options/gitignore/Typo3 +++ b/options/gitignore/Typo3 @@ -8,12 +8,15 @@ /typo3conf/temp_CACHED* /typo3conf/temp_fieldInfo.php /typo3conf/deprecation_*.log -/typo3conf/AdditionalConfiguration.php +/typo3conf/ENABLE_INSTALL_TOOL +/typo3conf/realurl_autoconf.php +/FIRST_INSTALL # Ignore system folders, you should have them symlinked. # If not comment out the following entries. /typo3 /typo3_src /typo3_src-* +/Packages /.htaccess /index.php # Ignore temp directory. diff --git a/options/gitignore/Umbraco b/options/gitignore/Umbraco index ea05e1fb2a9e..cd90af3071a7 100644 --- a/options/gitignore/Umbraco +++ b/options/gitignore/Umbraco @@ -1,3 +1,7 @@ +## Ignore Umbraco files/folders generated for each instance +## +## Get latest from https://github.com/github/gitignore/blob/master/Umbraco.gitignore + # Note: VisualStudio gitignore rules may also be relevant # Umbraco @@ -12,8 +16,11 @@ # Don't ignore Umbraco packages (VisualStudio.gitignore mistakes this for a NuGet packages folder) # Make sure to include details from VisualStudio.gitignore BEFORE this -!**/App_Data/[Pp]ackages/ -!**/[Uu]mbraco/[Dd]eveloper/[Pp]ackages +!**/App_Data/[Pp]ackages/* +!**/[Uu]mbraco/[Dd]eveloper/[Pp]ackages/* -# ImageProcessor DiskCache +# ImageProcessor DiskCache **/App_Data/cache/ + +# Ignore the Models Builder models out of date flag +**/App_Data/Models/ood.flag diff --git a/options/gitignore/Unity b/options/gitignore/Unity index eb83a8f122de..833e6d4291c8 100644 --- a/options/gitignore/Unity +++ b/options/gitignore/Unity @@ -1,12 +1,12 @@ -/[Ll]ibrary/ -/[Tt]emp/ -/[Oo]bj/ -/[Bb]uild/ -/[Bb]uilds/ -/Assets/AssetStoreTools* +[Ll]ibrary/ +[Tt]emp/ +[Oo]bj/ +[Bb]uild/ +[Bb]uilds/ +Assets/AssetStoreTools* -# Visual Studio 2015 cache directory -/.vs/ +# Visual Studio cache directory +.vs/ # Autogenerated VS/MD/Consulo solution and project files ExportedObj/ @@ -22,9 +22,12 @@ ExportedObj/ *.booproj *.svd *.pdb +*.opendb +*.VC.db # Unity3D generated meta files *.pidb.meta +*.pdb.meta # Unity3D Generated File On Crash Reports sysinfo.txt diff --git a/options/gitignore/UnrealEngine b/options/gitignore/UnrealEngine index 2f096001fec4..6582eaf9a113 100644 --- a/options/gitignore/UnrealEngine +++ b/options/gitignore/UnrealEngine @@ -1,9 +1,6 @@ # Visual Studio 2015 user specific files .vs/ -# Visual Studio 2015 database file -*.VC.db - # Compiled Object files *.slo *.lo @@ -50,10 +47,16 @@ SourceArt/**/*.tga # Binary Files Binaries/* +Plugins/*/Binaries/* # Builds Build/* +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + # Don't ignore icon files in Build !Build/**/*.ico @@ -65,6 +68,7 @@ Saved/* # Compiled source files for the engine to use Intermediate/* +Plugins/*/Intermediate/* # Cache files for the editor to use DerivedDataCache/* diff --git a/options/gitignore/Vagrant b/options/gitignore/Vagrant index a977916f6583..93987ca00ecf 100644 --- a/options/gitignore/Vagrant +++ b/options/gitignore/Vagrant @@ -1 +1,5 @@ +# General .vagrant/ + +# Log files (if you are creating logs in debug mode, uncomment this) +# *.logs diff --git a/options/gitignore/Vim b/options/gitignore/Vim index 42e7afc10051..741518ffd248 100644 --- a/options/gitignore/Vim +++ b/options/gitignore/Vim @@ -1,12 +1,17 @@ -# swap +# Swap [._]*.s[a-v][a-z] [._]*.sw[a-p] -[._]s[a-v][a-z] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] [._]sw[a-p] -# session + +# Session Session.vim -# temporary + +# Temporary .netrwhist *~ -# auto-generated tag files +# Auto-generated tag files tags +# Persistent undo +[._]*.un~ diff --git a/options/gitignore/VisualStudio b/options/gitignore/VisualStudio index a752eacca7de..4d13c54854e8 100644 --- a/options/gitignore/VisualStudio +++ b/options/gitignore/VisualStudio @@ -4,6 +4,7 @@ ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files +*.rsuser *.suo *.user *.userosscache @@ -24,11 +25,14 @@ bld/ [Oo]bj/ [Ll]og/ -# Visual Studio 2015 cache/options directory +# Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot #wwwroot/ +# Visual Studio 2017 auto generated files +Generated\ Files/ + # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* @@ -42,20 +46,28 @@ TestResult.xml [Rr]eleasePS/ dlldata.c +# Benchmark Results +BenchmarkDotNet.Artifacts/ + # .NET Core project.lock.json project.fragment.lock.json artifacts/ -**/Properties/launchSettings.json +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio *_i.c *_p.c -*_i.h +*_h.h *.ilk *.meta *.obj +*.iobj *.pch *.pdb +*.ipdb *.pgc *.pgd *.rsp @@ -65,6 +77,7 @@ artifacts/ *.tlh *.tmp *.tmp_proj +*_wpftmp.csproj *.log *.vspscc *.vssscc @@ -93,6 +106,9 @@ ipch/ *.vspx *.sap +# Visual Studio Trace Files +*.e2e + # TFS 2012 Local Workspace $tf/ @@ -113,6 +129,10 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + # Visual Studio code coverage results *.coverage *.coveragexml @@ -148,7 +168,7 @@ publish/ # Publish Web Output *.[Pp]ublish.xml *.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings +# Note: Comment the next line if you want to checkin your web deploy settings, # but database connection strings (with potential passwords) will be unencrypted *.pubxml *.publishproj @@ -161,11 +181,11 @@ PublishScripts/ # NuGet Packages *.nupkg # The packages folder can be ignored because of Package Restore -**/packages/* +**/[Pp]ackages/* # except build/, which is used as an MSBuild target. -!**/packages/build/ +!**/[Pp]ackages/build/ # Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config +#!**/[Pp]ackages/repositories.config # NuGet v3's project.json files produces more ignorable files *.nuget.props *.nuget.targets @@ -183,6 +203,7 @@ AppPackages/ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt +*.appx # Visual Studio cache files # files ending in .cache can be ignored @@ -201,6 +222,10 @@ ClientBin/ *.publishsettings orleans.codegen.cs +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ @@ -215,15 +240,19 @@ _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak # SQL Server files *.mdf *.ldf +*.ndf # Business Intelligence projects *.rdl.data *.bim.layout *.bim_*.settings +*.rptproj.rsuser # Microsoft Fakes FakesAssemblies/ @@ -235,9 +264,6 @@ FakesAssemblies/ .ntvs_analysis.dat node_modules/ -# Typescript v1 declaration files -typings/ - # Visual Studio 6 build log *.plg @@ -266,8 +292,8 @@ paket-files/ .idea/ *.sln.iml -# CodeRush -.cr/ +# CodeRush personal settings +.cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ @@ -277,6 +303,9 @@ __pycache__/ # tools/** # !tools/packages.config +# Tabs Studio +*.tss + # Telerik's JustMock configuration file *.jmconfig @@ -284,4 +313,22 @@ __pycache__/ *.btp.cs *.btm.cs *.odx.cs -*.xsd.cs \ No newline at end of file +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ diff --git a/options/gitignore/Windows b/options/gitignore/Windows index ba26afd96539..0251dd21ad87 100644 --- a/options/gitignore/Windows +++ b/options/gitignore/Windows @@ -3,8 +3,11 @@ Thumbs.db ehthumbs.db ehthumbs_vista.db +# Dump file +*.stackdump + # Folder config file -Desktop.ini +[Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ @@ -12,6 +15,7 @@ $RECYCLE.BIN/ # Windows Installer files *.cab *.msi +*.msix *.msm *.msp diff --git a/options/gitignore/WordPress b/options/gitignore/WordPress index 97923503c4cb..3b181ec0cf24 100644 --- a/options/gitignore/WordPress +++ b/options/gitignore/WordPress @@ -7,6 +7,7 @@ wp-content/blogs.dir/ wp-content/cache/ wp-content/upgrade/ wp-content/uploads/ +wp-content/mu-plugins/ wp-content/wp-cache-config.php wp-content/plugins/hello.php diff --git a/options/gitignore/Xcode b/options/gitignore/Xcode index 37de8bb4793f..b01314d3a64c 100644 --- a/options/gitignore/Xcode +++ b/options/gitignore/Xcode @@ -21,3 +21,59 @@ xcuserdata/ *.moved-aside *.xccheckout *.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + diff --git a/options/gitignore/ZendFramework b/options/gitignore/ZendFramework index 80adb154900f..f0b7d8585b70 100644 --- a/options/gitignore/ZendFramework +++ b/options/gitignore/ZendFramework @@ -19,7 +19,6 @@ temp/ data/DoctrineORMModule/Proxy/ data/DoctrineORMModule/cache/ - # Legacy ZF1 demos/ extras/documentation diff --git a/options/gitignore/macOS b/options/gitignore/macOS index f0f3fbc06c89..135767fc075e 100644 --- a/options/gitignore/macOS +++ b/options/gitignore/macOS @@ -1,26 +1,26 @@ -*.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/scripts/generate-gitignores.go b/scripts/generate-gitignores.go index a169fc0242ac..0f56ff3a8971 100644 --- a/scripts/generate-gitignores.go +++ b/scripts/generate-gitignores.go @@ -59,6 +59,8 @@ func main() { tr := tar.NewReader(gz) + filesToCopy := make(map[string]string, 0) + for { hdr, err := tr.Next() @@ -74,6 +76,12 @@ func main() { continue } + if hdr.Typeflag == tar.TypeSymlink { + fmt.Printf("Found symlink %s -> %s\n", hdr.Name, hdr.Linkname) + filesToCopy[strings.TrimSuffix(filepath.Base(hdr.Name), ".gitignore")] = strings.TrimSuffix(filepath.Base(hdr.Linkname), ".gitignore") + continue + } + out, err := os.Create(path.Join(destination, strings.TrimSuffix(filepath.Base(hdr.Name), ".gitignore"))) if err != nil { @@ -89,5 +97,21 @@ func main() { } } + for dst, src := range filesToCopy { + // Read all content of src to data + src = path.Join(destination, src) + data, err := ioutil.ReadFile(src) + if err != nil { + log.Fatalf("Failed to read src file. %s", err) + } + // Write data to dst + dst = path.Join(destination, dst) + err = ioutil.WriteFile(dst, data, 0644) + if err != nil { + log.Fatalf("Failed to write new file. %s", err) + } + fmt.Printf("Written (copy of %s) %s\n", src, dst) + } + fmt.Println("Done") } From b7983c7e4fdb5e97238eabd7c597232ca78aed3c Mon Sep 17 00:00:00 2001 From: zeripath Date: Sun, 4 Nov 2018 01:15:55 +0000 Subject: [PATCH 409/447] Fix #5226 by adding CSRF checking to api reqToken and add CSRF to the POST header for deadline (#5250) * Add CSRF checking to reqToken and place CSRF in the post for deadline creation Fixes #5226, #5249 * /api/v1/admin/users routes should have reqToken middleware --- integrations/api_admin_test.go | 10 +++++----- integrations/git_test.go | 3 ++- modules/context/api.go | 13 +++++++++++++ public/js/index.js | 4 ++++ routers/api/v1/api.go | 12 ++++++++---- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/integrations/api_admin_test.go b/integrations/api_admin_test.go index 690edad757a6..b8dded9c116a 100644 --- a/integrations/api_admin_test.go +++ b/integrations/api_admin_test.go @@ -39,8 +39,8 @@ func TestAPIAdminCreateAndDeleteSSHKey(t *testing.T) { OwnerID: keyOwner.ID, }) - req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token="+token, - keyOwner.Name, newPublicKey.ID) + req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token=%s", + keyOwner.Name, newPublicKey.ID, token) session.MakeRequest(t, req, http.StatusNoContent) models.AssertNotExistsBean(t, &models.PublicKey{ID: newPublicKey.ID}) } @@ -51,7 +51,7 @@ func TestAPIAdminDeleteMissingSSHKey(t *testing.T) { session := loginUser(t, "user1") token := getTokenForLoggedInUser(t, session) - req := NewRequestf(t, "DELETE", "/api/v1/admin/users/user1/keys/%d?token="+token, models.NonexistentID) + req := NewRequestf(t, "DELETE", "/api/v1/admin/users/user1/keys/%d?token=%s", models.NonexistentID, token) session.MakeRequest(t, req, http.StatusNotFound) } @@ -73,8 +73,8 @@ func TestAPIAdminDeleteUnauthorizedKey(t *testing.T) { session = loginUser(t, normalUsername) token = getTokenForLoggedInUser(t, session) - req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token="+token, - adminUsername, newPublicKey.ID) + req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token=%s", + adminUsername, newPublicKey.ID, token) session.MakeRequest(t, req, http.StatusForbidden) } diff --git a/integrations/git_test.go b/integrations/git_test.go index 7ac375dd029d..96d39e0519e7 100644 --- a/integrations/git_test.go +++ b/integrations/git_test.go @@ -143,7 +143,8 @@ func TestGit(t *testing.T) { session := loginUser(t, "user1") keyOwner := models.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User) - urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys", keyOwner.Name) + token := getTokenForLoggedInUser(t, session) + urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys?token=%s", keyOwner.Name, token) dataPubKey, err := ioutil.ReadFile(keyFile + ".pub") assert.NoError(t, err) diff --git a/modules/context/api.go b/modules/context/api.go index 0bf4307726e8..6a9c792370f4 100644 --- a/modules/context/api.go +++ b/modules/context/api.go @@ -8,6 +8,8 @@ import ( "fmt" "strings" + "github.com/go-macaron/csrf" + "code.gitea.io/git" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/base" @@ -97,6 +99,17 @@ func (ctx *APIContext) SetLinkHeader(total, pageSize int) { } } +// RequireCSRF requires a validated a CSRF token +func (ctx *APIContext) RequireCSRF() { + headerToken := ctx.Req.Header.Get(ctx.csrf.GetHeaderName()) + formValueToken := ctx.Req.FormValue(ctx.csrf.GetFormName()) + if len(headerToken) > 0 || len(formValueToken) > 0 { + csrf.Validate(ctx.Context.Context, ctx.csrf) + } else { + ctx.Context.Error(401) + } +} + // APIContexter returns apicontext as macaron middleware func APIContexter() macaron.Handler { return func(c *Context) { diff --git a/public/js/index.js b/public/js/index.js index 9aafa7d6464b..f5d3ef2d93d7 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -2595,6 +2595,10 @@ function updateDeadline(deadlineString) { data: JSON.stringify({ 'due_date': realDeadline, }), + headers: { + 'X-Csrf-Token': csrf, + 'X-Remote': true, + }, contentType: 'application/json', type: 'POST', success: function () { diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index cf639e47f5d1..6ee9ad6e0c65 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -174,11 +174,15 @@ func repoAssignment() macaron.Handler { // Contexter middleware already checks token for user sign in process. func reqToken() macaron.Handler { - return func(ctx *context.Context) { - if true != ctx.Data["IsApiToken"] { - ctx.Error(401) + return func(ctx *context.APIContext) { + if true == ctx.Data["IsApiToken"] { + return + } + if ctx.IsSigned { + ctx.RequireCSRF() return } + ctx.Context.Error(401) } } @@ -634,7 +638,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Post("/repos", bind(api.CreateRepoOption{}), admin.CreateRepo) }) }) - }, reqAdmin()) + }, reqToken(), reqAdmin()) m.Group("/topics", func() { m.Get("/search", repo.TopicSearch) From 8bb93c6bd8fd7a725b238f5dd4d1e2fe071d37f5 Mon Sep 17 00:00:00 2001 From: zeripath Date: Sun, 4 Nov 2018 15:41:23 +0000 Subject: [PATCH 410/447] Add zeripath to maintainers (#5273) --- MAINTAINERS | 1 + 1 file changed, 1 insertion(+) diff --git a/MAINTAINERS b/MAINTAINERS index a28bbfd05dec..73136498507f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -26,3 +26,4 @@ Alexey Terentyev (@axifive) Lanre Adelowo (@adelowo) Konrad Langenberg (@kolaente) He-Long Zhang (@BetaCat0) +Andrew Thornton (@zeripath) From eafcf9075087bfe38e4e9605b5e88eb30b12800e Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 4 Nov 2018 20:01:15 -0500 Subject: [PATCH 411/447] 1.6.0-rc2 changelog (#5276) --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d32531db7819..1a4ce7e4ab95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ This changelog goes through all the changes that have been made in each release without substantial changes to our git log; to see the highlights of what has been added to each release, please refer to the [blog](https://blog.gitea.io). +## [1.6.0-rc2](https://github.com/go-gitea/gitea/releases/tag/v1.6.0-rc2) - 2018-11-04 +* SECURITY + * Add CSRF checking to reqToken and add reqToken to admin API routes (#5272) (#5250) +* FEATURE + * Add comment replies (#5147) (#5104) +* BUGFIXES + * Fix wrong api request url for instances running in subfolders (#5261) (#5247) + * Accept web-command cli flags if web-command is commited (#5245) (#5200) + * Reduce join star, repo_topic, topic tables on repo search, to resolve extra columns problem on MSSQL (#5136) (#5229) + * Fix data race on migrate repository (#5224) (#5230) + * Add secret to all webhook's payload where it has been missing (#5208) (#5199) + * Fix sqlite and MSSQL lock (#5210) (#5223) (#5214) (#5218) (#5176) (#5179) + * Fix race on updatesize (#5190) (#5215) + * Fix filtering issues by tags on main screen issues (#5219) (#3824) + * Fix SQL quoting (#5137) (#5117) + * Fix regex to support optional end line of old section in diff hunk (#5097) (#5096) + ## [1.6.0-rc1](https://github.com/go-gitea/gitea/releases/tag/v1.6.0-rc1) - 2018-10-17 * BREAKING * Respect email privacy option in user search via API (#4512) From edf94113207eeea85c5dcf7616be1eef593b319e Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Sun, 4 Nov 2018 21:21:56 -0500 Subject: [PATCH 412/447] Clean up docs (#5274) * make docs more clear * make docs more clear * Add analytics * Update customizing-gitea.en-us.md * Update app.ini.sample --- custom/conf/app.ini.sample | 4 ++-- docs/content/doc/advanced/config-cheat-sheet.en-us.md | 4 ++-- docs/content/doc/advanced/customizing-gitea.en-us.md | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index a5925b48da26..9e2b0b69585a 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -265,9 +265,9 @@ COOKIE_REMEMBER_NAME = gitea_incredible REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER ; The minimum password length for new Users MIN_PASSWORD_LENGTH = 6 -; True when users are allowed to import local server paths +; Set to true to allow users to import local server paths IMPORT_LOCAL_PATHS = false -; Prevent all users (including admin) from creating custom git hooks +; Set to true to prevent all users (including admin) from creating custom git hooks DISABLE_GIT_HOOKS = false [openid] diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index 1c327f6073a6..a046fd0ca5bb 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -160,9 +160,9 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. information. - `REVERSE_PROXY_AUTHENTICATION_USER`: **X-WEBAUTH-USER**: Header name for reverse proxy authentication. -- `DISABLE_GIT_HOOKS`: **false**: Prevent all users (including admin) from creating custom +- `DISABLE_GIT_HOOKS`: **false**: Set to `true` to prevent all users (including admin) from creating custom git hooks. -- `IMPORT_LOCAL_PATHS`: **false**: Prevent all users (including admin) from importing local path on server. +- `IMPORT_LOCAL_PATHS`: **false**: Set to `false` to prevent all users (including admin) from importing local path on server. ## OpenID (`openid`) diff --git a/docs/content/doc/advanced/customizing-gitea.en-us.md b/docs/content/doc/advanced/customizing-gitea.en-us.md index fed48ca988ab..7c8b683da5c3 100644 --- a/docs/content/doc/advanced/customizing-gitea.en-us.md +++ b/docs/content/doc/advanced/customizing-gitea.en-us.md @@ -88,10 +88,14 @@ Apart from `extra_links.tmpl` and `extra_tabs.tmpl`, there are other useful temp - `body_outer_post.tmpl`, before the bottom `
` element. - `footer.tmpl`, right before the end of the `` tag, a good place for additional Javascript. +## Adding Analytics to Gitea + +Google Analytics, Matomo (previously Piwik), and other analytics services can be added to Gitea. To add the tracking code, refer to the `Other additions to the page` section of this document, and add the JavaScript to the `custom/templates/custom/header.tmpl` file. + ## Customizing gitignores, labels, licenses, locales, and readmes. Place custom files in corresponding sub-folder under `custom/options`. ## Customizing the look of Gitea -Gitea has two built-in themes, the default theme `gitea`, and a dark theme `arc-green`. To change the look of your Gitea install change the value of `DEFAULT_THEME` in the [ui](https://docs.gitea.io/en-us/config-cheat-sheet/#ui-ui) section of `app.ini` to another one of the available options. +As of version 1.6.0 Gitea has built-in themes. The two built-in themes are, the default theme `gitea`, and a dark theme `arc-green`. To change the look of your Gitea install change the value of `DEFAULT_THEME` in the [ui](https://docs.gitea.io/en-us/config-cheat-sheet/#ui-ui) section of `app.ini` to another one of the available options. From e0d57fa2791f0be5a05e113aacf25c6a27bddbb2 Mon Sep 17 00:00:00 2001 From: Stanislav Date: Mon, 5 Nov 2018 06:20:00 +0300 Subject: [PATCH 413/447] Prometheus endpoint (#5256) * Add prometheus collector and route * dep ensure -add github.com/prometheus/client_golang/prometheus * dep ensure -update github.com/golang/protobuf * add metrics to reserved usernames * add comment head in metrics package * fix style imports * add metrics settings * add bearer token check * mapping metrics configs * fix lint * update config cheat sheet * update conf sample, typo fix --- Gopkg.lock | 68 +- Gopkg.toml | 4 + custom/conf/app.ini.sample | 6 + .../doc/advanced/config-cheat-sheet.en-us.md | 5 + models/user.go | 1 + modules/metrics/collector.go | 299 ++ modules/setting/setting.go | 11 + routers/metrics.go | 30 + routers/routes/routes.go | 10 + vendor/github.com/beorn7/perks/LICENSE | 20 + .../beorn7/perks/quantile/stream.go | 316 ++ vendor/github.com/golang/protobuf/LICENSE | 3 - .../github.com/golang/protobuf/proto/clone.go | 56 +- .../golang/protobuf/proto/decode.go | 774 +---- .../golang/protobuf/proto/discard.go | 350 +++ .../golang/protobuf/proto/encode.go | 1186 +------ .../github.com/golang/protobuf/proto/equal.go | 64 +- .../golang/protobuf/proto/extensions.go | 322 +- .../github.com/golang/protobuf/proto/lib.go | 135 +- .../golang/protobuf/proto/message_set.go | 104 +- .../golang/protobuf/proto/pointer_reflect.go | 592 ++-- .../golang/protobuf/proto/pointer_unsafe.go | 364 ++- .../golang/protobuf/proto/properties.go | 470 +-- .../golang/protobuf/proto/table_marshal.go | 2767 +++++++++++++++++ .../golang/protobuf/proto/table_merge.go | 654 ++++ .../golang/protobuf/proto/table_unmarshal.go | 2051 ++++++++++++ .../github.com/golang/protobuf/proto/text.go | 78 +- .../golang/protobuf/proto/text_parser.go | 167 +- .../golang_protobuf_extensions/LICENSE | 201 ++ .../golang_protobuf_extensions/NOTICE | 1 + .../pbutil/decode.go | 75 + .../golang_protobuf_extensions/pbutil/doc.go | 16 + .../pbutil/encode.go | 46 + .../prometheus/client_golang/LICENSE | 201 ++ .../prometheus/client_golang/NOTICE | 23 + .../client_golang/prometheus/collector.go | 120 + .../client_golang/prometheus/counter.go | 277 ++ .../client_golang/prometheus/desc.go | 184 ++ .../client_golang/prometheus/doc.go | 201 ++ .../prometheus/expvar_collector.go | 119 + .../client_golang/prometheus/fnv.go | 42 + .../client_golang/prometheus/gauge.go | 286 ++ .../client_golang/prometheus/go_collector.go | 301 ++ .../client_golang/prometheus/histogram.go | 614 ++++ .../client_golang/prometheus/http.go | 505 +++ .../prometheus/internal/metric.go | 85 + .../client_golang/prometheus/labels.go | 70 + .../client_golang/prometheus/metric.go | 174 ++ .../client_golang/prometheus/observer.go | 52 + .../prometheus/process_collector.go | 204 ++ .../prometheus/promhttp/delegator.go | 199 ++ .../prometheus/promhttp/delegator_1_8.go | 181 ++ .../prometheus/promhttp/delegator_pre_1_8.go | 44 + .../client_golang/prometheus/promhttp/http.go | 311 ++ .../prometheus/promhttp/instrument_client.go | 97 + .../promhttp/instrument_client_1_8.go | 144 + .../prometheus/promhttp/instrument_server.go | 447 +++ .../client_golang/prometheus/registry.go | 895 ++++++ .../client_golang/prometheus/summary.go | 626 ++++ .../client_golang/prometheus/timer.go | 51 + .../client_golang/prometheus/untyped.go | 42 + .../client_golang/prometheus/value.go | 162 + .../client_golang/prometheus/vec.go | 472 +++ .../client_golang/prometheus/wrap.go | 179 ++ .../prometheus/client_model/LICENSE | 201 ++ .../github.com/prometheus/client_model/NOTICE | 5 + .../prometheus/client_model/go/metrics.pb.go | 629 ++++ .../prometheus/client_model/ruby/LICENSE | 201 ++ vendor/github.com/prometheus/common/LICENSE | 201 ++ vendor/github.com/prometheus/common/NOTICE | 5 + .../prometheus/common/expfmt/decode.go | 429 +++ .../prometheus/common/expfmt/encode.go | 88 + .../prometheus/common/expfmt/expfmt.go | 38 + .../prometheus/common/expfmt/fuzz.go | 36 + .../prometheus/common/expfmt/text_create.go | 468 +++ .../prometheus/common/expfmt/text_parse.go | 757 +++++ .../bitbucket.org/ww/goautoneg/autoneg.go | 162 + .../prometheus/common/model/alert.go | 136 + .../prometheus/common/model/fingerprinting.go | 105 + .../github.com/prometheus/common/model/fnv.go | 42 + .../prometheus/common/model/labels.go | 210 ++ .../prometheus/common/model/labelset.go | 169 + .../prometheus/common/model/metric.go | 103 + .../prometheus/common/model/model.go | 16 + .../prometheus/common/model/signature.go | 144 + .../prometheus/common/model/silence.go | 106 + .../prometheus/common/model/time.go | 264 ++ .../prometheus/common/model/value.go | 416 +++ vendor/github.com/prometheus/procfs/LICENSE | 201 ++ vendor/github.com/prometheus/procfs/NOTICE | 7 + .../github.com/prometheus/procfs/buddyinfo.go | 95 + vendor/github.com/prometheus/procfs/doc.go | 45 + vendor/github.com/prometheus/procfs/fs.go | 82 + .../prometheus/procfs/internal/util/parse.go | 59 + .../procfs/internal/util/sysreadfile_linux.go | 45 + vendor/github.com/prometheus/procfs/ipvs.go | 259 ++ vendor/github.com/prometheus/procfs/mdstat.go | 151 + .../prometheus/procfs/mountstats.go | 606 ++++ .../github.com/prometheus/procfs/net_dev.go | 216 ++ .../github.com/prometheus/procfs/nfs/nfs.go | 263 ++ .../github.com/prometheus/procfs/nfs/parse.go | 317 ++ .../prometheus/procfs/nfs/parse_nfs.go | 67 + .../prometheus/procfs/nfs/parse_nfsd.go | 89 + vendor/github.com/prometheus/procfs/proc.go | 258 ++ .../github.com/prometheus/procfs/proc_io.go | 65 + .../prometheus/procfs/proc_limits.go | 150 + .../github.com/prometheus/procfs/proc_ns.go | 68 + .../github.com/prometheus/procfs/proc_stat.go | 188 ++ vendor/github.com/prometheus/procfs/stat.go | 232 ++ vendor/github.com/prometheus/procfs/xfrm.go | 187 ++ .../github.com/prometheus/procfs/xfs/parse.go | 330 ++ .../github.com/prometheus/procfs/xfs/xfs.go | 163 + 112 files changed, 24655 insertions(+), 2973 deletions(-) create mode 100644 modules/metrics/collector.go create mode 100644 routers/metrics.go create mode 100644 vendor/github.com/beorn7/perks/LICENSE create mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go create mode 100644 vendor/github.com/golang/protobuf/proto/discard.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_marshal.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_merge.go create mode 100644 vendor/github.com/golang/protobuf/proto/table_unmarshal.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go create mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go create mode 100644 vendor/github.com/prometheus/client_golang/LICENSE create mode 100644 vendor/github.com/prometheus/client_golang/NOTICE create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/http.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go create mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go create mode 100644 vendor/github.com/prometheus/client_model/LICENSE create mode 100644 vendor/github.com/prometheus/client_model/NOTICE create mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go create mode 100644 vendor/github.com/prometheus/client_model/ruby/LICENSE create mode 100644 vendor/github.com/prometheus/common/LICENSE create mode 100644 vendor/github.com/prometheus/common/NOTICE create mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go create mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go create mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go create mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go create mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go create mode 100644 vendor/github.com/prometheus/common/model/alert.go create mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go create mode 100644 vendor/github.com/prometheus/common/model/fnv.go create mode 100644 vendor/github.com/prometheus/common/model/labels.go create mode 100644 vendor/github.com/prometheus/common/model/labelset.go create mode 100644 vendor/github.com/prometheus/common/model/metric.go create mode 100644 vendor/github.com/prometheus/common/model/model.go create mode 100644 vendor/github.com/prometheus/common/model/signature.go create mode 100644 vendor/github.com/prometheus/common/model/silence.go create mode 100644 vendor/github.com/prometheus/common/model/time.go create mode 100644 vendor/github.com/prometheus/common/model/value.go create mode 100644 vendor/github.com/prometheus/procfs/LICENSE create mode 100644 vendor/github.com/prometheus/procfs/NOTICE create mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go create mode 100644 vendor/github.com/prometheus/procfs/doc.go create mode 100644 vendor/github.com/prometheus/procfs/fs.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/parse.go create mode 100644 vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go create mode 100644 vendor/github.com/prometheus/procfs/ipvs.go create mode 100644 vendor/github.com/prometheus/procfs/mdstat.go create mode 100644 vendor/github.com/prometheus/procfs/mountstats.go create mode 100644 vendor/github.com/prometheus/procfs/net_dev.go create mode 100644 vendor/github.com/prometheus/procfs/nfs/nfs.go create mode 100644 vendor/github.com/prometheus/procfs/nfs/parse.go create mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfs.go create mode 100644 vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go create mode 100644 vendor/github.com/prometheus/procfs/proc.go create mode 100644 vendor/github.com/prometheus/procfs/proc_io.go create mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go create mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go create mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go create mode 100644 vendor/github.com/prometheus/procfs/stat.go create mode 100644 vendor/github.com/prometheus/procfs/xfrm.go create mode 100644 vendor/github.com/prometheus/procfs/xfs/parse.go create mode 100644 vendor/github.com/prometheus/procfs/xfs/xfs.go diff --git a/Gopkg.lock b/Gopkg.lock index db5d6b4f548c..2da402ba741a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -81,6 +81,14 @@ pruneopts = "NUT" revision = "349dd0209470eabd9514242c688c403c0926d266" +[[projects]] + branch = "master" + digest = "1:707ebe952a8b3d00b343c01536c79c73771d100f63ec6babeaed5c79e2b8a8dd" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "NUT" + revision = "3a771d992973f24aa725d07868b467d1ddfceafb" + [[projects]] digest = "1:67351095005f164e748a5a21899d1403b03878cb2d40a7b0f742376e6eeda974" name = "github.com/blevesearch/bleve" @@ -405,11 +413,12 @@ revision = "7f3990acf1833faa5ebd0e86f0a4c72a4b5eba3c" [[projects]] - digest = "1:b64f9be717fdab5f75122dc3868e8ca9d003779b6bc55f64f39a0cddc698bf88" + digest = "1:97df918963298c287643883209a2c3f642e6593379f97ab400c2a2e219ab647d" name = "github.com/golang/protobuf" packages = ["proto"] pruneopts = "NUT" - revision = "99511271042a09d1e01baea8781caa5210fec66e" + revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" + version = "v1.2.0" [[projects]] digest = "1:60e25fc5f5cfd7783f985ca99b4383e848981dddf0be584db7d809be20848e25" @@ -573,6 +582,14 @@ pruneopts = "NUT" revision = "c7c4067b79cc51e6dfdcef5c702e74b1e0fa7c75" +[[projects]] + digest = "1:5985ef4caf91ece5d54817c11ea25f182697534f8ae6521eadcd628c142ac4b6" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "NUT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + [[projects]] branch = "master" digest = "1:1ed0f3c066eb9d1c2ff7a864a6fa595c70b9b49049cc46af6a6f7ff0e4655321" @@ -644,6 +661,51 @@ pruneopts = "NUT" revision = "54653902c20e47f3417541d35435cb6d6162e28a" +[[projects]] + digest = "1:aa2da1df3327c3a338bb42f978407c07de74cd0a5bef35e9411881dffd444214" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/internal", + "prometheus/promhttp", + ] + pruneopts = "NUT" + revision = "1cafe34db7fdec6022e17e00e1c1ea501022f3e4" + version = "v0.9.0" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "NUT" + revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" + +[[projects]] + branch = "master" + digest = "1:06375f3b602de9c99fa99b8484f0e949fd5273e6e9c6592b5a0dd4cd9085f3ea" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "NUT" + revision = "7e9e6cabbd393fc208072eedef99188d0ce788b6" + +[[projects]] + branch = "master" + digest = "1:102dea0c03a915acfc634b7c67f2662012b5483b56d9025e33f5188e112759b6" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/util", + "nfs", + "xfs", + ] + pruneopts = "NUT" + revision = "185b4288413d2a0dd0806f78c90dde719829e5ae" + [[projects]] branch = "master" digest = "1:5be01c22bc1040e2f6ce4755d51a0ac9cef823a9f2004fb1f9896a414ef519e6" @@ -981,6 +1043,8 @@ "github.com/nfnt/resize", "github.com/pquerna/otp", "github.com/pquerna/otp/totp", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promhttp", "github.com/russross/blackfriday", "github.com/satori/go.uuid", "github.com/sergi/go-diff/diffmatchpatch", diff --git a/Gopkg.toml b/Gopkg.toml index 069d7ecf5221..6338263bcc5a 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -107,3 +107,7 @@ ignored = ["google.golang.org/appengine*"] [[override]] revision = "c10ba270aa0bf8b8c1c986e103859c67a9103061" name = "golang.org/x/oauth2" + +[[constraint]] + name = "github.com/prometheus/client_golang" + version = "0.9.0" diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 9e2b0b69585a..781fe3ca5f7d 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -659,3 +659,9 @@ FILE_EXTENSIONS = .adoc,.asciidoc RENDER_COMMAND = "asciidoc --out-file=- -" ; Don't pass the file on STDIN, pass the filename as argument instead. IS_INPUT_FILE = false + +[metrics] +; Enables metrics endpoint. True or false; default is false. +ENABLED = false +; If you want to add authorization, specify a token here +TOKEN = diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index a046fd0ca5bb..b0ab78d2f14a 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -302,6 +302,11 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `PULL`: **300**: Git pull from internal repositories timeout seconds. - `GC`: **60**: Git repository GC timeout seconds. +## Metrics (`metrics`) + +- `ENABLED`: **false**: Enables /metrics endpoint for prometheus. +- `TOKEN`: **\**: You need to specify the token, if you want to include in the authorization the metrics . The same token need to be used in prometheus parameters `bearer_token` or `bearer_token_file`. + ## API (`api`) - `ENABLE_SWAGGER_ENDPOINT`: **true**: Enables /api/swagger, /api/v1/swagger etc. endpoints. True or false; default is true. diff --git a/models/user.go b/models/user.go index 9469d6e793d3..9becee7760bd 100644 --- a/models/user.go +++ b/models/user.go @@ -698,6 +698,7 @@ var ( "issues", "js", "less", + "metrics", "new", "org", "plugins", diff --git a/modules/metrics/collector.go b/modules/metrics/collector.go new file mode 100644 index 000000000000..6f6cf7cb6465 --- /dev/null +++ b/modules/metrics/collector.go @@ -0,0 +1,299 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package metrics + +import ( + "code.gitea.io/gitea/models" + + "github.com/prometheus/client_golang/prometheus" +) + +const namespace = "gitea_" + +// Collector implements the prometheus.Collector interface and +// exposes gitea metrics for prometheus +type Collector struct { + Accesses *prometheus.Desc + Actions *prometheus.Desc + Attachments *prometheus.Desc + Comments *prometheus.Desc + Follows *prometheus.Desc + HookTasks *prometheus.Desc + Issues *prometheus.Desc + Labels *prometheus.Desc + LoginSources *prometheus.Desc + Milestones *prometheus.Desc + Mirrors *prometheus.Desc + Oauths *prometheus.Desc + Organizations *prometheus.Desc + PublicKeys *prometheus.Desc + Releases *prometheus.Desc + Repositories *prometheus.Desc + Stars *prometheus.Desc + Teams *prometheus.Desc + UpdateTasks *prometheus.Desc + Users *prometheus.Desc + Watches *prometheus.Desc + Webhooks *prometheus.Desc +} + +// NewCollector returns a new Collector with all prometheus.Desc initialized +func NewCollector() Collector { + return Collector{ + Accesses: prometheus.NewDesc( + namespace+"accesses", + "Number of Accesses", + nil, nil, + ), + Actions: prometheus.NewDesc( + namespace+"actions", + "Number of Actions", + nil, nil, + ), + Attachments: prometheus.NewDesc( + namespace+"attachments", + "Number of Attachments", + nil, nil, + ), + Comments: prometheus.NewDesc( + namespace+"comments", + "Number of Comments", + nil, nil, + ), + Follows: prometheus.NewDesc( + namespace+"follows", + "Number of Follows", + nil, nil, + ), + HookTasks: prometheus.NewDesc( + namespace+"hooktasks", + "Number of HookTasks", + nil, nil, + ), + Issues: prometheus.NewDesc( + namespace+"issues", + "Number of Issues", + nil, nil, + ), + Labels: prometheus.NewDesc( + namespace+"labels", + "Number of Labels", + nil, nil, + ), + LoginSources: prometheus.NewDesc( + namespace+"loginsources", + "Number of LoginSources", + nil, nil, + ), + Milestones: prometheus.NewDesc( + namespace+"milestones", + "Number of Milestones", + nil, nil, + ), + Mirrors: prometheus.NewDesc( + namespace+"mirrors", + "Number of Mirrors", + nil, nil, + ), + Oauths: prometheus.NewDesc( + namespace+"oauths", + "Number of Oauths", + nil, nil, + ), + Organizations: prometheus.NewDesc( + namespace+"organizations", + "Number of Organizations", + nil, nil, + ), + PublicKeys: prometheus.NewDesc( + namespace+"publickeys", + "Number of PublicKeys", + nil, nil, + ), + Releases: prometheus.NewDesc( + namespace+"releases", + "Number of Releases", + nil, nil, + ), + Repositories: prometheus.NewDesc( + namespace+"repositories", + "Number of Repositories", + nil, nil, + ), + Stars: prometheus.NewDesc( + namespace+"stars", + "Number of Stars", + nil, nil, + ), + Teams: prometheus.NewDesc( + namespace+"teams", + "Number of Teams", + nil, nil, + ), + UpdateTasks: prometheus.NewDesc( + namespace+"updatetasks", + "Number of UpdateTasks", + nil, nil, + ), + Users: prometheus.NewDesc( + namespace+"users", + "Number of Users", + nil, nil, + ), + Watches: prometheus.NewDesc( + namespace+"watches", + "Number of Watches", + nil, nil, + ), + Webhooks: prometheus.NewDesc( + namespace+"webhooks", + "Number of Webhooks", + nil, nil, + ), + } + +} + +// Describe returns all possible prometheus.Desc +func (c Collector) Describe(ch chan<- *prometheus.Desc) { + ch <- c.Accesses + ch <- c.Actions + ch <- c.Attachments + ch <- c.Comments + ch <- c.Follows + ch <- c.HookTasks + ch <- c.Issues + ch <- c.Labels + ch <- c.LoginSources + ch <- c.Milestones + ch <- c.Mirrors + ch <- c.Oauths + ch <- c.Organizations + ch <- c.PublicKeys + ch <- c.Releases + ch <- c.Repositories + ch <- c.Stars + ch <- c.Teams + ch <- c.UpdateTasks + ch <- c.Users + ch <- c.Watches + ch <- c.Webhooks +} + +// Collect returns the metrics with values +func (c Collector) Collect(ch chan<- prometheus.Metric) { + stats := models.GetStatistic() + + ch <- prometheus.MustNewConstMetric( + c.Accesses, + prometheus.GaugeValue, + float64(stats.Counter.Access), + ) + ch <- prometheus.MustNewConstMetric( + c.Actions, + prometheus.GaugeValue, + float64(stats.Counter.Action), + ) + ch <- prometheus.MustNewConstMetric( + c.Attachments, + prometheus.GaugeValue, + float64(stats.Counter.Attachment), + ) + ch <- prometheus.MustNewConstMetric( + c.Comments, + prometheus.GaugeValue, + float64(stats.Counter.Comment), + ) + ch <- prometheus.MustNewConstMetric( + c.Follows, + prometheus.GaugeValue, + float64(stats.Counter.Follow), + ) + ch <- prometheus.MustNewConstMetric( + c.HookTasks, + prometheus.GaugeValue, + float64(stats.Counter.HookTask), + ) + ch <- prometheus.MustNewConstMetric( + c.Issues, + prometheus.GaugeValue, + float64(stats.Counter.Issue), + ) + ch <- prometheus.MustNewConstMetric( + c.Labels, + prometheus.GaugeValue, + float64(stats.Counter.Label), + ) + ch <- prometheus.MustNewConstMetric( + c.LoginSources, + prometheus.GaugeValue, + float64(stats.Counter.LoginSource), + ) + ch <- prometheus.MustNewConstMetric( + c.Milestones, + prometheus.GaugeValue, + float64(stats.Counter.Milestone), + ) + ch <- prometheus.MustNewConstMetric( + c.Mirrors, + prometheus.GaugeValue, + float64(stats.Counter.Mirror), + ) + ch <- prometheus.MustNewConstMetric( + c.Oauths, + prometheus.GaugeValue, + float64(stats.Counter.Oauth), + ) + ch <- prometheus.MustNewConstMetric( + c.Organizations, + prometheus.GaugeValue, + float64(stats.Counter.Org), + ) + ch <- prometheus.MustNewConstMetric( + c.PublicKeys, + prometheus.GaugeValue, + float64(stats.Counter.PublicKey), + ) + ch <- prometheus.MustNewConstMetric( + c.Releases, + prometheus.GaugeValue, + float64(stats.Counter.Release), + ) + ch <- prometheus.MustNewConstMetric( + c.Repositories, + prometheus.GaugeValue, + float64(stats.Counter.Repo), + ) + ch <- prometheus.MustNewConstMetric( + c.Stars, + prometheus.GaugeValue, + float64(stats.Counter.Star), + ) + ch <- prometheus.MustNewConstMetric( + c.Teams, + prometheus.GaugeValue, + float64(stats.Counter.Team), + ) + ch <- prometheus.MustNewConstMetric( + c.UpdateTasks, + prometheus.GaugeValue, + float64(stats.Counter.UpdateTask), + ) + ch <- prometheus.MustNewConstMetric( + c.Users, + prometheus.GaugeValue, + float64(stats.Counter.User), + ) + ch <- prometheus.MustNewConstMetric( + c.Watches, + prometheus.GaugeValue, + float64(stats.Counter.Watch), + ) + ch <- prometheus.MustNewConstMetric( + c.Webhooks, + prometheus.GaugeValue, + float64(stats.Counter.Webhook), + ) +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index a15dc116af68..42ee102e0d75 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -561,6 +561,15 @@ var ( TrustedFacets []string }{} + // Metrics settings + Metrics = struct { + Enabled bool + Token string + }{ + Enabled: false, + Token: "", + } + // I18n settings Langs []string Names []string @@ -1125,6 +1134,8 @@ func NewContext() { log.Fatal(4, "Failed to map Git settings: %v", err) } else if err = Cfg.Section("api").MapTo(&API); err != nil { log.Fatal(4, "Failed to map API settings: %v", err) + } else if err = Cfg.Section("metrics").MapTo(&Metrics); err != nil { + log.Fatal(4, "Failed to map Metrics settings: %v", err) } sec = Cfg.Section("mirror") diff --git a/routers/metrics.go b/routers/metrics.go new file mode 100644 index 000000000000..e70918f06889 --- /dev/null +++ b/routers/metrics.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package routers + +import ( + "github.com/prometheus/client_golang/prometheus/promhttp" + + "code.gitea.io/gitea/modules/context" + "code.gitea.io/gitea/modules/setting" +) + +// Metrics validate auth token and render prometheus metrics +func Metrics(ctx *context.Context) { + if setting.Metrics.Token == "" { + promhttp.Handler().ServeHTTP(ctx.Resp, ctx.Req.Request) + return + } + header := ctx.Header().Get("Authorization") + if header == "" { + ctx.Error(401) + return + } + if header != "Bearer "+setting.Metrics.Token { + ctx.Error(401) + return + } + promhttp.Handler().ServeHTTP(ctx.Resp, ctx.Req.Request) +} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index 5e54934a3627..af216866bbfc 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/lfs" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/metrics" "code.gitea.io/gitea/modules/options" "code.gitea.io/gitea/modules/public" "code.gitea.io/gitea/modules/setting" @@ -39,6 +40,7 @@ import ( "github.com/go-macaron/i18n" "github.com/go-macaron/session" "github.com/go-macaron/toolbox" + "github.com/prometheus/client_golang/prometheus" "github.com/tstranex/u2f" "gopkg.in/macaron.v1" ) @@ -788,6 +790,14 @@ func RegisterRoutes(m *macaron.Macaron) { } }) + // prometheus metrics endpoint + if setting.Metrics.Enabled { + c := metrics.NewCollector() + prometheus.MustRegister(c) + + m.Get("/metrics", routers.Metrics) + } + // Not found handler. m.NotFound(routers.NotFound) } diff --git a/vendor/github.com/beorn7/perks/LICENSE b/vendor/github.com/beorn7/perks/LICENSE new file mode 100644 index 000000000000..339177be6636 --- /dev/null +++ b/vendor/github.com/beorn7/perks/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013 Blake Mizerany + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/beorn7/perks/quantile/stream.go new file mode 100644 index 000000000000..d7d14f8eb63d --- /dev/null +++ b/vendor/github.com/beorn7/perks/quantile/stream.go @@ -0,0 +1,316 @@ +// Package quantile computes approximate quantiles over an unbounded data +// stream within low memory and CPU bounds. +// +// A small amount of accuracy is traded to achieve the above properties. +// +// Multiple streams can be merged before calling Query to generate a single set +// of results. This is meaningful when the streams represent the same type of +// data. See Merge and Samples. +// +// For more detailed information about the algorithm used, see: +// +// Effective Computation of Biased Quantiles over Data Streams +// +// http://www.cs.rutgers.edu/~muthu/bquant.pdf +package quantile + +import ( + "math" + "sort" +) + +// Sample holds an observed value and meta information for compression. JSON +// tags have been added for convenience. +type Sample struct { + Value float64 `json:",string"` + Width float64 `json:",string"` + Delta float64 `json:",string"` +} + +// Samples represents a slice of samples. It implements sort.Interface. +type Samples []Sample + +func (a Samples) Len() int { return len(a) } +func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } +func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +type invariant func(s *stream, r float64) float64 + +// NewLowBiased returns an initialized Stream for low-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the lower ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewLowBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * r + } + return newStream(ƒ) +} + +// NewHighBiased returns an initialized Stream for high-biased quantiles +// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but +// error guarantees can still be given even for the higher ranks of the data +// distribution. +// +// The provided epsilon is a relative error, i.e. the true quantile of a value +// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error +// properties. +func NewHighBiased(epsilon float64) *Stream { + ƒ := func(s *stream, r float64) float64 { + return 2 * epsilon * (s.n - r) + } + return newStream(ƒ) +} + +// NewTargeted returns an initialized Stream concerned with a particular set of +// quantile values that are supplied a priori. Knowing these a priori reduces +// space and computation time. The targets map maps the desired quantiles to +// their absolute errors, i.e. the true quantile of a value returned by a query +// is guaranteed to be within (Quantile±Epsilon). +// +// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. +func NewTargeted(targetMap map[float64]float64) *Stream { + // Convert map to slice to avoid slow iterations on a map. + // ƒ is called on the hot path, so converting the map to a slice + // beforehand results in significant CPU savings. + targets := targetMapToSlice(targetMap) + + ƒ := func(s *stream, r float64) float64 { + var m = math.MaxFloat64 + var f float64 + for _, t := range targets { + if t.quantile*s.n <= r { + f = (2 * t.epsilon * r) / t.quantile + } else { + f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) + } + if f < m { + m = f + } + } + return m + } + return newStream(ƒ) +} + +type target struct { + quantile float64 + epsilon float64 +} + +func targetMapToSlice(targetMap map[float64]float64) []target { + targets := make([]target, 0, len(targetMap)) + + for quantile, epsilon := range targetMap { + t := target{ + quantile: quantile, + epsilon: epsilon, + } + targets = append(targets, t) + } + + return targets +} + +// Stream computes quantiles for a stream of float64s. It is not thread-safe by +// design. Take care when using across multiple goroutines. +type Stream struct { + *stream + b Samples + sorted bool +} + +func newStream(ƒ invariant) *Stream { + x := &stream{ƒ: ƒ} + return &Stream{x, make(Samples, 0, 500), true} +} + +// Insert inserts v into the stream. +func (s *Stream) Insert(v float64) { + s.insert(Sample{Value: v, Width: 1}) +} + +func (s *Stream) insert(sample Sample) { + s.b = append(s.b, sample) + s.sorted = false + if len(s.b) == cap(s.b) { + s.flush() + } +} + +// Query returns the computed qth percentiles value. If s was created with +// NewTargeted, and q is not in the set of quantiles provided a priori, Query +// will return an unspecified result. +func (s *Stream) Query(q float64) float64 { + if !s.flushed() { + // Fast path when there hasn't been enough data for a flush; + // this also yields better accuracy for small sets of data. + l := len(s.b) + if l == 0 { + return 0 + } + i := int(math.Ceil(float64(l) * q)) + if i > 0 { + i -= 1 + } + s.maybeSort() + return s.b[i].Value + } + s.flush() + return s.stream.query(q) +} + +// Merge merges samples into the underlying streams samples. This is handy when +// merging multiple streams from separate threads, database shards, etc. +// +// ATTENTION: This method is broken and does not yield correct results. The +// underlying algorithm is not capable of merging streams correctly. +func (s *Stream) Merge(samples Samples) { + sort.Sort(samples) + s.stream.merge(samples) +} + +// Reset reinitializes and clears the list reusing the samples buffer memory. +func (s *Stream) Reset() { + s.stream.reset() + s.b = s.b[:0] +} + +// Samples returns stream samples held by s. +func (s *Stream) Samples() Samples { + if !s.flushed() { + return s.b + } + s.flush() + return s.stream.samples() +} + +// Count returns the total number of samples observed in the stream +// since initialization. +func (s *Stream) Count() int { + return len(s.b) + s.stream.count() +} + +func (s *Stream) flush() { + s.maybeSort() + s.stream.merge(s.b) + s.b = s.b[:0] +} + +func (s *Stream) maybeSort() { + if !s.sorted { + s.sorted = true + sort.Sort(s.b) + } +} + +func (s *Stream) flushed() bool { + return len(s.stream.l) > 0 +} + +type stream struct { + n float64 + l []Sample + ƒ invariant +} + +func (s *stream) reset() { + s.l = s.l[:0] + s.n = 0 +} + +func (s *stream) insert(v float64) { + s.merge(Samples{{v, 1, 0}}) +} + +func (s *stream) merge(samples Samples) { + // TODO(beorn7): This tries to merge not only individual samples, but + // whole summaries. The paper doesn't mention merging summaries at + // all. Unittests show that the merging is inaccurate. Find out how to + // do merges properly. + var r float64 + i := 0 + for _, sample := range samples { + for ; i < len(s.l); i++ { + c := s.l[i] + if c.Value > sample.Value { + // Insert at position i. + s.l = append(s.l, Sample{}) + copy(s.l[i+1:], s.l[i:]) + s.l[i] = Sample{ + sample.Value, + sample.Width, + math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), + // TODO(beorn7): How to calculate delta correctly? + } + i++ + goto inserted + } + r += c.Width + } + s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) + i++ + inserted: + s.n += sample.Width + r += sample.Width + } + s.compress() +} + +func (s *stream) count() int { + return int(s.n) +} + +func (s *stream) query(q float64) float64 { + t := math.Ceil(q * s.n) + t += math.Ceil(s.ƒ(s, t) / 2) + p := s.l[0] + var r float64 + for _, c := range s.l[1:] { + r += p.Width + if r+c.Width+c.Delta > t { + return p.Value + } + p = c + } + return p.Value +} + +func (s *stream) compress() { + if len(s.l) < 2 { + return + } + x := s.l[len(s.l)-1] + xi := len(s.l) - 1 + r := s.n - 1 - x.Width + + for i := len(s.l) - 2; i >= 0; i-- { + c := s.l[i] + if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { + x.Width += c.Width + s.l[xi] = x + // Remove element at i. + copy(s.l[i:], s.l[i+1:]) + s.l = s.l[:len(s.l)-1] + xi -= 1 + } else { + x = c + xi = i + } + r -= c.Width + } +} + +func (s *stream) samples() Samples { + samples := make(Samples, len(s.l)) + copy(samples, s.l) + return samples +} diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE index 1b1b1921efa6..0f646931a462 100644 --- a/vendor/github.com/golang/protobuf/LICENSE +++ b/vendor/github.com/golang/protobuf/LICENSE @@ -1,7 +1,4 @@ -Go support for Protocol Buffers - Google's data interchange format - Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go index e98ddec9815b..3cd3249f7062 100644 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ b/vendor/github.com/golang/protobuf/proto/clone.go @@ -35,22 +35,39 @@ package proto import ( + "fmt" "log" "reflect" "strings" ) // Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) +func Clone(src Message) Message { + in := reflect.ValueOf(src) if in.IsNil() { - return pb + return src } - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) + dst := out.Interface().(Message) + Merge(dst, src) + return dst +} + +// Merger is the interface representing objects that can merge messages of the same type. +type Merger interface { + // Merge merges src into this message. + // Required and optional fields that are set in src will be set to that value in dst. + // Elements of repeated fields will be appended. + // + // Merge may panic if called with a different argument type than the receiver. + Merge(src Message) +} + +// generatedMerger is the custom merge method that generated protos will have. +// We must add this method since a generate Merge method will conflict with +// many existing protos that have a Merge data field already defined. +type generatedMerger interface { + XXX_Merge(src Message) } // Merge merges src into dst. @@ -58,17 +75,24 @@ func Clone(pb Message) Message { // Elements of repeated fields will be appended. // Merge panics if src and dst are not the same type, or if dst is nil. func Merge(dst, src Message) { + if m, ok := dst.(Merger); ok { + m.Merge(src) + return + } + in := reflect.ValueOf(src) out := reflect.ValueOf(dst) if out.IsNil() { panic("proto: nil destination") } if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") + panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) } if in.IsNil() { - // Merging nil into non-nil is a quiet no-op + return // Merge from nil src is a noop + } + if m, ok := dst.(generatedMerger); ok { + m.XXX_Merge(src) return } mergeStruct(out.Elem(), in.Elem()) @@ -84,9 +108,15 @@ func mergeStruct(out, in reflect.Value) { mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) } - if emIn, ok := in.Addr().Interface().(extendableProto); ok { - emOut := out.Addr().Interface().(extendableProto) - mergeExtension(emOut.ExtensionMap(), emIn.ExtensionMap()) + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } } uf := in.FieldByName("XXX_unrecognized") diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go index f94b9f416ecd..d9aa3c42d666 100644 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ b/vendor/github.com/golang/protobuf/proto/decode.go @@ -39,8 +39,6 @@ import ( "errors" "fmt" "io" - "os" - "reflect" ) // errOverflow is returned when an integer is too large to be represented. @@ -50,10 +48,6 @@ var errOverflow = errors.New("proto: integer overflow") // wire type is encountered. It does not get returned to user code. var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - // DecodeVarint reads a varint-encoded integer from the slice. // It returns the integer and the number of bytes consumed, or // zero if there is not enough. @@ -61,7 +55,6 @@ var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for // int32, int64, uint32, uint64, bool, and enum // protocol buffer types. func DecodeVarint(buf []byte) (x uint64, n int) { - // x, n already 0 for shift := uint(0); shift < 64; shift += 7 { if n >= len(buf) { return 0, 0 @@ -78,13 +71,7 @@ func DecodeVarint(buf []byte) (x uint64, n int) { return 0, 0 } -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - // x, err already 0 - +func (p *Buffer) decodeVarintSlow() (x uint64, err error) { i := p.index l := len(p.buf) @@ -107,6 +94,107 @@ func (p *Buffer) DecodeVarint() (x uint64, err error) { return } +// DecodeVarint reads a varint-encoded integer from the Buffer. +// This is the format for the +// int32, int64, uint32, uint64, bool, and enum +// protocol buffer types. +func (p *Buffer) DecodeVarint() (x uint64, err error) { + i := p.index + buf := p.buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + p.index++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return p.decodeVarintSlow() + } + + var b uint64 + // we already checked the first byte + x = uint64(buf[i]) - 0x80 + i++ + + b = uint64(buf[i]) + i++ + x += b << 7 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 7 + + b = uint64(buf[i]) + i++ + x += b << 14 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 14 + + b = uint64(buf[i]) + i++ + x += b << 21 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 21 + + b = uint64(buf[i]) + i++ + x += b << 28 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 28 + + b = uint64(buf[i]) + i++ + x += b << 35 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 35 + + b = uint64(buf[i]) + i++ + x += b << 42 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 42 + + b = uint64(buf[i]) + i++ + x += b << 49 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 49 + + b = uint64(buf[i]) + i++ + x += b << 56 + if b&0x80 == 0 { + goto done + } + x -= 0x80 << 56 + + b = uint64(buf[i]) + i++ + x += b << 63 + if b&0x80 == 0 { + goto done + } + // x -= 0x80 << 63 // Always zero. + + return 0, errOverflow + +done: + p.index = i + return x, nil +} + // DecodeFixed64 reads a 64-bit integer from the Buffer. // This is the format for the // fixed64, sfixed64, and double protocol buffer types. @@ -173,9 +261,6 @@ func (p *Buffer) DecodeZigzag32() (x uint64, err error) { return } -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - // DecodeRawBytes reads a count-delimited byte buffer from the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -217,81 +302,29 @@ func (p *Buffer) DecodeStringBytes() (s string, err error) { return string(buf), nil } -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - // Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be +// unmarshal themselves. The argument points to data that may be // overwritten, so implementations should not keep references to the // buffer. +// Unmarshal implementations should not clear the receiver. +// Any unmarshaled data should be merged into the receiver. +// Callers of Unmarshal that do not want to retain existing data +// should Reset the receiver before calling Unmarshal. type Unmarshaler interface { Unmarshal([]byte) error } +// newUnmarshaler is the interface representing objects that can +// unmarshal themselves. The semantics are identical to Unmarshaler. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newUnmarshaler interface { + XXX_Unmarshal([]byte) error +} + // Unmarshal parses the protocol buffer representation in buf and places the // decoded result in pb. If the struct underlying pb does not match // the data in buf, the results can be unpredictable. @@ -301,7 +334,13 @@ type Unmarshaler interface { // to preserve and append to existing data. func Unmarshal(buf []byte, pb Message) error { pb.Reset() - return UnmarshalMerge(buf, pb) + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } + if u, ok := pb.(Unmarshaler); ok { + return u.Unmarshal(buf) + } + return NewBuffer(buf).Unmarshal(pb) } // UnmarshalMerge parses the protocol buffer representation in buf and @@ -311,8 +350,16 @@ func Unmarshal(buf []byte, pb Message) error { // UnmarshalMerge merges into existing data in pb. // Most code should use Unmarshal instead. func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. + if u, ok := pb.(newUnmarshaler); ok { + return u.XXX_Unmarshal(buf) + } if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 return u.Unmarshal(buf) } return NewBuffer(buf).Unmarshal(pb) @@ -328,541 +375,54 @@ func (p *Buffer) DecodeMessage(pb Message) error { } // DecodeGroup reads a tag-delimited group from the Buffer. +// StartGroup tag is already consumed. This function consumes +// EndGroup tag. func (p *Buffer) DecodeGroup(pb Message) error { - typ, base, err := getbase(pb) - if err != nil { - return err + b := p.buf[p.index:] + x, y := findEndGroup(b) + if x < 0 { + return io.ErrUnexpectedEOF } - return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) + err := Unmarshal(b[:x], pb) + p.index += y + return err } // Unmarshal parses the protocol buffer representation in the // Buffer and places the decoded result in pb. If the struct // underlying pb does not match the data in the buffer, the results can be // unpredictable. +// +// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. func (p *Buffer) Unmarshal(pb Message) error { // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) + if u, ok := pb.(newUnmarshaler); ok { + err := u.XXX_Unmarshal(p.buf[p.index:]) p.index = len(p.buf) return err } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e := structPointer_Interface(base, st).(extendableProto); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - ext := e.ExtensionMap()[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - e.ExtensionMap()[int32(tag)] = ext - } - continue - } - } - // Maybe it's a oneof? - if prop.oneofUnmarshaler != nil { - m := structPointer_Interface(base, st).(Message) - // First return value indicates whether tag is a oneof field. - ok, err = prop.oneofUnmarshaler(m, tag, wire, o) - if err == ErrInternalBadWireType { - // Map the error to something more descriptive. - // Do the formatting here to save generated code space. - err = fmt.Errorf("bad wiretype for oneof field in %T", m) - } - if ok { - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - *structPointer_BoolVal(base, p.field) = u != 0 - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_String(base, p.field) = &s - return nil -} - -func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_StringVal(base, p.field) = s - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - fin := o.index + nb - if fin < o.index { - return errOverflow - } - - y := *v - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a map field. -func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - oi := o.index // index at the end of this map entry - o.index -= len(raw) // move buffer back to start of map entry - - mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V - if mptr.Elem().IsNil() { - mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) - } - v := mptr.Elem() // map[K]V - - // Prepare addressable doubly-indirect placeholders for the key and value types. - // See enc_new_map for why. - keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K - keybase := toStructPointer(keyptr.Addr()) // **K - - var valbase structPointer - var valptr reflect.Value - switch p.mtype.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valptr = reflect.ValueOf(&dummy) // *[]byte - valbase = toStructPointer(valptr) // *[]byte - case reflect.Ptr: - // message; valptr is **Msg; need to allocate the intermediate pointer - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valptr.Set(reflect.New(valptr.Type().Elem())) - valbase = toStructPointer(valptr) - default: - // everything else - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valbase = toStructPointer(valptr.Addr()) // **V - } - - // Decode. - // This parses a restricted wire format, namely the encoding of a message - // with two fields. See enc_new_map for the format. - for o.index < oi { - // tagcode for key and value properties are always a single byte - // because they have tags 1 and 2. - tagcode := o.buf[o.index] - o.index++ - switch tagcode { - case p.mkeyprop.tagcode[0]: - if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { - return err - } - case p.mvalprop.tagcode[0]: - if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { - return err - } - default: - // TODO: Should we silently skip this instead? - return fmt.Errorf("proto: bad map data tag %d", raw[0]) - } - } - keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() { - keyelem = reflect.Zero(p.mtype.Key()) - } - if !valelem.IsValid() { - valelem = reflect.Zero(p.mtype.Elem()) - } - - v.SetMapIndex(keyelem, valelem) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { + if u, ok := pb.(Unmarshaler); ok { + // NOTE: The history of proto have unfortunately been inconsistent + // whether Unmarshaler should or should not implicitly clear itself. + // Some implementations do, most do not. + // Thus, calling this here may or may not do what people want. + // + // See https://github.com/golang/protobuf/issues/424 + err := u.Unmarshal(p.buf[p.index:]) + p.index = len(p.buf) return err } - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - + // Slow workaround for messages that aren't Unmarshalers. + // This includes some hand-coded .pb.go files and + // bootstrap protos. + // TODO: fix all of those and then add Unmarshal to + // the Message interface. Then: + // The cast above and code below can be deleted. + // The old unmarshaler can be deleted. + // Clients can call Unmarshal directly (can already do that, actually). + var info InternalMessageInfo + err := info.Unmarshal(pb, p.buf[p.index:]) + p.index = len(p.buf) return err } diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go new file mode 100644 index 000000000000..dea2617ced34 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/discard.go @@ -0,0 +1,350 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2017 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +type generatedDiscarder interface { + XXX_DiscardUnknown() +} + +// DiscardUnknown recursively discards all unknown fields from this message +// and all embedded messages. +// +// When unmarshaling a message with unrecognized fields, the tags and values +// of such fields are preserved in the Message. This allows a later call to +// marshal to be able to produce a message that continues to have those +// unrecognized fields. To avoid this, DiscardUnknown is used to +// explicitly clear the unknown fields after unmarshaling. +// +// For proto2 messages, the unknown fields of message extensions are only +// discarded from messages that have been accessed via GetExtension. +func DiscardUnknown(m Message) { + if m, ok := m.(generatedDiscarder); ok { + m.XXX_DiscardUnknown() + return + } + // TODO: Dynamically populate a InternalMessageInfo for legacy messages, + // but the master branch has no implementation for InternalMessageInfo, + // so it would be more work to replicate that approach. + discardLegacy(m) +} + +// DiscardUnknown recursively discards all unknown fields. +func (a *InternalMessageInfo) DiscardUnknown(m Message) { + di := atomicLoadDiscardInfo(&a.discard) + if di == nil { + di = getDiscardInfo(reflect.TypeOf(m).Elem()) + atomicStoreDiscardInfo(&a.discard, di) + } + di.discard(toPointer(&m)) +} + +type discardInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []discardFieldInfo + unrecognized field +} + +type discardFieldInfo struct { + field field // Offset of field, guaranteed to be valid + discard func(src pointer) +} + +var ( + discardInfoMap = map[reflect.Type]*discardInfo{} + discardInfoLock sync.Mutex +) + +func getDiscardInfo(t reflect.Type) *discardInfo { + discardInfoLock.Lock() + defer discardInfoLock.Unlock() + di := discardInfoMap[t] + if di == nil { + di = &discardInfo{typ: t} + discardInfoMap[t] = di + } + return di +} + +func (di *discardInfo) discard(src pointer) { + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&di.initialized) == 0 { + di.computeDiscardInfo() + } + + for _, fi := range di.fields { + sfp := src.offset(fi.field) + fi.discard(sfp) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { + // Ignore lock since DiscardUnknown is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + DiscardUnknown(m) + } + } + } + + if di.unrecognized.IsValid() { + *src.offset(di.unrecognized).toBytes() = nil + } +} + +func (di *discardInfo) computeDiscardInfo() { + di.lock.Lock() + defer di.lock.Unlock() + if di.initialized != 0 { + return + } + t := di.typ + n := t.NumField() + + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + dfi := discardFieldInfo{field: toField(&f)} + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) + case isSlice: // E.g., []*pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sps := src.getPointerSlice() + for _, sp := range sps { + if !sp.isNil() { + di.discard(sp) + } + } + } + default: // E.g., *pb.T + di := getDiscardInfo(tf) + dfi.discard = func(src pointer) { + sp := src.getPointer() + if !sp.isNil() { + di.discard(sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) + default: // E.g., map[K]V + if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) + dfi.discard = func(src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + DiscardUnknown(val.Interface().(Message)) + } + } + } else { + dfi.discard = func(pointer) {} // Noop + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) + default: // E.g., interface{} + // TODO: Make this faster? + dfi.discard = func(src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + DiscardUnknown(sv.Interface().(Message)) + } + } + } + } + default: + continue + } + di.fields = append(di.fields, dfi) + } + + di.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + di.unrecognized = toField(&f) + } + + atomic.StoreInt32(&di.initialized, 1) +} + +func discardLegacy(m Message) { + v := reflect.ValueOf(m) + if v.Kind() != reflect.Ptr || v.IsNil() { + return + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return + } + t := v.Type() + + for i := 0; i < v.NumField(); i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + vf := v.Field(i) + tf := f.Type + + // Unwrap tf to get its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) + } + + switch tf.Kind() { + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) + case isSlice: // E.g., []*pb.T + for j := 0; j < vf.Len(); j++ { + discardLegacy(vf.Index(j).Interface().(Message)) + } + default: // E.g., *pb.T + discardLegacy(vf.Interface().(Message)) + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) + default: // E.g., map[K]V + tv := vf.Type().Elem() + if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) + for _, key := range vf.MapKeys() { + val := vf.MapIndex(key) + discardLegacy(val.Interface().(Message)) + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) + default: // E.g., test_proto.isCommunique_Union interface + if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { + vf = vf.Elem() // E.g., *test_proto.Communique_Msg + if !vf.IsNil() { + vf = vf.Elem() // E.g., test_proto.Communique_Msg + vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value + if vf.Kind() == reflect.Ptr { + discardLegacy(vf.Interface().(Message)) + } + } + } + } + } + } + + if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { + if vf.Type() != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + vf.Set(reflect.ValueOf([]byte(nil))) + } + + // For proto2 messages, only discard unknown fields in message extensions + // that have been accessed via GetExtension. + if em, err := extendable(m); err == nil { + // Ignore lock since discardLegacy is not concurrency safe. + emm, _ := em.extensionsRead() + for _, mx := range emm { + if m, ok := mx.value.(Message); ok { + discardLegacy(m) + } + } + } +} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go index 231b07401a38..3abfed2cff04 100644 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ b/vendor/github.com/golang/protobuf/proto/encode.go @@ -37,35 +37,24 @@ package proto import ( "errors" - "fmt" "reflect" - "sort" ) -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - var ( // errRepeatedHasNil is the error returned if Marshal is called with // a struct with a repeated field containing a nil element. errRepeatedHasNil = errors.New("proto: repeated field has nil element") + // errOneofHasNil is the error returned if Marshal is called with + // a struct with a oneof field containing a nil element. + errOneofHasNil = errors.New("proto: oneof field has nil value") + // ErrNil is the error returned if Marshal is called with nil. ErrNil = errors.New("proto: Marshal called with nil") + + // ErrTooLarge is the error returned if Marshal is called with a + // message that encodes to >2GB. + ErrTooLarge = errors.New("proto: message encodes to over 2 GB") ) // The fundamental encoders that put bytes on the wire. @@ -107,18 +96,27 @@ func (p *Buffer) EncodeVarint(x uint64) error { // SizeVarint returns the varint encoding size of an integer. func SizeVarint(x uint64) int { - return sizeVarint(x) -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + switch { + case x < 1<<7: + return 1 + case x < 1<<14: + return 2 + case x < 1<<21: + return 3 + case x < 1<<28: + return 4 + case x < 1<<35: + return 5 + case x < 1<<42: + return 6 + case x < 1<<49: + return 7 + case x < 1<<56: + return 8 + case x < 1<<63: + return 9 + } + return 10 } // EncodeFixed64 writes a 64-bit integer to the Buffer. @@ -137,10 +135,6 @@ func (p *Buffer) EncodeFixed64(x uint64) error { return nil } -func sizeFixed64(x uint64) int { - return 8 -} - // EncodeFixed32 writes a 32-bit integer to the Buffer. // This is the format for the // fixed32, sfixed32, and float protocol buffer types. @@ -153,10 +147,6 @@ func (p *Buffer) EncodeFixed32(x uint64) error { return nil } -func sizeFixed32(x uint64) int { - return 4 -} - // EncodeZigzag64 writes a zigzag-encoded 64-bit integer // to the Buffer. // This is the format used for the sint64 protocol buffer type. @@ -165,10 +155,6 @@ func (p *Buffer) EncodeZigzag64(x uint64) error { return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func sizeZigzag64(x uint64) int { - return sizeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - // EncodeZigzag32 writes a zigzag-encoded 32-bit integer // to the Buffer. // This is the format used for the sint32 protocol buffer type. @@ -177,10 +163,6 @@ func (p *Buffer) EncodeZigzag32(x uint64) error { return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) } -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - // EncodeRawBytes writes a count-delimited byte buffer to the Buffer. // This is the format used for the bytes protocol buffer // type and for embedded messages. @@ -190,11 +172,6 @@ func (p *Buffer) EncodeRawBytes(b []byte) error { return nil } -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - // EncodeStringBytes writes an encoded string to the Buffer. // This is the format used for the proto2 string type. func (p *Buffer) EncodeStringBytes(s string) error { @@ -203,323 +180,17 @@ func (p *Buffer) EncodeStringBytes(s string) error { return nil } -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - // Marshaler is the interface representing objects that can marshal themselves. type Marshaler interface { Marshal() ([]byte, error) } -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - var state errorState - if err != nil && !state.shouldContinue(err, nil) { - return nil, err - } - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - // EncodeMessage writes the protocol buffer to the Buffer, // prefixed by a varint-encoded length. func (p *Buffer) EncodeMessage(pb Message) error { - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - var state errorState - err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) - } - return err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - if err != nil { - return err - } - p.buf = append(p.buf, data...) - return nil - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - stats.Encode++ - } - - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - stats.Size++ - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - if !v { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, 1) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -func size_proto3_bool(p *Properties, base structPointer) int { - v := *structPointer_BoolVal(base, p.field) - if !v && !p.oneof { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -func size_proto3_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - if v == "" { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -func size_proto3_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - if v == "" && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeStringBytes(v) - return + siz := Size(pb) + p.EncodeVarint(uint64(siz)) + return p.Marshal(pb) } // All protocol buffer fields are nillable, but be careful. @@ -530,796 +201,3 @@ func isNil(v reflect.Value) bool { } return false } - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return state.err - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += len(p.tagcode) - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return errRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - v := *structPointer_ExtMap(base, p.field) - if err := encodeExtensionMap(v); err != nil { - return err - } - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := *structPointer_ExtMap(base, p.field) - return sizeExtensionMap(v) -} - -// Encode a map field. -func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { - var state errorState // XXX: or do we need to plumb this through? - - /* - A map defined as - map map_field = N; - is encoded in the same way as - message MapFieldEntry { - key_type key = 1; - value_type value = 2; - } - repeated MapFieldEntry map_field = N; - */ - - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - if v.Len() == 0 { - return nil - } - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - enc := func() error { - if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { - return err - } - if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil { - return err - } - return nil - } - - // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - - // The only illegal map entry values are nil message pointers. - if val.Kind() == reflect.Ptr && val.IsNil() { - return errors.New("proto: map has nil element") - } - - keycopy.Set(key) - valcopy.Set(val) - - o.buf = append(o.buf, p.tagcode...) - if err := o.enc_len_thing(enc, &state); err != nil { - return err - } - } - return nil -} - -func size_new_map(p *Properties, base structPointer) int { - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - n := 0 - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - keycopy.Set(key) - valcopy.Set(val) - - // Tag codes for key and val are the responsibility of the sub-sizer. - keysize := p.mkeyprop.size(p.mkeyprop, keybase) - valsize := p.mvalprop.size(p.mvalprop, valbase) - entry := keysize + valsize - // Add on tag code and length of map entry itself. - n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry - } - return n -} - -// mapEncodeScratch returns a new reflect.Value matching the map's value type, -// and a structPointer suitable for passing to an encoder or sizer. -func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { - // Prepare addressable doubly-indirect placeholders for the key and value types. - // This is needed because the element-type encoders expect **T, but the map iteration produces T. - - keycopy = reflect.New(mapType.Key()).Elem() // addressable K - keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K - keyptr.Set(keycopy.Addr()) // - keybase = toStructPointer(keyptr.Addr()) // **K - - // Value types are more varied and require special handling. - switch mapType.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte - valbase = toStructPointer(valcopy.Addr()) - case reflect.Ptr: - // message; the generated field type is map[K]*Msg (so V is *Msg), - // so we only need one level of indirection. - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valbase = toStructPointer(valcopy.Addr()) - default: - // everything else - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V - valptr.Set(valcopy.Addr()) // - valbase = toStructPointer(valptr.Addr()) // **V - } - return -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if err == errRepeatedHasNil { - // Give more context to nil values in repeated fields. - return errors.New("repeated field " + p.OrigName + " has nil element") - } else if !state.shouldContinue(err, p) { - return err - } - } - } - } - - // Do oneof fields. - if prop.oneofMarshaler != nil { - m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err != nil { - return err - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - // Factor in any oneof fields. - if prop.oneofSizer != nil { - m := structPointer_Interface(base, prop.stype).(Message) - n += prop.oneofSizer(m) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) -} - -// Encode something, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := enc() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go index f5db1def3c24..d4db5a1c1457 100644 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ b/vendor/github.com/golang/protobuf/proto/equal.go @@ -54,13 +54,17 @@ Equality is defined in this way: in a proto3 .proto file, fields are not "set"; specifically, zero length proto3 "bytes" fields are equal (nil == {}). - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal (a "bytes" field, - although represented by []byte, is not a repeated field) + and their corresponding elements are equal. Note a "bytes" field, + although represented by []byte, is not a repeated field and the + rule for the scalar fields described above applies. - Two unset fields are equal. - Two unknown field sets are equal if their current encoded state is equal. - Two extension sets are equal iff they have corresponding elements that are pairwise equal. + - Two map fields are equal iff their lengths are the same, + and they contain the same set of elements. Zero-length map + fields are equal. - Every other combination of things are not equal. The return value is undefined if a and b are not protocol buffers. @@ -105,15 +109,6 @@ func equalStruct(v1, v2 reflect.Value) bool { // set/unset mismatch return false } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } f1, f2 = f1.Elem(), f2.Elem() } if !equalAny(f1, f2, sprop.Prop[i]) { @@ -121,9 +116,16 @@ func equalStruct(v1, v2 reflect.Value) bool { } } + if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { + em2 := v2.FieldByName("XXX_InternalExtensions") + if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { + return false + } + } + if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { em2 := v2.FieldByName("XXX_extensions") - if !equalExtensions(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { + if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { return false } } @@ -135,11 +137,7 @@ func equalStruct(v1, v2 reflect.Value) bool { u1 := uf.Bytes() u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true + return bytes.Equal(u1, u2) } // v1 and v2 are known to have the same type. @@ -184,6 +182,13 @@ func equalAny(v1, v2 reflect.Value, prop *Properties) bool { } return true case reflect.Ptr: + // Maps may have nil values in them, so check for nil. + if v1.IsNil() && v2.IsNil() { + return true + } + if v1.IsNil() != v2.IsNil() { + return false + } return equalAny(v1.Elem(), v2.Elem(), prop) case reflect.Slice: if v1.Type().Elem().Kind() == reflect.Uint8 { @@ -223,8 +228,14 @@ func equalAny(v1, v2 reflect.Value, prop *Properties) bool { } // base is the struct type that the extensions are based on. -// em1 and em2 are extension maps. -func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool { +// x1 and x2 are InternalExtensions. +func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { + em1, _ := x1.extensionsRead() + em2, _ := x2.extensionsRead() + return equalExtMap(base, em1, em2) +} + +func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { if len(em1) != len(em2) { return false } @@ -237,6 +248,15 @@ func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool { m1, m2 := e1.value, e2.value + if m1 == nil && m2 == nil { + // Both have only encoded form. + if bytes.Equal(e1.enc, e2.enc) { + continue + } + // The bytes are different, but the extensions might still be + // equal. We need to decode them to compare. + } + if m1 != nil && m2 != nil { // Both are unencoded. if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { @@ -252,8 +272,12 @@ func equalExtensions(base reflect.Type, em1, em2 map[int32]Extension) bool { desc = m[extNum] } if desc == nil { + // If both have only encoded form and the bytes are the same, + // it is handled above. We get here when the bytes are different. + // We don't know how to decode it, so just compare them as byte + // slices. log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue + return false } var err error if m1 == nil { diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go index 054f4f1df788..816a3b9d6c09 100644 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ b/vendor/github.com/golang/protobuf/proto/extensions.go @@ -38,6 +38,7 @@ package proto import ( "errors" "fmt" + "io" "reflect" "strconv" "sync" @@ -52,14 +53,111 @@ type ExtensionRange struct { Start, End int32 // both inclusive } -// extendableProto is an interface implemented by any protocol buffer that may be extended. +// extendableProto is an interface implemented by any protocol buffer generated by the current +// proto compiler that may be extended. type extendableProto interface { + Message + ExtensionRangeArray() []ExtensionRange + extensionsWrite() map[int32]Extension + extensionsRead() (map[int32]Extension, sync.Locker) +} + +// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous +// version of the proto compiler that may be extended. +type extendableProtoV1 interface { Message ExtensionRangeArray() []ExtensionRange ExtensionMap() map[int32]Extension } -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() +// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. +type extensionAdapter struct { + extendableProtoV1 +} + +func (e extensionAdapter) extensionsWrite() map[int32]Extension { + return e.ExtensionMap() +} + +func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { + return e.ExtensionMap(), notLocker{} +} + +// notLocker is a sync.Locker whose Lock and Unlock methods are nops. +type notLocker struct{} + +func (n notLocker) Lock() {} +func (n notLocker) Unlock() {} + +// extendable returns the extendableProto interface for the given generated proto message. +// If the proto message has the old extension format, it returns a wrapper that implements +// the extendableProto interface. +func extendable(p interface{}) (extendableProto, error) { + switch p := p.(type) { + case extendableProto: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return p, nil + case extendableProtoV1: + if isNilPtr(p) { + return nil, fmt.Errorf("proto: nil %T is not extendable", p) + } + return extensionAdapter{p}, nil + } + // Don't allocate a specific error containing %T: + // this is the hot path for Clone and MarshalText. + return nil, errNotExtendable +} + +var errNotExtendable = errors.New("proto: not an extendable proto.Message") + +func isNilPtr(x interface{}) bool { + v := reflect.ValueOf(x) + return v.Kind() == reflect.Ptr && v.IsNil() +} + +// XXX_InternalExtensions is an internal representation of proto extensions. +// +// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, +// thus gaining the unexported 'extensions' method, which can be called only from the proto package. +// +// The methods of XXX_InternalExtensions are not concurrency safe in general, +// but calls to logically read-only methods such as has and get may be executed concurrently. +type XXX_InternalExtensions struct { + // The struct must be indirect so that if a user inadvertently copies a + // generated message and its embedded XXX_InternalExtensions, they + // avoid the mayhem of a copied mutex. + // + // The mutex serializes all logically read-only operations to p.extensionMap. + // It is up to the client to ensure that write operations to p.extensionMap are + // mutually exclusive with other accesses. + p *struct { + mu sync.Mutex + extensionMap map[int32]Extension + } +} + +// extensionsWrite returns the extension map, creating it on first use. +func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { + if e.p == nil { + e.p = new(struct { + mu sync.Mutex + extensionMap map[int32]Extension + }) + e.p.extensionMap = make(map[int32]Extension) + } + return e.p.extensionMap +} + +// extensionsRead returns the extensions map for read-only use. It may be nil. +// The caller must hold the returned mutex's lock when accessing Elements within the map. +func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { + if e.p == nil { + return nil, nil + } + return e.p.extensionMap, &e.p.mu +} // ExtensionDesc represents an extension specification. // Used in generated code from the protocol compiler. @@ -69,6 +167,7 @@ type ExtensionDesc struct { Field int32 // field number Name string // fully-qualified name of extension, for text formatting Tag string // protobuf tag style + Filename string // name of the file in which the extension is defined } func (ed *ExtensionDesc) repeated() bool { @@ -92,8 +191,13 @@ type Extension struct { } // SetRawExtension is for testing only. -func SetRawExtension(base extendableProto, id int32, b []byte) { - base.ExtensionMap()[id] = Extension{enc: b} +func SetRawExtension(base Message, id int32, b []byte) { + epb, err := extendable(base) + if err != nil { + return + } + extmap := epb.extensionsWrite() + extmap[id] = Extension{enc: b} } // isExtensionField returns true iff the given field number is in an extension range. @@ -108,9 +212,13 @@ func isExtensionField(pb extendableProto, field int32) bool { // checkExtensionTypes checks that the given extension is valid for pb. func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { + var pbi interface{} = pb // Check the extended type. - if a, b := reflect.TypeOf(pb), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) + if ea, ok := pbi.(extensionAdapter); ok { + pbi = ea.extendableProtoV1 + } + if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { + return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) } // Check the range. if !isExtensionField(pb, extension.Field) { @@ -155,80 +263,62 @@ func extensionProperties(ed *ExtensionDesc) *Properties { return prop } -// encodeExtensionMap encodes any unmarshaled (unencoded) extensions in m. -func encodeExtensionMap(m map[int32]Extension) error { - for k, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - m[k] = e - } - return nil -} - -func sizeExtensionMap(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - // HasExtension returns whether the given extension is present in pb. -func HasExtension(pb extendableProto, extension *ExtensionDesc) bool { +func HasExtension(pb Message, extension *ExtensionDesc) bool { // TODO: Check types, field numbers, etc.? - _, ok := pb.ExtensionMap()[extension.Field] + epb, err := extendable(pb) + if err != nil { + return false + } + extmap, mu := epb.extensionsRead() + if extmap == nil { + return false + } + mu.Lock() + _, ok := extmap[extension.Field] + mu.Unlock() return ok } // ClearExtension removes the given extension from pb. -func ClearExtension(pb extendableProto, extension *ExtensionDesc) { +func ClearExtension(pb Message, extension *ExtensionDesc) { + epb, err := extendable(pb) + if err != nil { + return + } // TODO: Check types, field numbers, etc.? - delete(pb.ExtensionMap(), extension.Field) + extmap := epb.extensionsWrite() + delete(extmap, extension.Field) } -// GetExtension parses and returns the given extension of pb. -// If the extension is not present and has no default value it returns ErrMissingExtension. -func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, error) { - if err := checkExtensionTypes(pb, extension); err != nil { +// GetExtension retrieves a proto2 extended field from pb. +// +// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), +// then GetExtension parses the encoded field and returns a Go value of the specified type. +// If the field is not present, then the default value is returned (if one is specified), +// otherwise ErrMissingExtension is reported. +// +// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), +// then GetExtension returns the raw encoded bytes of the field extension. +func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { + epb, err := extendable(pb) + if err != nil { return nil, err } - emap := pb.ExtensionMap() + if extension.ExtendedType != nil { + // can only check type if this is a complete descriptor + if err := checkExtensionTypes(epb, extension); err != nil { + return nil, err + } + } + + emap, mu := epb.extensionsRead() + if emap == nil { + return defaultExtensionValue(extension) + } + mu.Lock() + defer mu.Unlock() e, ok := emap[extension.Field] if !ok { // defaultExtensionValue returns the default value or @@ -247,6 +337,11 @@ func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, er return e.value, nil } + if extension.ExtensionType == nil { + // incomplete descriptor + return e.enc, nil + } + v, err := decodeExtension(e.enc, extension) if err != nil { return nil, err @@ -264,6 +359,11 @@ func GetExtension(pb extendableProto, extension *ExtensionDesc) (interface{}, er // defaultExtensionValue returns the default value for extension. // If no default for an extension is defined ErrMissingExtension is returned. func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { + if extension.ExtensionType == nil { + // incomplete descriptor, so no default + return nil, ErrMissingExtension + } + t := reflect.TypeOf(extension.ExtensionType) props := extensionProperties(extension) @@ -298,31 +398,28 @@ func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { // decodeExtension decodes an extension encoded in b. func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - t := reflect.TypeOf(extension.ExtensionType) - - props := extensionProperties(extension) + unmarshal := typeUnmarshaler(t, extension.Tag) // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. + // Allocate space to store the pointer/slice. value := reflect.New(t).Elem() + var err error for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF } + b = b[n:] + wire := int(x) & 7 - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { + b, err = unmarshal(b, valToPointer(value.Addr()), wire) + if err != nil { return nil, err } - if o.index >= len(o.buf) { + if len(b) == 0 { break } } @@ -332,10 +429,9 @@ func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { // GetExtensions returns a slice of the extensions present in pb that are also listed in es. // The returned slice has the same length as es; missing extensions will appear as nil elements. func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, ok := pb.(extendableProto) - if !ok { - err = errors.New("proto: not an extendable proto") - return + epb, err := extendable(pb) + if err != nil { + return nil, err } extensions = make([]interface{}, len(es)) for i, e := range es { @@ -350,9 +446,44 @@ func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, e return } +// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. +// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing +// just the Field field, which defines the extension's field number. +func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { + epb, err := extendable(pb) + if err != nil { + return nil, err + } + registeredExtensions := RegisteredExtensions(pb) + + emap, mu := epb.extensionsRead() + if emap == nil { + return nil, nil + } + mu.Lock() + defer mu.Unlock() + extensions := make([]*ExtensionDesc, 0, len(emap)) + for extid, e := range emap { + desc := e.desc + if desc == nil { + desc = registeredExtensions[extid] + if desc == nil { + desc = &ExtensionDesc{Field: extid} + } + } + + extensions = append(extensions, desc) + } + return extensions, nil +} + // SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb extendableProto, extension *ExtensionDesc, value interface{}) error { - if err := checkExtensionTypes(pb, extension); err != nil { +func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { + epb, err := extendable(pb) + if err != nil { + return err + } + if err := checkExtensionTypes(epb, extension); err != nil { return err } typ := reflect.TypeOf(extension.ExtensionType) @@ -368,10 +499,23 @@ func SetExtension(pb extendableProto, extension *ExtensionDesc, value interface{ return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) } - pb.ExtensionMap()[extension.Field] = Extension{desc: extension, value: value} + extmap := epb.extensionsWrite() + extmap[extension.Field] = Extension{desc: extension, value: value} return nil } +// ClearAllExtensions clears all extensions from pb. +func ClearAllExtensions(pb Message) { + epb, err := extendable(pb) + if err != nil { + return + } + m := epb.extensionsWrite() + for k := range m { + delete(m, k) + } +} + // A global registry of extensions. // The generated code will register the generated descriptors by calling RegisterExtension. diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go index 0de8f8dffd08..75565cc6dcf4 100644 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ b/vendor/github.com/golang/protobuf/proto/lib.go @@ -73,7 +73,6 @@ for a protocol buffer variable v: When the .proto file specifies `syntax="proto3"`, there are some differences: - Non-repeated fields of non-message type are values instead of pointers. - - Getters are only generated for message and oneof fields. - Enum types do not get an Enum method. The simplest way to describe this is to see an example. @@ -274,6 +273,67 @@ import ( "sync" ) +// RequiredNotSetError is an error type returned by either Marshal or Unmarshal. +// Marshal reports this when a required field is not initialized. +// Unmarshal reports this when a required field is missing from the wire data. +type RequiredNotSetError struct{ field string } + +func (e *RequiredNotSetError) Error() string { + if e.field == "" { + return fmt.Sprintf("proto: required field not set") + } + return fmt.Sprintf("proto: required field %q not set", e.field) +} +func (e *RequiredNotSetError) RequiredNotSet() bool { + return true +} + +type invalidUTF8Error struct{ field string } + +func (e *invalidUTF8Error) Error() string { + if e.field == "" { + return "proto: invalid UTF-8 detected" + } + return fmt.Sprintf("proto: field %q contains invalid UTF-8", e.field) +} +func (e *invalidUTF8Error) InvalidUTF8() bool { + return true +} + +// errInvalidUTF8 is a sentinel error to identify fields with invalid UTF-8. +// This error should not be exposed to the external API as such errors should +// be recreated with the field information. +var errInvalidUTF8 = &invalidUTF8Error{} + +// isNonFatal reports whether the error is either a RequiredNotSet error +// or a InvalidUTF8 error. +func isNonFatal(err error) bool { + if re, ok := err.(interface{ RequiredNotSet() bool }); ok && re.RequiredNotSet() { + return true + } + if re, ok := err.(interface{ InvalidUTF8() bool }); ok && re.InvalidUTF8() { + return true + } + return false +} + +type nonFatal struct{ E error } + +// Merge merges err into nf and reports whether it was successful. +// Otherwise it returns false for any fatal non-nil errors. +func (nf *nonFatal) Merge(err error) (ok bool) { + if err == nil { + return true // not an error + } + if !isNonFatal(err) { + return false // fatal error + } + if nf.E == nil { + nf.E = err // store first instance of non-fatal error + } + return true +} + // Message is implemented by generated protocol buffer messages. type Message interface { Reset() @@ -308,18 +368,9 @@ func GetStats() Stats { return stats } // temporary Buffer and are fine for most applications. type Buffer struct { buf []byte // encode/decode byte stream - index int // write point + index int // read point - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 + deterministic bool } // NewBuffer allocates a new Buffer and initializes its internal data to @@ -344,6 +395,30 @@ func (p *Buffer) SetBuf(s []byte) { // Bytes returns the contents of the Buffer. func (p *Buffer) Bytes() []byte { return p.buf } +// SetDeterministic sets whether to use deterministic serialization. +// +// Deterministic serialization guarantees that for a given binary, equal +// messages will always be serialized to the same bytes. This implies: +// +// - Repeated serialization of a message will return the same bytes. +// - Different processes of the same binary (which may be executing on +// different machines) will serialize equal messages to the same bytes. +// +// Note that the deterministic serialization is NOT canonical across +// languages. It is not guaranteed to remain stable over time. It is unstable +// across different builds with schema changes due to unknown fields. +// Users who need canonical serialization (e.g., persistent storage in a +// canonical form, fingerprinting, etc.) should define their own +// canonicalization specification and implement their own serializer rather +// than relying on this API. +// +// If deterministic serialization is requested, map entries will be sorted +// by keys in lexographical order. This is an implementation detail and +// subject to change. +func (p *Buffer) SetDeterministic(deterministic bool) { + p.deterministic = deterministic +} + /* * Helper routines for simplifying the creation of optional fields of basic type. */ @@ -832,22 +907,12 @@ func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMes return sf, false, nil } +// mapKeys returns a sort.Interface to be used for sorting the map keys. // Map fields may have key types of non-float scalars, strings and enums. -// The easiest way to sort them in some deterministic order is to use fmt. -// If this turns out to be inefficient we can always consider other options, -// such as doing a Schwartzian transform. - func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{ - vs: vs, - // default Less function: textual comparison - less: func(a, b reflect.Value) bool { - return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) - }, - } + s := mapKeySorter{vs: vs} - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; - // numeric keys are sorted numerically. + // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. if len(vs) == 0 { return s } @@ -856,6 +921,12 @@ func mapKeys(vs []reflect.Value) sort.Interface { s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } case reflect.Uint32, reflect.Uint64: s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } + case reflect.Bool: + s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true + case reflect.String: + s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } + default: + panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) } return s @@ -889,6 +960,20 @@ func isProto3Zero(v reflect.Value) bool { return false } +// ProtoPackageIsVersion2 is referenced from generated protocol buffer files +// to assert that that code is compatible with this version of the proto package. +const ProtoPackageIsVersion2 = true + // ProtoPackageIsVersion1 is referenced from generated protocol buffer files // to assert that that code is compatible with this version of the proto package. const ProtoPackageIsVersion1 = true + +// InternalMessageInfo is a type used internally by generated .pb.go files. +// This type is not intended to be used by non-generated code. +// This type is not subject to any compatibility guarantee. +type InternalMessageInfo struct { + marshal *marshalInfo + unmarshal *unmarshalInfo + merge *mergeInfo + discard *discardInfo +} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go index e25e01e63748..3b6ca41d5e55 100644 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ b/vendor/github.com/golang/protobuf/proto/message_set.go @@ -42,6 +42,7 @@ import ( "fmt" "reflect" "sort" + "sync" ) // errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. @@ -94,10 +95,7 @@ func (ms *messageSet) find(pb Message) *_MessageSet_Item { } func (ms *messageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false + return ms.find(pb) != nil } func (ms *messageSet) Unmarshal(pb Message) error { @@ -149,36 +147,54 @@ func skipVarint(buf []byte) []byte { // MarshalMessageSet encodes the extension map represented by m in the message set wire format. // It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(m map[int32]Extension) ([]byte, error) { - if err := encodeExtensionMap(m); err != nil { - return nil, err - } +func MarshalMessageSet(exts interface{}) ([]byte, error) { + return marshalMessageSet(exts, false) +} - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) +// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. +func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var u marshalInfo + siz := u.sizeMessageSet(exts) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, exts, deterministic) + + case map[int32]Extension: + // This is an old-style extension map. + // Wrap it in a new-style XXX_InternalExtensions. + ie := XXX_InternalExtensions{ + p: &struct { + mu sync.Mutex + extensionMap map[int32]Extension + }{ + extensionMap: exts, + }, + } + + var u marshalInfo + siz := u.sizeMessageSet(&ie) + b := make([]byte, 0, siz) + return u.appendMessageSet(b, &ie, deterministic) + + default: + return nil, errors.New("proto: not an extension map") } - return Marshal(ms) } // UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, m map[int32]Extension) error { +// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. +func UnmarshalMessageSet(buf []byte, exts interface{}) error { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + m = exts.extensionsWrite() + case map[int32]Extension: + m = exts + default: + return errors.New("proto: not an extension map") + } + ms := new(messageSet) if err := Unmarshal(buf, ms); err != nil { return err @@ -209,7 +225,24 @@ func UnmarshalMessageSet(buf []byte, m map[int32]Extension) error { // MarshalMessageSetJSON encodes the extension map represented by m in JSON format. // It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(m map[int32]Extension) ([]byte, error) { +func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { + var m map[int32]Extension + switch exts := exts.(type) { + case *XXX_InternalExtensions: + var mu sync.Locker + m, mu = exts.extensionsRead() + if m != nil { + // Keep the extensions map locked until we're done marshaling to prevent + // races between marshaling and unmarshaling the lazily-{en,de}coded + // values. + mu.Lock() + defer mu.Unlock() + } + case map[int32]Extension: + m = exts + default: + return nil, errors.New("proto: not an extension map") + } var b bytes.Buffer b.WriteByte('{') @@ -222,15 +255,16 @@ func MarshalMessageSetJSON(m map[int32]Extension) ([]byte, error) { for i, id := range ids { ext := m[id] - if i > 0 { - b.WriteByte(',') - } - msd, ok := messageSetMap[id] if !ok { // Unknown type; we can't render it, so skip it. continue } + + if i > 0 && b.Len() > 1 { + b.WriteByte(',') + } + fmt.Fprintf(&b, `"[%s]":`, msd.name) x := ext.value @@ -252,7 +286,7 @@ func MarshalMessageSetJSON(m map[int32]Extension) ([]byte, error) { // UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. // It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, m map[int32]Extension) error { +func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { // Common-case fast path. if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { return nil diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go index 749919d250a1..b6cad90834b3 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build appengine +// +build purego appengine js // This file contains an implementation of proto field accesses using package reflect. // It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can @@ -38,32 +38,13 @@ package proto import ( - "math" "reflect" + "sync" ) -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} +const unsafeAllowed = false -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. +// A field identifies a field in a struct, accessible from a pointer. // In this implementation, a field is identified by the sequence of field indices // passed to reflect's FieldByIndex. type field []int @@ -76,404 +57,301 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. var invalidField = field(nil) +// zeroField is a noop when calling pointer.offset. +var zeroField = field([]int{}) + // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { return f != nil } -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) +// The pointer type is for the table-driven decoder. +// The implementation here uses a reflect.Value of pointer type to +// create a generic pointer. In pointer_unsafe.go we use unsafe +// instead of reflect to implement the same (but faster) interface. +type pointer struct { + v reflect.Value } -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + return pointer{v: reflect.ValueOf(*i)} } -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + v := reflect.ValueOf(*i) + u := reflect.New(v.Type()) + u.Elem().Set(v) + return pointer{v: u} } -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{v: v} } -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} } -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return structPointer_ifield(p, f).(*bool) +func (p pointer) isNil() bool { + return p.v.IsNil() } -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) +// grow updates the slice s in place to make it one element longer. +// s must be addressable. +// Returns the (addressable) new element. +func grow(s reflect.Value) reflect.Value { + n, m := s.Len(), s.Cap() + if n < m { + s.SetLen(n + 1) + } else { + s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) + } + return s.Index(n) } -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) +func (p pointer) toInt64() *int64 { + return p.v.Interface().(*int64) } - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return structPointer_ifield(p, f).(*string) +func (p pointer) toInt64Ptr() **int64 { + return p.v.Interface().(**int64) } - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) +func (p pointer) toInt64Slice() *[]int64 { + return p.v.Interface().(*[]int64) } -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) -} +var int32ptr = reflect.TypeOf((*int32)(nil)) -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return structPointer_field(p, f).Addr() +func (p pointer) toInt32() *int32 { + return p.v.Convert(int32ptr).Interface().(*int32) } -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) +// The toInt32Ptr/Slice methods don't work because of enums. +// Instead, we must use set/get methods for the int32ptr/slice case. +/* + func (p pointer) toInt32Ptr() **int32 { + return p.v.Interface().(**int32) } - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} + func (p pointer) toInt32Slice() *[]int32 { + return p.v.Interface().(*[]int32) } - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} +*/ +func (p pointer) getInt32Ptr() *int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().(*int32) + } + // an enum + return p.v.Elem().Convert(int32PtrType).Interface().(*int32) +} +func (p pointer) setInt32Ptr(v int32) { + // Allocate value in a *int32. Possibly convert that to a *enum. + // Then assign it to a **int32 or **enum. + // Note: we can convert *int32 to *enum, but we can't convert + // **int32 to **enum! + p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) +} + +// getInt32Slice copies []int32 from p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getInt32Slice() []int32 { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + return p.v.Elem().Interface().([]int32) + } + // an enum + // Allocate a []int32, then assign []enum's values into it. + // Note: we can't convert []enum to []int32. + slice := p.v.Elem() + s := make([]int32, slice.Len()) + for i := 0; i < slice.Len(); i++ { + s[i] = int32(slice.Index(i).Int()) + } + return s } -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value +// setInt32Slice copies []int32 into p as a new slice. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setInt32Slice(v []int32) { + if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { + // raw int32 type + p.v.Elem().Set(reflect.ValueOf(v)) + return + } + // an enum + // Allocate a []enum, then assign []int32's values into it. + // Note: we can't convert []enum to []int32. + slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) + for i, x := range v { + slice.Index(i).SetInt(int64(x)) + } + p.v.Elem().Set(slice) } - -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) +func (p pointer) appendInt32Slice(v int32) { + grow(p.v.Elem()).SetInt(int64(v)) } -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value +func (p pointer) toUint64() *uint64 { + return p.v.Interface().(*uint64) } - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() +func (p pointer) toUint64Ptr() **uint64 { + return p.v.Interface().(**uint64) } - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) +func (p pointer) toUint64Slice() *[]uint64 { + return p.v.Interface().(*[]uint64) } - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toUint32() *uint32 { + return p.v.Interface().(*uint32) } - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} +func (p pointer) toUint32Ptr() **uint32 { + return p.v.Interface().(**uint32) } - -// A word32Val represents a field of type int32, uint32, float32, or enum. -// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. -type word32Val struct { - v reflect.Value +func (p pointer) toUint32Slice() *[]uint32 { + return p.v.Interface().(*[]uint32) } - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - switch p.v.Type() { - case int32Type: - p.v.SetInt(int64(x)) - return - case uint32Type: - p.v.SetUint(uint64(x)) - return - case float32Type: - p.v.SetFloat(float64(math.Float32frombits(x))) - return - } - - // must be enum - p.v.SetInt(int64(int32(x))) +func (p pointer) toBool() *bool { + return p.v.Interface().(*bool) } - -// Get gets the bits pointed at by p, as a uint32. -func word32Val_Get(p word32Val) uint32 { - elem := p.v - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toBoolPtr() **bool { + return p.v.Interface().(**bool) } - -// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val{structPointer_field(p, f)} +func (p pointer) toBoolSlice() *[]bool { + return p.v.Interface().(*[]bool) } - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value +func (p pointer) toFloat64() *float64 { + return p.v.Interface().(*float64) } - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } +func (p pointer) toFloat64Ptr() **float64 { + return p.v.Interface().(**float64) } - -func (p word32Slice) Len() int { - return p.v.Len() +func (p pointer) toFloat64Slice() *[]float64 { + return p.v.Interface().(*[]float64) } - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") +func (p pointer) toFloat32() *float32 { + return p.v.Interface().(*float32) } - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} +func (p pointer) toFloat32Ptr() **float32 { + return p.v.Interface().(**float32) } - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value +func (p pointer) toFloat32Slice() *[]float32 { + return p.v.Interface().(*[]float32) } - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") +func (p pointer) toString() *string { + return p.v.Interface().(*string) } - -func word64_IsNil(p word64) bool { - return p.v.IsNil() +func (p pointer) toStringPtr() **string { + return p.v.Interface().(**string) } - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") +func (p pointer) toStringSlice() *[]string { + return p.v.Interface().(*[]string) } - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} +func (p pointer) toBytes() *[]byte { + return p.v.Interface().(*[]byte) +} +func (p pointer) toBytesSlice() *[][]byte { + return p.v.Interface().(*[][]byte) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return p.v.Interface().(*XXX_InternalExtensions) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return p.v.Interface().(*map[int32]Extension) +} +func (p pointer) getPointer() pointer { + return pointer{v: p.v.Elem()} +} +func (p pointer) setPointer(q pointer) { + p.v.Elem().Set(q.v) +} +func (p pointer) appendPointer(q pointer) { + grow(p.v.Elem()).Set(q.v) } -// word64Val is like word32Val but for 64-bit values. -type word64Val struct { - v reflect.Value +// getPointerSlice copies []*T from p as a new []pointer. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) getPointerSlice() []pointer { + if p.v.IsNil() { + return nil + } + n := p.v.Elem().Len() + s := make([]pointer, n) + for i := 0; i < n; i++ { + s[i] = pointer{v: p.v.Elem().Index(i)} + } + return s } -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - switch p.v.Type() { - case int64Type: - p.v.SetInt(int64(x)) - return - case uint64Type: - p.v.SetUint(x) - return - case float64Type: - p.v.SetFloat(math.Float64frombits(x)) +// setPointerSlice copies []pointer into p as a new []*T. +// This behavior differs from the implementation in pointer_unsafe.go. +func (p pointer) setPointerSlice(v []pointer) { + if v == nil { + p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) return } - panic("unreachable") + s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) + for _, p := range v { + s = reflect.Append(s, p.v) + } + p.v.Elem().Set(s) } -func word64Val_Get(p word64Val) uint64 { - elem := p.v - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + if p.v.Elem().IsNil() { + return pointer{v: p.v.Elem()} } - panic("unreachable") + return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct } -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val{structPointer_field(p, f)} +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + // TODO: check that p.v.Type().Elem() == t? + return p.v } -type word64Slice struct { - v reflect.Value +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p } - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } - -func (p word64Slice) Len() int { - return p.v.Len() +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p } - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v } +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + atomicLock.Lock() + defer atomicLock.Unlock() + return *p +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomicLock.Lock() + defer atomicLock.Unlock() + *p = v +} + +var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go index e9be0fe92ee7..d55a335d9453 100644 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go @@ -29,7 +29,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// +build !appengine +// +build !purego,!appengine,!js // This file contains the implementation of the proto field accesses using package unsafe. @@ -37,38 +37,13 @@ package proto import ( "reflect" + "sync/atomic" "unsafe" ) -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} +const unsafeAllowed = true -// A field identifies a field in a struct, accessible from a structPointer. +// A field identifies a field in a struct, accessible from a pointer. // In this implementation, a field is identified by its byte offset from the start of the struct. type field uintptr @@ -80,187 +55,254 @@ func toField(f *reflect.StructField) field { // invalidField is an invalid field identifier. const invalidField = ^field(0) +// zeroField is a noop when calling pointer.offset. +const zeroField = field(0) + // IsValid reports whether the field identifier is valid. func (f field) IsValid() bool { - return f != ^field(0) + return f != invalidField } -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// The pointer type below is for the new table-driven encoder/decoder. +// The implementation here uses unsafe.Pointer to create a generic pointer. +// In pointer_reflect.go we use reflect instead of unsafe to implement +// the same (but slower) interface. +type pointer struct { + p unsafe.Pointer } -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} +// size of pointer +var ptrSize = unsafe.Sizeof(uintptr(0)) -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// toPointer converts an interface of pointer type to a pointer +// that points to the same target. +func toPointer(i *Message) pointer { + // Super-tricky - read pointer out of data word of interface value. + // Saves ~25ns over the equivalent: + // return valToPointer(reflect.ValueOf(*i)) + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} } -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// toAddrPointer converts an interface to a pointer that points to +// the interface data. +func toAddrPointer(i *interface{}, isptr bool) pointer { + // Super-tricky - read or get the address of data word of interface value. + if isptr { + // The interface is of pointer type, thus it is a direct interface. + // The data word is the pointer data itself. We take its address. + return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} + } + // The interface is not of pointer type. The data word is the pointer + // to the data. + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} } -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// valToPointer converts v to a pointer. v must be of pointer type. +func valToPointer(v reflect.Value) pointer { + return pointer{p: unsafe.Pointer(v.Pointer())} } -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// offset converts from a pointer to a structure to a pointer to +// one of its fields. +func (p pointer) offset(f field) pointer { + // For safety, we should panic if !f.IsValid, however calling panic causes + // this to no longer be inlineable, which is a serious performance cost. + /* + if !f.IsValid() { + panic("invalid field") + } + */ + return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} } -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) isNil() bool { + return p.p == nil } -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt64() *int64 { + return (*int64)(p.p) } - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toInt64Ptr() **int64 { + return (**int64)(p.p) } - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) +func (p pointer) toInt64Slice() *[]int64 { + return (*[]int64)(p.p) } - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q +func (p pointer) toInt32() *int32 { + return (*int32)(p.p) } -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) +// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. +/* + func (p pointer) toInt32Ptr() **int32 { + return (**int32)(p.p) + } + func (p pointer) toInt32Slice() *[]int32 { + return (*[]int32)(p.p) + } +*/ +func (p pointer) getInt32Ptr() *int32 { + return *(**int32)(p.p) } - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) setInt32Ptr(v int32) { + *(**int32)(p.p) = &v } -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil +// getInt32Slice loads a []int32 from p. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getInt32Slice() []int32 { + return *(*[]int32)(p.p) } -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] +// setInt32Slice stores a []int32 to p. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setInt32Slice(v []int32) { + *(*[]int32)(p.p) = v } -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p +// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? +func (p pointer) appendInt32Slice(v int32) { + s := (*[]int32)(p.p) + *s = append(*s, v) } -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +func (p pointer) toUint64() *uint64 { + return (*uint64)(p.p) } - -// A word32Val is the address of a 32-bit value field. -type word32Val *uint32 - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - *p = x +func (p pointer) toUint64Ptr() **uint64 { + return (**uint64)(p.p) } - -// Get gets the value pointed at by p. -func word32Val_Get(p word32Val) uint32 { - return *p +func (p pointer) toUint64Slice() *[]uint64 { + return (*[]uint64)(p.p) } - -// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +func (p pointer) toUint32() *uint32 { + return (*uint32)(p.p) } - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func (p pointer) toUint32Ptr() **uint32 { + return (**uint32)(p.p) } - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] +func (p pointer) toUint32Slice() *[]uint32 { + return (*[]uint32)(p.p) } - -func word64_IsNil(p word64) bool { - return *p == nil +func (p pointer) toBool() *bool { + return (*bool)(p.p) } - -func word64_Get(p word64) uint64 { - return **p +func (p pointer) toBoolPtr() **bool { + return (**bool)(p.p) +} +func (p pointer) toBoolSlice() *[]bool { + return (*[]bool)(p.p) +} +func (p pointer) toFloat64() *float64 { + return (*float64)(p.p) +} +func (p pointer) toFloat64Ptr() **float64 { + return (**float64)(p.p) +} +func (p pointer) toFloat64Slice() *[]float64 { + return (*[]float64)(p.p) +} +func (p pointer) toFloat32() *float32 { + return (*float32)(p.p) +} +func (p pointer) toFloat32Ptr() **float32 { + return (**float32)(p.p) +} +func (p pointer) toFloat32Slice() *[]float32 { + return (*[]float32)(p.p) +} +func (p pointer) toString() *string { + return (*string)(p.p) +} +func (p pointer) toStringPtr() **string { + return (**string)(p.p) +} +func (p pointer) toStringSlice() *[]string { + return (*[]string)(p.p) +} +func (p pointer) toBytes() *[]byte { + return (*[]byte)(p.p) +} +func (p pointer) toBytesSlice() *[][]byte { + return (*[][]byte)(p.p) +} +func (p pointer) toExtensions() *XXX_InternalExtensions { + return (*XXX_InternalExtensions)(p.p) +} +func (p pointer) toOldExtensions() *map[int32]Extension { + return (*map[int32]Extension)(p.p) } -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +// getPointerSlice loads []*T from p as a []pointer. +// The value returned is aliased with the original slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) getPointerSlice() []pointer { + // Super-tricky - p should point to a []*T where T is a + // message type. We load it as []pointer. + return *(*[]pointer)(p.p) } -// word64Val is like word32Val but for 64-bit values. -type word64Val *uint64 +// setPointerSlice stores []pointer into p as a []*T. +// The value set is aliased with the input slice. +// This behavior differs from the implementation in pointer_reflect.go. +func (p pointer) setPointerSlice(v []pointer) { + // Super-tricky - p should point to a []*T where T is a + // message type. We store it as []pointer. + *(*[]pointer)(p.p) = v +} -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - *p = x +// getPointer loads the pointer at p and returns it. +func (p pointer) getPointer() pointer { + return pointer{p: *(*unsafe.Pointer)(p.p)} } -func word64Val_Get(p word64Val) uint64 { - return *p +// setPointer stores the pointer q at p. +func (p pointer) setPointer(q pointer) { + *(*unsafe.Pointer)(p.p) = q.p } -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) +// append q to the slice pointed to by p. +func (p pointer) appendPointer(q pointer) { + s := (*[]unsafe.Pointer)(p.p) + *s = append(*s, q.p) } -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 +// getInterfacePointer returns a pointer that points to the +// interface data of the interface pointed by p. +func (p pointer) getInterfacePointer() pointer { + // Super-tricky - read pointer out of data word of interface value. + return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} +} -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } +// asPointerTo returns a reflect.Value that is a pointer to an +// object of type t stored at p. +func (p pointer) asPointerTo(t reflect.Type) reflect.Value { + return reflect.NewAt(t, p.p) +} -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) +func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { + return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { + return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { + return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} +func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { + return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) } diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go index 4fe2ec22e863..50b99b83a8c7 100644 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ b/vendor/github.com/golang/protobuf/proto/properties.go @@ -58,42 +58,6 @@ const ( WireFixed32 = 5 ) -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// A oneofMarshaler does the marshaling for all oneof fields in a message. -type oneofMarshaler func(Message, *Buffer) error - -// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. -type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) - -// A oneofSizer does the sizing for all oneof fields in a message. -type oneofSizer func(Message) int - // tagMap is an optimization over map[int]int for typical protocol buffer // use-cases. Encoded protocol buffers are often in tag order with small tag // numbers. @@ -140,13 +104,6 @@ type StructProperties struct { decoderTags tagMap // map from proto tag to struct field number decoderOrigNames map[string]int // map from original name to struct field number order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto - - oneofMarshaler oneofMarshaler - oneofUnmarshaler oneofUnmarshaler - oneofSizer oneofSizer - stype reflect.Type // OneofTypes contains information about the oneof fields in this message. // It is keyed by the original name of a field. @@ -182,41 +139,24 @@ type Properties struct { Repeated bool Packed bool // relevant for repeated primitives only Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only + proto3 bool // whether this is known to be a proto3 field oneof bool // whether this is a oneof field Default string // default value HasDefault bool // whether an explicit default was provided - def_uint64 uint64 - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder + + stype reflect.Type // set for struct types only + sprop *StructProperties // set for struct types only + + mtype reflect.Type // set for map types only + MapKeyProp *Properties // set for map types only + MapValProp *Properties // set for map types only } // String formats the properties in the protobuf struct field tag style. func (p *Properties) String() string { s := p.Wire - s = "," + s += "," s += strconv.Itoa(p.Tag) if p.Required { s += ",req" @@ -262,29 +202,14 @@ func (p *Properties) Parse(s string) { switch p.Wire { case "varint": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint case "fixed32": p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 case "fixed64": p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 case "zigzag32": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 case "zigzag64": p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 case "bytes", "group": p.WireType = WireBytes // no numeric converter for non-numeric types @@ -299,6 +224,7 @@ func (p *Properties) Parse(s string) { return } +outer: for i := 2; i < len(fields); i++ { f := fields[i] switch { @@ -326,260 +252,41 @@ func (p *Properties) Parse(s string) { if i+1 < len(fields) { // Commas aren't escaped, and def is always last. p.Default += "," + strings.Join(fields[i+1:], ",") - break + break outer } } } } -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - +// setFieldProps initializes the field properties for submessages and maps. +func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { switch t1 := typ; t1.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - - // proto3 scalar types - - case reflect.Bool: - p.enc = (*Buffer).enc_proto3_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_proto3_bool - case reflect.Int32: - p.enc = (*Buffer).enc_proto3_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_proto3_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_proto3_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_proto3_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - case reflect.String: - p.enc = (*Buffer).enc_proto3_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_proto3_string - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: + if t1.Elem().Kind() == reflect.Struct { p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } } case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_byte - p.dec = (*Buffer).dec_slice_byte - p.size = size_slice_byte - // This is a []byte, which is either a bytes field, - // or the value of a map field. In the latter case, - // we always encode an empty []byte, so we should not - // use the proto3 enc/size funcs. - // f == nil iff this is the key/value of a map field. - if p.proto3 && f != nil { - p.enc = (*Buffer).enc_proto3_slice_byte - p.size = size_proto3_slice_byte - } - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } + if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { + p.stype = t2.Elem() } case reflect.Map: - p.enc = (*Buffer).enc_new_map - p.dec = (*Buffer).dec_new_map - p.size = size_new_map - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} + p.MapKeyProp = &Properties{} + p.MapKeyProp.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) + p.MapValProp = &Properties{} vtype := p.mtype.Elem() if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { // The value type is not a message (*T) or bytes ([]byte), // so we need encoders for the pointer to this type. vtype = reflect.PtrTo(vtype) } - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) + p.MapValProp.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) } - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes - } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] - if p.stype != nil { if lockGetProp { p.sprop = GetProperties(p.stype) @@ -590,32 +297,9 @@ func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lock } var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() + marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() ) -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isMarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isMarshaler") - } - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - // We're checking for (likely) pointer-receiver methods - // so if t is not a pointer, something is very wrong. - // The calls above only invoke isUnmarshaler on pointer types. - if t.Kind() != reflect.Ptr { - panic("proto: misuse of isUnmarshaler") - } - return t.Implements(unmarshalerType) -} - // Init populates the properties from a protocol buffer struct tag. func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { p.init(typ, name, tag, f, true) @@ -625,14 +309,11 @@ func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructF // "bytes,49,opt,def=hello!" p.Name = name p.OrigName = name - if f != nil { - p.field = toField(f) - } if tag == "" { return } p.Parse(tag) - p.setEncAndDec(typ, f, lockGetProp) + p.setFieldProps(typ, f, lockGetProp) } var ( @@ -682,8 +363,6 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { propertiesMap[t] = prop // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) - prop.unrecField = invalidField prop.Prop = make([]*Properties, t.NumField()) prop.order = make([]int, t.NumField()) @@ -693,15 +372,11 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { name := f.Name p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - if f.Name == "XXX_extensions" { // special case - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map + oneof := f.Tag.Get("protobuf_oneof") // special case + if oneof != "" { + // Oneof fields don't use the traditional protobuf tag. + p.OrigName = oneof } - if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } - oneof := f.Tag.Get("protobuf_oneof") != "" // special case prop.Prop[i] = p prop.order[i] = i if debug { @@ -711,9 +386,6 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } print("\n") } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && !oneof { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } } // Re-order prop.order. @@ -724,8 +396,7 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { } if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { var oots []interface{} - prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() - prop.stype = t + _, _, _, oots = om.XXX_OneofFuncs() // Interpret oneof metadata. prop.OneofTypes = make(map[string]*OneofProperties) @@ -775,30 +446,6 @@ func getPropertiesLocked(t reflect.Type) *StructProperties { return prop } -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - // A global registry of enum types. // The generated code will register the generated maps by calling RegisterEnum. @@ -822,25 +469,76 @@ func EnumValueMap(enumType string) map[string]int32 { // A registry of all linked message types. // The string is a fully-qualified proto name ("pkg.Message"). var ( - protoTypes = make(map[string]reflect.Type) - revProtoTypes = make(map[reflect.Type]string) + protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers + protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types + revProtoTypes = make(map[reflect.Type]string) ) // RegisterType is called from generated code and maps from the fully qualified // proto name to the type (pointer to struct) of the protocol buffer. func RegisterType(x Message, name string) { - if _, ok := protoTypes[name]; ok { + if _, ok := protoTypedNils[name]; ok { // TODO: Some day, make this a panic. log.Printf("proto: duplicate proto type registered: %s", name) return } t := reflect.TypeOf(x) - protoTypes[name] = t + if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { + // Generated code always calls RegisterType with nil x. + // This check is just for extra safety. + protoTypedNils[name] = x + } else { + protoTypedNils[name] = reflect.Zero(t).Interface().(Message) + } + revProtoTypes[t] = name +} + +// RegisterMapType is called from generated code and maps from the fully qualified +// proto name to the native map type of the proto map definition. +func RegisterMapType(x interface{}, name string) { + if reflect.TypeOf(x).Kind() != reflect.Map { + panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) + } + if _, ok := protoMapTypes[name]; ok { + log.Printf("proto: duplicate proto type registered: %s", name) + return + } + t := reflect.TypeOf(x) + protoMapTypes[name] = t revProtoTypes[t] = name } // MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { return revProtoTypes[reflect.TypeOf(x)] } +func MessageName(x Message) string { + type xname interface { + XXX_MessageName() string + } + if m, ok := x.(xname); ok { + return m.XXX_MessageName() + } + return revProtoTypes[reflect.TypeOf(x)] +} // MessageType returns the message type (pointer to struct) for a named message. -func MessageType(name string) reflect.Type { return protoTypes[name] } +// The type is not guaranteed to implement proto.Message if the name refers to a +// map entry. +func MessageType(name string) reflect.Type { + if t, ok := protoTypedNils[name]; ok { + return reflect.TypeOf(t) + } + return protoMapTypes[name] +} + +// A registry of all linked proto files. +var ( + protoFiles = make(map[string][]byte) // file name => fileDescriptor +) + +// RegisterFile is called from generated code and maps from the +// full file name of a .proto file to its compressed FileDescriptorProto. +func RegisterFile(filename string, fileDescriptor []byte) { + protoFiles[filename] = fileDescriptor +} + +// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. +func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go new file mode 100644 index 000000000000..b16794496f5f --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_marshal.go @@ -0,0 +1,2767 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "math" + "reflect" + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// a sizer takes a pointer to a field and the size of its tag, computes the size of +// the encoded data. +type sizer func(pointer, int) int + +// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), +// marshals the field to the end of the slice, returns the slice and error (if any). +type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) + +// marshalInfo is the information used for marshaling a message. +type marshalInfo struct { + typ reflect.Type + fields []*marshalFieldInfo + unrecognized field // offset of XXX_unrecognized + extensions field // offset of XXX_InternalExtensions + v1extensions field // offset of XXX_extensions + sizecache field // offset of XXX_sizecache + initialized int32 // 0 -- only typ is set, 1 -- fully initialized + messageset bool // uses message set wire format + hasmarshaler bool // has custom marshaler + sync.RWMutex // protect extElems map, also for initialization + extElems map[int32]*marshalElemInfo // info of extension elements +} + +// marshalFieldInfo is the information used for marshaling a field of a message. +type marshalFieldInfo struct { + field field + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isPointer bool + required bool // field is required + name string // name of the field, for error reporting + oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements +} + +// marshalElemInfo is the information used for marshaling an extension or oneof element. +type marshalElemInfo struct { + wiretag uint64 // tag in wire format + tagsize int // size of tag in wire format + sizer sizer + marshaler marshaler + isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) +} + +var ( + marshalInfoMap = map[reflect.Type]*marshalInfo{} + marshalInfoLock sync.Mutex +) + +// getMarshalInfo returns the information to marshal a given type of message. +// The info it returns may not necessarily initialized. +// t is the type of the message (NOT the pointer to it). +func getMarshalInfo(t reflect.Type) *marshalInfo { + marshalInfoLock.Lock() + u, ok := marshalInfoMap[t] + if !ok { + u = &marshalInfo{typ: t} + marshalInfoMap[t] = u + } + marshalInfoLock.Unlock() + return u +} + +// Size is the entry point from generated code, +// and should be ONLY called by generated code. +// It computes the size of encoded data of msg. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Size(msg Message) int { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return 0 + } + return u.size(ptr) +} + +// Marshal is the entry point from generated code, +// and should be ONLY called by generated code. +// It marshals msg to the end of b. +// a is a pointer to a place to store cached marshal info. +func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { + u := getMessageMarshalInfo(msg, a) + ptr := toPointer(&msg) + if ptr.isNil() { + // We get here if msg is a typed nil ((*SomeMessage)(nil)), + // so it satisfies the interface, and msg == nil wouldn't + // catch it. We don't want crash in this case. + return b, ErrNil + } + return u.marshal(b, ptr, deterministic) +} + +func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { + // u := a.marshal, but atomically. + // We use an atomic here to ensure memory consistency. + u := atomicLoadMarshalInfo(&a.marshal) + if u == nil { + // Get marshal information from type of message. + t := reflect.ValueOf(msg).Type() + if t.Kind() != reflect.Ptr { + panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) + } + u = getMarshalInfo(t.Elem()) + // Store it in the cache for later users. + // a.marshal = u, but atomically. + atomicStoreMarshalInfo(&a.marshal, u) + } + return u +} + +// size is the main function to compute the size of the encoded data of a message. +// ptr is the pointer to the message. +func (u *marshalInfo) size(ptr pointer) int { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b, _ := m.Marshal() + return len(b) + } + + n := 0 + for _, f := range u.fields { + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + n += f.sizer(ptr.offset(f.field), f.tagsize) + } + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + n += u.sizeMessageSet(e) + } else { + n += u.sizeExtensions(e) + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + n += u.sizeV1Extensions(m) + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + n += len(s) + } + // cache the result for use in marshal + if u.sizecache.IsValid() { + atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) + } + return n +} + +// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), +// fall back to compute the size. +func (u *marshalInfo) cachedsize(ptr pointer) int { + if u.sizecache.IsValid() { + return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) + } + return u.size(ptr) +} + +// marshal is the main function to marshal a message. It takes a byte slice and appends +// the encoded data to the end of the slice, returns the slice and error (if any). +// ptr is the pointer to the message. +// If deterministic is true, map is marshaled in deterministic order. +func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { + if atomic.LoadInt32(&u.initialized) == 0 { + u.computeMarshalInfo() + } + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if u.hasmarshaler { + m := ptr.asPointerTo(u.typ).Interface().(Marshaler) + b1, err := m.Marshal() + b = append(b, b1...) + return b, err + } + + var err, errLater error + // The old marshaler encodes extensions at beginning. + if u.extensions.IsValid() { + e := ptr.offset(u.extensions).toExtensions() + if u.messageset { + b, err = u.appendMessageSet(b, e, deterministic) + } else { + b, err = u.appendExtensions(b, e, deterministic) + } + if err != nil { + return b, err + } + } + if u.v1extensions.IsValid() { + m := *ptr.offset(u.v1extensions).toOldExtensions() + b, err = u.appendV1Extensions(b, m, deterministic) + if err != nil { + return b, err + } + } + for _, f := range u.fields { + if f.required { + if ptr.offset(f.field).getPointer().isNil() { + // Required field is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name} + } + continue + } + } + if f.isPointer && ptr.offset(f.field).getPointer().isNil() { + // nil pointer always marshals to nothing + continue + } + b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) + if err != nil { + if err1, ok := err.(*RequiredNotSetError); ok { + // Required field in submessage is not set. + // We record the error but keep going, to give a complete marshaling. + if errLater == nil { + errLater = &RequiredNotSetError{f.name + "." + err1.field} + } + continue + } + if err == errRepeatedHasNil { + err = errors.New("proto: repeated field " + f.name + " has nil element") + } + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return b, err + } + } + if u.unrecognized.IsValid() { + s := *ptr.offset(u.unrecognized).toBytes() + b = append(b, s...) + } + return b, errLater +} + +// computeMarshalInfo initializes the marshal info. +func (u *marshalInfo) computeMarshalInfo() { + u.Lock() + defer u.Unlock() + if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock + return + } + + t := u.typ + u.unrecognized = invalidField + u.extensions = invalidField + u.v1extensions = invalidField + u.sizecache = invalidField + + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + if reflect.PtrTo(t).Implements(marshalerType) { + u.hasmarshaler = true + atomic.StoreInt32(&u.initialized, 1) + return + } + + // get oneof implementers + var oneofImplementers []interface{} + if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { + _, _, _, oneofImplementers = m.XXX_OneofFuncs() + } + + n := t.NumField() + + // deal with XXX fields first + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + if !strings.HasPrefix(f.Name, "XXX_") { + continue + } + switch f.Name { + case "XXX_sizecache": + u.sizecache = toField(&f) + case "XXX_unrecognized": + u.unrecognized = toField(&f) + case "XXX_InternalExtensions": + u.extensions = toField(&f) + u.messageset = f.Tag.Get("protobuf_messageset") == "1" + case "XXX_extensions": + u.v1extensions = toField(&f) + case "XXX_NoUnkeyedLiteral": + // nothing to do + default: + panic("unknown XXX field: " + f.Name) + } + n-- + } + + // normal fields + fields := make([]marshalFieldInfo, n) // batch allocation + u.fields = make([]*marshalFieldInfo, 0, n) + for i, j := 0, 0; i < t.NumField(); i++ { + f := t.Field(i) + + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + field := &fields[j] + j++ + field.name = f.Name + u.fields = append(u.fields, field) + if f.Tag.Get("protobuf_oneof") != "" { + field.computeOneofFieldInfo(&f, oneofImplementers) + continue + } + if f.Tag.Get("protobuf") == "" { + // field has no tag (not in generated message), ignore it + u.fields = u.fields[:len(u.fields)-1] + j-- + continue + } + field.computeMarshalFieldInfo(&f) + } + + // fields are marshaled in tag order on the wire. + sort.Sort(byTag(u.fields)) + + atomic.StoreInt32(&u.initialized, 1) +} + +// helper for sorting fields by tag +type byTag []*marshalFieldInfo + +func (a byTag) Len() int { return len(a) } +func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } + +// getExtElemInfo returns the information to marshal an extension element. +// The info it returns is initialized. +func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { + // get from cache first + u.RLock() + e, ok := u.extElems[desc.Field] + u.RUnlock() + if ok { + return e + } + + t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct + tags := strings.Split(desc.Tag, ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(t, tags, false, false) + e = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + isptr: t.Kind() == reflect.Ptr, + } + + // update cache + u.Lock() + if u.extElems == nil { + u.extElems = make(map[int32]*marshalElemInfo) + } + u.extElems[desc.Field] = e + u.Unlock() + return e +} + +// computeMarshalFieldInfo fills up the information to marshal a field. +func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { + // parse protobuf tag of the field. + // tag has format of "bytes,49,opt,name=foo,def=hello!" + tags := strings.Split(f.Tag.Get("protobuf"), ",") + if tags[0] == "" { + return + } + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + if tags[2] == "req" { + fi.required = true + } + fi.setTag(f, tag, wt) + fi.setMarshaler(f, tags) +} + +func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { + fi.field = toField(f) + fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. + fi.isPointer = true + fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) + fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) + + ityp := f.Type // interface type + for _, o := range oneofImplementers { + t := reflect.TypeOf(o) + if !t.Implements(ityp) { + continue + } + sf := t.Elem().Field(0) // oneof implementer is a struct with a single field + tags := strings.Split(sf.Tag.Get("protobuf"), ",") + tag, err := strconv.Atoi(tags[1]) + if err != nil { + panic("tag is not an integer") + } + wt := wiretype(tags[0]) + sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value + fi.oneofElems[t.Elem()] = &marshalElemInfo{ + wiretag: uint64(tag)<<3 | wt, + tagsize: SizeVarint(uint64(tag) << 3), + sizer: sizer, + marshaler: marshaler, + } + } +} + +type oneofMessage interface { + XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) +} + +// wiretype returns the wire encoding of the type. +func wiretype(encoding string) uint64 { + switch encoding { + case "fixed32": + return WireFixed32 + case "fixed64": + return WireFixed64 + case "varint", "zigzag32", "zigzag64": + return WireVarint + case "bytes": + return WireBytes + case "group": + return WireStartGroup + } + panic("unknown wire type " + encoding) +} + +// setTag fills up the tag (in wire format) and its size in the info of a field. +func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { + fi.field = toField(f) + fi.wiretag = uint64(tag)<<3 | wt + fi.tagsize = SizeVarint(uint64(tag) << 3) +} + +// setMarshaler fills up the sizer and marshaler in the info of a field. +func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { + switch f.Type.Kind() { + case reflect.Map: + // map field + fi.isPointer = true + fi.sizer, fi.marshaler = makeMapMarshaler(f) + return + case reflect.Ptr, reflect.Slice: + fi.isPointer = true + } + fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) +} + +// typeMarshaler returns the sizer and marshaler of a given field. +// t is the type of the field. +// tags is the generated "protobuf" tag of the field. +// If nozero is true, zero value is not marshaled to the wire. +// If oneof is true, it is a oneof field. +func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { + encoding := tags[0] + + pointer := false + slice := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + packed := false + proto3 := false + validateUTF8 := true + for i := 2; i < len(tags); i++ { + if tags[i] == "packed" { + packed = true + } + if tags[i] == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + switch t.Kind() { + case reflect.Bool: + if pointer { + return sizeBoolPtr, appendBoolPtr + } + if slice { + if packed { + return sizeBoolPackedSlice, appendBoolPackedSlice + } + return sizeBoolSlice, appendBoolSlice + } + if nozero { + return sizeBoolValueNoZero, appendBoolValueNoZero + } + return sizeBoolValue, appendBoolValue + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixed32Ptr, appendFixed32Ptr + } + if slice { + if packed { + return sizeFixed32PackedSlice, appendFixed32PackedSlice + } + return sizeFixed32Slice, appendFixed32Slice + } + if nozero { + return sizeFixed32ValueNoZero, appendFixed32ValueNoZero + } + return sizeFixed32Value, appendFixed32Value + case "varint": + if pointer { + return sizeVarint32Ptr, appendVarint32Ptr + } + if slice { + if packed { + return sizeVarint32PackedSlice, appendVarint32PackedSlice + } + return sizeVarint32Slice, appendVarint32Slice + } + if nozero { + return sizeVarint32ValueNoZero, appendVarint32ValueNoZero + } + return sizeVarint32Value, appendVarint32Value + } + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return sizeFixedS32Ptr, appendFixedS32Ptr + } + if slice { + if packed { + return sizeFixedS32PackedSlice, appendFixedS32PackedSlice + } + return sizeFixedS32Slice, appendFixedS32Slice + } + if nozero { + return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero + } + return sizeFixedS32Value, appendFixedS32Value + case "varint": + if pointer { + return sizeVarintS32Ptr, appendVarintS32Ptr + } + if slice { + if packed { + return sizeVarintS32PackedSlice, appendVarintS32PackedSlice + } + return sizeVarintS32Slice, appendVarintS32Slice + } + if nozero { + return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero + } + return sizeVarintS32Value, appendVarintS32Value + case "zigzag32": + if pointer { + return sizeZigzag32Ptr, appendZigzag32Ptr + } + if slice { + if packed { + return sizeZigzag32PackedSlice, appendZigzag32PackedSlice + } + return sizeZigzag32Slice, appendZigzag32Slice + } + if nozero { + return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero + } + return sizeZigzag32Value, appendZigzag32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixed64Ptr, appendFixed64Ptr + } + if slice { + if packed { + return sizeFixed64PackedSlice, appendFixed64PackedSlice + } + return sizeFixed64Slice, appendFixed64Slice + } + if nozero { + return sizeFixed64ValueNoZero, appendFixed64ValueNoZero + } + return sizeFixed64Value, appendFixed64Value + case "varint": + if pointer { + return sizeVarint64Ptr, appendVarint64Ptr + } + if slice { + if packed { + return sizeVarint64PackedSlice, appendVarint64PackedSlice + } + return sizeVarint64Slice, appendVarint64Slice + } + if nozero { + return sizeVarint64ValueNoZero, appendVarint64ValueNoZero + } + return sizeVarint64Value, appendVarint64Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return sizeFixedS64Ptr, appendFixedS64Ptr + } + if slice { + if packed { + return sizeFixedS64PackedSlice, appendFixedS64PackedSlice + } + return sizeFixedS64Slice, appendFixedS64Slice + } + if nozero { + return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero + } + return sizeFixedS64Value, appendFixedS64Value + case "varint": + if pointer { + return sizeVarintS64Ptr, appendVarintS64Ptr + } + if slice { + if packed { + return sizeVarintS64PackedSlice, appendVarintS64PackedSlice + } + return sizeVarintS64Slice, appendVarintS64Slice + } + if nozero { + return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero + } + return sizeVarintS64Value, appendVarintS64Value + case "zigzag64": + if pointer { + return sizeZigzag64Ptr, appendZigzag64Ptr + } + if slice { + if packed { + return sizeZigzag64PackedSlice, appendZigzag64PackedSlice + } + return sizeZigzag64Slice, appendZigzag64Slice + } + if nozero { + return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero + } + return sizeZigzag64Value, appendZigzag64Value + } + case reflect.Float32: + if pointer { + return sizeFloat32Ptr, appendFloat32Ptr + } + if slice { + if packed { + return sizeFloat32PackedSlice, appendFloat32PackedSlice + } + return sizeFloat32Slice, appendFloat32Slice + } + if nozero { + return sizeFloat32ValueNoZero, appendFloat32ValueNoZero + } + return sizeFloat32Value, appendFloat32Value + case reflect.Float64: + if pointer { + return sizeFloat64Ptr, appendFloat64Ptr + } + if slice { + if packed { + return sizeFloat64PackedSlice, appendFloat64PackedSlice + } + return sizeFloat64Slice, appendFloat64Slice + } + if nozero { + return sizeFloat64ValueNoZero, appendFloat64ValueNoZero + } + return sizeFloat64Value, appendFloat64Value + case reflect.String: + if validateUTF8 { + if pointer { + return sizeStringPtr, appendUTF8StringPtr + } + if slice { + return sizeStringSlice, appendUTF8StringSlice + } + if nozero { + return sizeStringValueNoZero, appendUTF8StringValueNoZero + } + return sizeStringValue, appendUTF8StringValue + } + if pointer { + return sizeStringPtr, appendStringPtr + } + if slice { + return sizeStringSlice, appendStringSlice + } + if nozero { + return sizeStringValueNoZero, appendStringValueNoZero + } + return sizeStringValue, appendStringValue + case reflect.Slice: + if slice { + return sizeBytesSlice, appendBytesSlice + } + if oneof { + // Oneof bytes field may also have "proto3" tag. + // We want to marshal it as a oneof field. Do this + // check before the proto3 check. + return sizeBytesOneof, appendBytesOneof + } + if proto3 { + return sizeBytes3, appendBytes3 + } + return sizeBytes, appendBytes + case reflect.Struct: + switch encoding { + case "group": + if slice { + return makeGroupSliceMarshaler(getMarshalInfo(t)) + } + return makeGroupMarshaler(getMarshalInfo(t)) + case "bytes": + if slice { + return makeMessageSliceMarshaler(getMarshalInfo(t)) + } + return makeMessageMarshaler(getMarshalInfo(t)) + } + } + panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) +} + +// Below are functions to size/marshal a specific type of a field. +// They are stored in the field's info, and called by function pointers. +// They have type sizer or marshaler. + +func sizeFixed32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixed32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixedS32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFixedS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + return (4 + tagsize) * len(s) +} +func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFloat32Value(_ pointer, tagsize int) int { + return 4 + tagsize +} +func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat32Ptr() + if p == nil { + return 0 + } + return 4 + tagsize +} +func sizeFloat32Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + return (4 + tagsize) * len(s) +} +func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return 0 + } + return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize +} +func sizeFixed64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixed64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFixedS64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFixedS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + return (8 + tagsize) * len(s) +} +func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeFloat64Value(_ pointer, tagsize int) int { + return 8 + tagsize +} +func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toFloat64Ptr() + if p == nil { + return 0 + } + return 8 + tagsize +} +func sizeFloat64Slice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + return (8 + tagsize) * len(s) +} +func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return 0 + } + return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize +} +func sizeVarint32Value(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarint32Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarint32Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarint64Value(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + return SizeVarint(v) + tagsize +} +func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toUint64() + if v == 0 { + return 0 + } + return SizeVarint(v) + tagsize +} +func sizeVarint64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toUint64Ptr() + if p == nil { + return 0 + } + return SizeVarint(*p) + tagsize +} +func sizeVarint64Slice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(v) + tagsize + } + return n +} +func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeVarintS64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v)) + tagsize +} +func sizeVarintS64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + return SizeVarint(uint64(*p)) + tagsize +} +func sizeVarintS64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + tagsize + } + return n +} +func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag32Value(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt32() + if v == 0 { + return 0 + } + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Ptr(ptr pointer, tagsize int) int { + p := ptr.getInt32Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize +} +func sizeZigzag32Slice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize + } + return n +} +func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { + s := ptr.getInt32Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeZigzag64Value(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toInt64() + if v == 0 { + return 0 + } + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Ptr(ptr pointer, tagsize int) int { + p := *ptr.toInt64Ptr() + if p == nil { + return 0 + } + v := *p + return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize +} +func sizeZigzag64Slice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize + } + return n +} +func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return 0 + } + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + return n + SizeVarint(uint64(n)) + tagsize +} +func sizeBoolValue(_ pointer, tagsize int) int { + return 1 + tagsize +} +func sizeBoolValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toBool() + if !v { + return 0 + } + return 1 + tagsize +} +func sizeBoolPtr(ptr pointer, tagsize int) int { + p := *ptr.toBoolPtr() + if p == nil { + return 0 + } + return 1 + tagsize +} +func sizeBoolSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + return (1 + tagsize) * len(s) +} +func sizeBoolPackedSlice(ptr pointer, tagsize int) int { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return 0 + } + return len(s) + SizeVarint(uint64(len(s))) + tagsize +} +func sizeStringValue(ptr pointer, tagsize int) int { + v := *ptr.toString() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringValueNoZero(ptr pointer, tagsize int) int { + v := *ptr.toString() + if v == "" { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringPtr(ptr pointer, tagsize int) int { + p := *ptr.toStringPtr() + if p == nil { + return 0 + } + v := *p + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeStringSlice(ptr pointer, tagsize int) int { + s := *ptr.toStringSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} +func sizeBytes(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if v == nil { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytes3(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + if len(v) == 0 { + return 0 + } + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesOneof(ptr pointer, tagsize int) int { + v := *ptr.toBytes() + return len(v) + SizeVarint(uint64(len(v))) + tagsize +} +func sizeBytesSlice(ptr pointer, tagsize int) int { + s := *ptr.toBytesSlice() + n := 0 + for _, v := range s { + n += len(v) + SizeVarint(uint64(len(v))) + tagsize + } + return n +} + +// appendFixed32 appends an encoded fixed32 to b. +func appendFixed32(b []byte, v uint32) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24)) + return b +} + +// appendFixed64 appends an encoded fixed64 to b. +func appendFixed64(b []byte, v uint64) []byte { + b = append(b, + byte(v), + byte(v>>8), + byte(v>>16), + byte(v>>24), + byte(v>>32), + byte(v>>40), + byte(v>>48), + byte(v>>56)) + return b +} + +// appendVarint appends an encoded varint to b. +func appendVarint(b []byte, v uint64) []byte { + // TODO: make 1-byte (maybe 2-byte) case inline-able, once we + // have non-leaf inliner. + switch { + case v < 1<<7: + b = append(b, byte(v)) + case v < 1<<14: + b = append(b, + byte(v&0x7f|0x80), + byte(v>>7)) + case v < 1<<21: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte(v>>14)) + case v < 1<<28: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte(v>>21)) + case v < 1<<35: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte(v>>28)) + case v < 1<<42: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte(v>>35)) + case v < 1<<49: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte(v>>42)) + case v < 1<<56: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte(v>>49)) + case v < 1<<63: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte(v>>56)) + default: + b = append(b, + byte(v&0x7f|0x80), + byte((v>>7)&0x7f|0x80), + byte((v>>14)&0x7f|0x80), + byte((v>>21)&0x7f|0x80), + byte((v>>28)&0x7f|0x80), + byte((v>>35)&0x7f|0x80), + byte((v>>42)&0x7f|0x80), + byte((v>>49)&0x7f|0x80), + byte((v>>56)&0x7f|0x80), + 1) + } + return b +} + +func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, *p) + return b, nil +} +func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, v) + } + return b, nil +} +func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + return b, nil +} +func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(*p)) + return b, nil +} +func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, uint32(v)) + } + return b, nil +} +func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float32bits(*ptr.toFloat32()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, v) + return b, nil +} +func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(*p)) + return b, nil +} +func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(4*len(s))) + for _, v := range s { + b = appendFixed32(b, math.Float32bits(v)) + } + return b, nil +} +func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, *p) + return b, nil +} +func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, v) + } + return b, nil +} +func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + return b, nil +} +func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(*p)) + return b, nil +} +func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, uint64(v)) + } + return b, nil +} +func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := math.Float64bits(*ptr.toFloat64()) + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, v) + return b, nil +} +func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toFloat64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(*p)) + return b, nil +} +func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toFloat64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(8*len(s))) + for _, v := range s { + b = appendFixed64(b, math.Float64bits(v)) + } + return b, nil +} +func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toUint64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + return b, nil +} +func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toUint64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, *p) + return b, nil +} +func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, v) + } + return b, nil +} +func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toUint64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(v) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, v) + } + return b, nil +} +func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + return b, nil +} +func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(*p)) + return b, nil +} +func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v)) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v)) + } + return b, nil +} +func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt32() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := ptr.getInt32Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + return b, nil +} +func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := ptr.getInt32Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + } + return b, nil +} +func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toInt64() + if v == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toInt64Ptr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + v := *p + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + return b, nil +} +func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toInt64Slice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + // compute size + n := 0 + for _, v := range s { + n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) + } + b = appendVarint(b, uint64(n)) + for _, v := range s { + b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) + } + return b, nil +} +func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBool() + if !v { + return b, nil + } + b = appendVarint(b, wiretag) + b = append(b, 1) + return b, nil +} + +func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toBoolPtr() + if p == nil { + return b, nil + } + b = appendVarint(b, wiretag) + if *p { + b = append(b, 1) + } else { + b = append(b, 0) + } + return b, nil +} +func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBoolSlice() + if len(s) == 0 { + return b, nil + } + b = appendVarint(b, wiretag&^7|WireBytes) + b = appendVarint(b, uint64(len(s))) + for _, v := range s { + if v { + b = append(b, 1) + } else { + b = append(b, 0) + } + } + return b, nil +} +func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toString() + if v == "" { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toStringSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} +func appendUTF8StringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + v := *ptr.toString() + if v == "" { + return b, nil + } + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + p := *ptr.toStringPtr() + if p == nil { + return b, nil + } + v := *p + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendUTF8StringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + var invalidUTF8 bool + s := *ptr.toStringSlice() + for _, v := range s { + if !utf8.ValidString(v) { + invalidUTF8 = true + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + if invalidUTF8 { + return b, errInvalidUTF8 + } + return b, nil +} +func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if v == nil { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + if len(v) == 0 { + return b, nil + } + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + v := *ptr.toBytes() + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + return b, nil +} +func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { + s := *ptr.toBytesSlice() + for _, v := range s { + b = appendVarint(b, wiretag) + b = appendVarint(b, uint64(len(v))) + b = append(b, v...) + } + return b, nil +} + +// makeGroupMarshaler returns the sizer and marshaler for a group. +// u is the marshal info of the underlying message. +func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + return u.size(p) + 2*tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + var err error + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, p, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + return b, err + } +} + +// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. +// u is the marshal info of the underlying message. +func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + n += u.size(v) + 2*tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) // start group + b, err = u.marshal(b, v, deterministic) + b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMessageMarshaler returns the sizer and marshaler for a message field. +// u is the marshal info of the message. +func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.size(p) + return siz + SizeVarint(uint64(siz)) + tagsize + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + p := ptr.getPointer() + if p.isNil() { + return b, nil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(p) + b = appendVarint(b, uint64(siz)) + return u.marshal(b, p, deterministic) + } +} + +// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. +// u is the marshal info of the message. +func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { + return func(ptr pointer, tagsize int) int { + s := ptr.getPointerSlice() + n := 0 + for _, v := range s { + if v.isNil() { + continue + } + siz := u.size(v) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { + s := ptr.getPointerSlice() + var err error + var nerr nonFatal + for _, v := range s { + if v.isNil() { + return b, errRepeatedHasNil + } + b = appendVarint(b, wiretag) + siz := u.cachedsize(v) + b = appendVarint(b, uint64(siz)) + b, err = u.marshal(b, v, deterministic) + + if !nerr.Merge(err) { + if err == ErrNil { + err = errRepeatedHasNil + } + return b, err + } + } + return b, nerr.E + } +} + +// makeMapMarshaler returns the sizer and marshaler for a map field. +// f is the pointer to the reflect data structure of the field. +func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { + // figure out key and value type + t := f.Type + keyType := t.Key() + valType := t.Elem() + keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") + valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") + keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map + valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map + keyWireTag := 1<<3 | wiretype(keyTags[0]) + valWireTag := 2<<3 | wiretype(valTags[0]) + + // We create an interface to get the addresses of the map key and value. + // If value is pointer-typed, the interface is a direct interface, the + // idata itself is the value. Otherwise, the idata is the pointer to the + // value. + // Key cannot be pointer-typed. + valIsPtr := valType.Kind() == reflect.Ptr + + // If value is a message with nested maps, calling + // valSizer in marshal may be quadratic. We should use + // cached version in marshal (but not in size). + // If value is not message type, we don't have size cache, + // but it cannot be nested either. Just use valSizer. + valCachedSizer := valSizer + if valIsPtr && valType.Elem().Kind() == reflect.Struct { + u := getMarshalInfo(valType.Elem()) + valCachedSizer = func(ptr pointer, tagsize int) int { + // Same as message sizer, but use cache. + p := ptr.getPointer() + if p.isNil() { + return 0 + } + siz := u.cachedsize(p) + return siz + SizeVarint(uint64(siz)) + tagsize + } + } + return func(ptr pointer, tagsize int) int { + m := ptr.asPointerTo(t).Elem() // the map + n := 0 + for _, k := range m.MapKeys() { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + n += siz + SizeVarint(uint64(siz)) + tagsize + } + return n + }, + func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { + m := ptr.asPointerTo(t).Elem() // the map + var err error + keys := m.MapKeys() + if len(keys) > 1 && deterministic { + sort.Sort(mapKeys(keys)) + } + + var nerr nonFatal + for _, k := range keys { + ki := k.Interface() + vi := m.MapIndex(k).Interface() + kaddr := toAddrPointer(&ki, false) // pointer to key + vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value + b = appendVarint(b, tag) + siz := keySizer(kaddr, 1) + valCachedSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) + b = appendVarint(b, uint64(siz)) + b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) + if !nerr.Merge(err) { + return b, err + } + b, err = valMarshaler(b, vaddr, valWireTag, deterministic) + if err != ErrNil && !nerr.Merge(err) { // allow nil value in map + return b, err + } + } + return b, nerr.E + } +} + +// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. +// fi is the marshal info of the field. +// f is the pointer to the reflect data structure of the field. +func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { + // Oneof field is an interface. We need to get the actual data type on the fly. + t := f.Type + return func(ptr pointer, _ int) int { + p := ptr.getInterfacePointer() + if p.isNil() { + return 0 + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + e := fi.oneofElems[telem] + return e.sizer(p, e.tagsize) + }, + func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { + p := ptr.getInterfacePointer() + if p.isNil() { + return b, nil + } + v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct + telem := v.Type() + if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { + return b, errOneofHasNil + } + e := fi.oneofElems[telem] + return e.marshaler(b, p, e.wiretag, deterministic) + } +} + +// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. +func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + mu.Unlock() + return n +} + +// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. +func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + // Not sure this is required, but the old code does it. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// message set format is: +// message MessageSet { +// repeated group Item = 1 { +// required int32 type_id = 2; +// required string message = 3; +// }; +// } + +// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field +// in message set format (above). +func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { + m, mu := ext.extensionsRead() + if m == nil { + return 0 + } + mu.Lock() + + n := 0 + for id, e := range m { + n += 2 // start group, end group. tag = 1 (size=1) + n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + siz := len(msgWithLen) + n += siz + 1 // message, tag = 3 (size=1) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, 1) // message, tag = 3 (size=1) + } + mu.Unlock() + return n +} + +// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) +// to the end of byte slice b. +func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { + m, mu := ext.extensionsRead() + if m == nil { + return b, nil + } + mu.Lock() + defer mu.Unlock() + + var err error + var nerr nonFatal + + // Fast-path for common cases: zero or one extensions. + // Don't bother sorting the keys. + if len(m) <= 1 { + for id, e := range m { + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + if !nerr.Merge(err) { + return b, err + } + b = append(b, 1<<3|WireEndGroup) + } + return b, nerr.E + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + for _, id := range keys { + e := m[int32(id)] + b = append(b, 1<<3|WireStartGroup) + b = append(b, 2<<3|WireVarint) + b = appendVarint(b, uint64(id)) + + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint + b = append(b, 3<<3|WireBytes) + b = append(b, msgWithLen...) + b = append(b, 1<<3|WireEndGroup) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) + b = append(b, 1<<3|WireEndGroup) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// sizeV1Extensions computes the size of encoded data for a V1-API extension field. +func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { + if m == nil { + return 0 + } + + n := 0 + for _, e := range m { + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + n += len(e.enc) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + n += ei.sizer(p, ei.tagsize) + } + return n +} + +// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. +func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { + if m == nil { + return b, nil + } + + // Sort the keys to provide a deterministic encoding. + keys := make([]int, 0, len(m)) + for k := range m { + keys = append(keys, int(k)) + } + sort.Ints(keys) + + var err error + var nerr nonFatal + for _, k := range keys { + e := m[int32(k)] + if e.value == nil || e.desc == nil { + // Extension is only in its encoded form. + b = append(b, e.enc...) + continue + } + + // We don't skip extensions that have an encoded form set, + // because the extension value may have been mutated after + // the last time this function was called. + + ei := u.getExtElemInfo(e.desc) + v := e.value + p := toAddrPointer(&v, ei.isptr) + b, err = ei.marshaler(b, p, ei.wiretag, deterministic) + if !nerr.Merge(err) { + return b, err + } + } + return b, nerr.E +} + +// newMarshaler is the interface representing objects that can marshal themselves. +// +// This exists to support protoc-gen-go generated messages. +// The proto package will stop type-asserting to this interface in the future. +// +// DO NOT DEPEND ON THIS. +type newMarshaler interface { + XXX_Size() int + XXX_Marshal(b []byte, deterministic bool) ([]byte, error) +} + +// Size returns the encoded size of a protocol buffer message. +// This is the main entry point. +func Size(pb Message) int { + if m, ok := pb.(newMarshaler); ok { + return m.XXX_Size() + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, _ := m.Marshal() + return len(b) + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return 0 + } + var info InternalMessageInfo + return info.Size(pb) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, returning the data. +// This is the main entry point. +func Marshal(pb Message) ([]byte, error) { + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + b := make([]byte, 0, siz) + return m.XXX_Marshal(b, false) + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + return m.Marshal() + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return nil, ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + b := make([]byte, 0, siz) + return info.Marshal(b, pb, false) +} + +// Marshal takes a protocol buffer message +// and encodes it into the wire format, writing the result to the +// Buffer. +// This is an alternative entry point. It is not necessary to use +// a Buffer for most applications. +func (p *Buffer) Marshal(pb Message) error { + var err error + if m, ok := pb.(newMarshaler); ok { + siz := m.XXX_Size() + p.grow(siz) // make sure buf has enough capacity + p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) + return err + } + if m, ok := pb.(Marshaler); ok { + // If the message can marshal itself, let it do it, for compatibility. + // NOTE: This is not efficient. + b, err := m.Marshal() + p.buf = append(p.buf, b...) + return err + } + // in case somehow we didn't generate the wrapper + if pb == nil { + return ErrNil + } + var info InternalMessageInfo + siz := info.Size(pb) + p.grow(siz) // make sure buf has enough capacity + p.buf, err = info.Marshal(p.buf, pb, p.deterministic) + return err +} + +// grow grows the buffer's capacity, if necessary, to guarantee space for +// another n bytes. After grow(n), at least n bytes can be written to the +// buffer without another allocation. +func (p *Buffer) grow(n int) { + need := len(p.buf) + n + if need <= cap(p.buf) { + return + } + newCap := len(p.buf) * 2 + if newCap < need { + newCap = need + } + p.buf = append(make([]byte, 0, newCap), p.buf...) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go new file mode 100644 index 000000000000..5525def6a5da --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_merge.go @@ -0,0 +1,654 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "fmt" + "reflect" + "strings" + "sync" + "sync/atomic" +) + +// Merge merges the src message into dst. +// This assumes that dst and src of the same type and are non-nil. +func (a *InternalMessageInfo) Merge(dst, src Message) { + mi := atomicLoadMergeInfo(&a.merge) + if mi == nil { + mi = getMergeInfo(reflect.TypeOf(dst).Elem()) + atomicStoreMergeInfo(&a.merge, mi) + } + mi.merge(toPointer(&dst), toPointer(&src)) +} + +type mergeInfo struct { + typ reflect.Type + + initialized int32 // 0: only typ is valid, 1: everything is valid + lock sync.Mutex + + fields []mergeFieldInfo + unrecognized field // Offset of XXX_unrecognized +} + +type mergeFieldInfo struct { + field field // Offset of field, guaranteed to be valid + + // isPointer reports whether the value in the field is a pointer. + // This is true for the following situations: + // * Pointer to struct + // * Pointer to basic type (proto2 only) + // * Slice (first value in slice header is a pointer) + // * String (first value in string header is a pointer) + isPointer bool + + // basicWidth reports the width of the field assuming that it is directly + // embedded in the struct (as is the case for basic types in proto3). + // The possible values are: + // 0: invalid + // 1: bool + // 4: int32, uint32, float32 + // 8: int64, uint64, float64 + basicWidth int + + // Where dst and src are pointers to the types being merged. + merge func(dst, src pointer) +} + +var ( + mergeInfoMap = map[reflect.Type]*mergeInfo{} + mergeInfoLock sync.Mutex +) + +func getMergeInfo(t reflect.Type) *mergeInfo { + mergeInfoLock.Lock() + defer mergeInfoLock.Unlock() + mi := mergeInfoMap[t] + if mi == nil { + mi = &mergeInfo{typ: t} + mergeInfoMap[t] = mi + } + return mi +} + +// merge merges src into dst assuming they are both of type *mi.typ. +func (mi *mergeInfo) merge(dst, src pointer) { + if dst.isNil() { + panic("proto: nil destination") + } + if src.isNil() { + return // Nothing to do. + } + + if atomic.LoadInt32(&mi.initialized) == 0 { + mi.computeMergeInfo() + } + + for _, fi := range mi.fields { + sfp := src.offset(fi.field) + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string + continue + } + if fi.basicWidth > 0 { + switch { + case fi.basicWidth == 1 && !*sfp.toBool(): + continue + case fi.basicWidth == 4 && *sfp.toUint32() == 0: + continue + case fi.basicWidth == 8 && *sfp.toUint64() == 0: + continue + } + } + } + + dfp := dst.offset(fi.field) + fi.merge(dfp, sfp) + } + + // TODO: Make this faster? + out := dst.asPointerTo(mi.typ).Elem() + in := src.asPointerTo(mi.typ).Elem() + if emIn, err := extendable(in.Addr().Interface()); err == nil { + emOut, _ := extendable(out.Addr().Interface()) + mIn, muIn := emIn.extensionsRead() + if mIn != nil { + mOut := emOut.extensionsWrite() + muIn.Lock() + mergeExtension(mOut, mIn) + muIn.Unlock() + } + } + + if mi.unrecognized.IsValid() { + if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { + *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) + } + } +} + +func (mi *mergeInfo) computeMergeInfo() { + mi.lock.Lock() + defer mi.lock.Unlock() + if mi.initialized != 0 { + return + } + t := mi.typ + n := t.NumField() + + props := GetProperties(t) + for i := 0; i < n; i++ { + f := t.Field(i) + if strings.HasPrefix(f.Name, "XXX_") { + continue + } + + mfi := mergeFieldInfo{field: toField(&f)} + tf := f.Type + + // As an optimization, we can avoid the merge function call cost + // if we know for sure that the source will have no effect + // by checking if it is the zero value. + if unsafeAllowed { + switch tf.Kind() { + case reflect.Ptr, reflect.Slice, reflect.String: + // As a special case, we assume slices and strings are pointers + // since we know that the first field in the SliceSlice or + // StringHeader is a data pointer. + mfi.isPointer = true + case reflect.Bool: + mfi.basicWidth = 1 + case reflect.Int32, reflect.Uint32, reflect.Float32: + mfi.basicWidth = 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + mfi.basicWidth = 8 + } + } + + // Unwrap tf to get at its most basic type. + var isPointer, isSlice bool + if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { + isSlice = true + tf = tf.Elem() + } + if tf.Kind() == reflect.Ptr { + isPointer = true + tf = tf.Elem() + } + if isPointer && isSlice && tf.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + tf.Name()) + } + + switch tf.Kind() { + case reflect.Int32: + switch { + case isSlice: // E.g., []int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Slice is not defined (see pointer_reflect.go). + /* + sfsp := src.toInt32Slice() + if *sfsp != nil { + dfsp := dst.toInt32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + */ + sfs := src.getInt32Slice() + if sfs != nil { + dfs := dst.getInt32Slice() + dfs = append(dfs, sfs...) + if dfs == nil { + dfs = []int32{} + } + dst.setInt32Slice(dfs) + } + } + case isPointer: // E.g., *int32 + mfi.merge = func(dst, src pointer) { + // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). + /* + sfpp := src.toInt32Ptr() + if *sfpp != nil { + dfpp := dst.toInt32Ptr() + if *dfpp == nil { + *dfpp = Int32(**sfpp) + } else { + **dfpp = **sfpp + } + } + */ + sfp := src.getInt32Ptr() + if sfp != nil { + dfp := dst.getInt32Ptr() + if dfp == nil { + dst.setInt32Ptr(*sfp) + } else { + *dfp = *sfp + } + } + } + default: // E.g., int32 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt32(); v != 0 { + *dst.toInt32() = v + } + } + } + case reflect.Int64: + switch { + case isSlice: // E.g., []int64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toInt64Slice() + if *sfsp != nil { + dfsp := dst.toInt64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []int64{} + } + } + } + case isPointer: // E.g., *int64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toInt64Ptr() + if *sfpp != nil { + dfpp := dst.toInt64Ptr() + if *dfpp == nil { + *dfpp = Int64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., int64 + mfi.merge = func(dst, src pointer) { + if v := *src.toInt64(); v != 0 { + *dst.toInt64() = v + } + } + } + case reflect.Uint32: + switch { + case isSlice: // E.g., []uint32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint32Slice() + if *sfsp != nil { + dfsp := dst.toUint32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint32{} + } + } + } + case isPointer: // E.g., *uint32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint32Ptr() + if *sfpp != nil { + dfpp := dst.toUint32Ptr() + if *dfpp == nil { + *dfpp = Uint32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint32 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint32(); v != 0 { + *dst.toUint32() = v + } + } + } + case reflect.Uint64: + switch { + case isSlice: // E.g., []uint64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toUint64Slice() + if *sfsp != nil { + dfsp := dst.toUint64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []uint64{} + } + } + } + case isPointer: // E.g., *uint64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toUint64Ptr() + if *sfpp != nil { + dfpp := dst.toUint64Ptr() + if *dfpp == nil { + *dfpp = Uint64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., uint64 + mfi.merge = func(dst, src pointer) { + if v := *src.toUint64(); v != 0 { + *dst.toUint64() = v + } + } + } + case reflect.Float32: + switch { + case isSlice: // E.g., []float32 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat32Slice() + if *sfsp != nil { + dfsp := dst.toFloat32Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float32{} + } + } + } + case isPointer: // E.g., *float32 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat32Ptr() + if *sfpp != nil { + dfpp := dst.toFloat32Ptr() + if *dfpp == nil { + *dfpp = Float32(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float32 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat32(); v != 0 { + *dst.toFloat32() = v + } + } + } + case reflect.Float64: + switch { + case isSlice: // E.g., []float64 + mfi.merge = func(dst, src pointer) { + sfsp := src.toFloat64Slice() + if *sfsp != nil { + dfsp := dst.toFloat64Slice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []float64{} + } + } + } + case isPointer: // E.g., *float64 + mfi.merge = func(dst, src pointer) { + sfpp := src.toFloat64Ptr() + if *sfpp != nil { + dfpp := dst.toFloat64Ptr() + if *dfpp == nil { + *dfpp = Float64(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., float64 + mfi.merge = func(dst, src pointer) { + if v := *src.toFloat64(); v != 0 { + *dst.toFloat64() = v + } + } + } + case reflect.Bool: + switch { + case isSlice: // E.g., []bool + mfi.merge = func(dst, src pointer) { + sfsp := src.toBoolSlice() + if *sfsp != nil { + dfsp := dst.toBoolSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []bool{} + } + } + } + case isPointer: // E.g., *bool + mfi.merge = func(dst, src pointer) { + sfpp := src.toBoolPtr() + if *sfpp != nil { + dfpp := dst.toBoolPtr() + if *dfpp == nil { + *dfpp = Bool(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., bool + mfi.merge = func(dst, src pointer) { + if v := *src.toBool(); v { + *dst.toBool() = v + } + } + } + case reflect.String: + switch { + case isSlice: // E.g., []string + mfi.merge = func(dst, src pointer) { + sfsp := src.toStringSlice() + if *sfsp != nil { + dfsp := dst.toStringSlice() + *dfsp = append(*dfsp, *sfsp...) + if *dfsp == nil { + *dfsp = []string{} + } + } + } + case isPointer: // E.g., *string + mfi.merge = func(dst, src pointer) { + sfpp := src.toStringPtr() + if *sfpp != nil { + dfpp := dst.toStringPtr() + if *dfpp == nil { + *dfpp = String(**sfpp) + } else { + **dfpp = **sfpp + } + } + } + default: // E.g., string + mfi.merge = func(dst, src pointer) { + if v := *src.toString(); v != "" { + *dst.toString() = v + } + } + } + case reflect.Slice: + isProto3 := props.Prop[i].proto3 + switch { + case isPointer: + panic("bad pointer in byte slice case in " + tf.Name()) + case tf.Elem().Kind() != reflect.Uint8: + panic("bad element kind in byte slice case in " + tf.Name()) + case isSlice: // E.g., [][]byte + mfi.merge = func(dst, src pointer) { + sbsp := src.toBytesSlice() + if *sbsp != nil { + dbsp := dst.toBytesSlice() + for _, sb := range *sbsp { + if sb == nil { + *dbsp = append(*dbsp, nil) + } else { + *dbsp = append(*dbsp, append([]byte{}, sb...)) + } + } + if *dbsp == nil { + *dbsp = [][]byte{} + } + } + } + default: // E.g., []byte + mfi.merge = func(dst, src pointer) { + sbp := src.toBytes() + if *sbp != nil { + dbp := dst.toBytes() + if !isProto3 || len(*sbp) > 0 { + *dbp = append([]byte{}, *sbp...) + } + } + } + } + case reflect.Struct: + switch { + case !isPointer: + panic(fmt.Sprintf("message field %s without pointer", tf)) + case isSlice: // E.g., []*pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sps := src.getPointerSlice() + if sps != nil { + dps := dst.getPointerSlice() + for _, sp := range sps { + var dp pointer + if !sp.isNil() { + dp = valToPointer(reflect.New(tf)) + mi.merge(dp, sp) + } + dps = append(dps, dp) + } + if dps == nil { + dps = []pointer{} + } + dst.setPointerSlice(dps) + } + } + default: // E.g., *pb.T + mi := getMergeInfo(tf) + mfi.merge = func(dst, src pointer) { + sp := src.getPointer() + if !sp.isNil() { + dp := dst.getPointer() + if dp.isNil() { + dp = valToPointer(reflect.New(tf)) + dst.setPointer(dp) + } + mi.merge(dp, sp) + } + } + } + case reflect.Map: + switch { + case isPointer || isSlice: + panic("bad pointer or slice in map case in " + tf.Name()) + default: // E.g., map[K]V + mfi.merge = func(dst, src pointer) { + sm := src.asPointerTo(tf).Elem() + if sm.Len() == 0 { + return + } + dm := dst.asPointerTo(tf).Elem() + if dm.IsNil() { + dm.Set(reflect.MakeMap(tf)) + } + + switch tf.Elem().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(Clone(val.Interface().(Message))) + dm.SetMapIndex(key, val) + } + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) + dm.SetMapIndex(key, val) + } + default: // Basic type (e.g., string) + for _, key := range sm.MapKeys() { + val := sm.MapIndex(key) + dm.SetMapIndex(key, val) + } + } + } + } + case reflect.Interface: + // Must be oneof field. + switch { + case isPointer || isSlice: + panic("bad pointer or slice in interface case in " + tf.Name()) + default: // E.g., interface{} + // TODO: Make this faster? + mfi.merge = func(dst, src pointer) { + su := src.asPointerTo(tf).Elem() + if !su.IsNil() { + du := dst.asPointerTo(tf).Elem() + typ := su.Elem().Type() + if du.IsNil() || du.Elem().Type() != typ { + du.Set(reflect.New(typ.Elem())) // Initialize interface if empty + } + sv := su.Elem().Elem().Field(0) + if sv.Kind() == reflect.Ptr && sv.IsNil() { + return + } + dv := du.Elem().Elem().Field(0) + if dv.Kind() == reflect.Ptr && dv.IsNil() { + dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty + } + switch sv.Type().Kind() { + case reflect.Ptr: // Proto struct (e.g., *T) + Merge(dv.Interface().(Message), sv.Interface().(Message)) + case reflect.Slice: // E.g. Bytes type (e.g., []byte) + dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) + default: // Basic type (e.g., string) + dv.Set(sv) + } + } + } + } + default: + panic(fmt.Sprintf("merger not found for type:%s", tf)) + } + mi.fields = append(mi.fields, mfi) + } + + mi.unrecognized = invalidField + if f, ok := t.FieldByName("XXX_unrecognized"); ok { + if f.Type != reflect.TypeOf([]byte{}) { + panic("expected XXX_unrecognized to be of type []byte") + } + mi.unrecognized = toField(&f) + } + + atomic.StoreInt32(&mi.initialized, 1) +} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go new file mode 100644 index 000000000000..ebf1caa56a26 --- /dev/null +++ b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go @@ -0,0 +1,2051 @@ +// Go support for Protocol Buffers - Google's data interchange format +// +// Copyright 2016 The Go Authors. All rights reserved. +// https://github.com/golang/protobuf +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package proto + +import ( + "errors" + "fmt" + "io" + "math" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "unicode/utf8" +) + +// Unmarshal is the entry point from the generated .pb.go files. +// This function is not intended to be used by non-generated code. +// This function is not subject to any compatibility guarantee. +// msg contains a pointer to a protocol buffer struct. +// b is the data to be unmarshaled into the protocol buffer. +// a is a pointer to a place to store cached unmarshal information. +func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { + // Load the unmarshal information for this message type. + // The atomic load ensures memory consistency. + u := atomicLoadUnmarshalInfo(&a.unmarshal) + if u == nil { + // Slow path: find unmarshal info for msg, update a with it. + u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) + atomicStoreUnmarshalInfo(&a.unmarshal, u) + } + // Then do the unmarshaling. + err := u.unmarshal(toPointer(&msg), b) + return err +} + +type unmarshalInfo struct { + typ reflect.Type // type of the protobuf struct + + // 0 = only typ field is initialized + // 1 = completely initialized + initialized int32 + lock sync.Mutex // prevents double initialization + dense []unmarshalFieldInfo // fields indexed by tag # + sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # + reqFields []string // names of required fields + reqMask uint64 // 1< 0 { + // Read tag and wire type. + // Special case 1 and 2 byte varints. + var x uint64 + if b[0] < 128 { + x = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + x = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + x, n = decodeVarint(b) + if n == 0 { + return io.ErrUnexpectedEOF + } + b = b[n:] + } + tag := x >> 3 + wire := int(x) & 7 + + // Dispatch on the tag to one of the unmarshal* functions below. + var f unmarshalFieldInfo + if tag < uint64(len(u.dense)) { + f = u.dense[tag] + } else { + f = u.sparse[tag] + } + if fn := f.unmarshal; fn != nil { + var err error + b, err = fn(b, m.offset(f.field), wire) + if err == nil { + reqMask |= f.reqMask + continue + } + if r, ok := err.(*RequiredNotSetError); ok { + // Remember this error, but keep parsing. We need to produce + // a full parse even if a required field is missing. + if errLater == nil { + errLater = r + } + reqMask |= f.reqMask + continue + } + if err != errInternalBadWireType { + if err == errInvalidUTF8 { + if errLater == nil { + fullName := revProtoTypes[reflect.PtrTo(u.typ)] + "." + f.name + errLater = &invalidUTF8Error{fullName} + } + continue + } + return err + } + // Fragments with bad wire type are treated as unknown fields. + } + + // Unknown tag. + if !u.unrecognized.IsValid() { + // Don't keep unrecognized data; just skip it. + var err error + b, err = skipField(b, wire) + if err != nil { + return err + } + continue + } + // Keep unrecognized data around. + // maybe in extensions, maybe in the unrecognized field. + z := m.offset(u.unrecognized).toBytes() + var emap map[int32]Extension + var e Extension + for _, r := range u.extensionRanges { + if uint64(r.Start) <= tag && tag <= uint64(r.End) { + if u.extensions.IsValid() { + mp := m.offset(u.extensions).toExtensions() + emap = mp.extensionsWrite() + e = emap[int32(tag)] + z = &e.enc + break + } + if u.oldExtensions.IsValid() { + p := m.offset(u.oldExtensions).toOldExtensions() + emap = *p + if emap == nil { + emap = map[int32]Extension{} + *p = emap + } + e = emap[int32(tag)] + z = &e.enc + break + } + panic("no extensions field available") + } + } + + // Use wire type to skip data. + var err error + b0 := b + b, err = skipField(b, wire) + if err != nil { + return err + } + *z = encodeVarint(*z, tag<<3|uint64(wire)) + *z = append(*z, b0[:len(b0)-len(b)]...) + + if emap != nil { + emap[int32(tag)] = e + } + } + if reqMask != u.reqMask && errLater == nil { + // A required field of this message is missing. + for _, n := range u.reqFields { + if reqMask&1 == 0 { + errLater = &RequiredNotSetError{n} + } + reqMask >>= 1 + } + } + return errLater +} + +// computeUnmarshalInfo fills in u with information for use +// in unmarshaling protocol buffers of type u.typ. +func (u *unmarshalInfo) computeUnmarshalInfo() { + u.lock.Lock() + defer u.lock.Unlock() + if u.initialized != 0 { + return + } + t := u.typ + n := t.NumField() + + // Set up the "not found" value for the unrecognized byte buffer. + // This is the default for proto3. + u.unrecognized = invalidField + u.extensions = invalidField + u.oldExtensions = invalidField + + // List of the generated type and offset for each oneof field. + type oneofField struct { + ityp reflect.Type // interface type of oneof field + field field // offset in containing message + } + var oneofFields []oneofField + + for i := 0; i < n; i++ { + f := t.Field(i) + if f.Name == "XXX_unrecognized" { + // The byte slice used to hold unrecognized input is special. + if f.Type != reflect.TypeOf(([]byte)(nil)) { + panic("bad type for XXX_unrecognized field: " + f.Type.Name()) + } + u.unrecognized = toField(&f) + continue + } + if f.Name == "XXX_InternalExtensions" { + // Ditto here. + if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { + panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) + } + u.extensions = toField(&f) + if f.Tag.Get("protobuf_messageset") == "1" { + u.isMessageSet = true + } + continue + } + if f.Name == "XXX_extensions" { + // An older form of the extensions field. + if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { + panic("bad type for XXX_extensions field: " + f.Type.Name()) + } + u.oldExtensions = toField(&f) + continue + } + if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { + continue + } + + oneof := f.Tag.Get("protobuf_oneof") + if oneof != "" { + oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) + // The rest of oneof processing happens below. + continue + } + + tags := f.Tag.Get("protobuf") + tagArray := strings.Split(tags, ",") + if len(tagArray) < 2 { + panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) + } + tag, err := strconv.Atoi(tagArray[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tagArray[1]) + } + + name := "" + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + } + + // Extract unmarshaling function from the field (its type and tags). + unmarshal := fieldUnmarshaler(&f) + + // Required field? + var reqMask uint64 + if tagArray[2] == "req" { + bit := len(u.reqFields) + u.reqFields = append(u.reqFields, name) + reqMask = uint64(1) << uint(bit) + // TODO: if we have more than 64 required fields, we end up + // not verifying that all required fields are present. + // Fix this, perhaps using a count of required fields? + } + + // Store the info in the correct slot in the message. + u.setTag(tag, toField(&f), unmarshal, reqMask, name) + } + + // Find any types associated with oneof fields. + // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? + fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") + if fn.IsValid() { + res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} + for i := res.Len() - 1; i >= 0; i-- { + v := res.Index(i) // interface{} + tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X + typ := tptr.Elem() // Msg_X + + f := typ.Field(0) // oneof implementers have one field + baseUnmarshal := fieldUnmarshaler(&f) + tags := strings.Split(f.Tag.Get("protobuf"), ",") + fieldNum, err := strconv.Atoi(tags[1]) + if err != nil { + panic("protobuf tag field not an integer: " + tags[1]) + } + var name string + for _, tag := range tags { + if strings.HasPrefix(tag, "name=") { + name = strings.TrimPrefix(tag, "name=") + break + } + } + + // Find the oneof field that this struct implements. + // Might take O(n^2) to process all of the oneofs, but who cares. + for _, of := range oneofFields { + if tptr.Implements(of.ityp) { + // We have found the corresponding interface for this struct. + // That lets us know where this struct should be stored + // when we encounter it during unmarshaling. + unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) + u.setTag(fieldNum, of.field, unmarshal, 0, name) + } + } + } + } + + // Get extension ranges, if any. + fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") + if fn.IsValid() { + if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { + panic("a message with extensions, but no extensions field in " + t.Name()) + } + u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) + } + + // Explicitly disallow tag 0. This will ensure we flag an error + // when decoding a buffer of all zeros. Without this code, we + // would decode and skip an all-zero buffer of even length. + // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. + u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { + return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) + }, 0, "") + + // Set mask for required field check. + u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? + for len(u.dense) <= tag { + u.dense = append(u.dense, unmarshalFieldInfo{}) + } + u.dense[tag] = i + return + } + if u.sparse == nil { + u.sparse = map[uint64]unmarshalFieldInfo{} + } + u.sparse[uint64(tag)] = i +} + +// fieldUnmarshaler returns an unmarshaler for the given field. +func fieldUnmarshaler(f *reflect.StructField) unmarshaler { + if f.Type.Kind() == reflect.Map { + return makeUnmarshalMap(f) + } + return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) +} + +// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. +func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { + tagArray := strings.Split(tags, ",") + encoding := tagArray[0] + name := "unknown" + proto3 := false + validateUTF8 := true + for _, tag := range tagArray[3:] { + if strings.HasPrefix(tag, "name=") { + name = tag[5:] + } + if tag == "proto3" { + proto3 = true + } + } + validateUTF8 = validateUTF8 && proto3 + + // Figure out packaging (pointer, slice, or both) + slice := false + pointer := false + if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { + slice = true + t = t.Elem() + } + if t.Kind() == reflect.Ptr { + pointer = true + t = t.Elem() + } + + // We'll never have both pointer and slice for basic types. + if pointer && slice && t.Kind() != reflect.Struct { + panic("both pointer and slice for basic type in " + t.Name()) + } + + switch t.Kind() { + case reflect.Bool: + if pointer { + return unmarshalBoolPtr + } + if slice { + return unmarshalBoolSlice + } + return unmarshalBoolValue + case reflect.Int32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixedS32Ptr + } + if slice { + return unmarshalFixedS32Slice + } + return unmarshalFixedS32Value + case "varint": + // this could be int32 or enum + if pointer { + return unmarshalInt32Ptr + } + if slice { + return unmarshalInt32Slice + } + return unmarshalInt32Value + case "zigzag32": + if pointer { + return unmarshalSint32Ptr + } + if slice { + return unmarshalSint32Slice + } + return unmarshalSint32Value + } + case reflect.Int64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixedS64Ptr + } + if slice { + return unmarshalFixedS64Slice + } + return unmarshalFixedS64Value + case "varint": + if pointer { + return unmarshalInt64Ptr + } + if slice { + return unmarshalInt64Slice + } + return unmarshalInt64Value + case "zigzag64": + if pointer { + return unmarshalSint64Ptr + } + if slice { + return unmarshalSint64Slice + } + return unmarshalSint64Value + } + case reflect.Uint32: + switch encoding { + case "fixed32": + if pointer { + return unmarshalFixed32Ptr + } + if slice { + return unmarshalFixed32Slice + } + return unmarshalFixed32Value + case "varint": + if pointer { + return unmarshalUint32Ptr + } + if slice { + return unmarshalUint32Slice + } + return unmarshalUint32Value + } + case reflect.Uint64: + switch encoding { + case "fixed64": + if pointer { + return unmarshalFixed64Ptr + } + if slice { + return unmarshalFixed64Slice + } + return unmarshalFixed64Value + case "varint": + if pointer { + return unmarshalUint64Ptr + } + if slice { + return unmarshalUint64Slice + } + return unmarshalUint64Value + } + case reflect.Float32: + if pointer { + return unmarshalFloat32Ptr + } + if slice { + return unmarshalFloat32Slice + } + return unmarshalFloat32Value + case reflect.Float64: + if pointer { + return unmarshalFloat64Ptr + } + if slice { + return unmarshalFloat64Slice + } + return unmarshalFloat64Value + case reflect.Map: + panic("map type in typeUnmarshaler in " + t.Name()) + case reflect.Slice: + if pointer { + panic("bad pointer in slice case in " + t.Name()) + } + if slice { + return unmarshalBytesSlice + } + return unmarshalBytesValue + case reflect.String: + if validateUTF8 { + if pointer { + return unmarshalUTF8StringPtr + } + if slice { + return unmarshalUTF8StringSlice + } + return unmarshalUTF8StringValue + } + if pointer { + return unmarshalStringPtr + } + if slice { + return unmarshalStringSlice + } + return unmarshalStringValue + case reflect.Struct: + // message or group field + if !pointer { + panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) + } + switch encoding { + case "bytes": + if slice { + return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) + case "group": + if slice { + return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) + } + return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) + } + } + panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) +} + +// Below are all the unmarshalers for individual fields of various types. + +func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64() = v + return b, nil +} + +func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x) + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64() = v + return b, nil +} + +func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + *f.toInt64Ptr() = &v + return b, nil +} + +func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int64(x>>1) ^ int64(x)<<63>>63 + s := f.toInt64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64() = v + return b, nil +} + +func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + *f.toUint64Ptr() = &v + return b, nil +} + +func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint64(x) + s := f.toUint64Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + *f.toInt32() = v + return b, nil +} + +func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x) + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + *f.toInt32() = v + return b, nil +} + +func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.setInt32Ptr(v) + return b, nil +} + +func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := int32(x>>1) ^ int32(x)<<31>>31 + f.appendInt32Slice(v) + return b, nil +} + +func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32() = v + return b, nil +} + +func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + *f.toUint32Ptr() = &v + return b, nil +} + +func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + v := uint32(x) + s := f.toUint32Slice() + *s = append(*s, v) + return b, nil +} + +func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64() = v + return b[8:], nil +} + +func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + *f.toUint64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 + s := f.toUint64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64() = v + return b[8:], nil +} + +func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + *f.toInt64Ptr() = &v + return b[8:], nil +} + +func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 + s := f.toInt64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32() = v + return b[4:], nil +} + +func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + *f.toUint32Ptr() = &v + return b[4:], nil +} + +func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 + s := f.toUint32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + *f.toInt32() = v + return b[4:], nil +} + +func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.setInt32Ptr(v) + return b[4:], nil +} + +func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 + f.appendInt32Slice(v) + return b[4:], nil +} + +func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + // Note: any length varint is allowed, even though any sane + // encoder will use one byte. + // See https://github.com/golang/protobuf/issues/76 + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + // TODO: check if x>1? Tests seem to indicate no. + v := x != 0 + *f.toBool() = v + return b[n:], nil +} + +func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + *f.toBoolPtr() = &v + return b[n:], nil +} + +func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + x, n = decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + b = b[n:] + } + return res, nil + } + if w != WireVarint { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + v := x != 0 + s := f.toBoolSlice() + *s = append(*s, v) + return b[n:], nil +} + +func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64() = v + return b[8:], nil +} + +func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + *f.toFloat64Ptr() = &v + return b[8:], nil +} + +func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + b = b[8:] + } + return res, nil + } + if w != WireFixed64 { + return b, errInternalBadWireType + } + if len(b) < 8 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) + s := f.toFloat64Slice() + *s = append(*s, v) + return b[8:], nil +} + +func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32() = v + return b[4:], nil +} + +func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + *f.toFloat32Ptr() = &v + return b[4:], nil +} + +func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { + if w == WireBytes { // packed + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + res := b[x:] + b = b[:x] + for len(b) > 0 { + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + b = b[4:] + } + return res, nil + } + if w != WireFixed32 { + return b, errInternalBadWireType + } + if len(b) < 4 { + return nil, io.ErrUnexpectedEOF + } + v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) + s := f.toFloat32Slice() + *s = append(*s, v) + return b[4:], nil +} + +func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + return b[x:], nil +} + +func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + return b[x:], nil +} + +func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + return b[x:], nil +} + +func unmarshalUTF8StringValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toString() = v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringPtr(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + *f.toStringPtr() = &v + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +func unmarshalUTF8StringSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := string(b[:x]) + s := f.toStringSlice() + *s = append(*s, v) + if !utf8.ValidString(v) { + return b[x:], errInvalidUTF8 + } + return b[x:], nil +} + +var emptyBuf [0]byte + +func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // The use of append here is a trick which avoids the zeroing + // that would be required if we used a make/copy pair. + // We append to emptyBuf instead of nil because we want + // a non-nil result even when the length is 0. + v := append(emptyBuf[:], b[:x]...) + *f.toBytes() = v + return b[x:], nil +} + +func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := append(emptyBuf[:], b[:x]...) + s := f.toBytesSlice() + *s = append(*s, v) + return b[x:], nil +} + +func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + // First read the message field to see if something is there. + // The semantics of multiple submessages are weird. Instead of + // the last one winning (as it is for all other fields), multiple + // submessages are merged. + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[x:], err + } +} + +func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireBytes { + return b, errInternalBadWireType + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[x:], err + } +} + +func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := f.getPointer() + if v.isNil() { + v = valToPointer(reflect.New(sub.typ)) + f.setPointer(v) + } + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + return b[y:], err + } +} + +func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { + return func(b []byte, f pointer, w int) ([]byte, error) { + if w != WireStartGroup { + return b, errInternalBadWireType + } + x, y := findEndGroup(b) + if x < 0 { + return nil, io.ErrUnexpectedEOF + } + v := valToPointer(reflect.New(sub.typ)) + err := sub.unmarshal(v, b[:x]) + if err != nil { + if r, ok := err.(*RequiredNotSetError); ok { + r.field = name + "." + r.field + } else { + return nil, err + } + } + f.appendPointer(v) + return b[y:], err + } +} + +func makeUnmarshalMap(f *reflect.StructField) unmarshaler { + t := f.Type + kt := t.Key() + vt := t.Elem() + unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) + unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) + return func(b []byte, f pointer, w int) ([]byte, error) { + // The map entry is a submessage. Figure out how big it is. + if w != WireBytes { + return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) + } + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + b = b[n:] + if x > uint64(len(b)) { + return nil, io.ErrUnexpectedEOF + } + r := b[x:] // unused data to return + b = b[:x] // data for map entry + + // Note: we could use #keys * #values ~= 200 functions + // to do map decoding without reflection. Probably not worth it. + // Maps will be somewhat slow. Oh well. + + // Read key and value from data. + var nerr nonFatal + k := reflect.New(kt) + v := reflect.New(vt) + for len(b) > 0 { + x, n := decodeVarint(b) + if n == 0 { + return nil, io.ErrUnexpectedEOF + } + wire := int(x) & 7 + b = b[n:] + + var err error + switch x >> 3 { + case 1: + b, err = unmarshalKey(b, valToPointer(k), wire) + case 2: + b, err = unmarshalVal(b, valToPointer(v), wire) + default: + err = errInternalBadWireType // skip unknown tag + } + + if nerr.Merge(err) { + continue + } + if err != errInternalBadWireType { + return nil, err + } + + // Skip past unknown fields. + b, err = skipField(b, wire) + if err != nil { + return nil, err + } + } + + // Get map, allocate if needed. + m := f.asPointerTo(t).Elem() // an addressable map[K]T + if m.IsNil() { + m.Set(reflect.MakeMap(t)) + } + + // Insert into map. + m.SetMapIndex(k.Elem(), v.Elem()) + + return r, nerr.E + } +} + +// makeUnmarshalOneof makes an unmarshaler for oneof fields. +// for: +// message Msg { +// oneof F { +// int64 X = 1; +// float64 Y = 2; +// } +// } +// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). +// ityp is the interface type of the oneof field (e.g. isMsg_F). +// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). +// Note that this function will be called once for each case in the oneof. +func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { + sf := typ.Field(0) + field0 := toField(&sf) + return func(b []byte, f pointer, w int) ([]byte, error) { + // Allocate holder for value. + v := reflect.New(typ) + + // Unmarshal data into holder. + // We unmarshal into the first field of the holder object. + var err error + var nerr nonFatal + b, err = unmarshal(b, valToPointer(v).offset(field0), w) + if !nerr.Merge(err) { + return nil, err + } + + // Write pointer to holder into target field. + f.asPointerTo(ityp).Elem().Set(v) + + return b, nerr.E + } +} + +// Error used by decode internally. +var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") + +// skipField skips past a field of type wire and returns the remaining bytes. +func skipField(b []byte, wire int) ([]byte, error) { + switch wire { + case WireVarint: + _, k := decodeVarint(b) + if k == 0 { + return b, io.ErrUnexpectedEOF + } + b = b[k:] + case WireFixed32: + if len(b) < 4 { + return b, io.ErrUnexpectedEOF + } + b = b[4:] + case WireFixed64: + if len(b) < 8 { + return b, io.ErrUnexpectedEOF + } + b = b[8:] + case WireBytes: + m, k := decodeVarint(b) + if k == 0 || uint64(len(b)-k) < m { + return b, io.ErrUnexpectedEOF + } + b = b[uint64(k)+m:] + case WireStartGroup: + _, i := findEndGroup(b) + if i == -1 { + return b, io.ErrUnexpectedEOF + } + b = b[i:] + default: + return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) + } + return b, nil +} + +// findEndGroup finds the index of the next EndGroup tag. +// Groups may be nested, so the "next" EndGroup tag is the first +// unpaired EndGroup. +// findEndGroup returns the indexes of the start and end of the EndGroup tag. +// Returns (-1,-1) if it can't find one. +func findEndGroup(b []byte) (int, int) { + depth := 1 + i := 0 + for { + x, n := decodeVarint(b[i:]) + if n == 0 { + return -1, -1 + } + j := i + i += n + switch x & 7 { + case WireVarint: + _, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + case WireFixed32: + if len(b)-4 < i { + return -1, -1 + } + i += 4 + case WireFixed64: + if len(b)-8 < i { + return -1, -1 + } + i += 8 + case WireBytes: + m, k := decodeVarint(b[i:]) + if k == 0 { + return -1, -1 + } + i += k + if uint64(len(b)-i) < m { + return -1, -1 + } + i += int(m) + case WireStartGroup: + depth++ + case WireEndGroup: + depth-- + if depth == 0 { + return j, i + } + default: + return -1, -1 + } + } +} + +// encodeVarint appends a varint-encoded integer to b and returns the result. +func encodeVarint(b []byte, x uint64) []byte { + for x >= 1<<7 { + b = append(b, byte(x&0x7f|0x80)) + x >>= 7 + } + return append(b, byte(x)) +} + +// decodeVarint reads a varint-encoded integer from b. +// Returns the decoded integer and the number of bytes read. +// If there is an error, it returns 0,0. +func decodeVarint(b []byte) (uint64, int) { + var x, y uint64 + if len(b) <= 0 { + goto bad + } + x = uint64(b[0]) + if x < 0x80 { + return x, 1 + } + x -= 0x80 + + if len(b) <= 1 { + goto bad + } + y = uint64(b[1]) + x += y << 7 + if y < 0x80 { + return x, 2 + } + x -= 0x80 << 7 + + if len(b) <= 2 { + goto bad + } + y = uint64(b[2]) + x += y << 14 + if y < 0x80 { + return x, 3 + } + x -= 0x80 << 14 + + if len(b) <= 3 { + goto bad + } + y = uint64(b[3]) + x += y << 21 + if y < 0x80 { + return x, 4 + } + x -= 0x80 << 21 + + if len(b) <= 4 { + goto bad + } + y = uint64(b[4]) + x += y << 28 + if y < 0x80 { + return x, 5 + } + x -= 0x80 << 28 + + if len(b) <= 5 { + goto bad + } + y = uint64(b[5]) + x += y << 35 + if y < 0x80 { + return x, 6 + } + x -= 0x80 << 35 + + if len(b) <= 6 { + goto bad + } + y = uint64(b[6]) + x += y << 42 + if y < 0x80 { + return x, 7 + } + x -= 0x80 << 42 + + if len(b) <= 7 { + goto bad + } + y = uint64(b[7]) + x += y << 49 + if y < 0x80 { + return x, 8 + } + x -= 0x80 << 49 + + if len(b) <= 8 { + goto bad + } + y = uint64(b[8]) + x += y << 56 + if y < 0x80 { + return x, 9 + } + x -= 0x80 << 56 + + if len(b) <= 9 { + goto bad + } + y = uint64(b[9]) + x += y << 63 + if y < 2 { + return x, 10 + } + +bad: + return 0, 0 +} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go index 37c953570d34..1aaee725b45b 100644 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ b/vendor/github.com/golang/protobuf/proto/text.go @@ -50,7 +50,6 @@ import ( var ( newline = []byte("\n") spaces = []byte(" ") - gtNewline = []byte(">\n") endBraceNewline = []byte("}\n") backslashN = []byte{'\\', 'n'} backslashR = []byte{'\\', 'r'} @@ -154,7 +153,7 @@ func (w *textWriter) indent() { w.ind++ } func (w *textWriter) unindent() { if w.ind == 0 { - log.Printf("proto: textWriter unindented too far") + log.Print("proto: textWriter unindented too far") return } w.ind-- @@ -170,11 +169,6 @@ func writeName(w *textWriter, props *Properties) error { return nil } -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - func requiresQuotes(u string) bool { // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. for _, ch := range u { @@ -269,6 +263,10 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { props := sprops.Prop[i] name := st.Field(i).Name + if name == "XXX_NoUnkeyedLiteral" { + continue + } + if strings.HasPrefix(name, "XXX_") { // There are two XXX_ fields: // XXX_unrecognized []byte @@ -355,7 +353,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { + if err := tm.writeAny(w, key, props.MapKeyProp); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -372,7 +370,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { + if err := tm.writeAny(w, val, props.MapValProp); err != nil { return err } if err := w.WriteByte('\n'); err != nil { @@ -436,12 +434,6 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return err } } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } // Enums have a String method, so writeAny will work fine. if err := tm.writeAny(w, fv, props); err != nil { @@ -455,7 +447,7 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { // Extensions (the XXX_extensions field). pv := sv.Addr() - if pv.Type().Implements(extendableProtoType) { + if _, err := extendable(pv.Interface()); err == nil { if err := tm.writeExtensions(w, pv); err != nil { return err } @@ -464,27 +456,6 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { return nil } -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - // writeAny writes an arbitrary field. func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { v = reflect.Indirect(v) @@ -513,7 +484,7 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert switch v.Kind() { case reflect.Slice: // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Interface().([]byte))); err != nil { + if err := writeString(w, string(v.Bytes())); err != nil { return err } case reflect.String: @@ -535,6 +506,19 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert } } w.indent() + if v.CanAddr() { + // Calling v.Interface on a struct causes the reflect package to + // copy the entire struct. This is racy with the new Marshaler + // since we atomically update the XXX_sizecache. + // + // Thus, we retrieve a pointer to the struct if possible to avoid + // a race since v.Interface on the pointer doesn't copy the struct. + // + // If v is not addressable, then we are not worried about a race + // since it implies that the binary Marshaler cannot possibly be + // mutating this value. + v = v.Addr() + } if etm, ok := v.Interface().(encoding.TextMarshaler); ok { text, err := etm.MarshalText() if err != nil { @@ -543,8 +527,13 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert if _, err = w.Write(text); err != nil { return err } - } else if err := tm.writeStruct(w, v); err != nil { - return err + } else { + if v.Kind() == reflect.Ptr { + v = v.Elem() + } + if err := tm.writeStruct(w, v); err != nil { + return err + } } w.unindent() if err := w.WriteByte(ket); err != nil { @@ -689,17 +678,22 @@ func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // pv is assumed to be a pointer to a protocol message struct that is extendable. func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { emap := extensionMaps[pv.Type().Elem()] - ep := pv.Interface().(extendableProto) + ep, _ := extendable(pv.Interface()) // Order the extensions by ID. // This isn't strictly necessary, but it will give us // canonical output, which will also make testing easier. - m := ep.ExtensionMap() + m, mu := ep.extensionsRead() + if m == nil { + return nil + } + mu.Lock() ids := make([]int32, 0, len(m)) for id := range m { ids = append(ids, id) } sort.Sort(int32Slice(ids)) + mu.Unlock() for _, extNum := range ids { ext := m[extNum] diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go index b5e1c8e1f465..bb55a3af2769 100644 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ b/vendor/github.com/golang/protobuf/proto/text_parser.go @@ -44,6 +44,9 @@ import ( "unicode/utf8" ) +// Error string emitted when deserializing Any and fields are already set +const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" + type ParseError struct { Message string Line int // 1-based line number @@ -203,7 +206,6 @@ func (p *textParser) advance() { var ( errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") ) func unquoteC(s string, quote rune) (string, error) { @@ -274,60 +276,47 @@ func unescape(s string) (ch string, tail string, err error) { return "?", s, nil // trigraph workaround case '\'', '"', '\\': return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': + case '0', '1', '2', '3', '4', '5', '6', '7': if len(s) < 2 { return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) } - base := 8 - ss := s[:2] + ss := string(r) + s[:2] s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) + i, err := strconv.ParseUint(ss, 8, 8) if err != nil { - return "", "", err + return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) } return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { + case 'x', 'X', 'u', 'U': + var n int + switch r { + case 'x', 'X': + n = 2 + case 'u': + n = 4 + case 'U': n = 8 } if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b + return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) } + ss := s[:n] s = s[n:] - return string(bs), s, nil + i, err := strconv.ParseUint(ss, 16, 64) + if err != nil { + return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) + } + if r == 'x' || r == 'X' { + return string([]byte{byte(i)}), s, nil + } + if i > utf8.MaxRune { + return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) + } + return string(i), s, nil } return "", "", fmt.Errorf(`unknown escape \%c`, r) } -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - // Back off the parser by one token. Can only be done between calls to next(). // It makes the next advance() a no-op. func (p *textParser) back() { p.backed = true } @@ -508,8 +497,16 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { if err != nil { return p.errorf("failed to marshal message of type %q: %v", messageName, err) } + if fieldSet["type_url"] { + return p.errorf(anyRepeatedlyUnpacked, "type_url") + } + if fieldSet["value"] { + return p.errorf(anyRepeatedlyUnpacked, "value") + } sv.FieldByName("TypeUrl").SetString(extName) sv.FieldByName("Value").SetBytes(b) + fieldSet["type_url"] = true + fieldSet["value"] = true continue } @@ -550,7 +547,7 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { } reqFieldErr = err } - ep := sv.Addr().Interface().(extendableProto) + ep := sv.Addr().Interface().(Message) if !rep { SetExtension(ep, desc, ext.Interface()) } else { @@ -581,7 +578,11 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { props = oop.Prop nv := reflect.New(oop.Type.Elem()) dst = nv.Elem().Field(0) - sv.Field(oop.Field).Set(nv) + field := sv.Field(oop.Field) + if !field.IsNil() { + return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) + } + field.Set(nv) } if !dst.IsValid() { return p.errorf("unknown field name %q in %v", name, st) @@ -602,8 +603,9 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { // The map entry should be this sequence of tokens: // < key : KEY value : VALUE > - // Technically the "key" and "value" could come in any order, - // but in practice they won't. + // However, implementations may omit key or value, and technically + // we should support them in any order. See b/28924776 for a time + // this went wrong. tok := p.next() var terminator string @@ -615,32 +617,39 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { default: return p.errorf("expected '{' or '<', found %q", tok.value) } - if err := p.consumeToken("key"); err != nil { - return err - } - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - if err := p.consumeToken("value"); err != nil { - return err - } - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - if err := p.consumeToken(terminator); err != nil { - return err + for { + tok := p.next() + if tok.err != nil { + return tok.err + } + if tok.value == terminator { + break + } + switch tok.value { + case "key": + if err := p.consumeToken(":"); err != nil { + return err + } + if err := p.readAny(key, props.MapKeyProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + case "value": + if err := p.checkForColon(props.MapValProp, dst.Type().Elem()); err != nil { + return err + } + if err := p.readAny(val, props.MapValProp); err != nil { + return err + } + if err := p.consumeOptionalSeparator(); err != nil { + return err + } + default: + p.back() + return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) + } } dst.SetMapIndex(key, val) @@ -663,7 +672,8 @@ func (p *textParser) readStruct(sv reflect.Value, terminator string) error { return err } reqFieldErr = err - } else if props.Required { + } + if props.Required { reqCount-- } @@ -704,6 +714,9 @@ func (p *textParser) consumeExtName() (string, error) { if tok.err != nil { return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) } + if p.done && tok.value != "]" { + return "", p.errorf("unclosed type_url or extension name") + } } return strings.Join(parts, ""), nil } @@ -772,12 +785,12 @@ func (p *textParser) readAny(v reflect.Value, props *Properties) error { fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) return p.readAny(fv.Index(fv.Len()-1), props) case reflect.Bool: - // Either "true", "false", 1 or 0. + // true/1/t/True or false/f/0/False. switch tok.value { - case "true", "1": + case "true", "1", "t", "True": fv.SetBool(true) return nil - case "false", "0": + case "false", "0", "f", "False": fv.SetBool(false) return nil } @@ -859,13 +872,9 @@ func (p *textParser) readAny(v reflect.Value, props *Properties) error { // UnmarshalText returns *RequiredNotSetError. func UnmarshalText(s string, pb Message) error { if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err + return um.UnmarshalText([]byte(s)) } pb.Reset() v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil + return newTextParser(s).readStruct(v.Elem(), "") } diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE b/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE new file mode 100644 index 000000000000..8dada3edaf50 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE b/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE new file mode 100644 index 000000000000..5d8cb5b72e73 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE @@ -0,0 +1 @@ +Copyright 2012 Matt T. Proud (matt.proud@gmail.com) diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go new file mode 100644 index 000000000000..258c0636aac8 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go @@ -0,0 +1,75 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/golang/protobuf/proto" +) + +var errInvalidVarint = errors.New("invalid varint32 encountered") + +// ReadDelimited decodes a message from the provided length-delimited stream, +// where the length is encoded as 32-bit varint prefix to the message body. +// It returns the total number of bytes read and any applicable error. This is +// roughly equivalent to the companion Java API's +// MessageLite#parseDelimitedFrom. As per the reader contract, this function +// calls r.Read repeatedly as required until exactly one message including its +// prefix is read and decoded (or an error has occurred). The function never +// reads more bytes from the stream than required. The function never returns +// an error if a message has been read and decoded correctly, even if the end +// of the stream has been reached in doing so. In that case, any subsequent +// calls return (0, io.EOF). +func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { + // Per AbstractParser#parsePartialDelimitedFrom with + // CodedInputStream#readRawVarint32. + var headerBuf [binary.MaxVarintLen32]byte + var bytesRead, varIntBytes int + var messageLength uint64 + for varIntBytes == 0 { // i.e. no varint has been decoded yet. + if bytesRead >= len(headerBuf) { + return bytesRead, errInvalidVarint + } + // We have to read byte by byte here to avoid reading more bytes + // than required. Each read byte is appended to what we have + // read before. + newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) + if newBytesRead == 0 { + if err != nil { + return bytesRead, err + } + // A Reader should not return (0, nil), but if it does, + // it should be treated as no-op (according to the + // Reader contract). So let's go on... + continue + } + bytesRead += newBytesRead + // Now present everything read so far to the varint decoder and + // see if a varint can be decoded already. + messageLength, varIntBytes = proto.DecodeVarint(headerBuf[:bytesRead]) + } + + messageBuf := make([]byte, messageLength) + newBytesRead, err := io.ReadFull(r, messageBuf) + bytesRead += newBytesRead + if err != nil { + return bytesRead, err + } + + return bytesRead, proto.Unmarshal(messageBuf, m) +} diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go new file mode 100644 index 000000000000..c318385cbed0 --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go @@ -0,0 +1,16 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package pbutil provides record length-delimited Protocol Buffer streaming. +package pbutil diff --git a/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go new file mode 100644 index 000000000000..8fb59ad226ff --- /dev/null +++ b/vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go @@ -0,0 +1,46 @@ +// Copyright 2013 Matt T. Proud +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package pbutil + +import ( + "encoding/binary" + "io" + + "github.com/golang/protobuf/proto" +) + +// WriteDelimited encodes and dumps a message to the provided writer prefixed +// with a 32-bit varint indicating the length of the encoded message, producing +// a length-delimited record stream, which can be used to chain together +// encoded messages of the same type together in a file. It returns the total +// number of bytes written and any applicable error. This is roughly +// equivalent to the companion Java API's MessageLite#writeDelimitedTo. +func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { + buffer, err := proto.Marshal(m) + if err != nil { + return 0, err + } + + var buf [binary.MaxVarintLen32]byte + encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) + + sync, err := w.Write(buf[:encodedLength]) + if err != nil { + return sync, err + } + + n, err = w.Write(buffer) + return n + sync, err +} diff --git a/vendor/github.com/prometheus/client_golang/LICENSE b/vendor/github.com/prometheus/client_golang/LICENSE new file mode 100644 index 000000000000..261eeb9e9f8b --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/client_golang/NOTICE b/vendor/github.com/prometheus/client_golang/NOTICE new file mode 100644 index 000000000000..dd878a30ee9a --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/NOTICE @@ -0,0 +1,23 @@ +Prometheus instrumentation library for Go applications +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). + + +The following components are included in this product: + +perks - a fork of https://github.com/bmizerany/perks +https://github.com/beorn7/perks +Copyright 2013-2015 Blake Mizerany, Björn Rabenstein +See https://github.com/beorn7/perks/blob/master/README.md for license details. + +Go support for Protocol Buffers - Google's data interchange format +http://github.com/golang/protobuf/ +Copyright 2010 The Go Authors +See source code for license details. + +Support for streaming Protocol Buffer messages for the Go language (golang). +https://github.com/matttproud/golang_protobuf_extensions +Copyright 2013 Matt T. Proud +Licensed under the Apache License, Version 2.0 diff --git a/vendor/github.com/prometheus/client_golang/prometheus/collector.go b/vendor/github.com/prometheus/client_golang/prometheus/collector.go new file mode 100644 index 000000000000..c0d70b2faf16 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/collector.go @@ -0,0 +1,120 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Collector is the interface implemented by anything that can be used by +// Prometheus to collect metrics. A Collector has to be registered for +// collection. See Registerer.Register. +// +// The stock metrics provided by this package (Gauge, Counter, Summary, +// Histogram, Untyped) are also Collectors (which only ever collect one metric, +// namely itself). An implementer of Collector may, however, collect multiple +// metrics in a coordinated fashion and/or create metrics on the fly. Examples +// for collectors already implemented in this library are the metric vectors +// (i.e. collection of multiple instances of the same Metric but with different +// label values) like GaugeVec or SummaryVec, and the ExpvarCollector. +type Collector interface { + // Describe sends the super-set of all possible descriptors of metrics + // collected by this Collector to the provided channel and returns once + // the last descriptor has been sent. The sent descriptors fulfill the + // consistency and uniqueness requirements described in the Desc + // documentation. + // + // It is valid if one and the same Collector sends duplicate + // descriptors. Those duplicates are simply ignored. However, two + // different Collectors must not send duplicate descriptors. + // + // Sending no descriptor at all marks the Collector as “unchecked”, + // i.e. no checks will be performed at registration time, and the + // Collector may yield any Metric it sees fit in its Collect method. + // + // This method idempotently sends the same descriptors throughout the + // lifetime of the Collector. It may be called concurrently and + // therefore must be implemented in a concurrency safe way. + // + // If a Collector encounters an error while executing this method, it + // must send an invalid descriptor (created with NewInvalidDesc) to + // signal the error to the registry. + Describe(chan<- *Desc) + // Collect is called by the Prometheus registry when collecting + // metrics. The implementation sends each collected metric via the + // provided channel and returns once the last metric has been sent. The + // descriptor of each sent metric is one of those returned by Describe + // (unless the Collector is unchecked, see above). Returned metrics that + // share the same descriptor must differ in their variable label + // values. + // + // This method may be called concurrently and must therefore be + // implemented in a concurrency safe way. Blocking occurs at the expense + // of total performance of rendering all registered metrics. Ideally, + // Collector implementations support concurrent readers. + Collect(chan<- Metric) +} + +// DescribeByCollect is a helper to implement the Describe method of a custom +// Collector. It collects the metrics from the provided Collector and sends +// their descriptors to the provided channel. +// +// If a Collector collects the same metrics throughout its lifetime, its +// Describe method can simply be implemented as: +// +// func (c customCollector) Describe(ch chan<- *Desc) { +// DescribeByCollect(c, ch) +// } +// +// However, this will not work if the metrics collected change dynamically over +// the lifetime of the Collector in a way that their combined set of descriptors +// changes as well. The shortcut implementation will then violate the contract +// of the Describe method. If a Collector sometimes collects no metrics at all +// (for example vectors like CounterVec, GaugeVec, etc., which only collect +// metrics after a metric with a fully specified label set has been accessed), +// it might even get registered as an unchecked Collecter (cf. the Register +// method of the Registerer interface). Hence, only use this shortcut +// implementation of Describe if you are certain to fulfill the contract. +// +// The Collector example demonstrates a use of DescribeByCollect. +func DescribeByCollect(c Collector, descs chan<- *Desc) { + metrics := make(chan Metric) + go func() { + c.Collect(metrics) + close(metrics) + }() + for m := range metrics { + descs <- m.Desc() + } +} + +// selfCollector implements Collector for a single Metric so that the Metric +// collects itself. Add it as an anonymous field to a struct that implements +// Metric, and call init with the Metric itself as an argument. +type selfCollector struct { + self Metric +} + +// init provides the selfCollector with a reference to the metric it is supposed +// to collect. It is usually called within the factory function to create a +// metric. See example. +func (c *selfCollector) init(self Metric) { + c.self = self +} + +// Describe implements Collector. +func (c *selfCollector) Describe(ch chan<- *Desc) { + ch <- c.self.Desc() +} + +// Collect implements Collector. +func (c *selfCollector) Collect(ch chan<- Metric) { + ch <- c.self +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go new file mode 100644 index 000000000000..765e4550c66e --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -0,0 +1,277 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "math" + "sync/atomic" + + dto "github.com/prometheus/client_model/go" +) + +// Counter is a Metric that represents a single numerical value that only ever +// goes up. That implies that it cannot be used to count items whose number can +// also go down, e.g. the number of currently running goroutines. Those +// "counters" are represented by Gauges. +// +// A Counter is typically used to count requests served, tasks completed, errors +// occurred, etc. +// +// To create Counter instances, use NewCounter. +type Counter interface { + Metric + Collector + + // Inc increments the counter by 1. Use Add to increment it by arbitrary + // non-negative values. + Inc() + // Add adds the given value to the counter. It panics if the value is < + // 0. + Add(float64) +} + +// CounterOpts is an alias for Opts. See there for doc comments. +type CounterOpts Opts + +// NewCounter creates a new Counter based on the provided CounterOpts. +// +// The returned implementation tracks the counter value in two separate +// variables, a float64 and a uint64. The latter is used to track calls of the +// Inc method and calls of the Add method with a value that can be represented +// as a uint64. This allows atomic increments of the counter with optimal +// performance. (It is common to have an Inc call in very hot execution paths.) +// Both internal tracking values are added up in the Write method. This has to +// be taken into account when it comes to precision and overflow behavior. +func NewCounter(opts CounterOpts) Counter { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &counter{desc: desc, labelPairs: desc.constLabelPairs} + result.init(result) // Init self-collection. + return result +} + +type counter struct { + // valBits contains the bits of the represented float64 value, while + // valInt stores values that are exact integers. Both have to go first + // in the struct to guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + valInt uint64 + + selfCollector + desc *Desc + + labelPairs []*dto.LabelPair +} + +func (c *counter) Desc() *Desc { + return c.desc +} + +func (c *counter) Add(v float64) { + if v < 0 { + panic(errors.New("counter cannot decrease in value")) + } + ival := uint64(v) + if float64(ival) == v { + atomic.AddUint64(&c.valInt, ival) + return + } + + for { + oldBits := atomic.LoadUint64(&c.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&c.valBits, oldBits, newBits) { + return + } + } +} + +func (c *counter) Inc() { + atomic.AddUint64(&c.valInt, 1) +} + +func (c *counter) Write(out *dto.Metric) error { + fval := math.Float64frombits(atomic.LoadUint64(&c.valBits)) + ival := atomic.LoadUint64(&c.valInt) + val := fval + float64(ival) + + return populateMetric(CounterValue, val, c.labelPairs, out) +} + +// CounterVec is a Collector that bundles a set of Counters that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. number of HTTP requests, partitioned by response code and +// method). Create instances with NewCounterVec. +type CounterVec struct { + *metricVec +} + +// NewCounterVec creates a new CounterVec based on the provided CounterOpts and +// partitioned by the given label names. +func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &CounterVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + if len(lvs) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &counter{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues returns the Counter for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Counter is created. +// +// It is possible to call this method without using the returned Counter to only +// create the new Counter but leave it at its starting value 0. See also the +// SummaryVec example. +// +// Keeping the Counter for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Counter from the CounterVec. In that case, +// the Counter will still exist, but it will not be exported anymore, even if a +// Counter with the same label values is created later. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// GetMetricWith returns the Counter for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Counter is created. Implications of +// creating a Counter without using it and keeping the Counter for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Counter), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (v *CounterVec) WithLabelValues(lvs ...string) Counter { + c, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return c +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) +func (v *CounterVec) With(labels Labels) Counter { + c, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return c +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the CounterVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &CounterVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *CounterVec) MustCurryWith(labels Labels) *CounterVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +// CounterFunc is a Counter whose value is determined at collect time by calling a +// provided function. +// +// To create CounterFunc instances, use NewCounterFunc. +type CounterFunc interface { + Metric + Collector +} + +// NewCounterFunc creates a new CounterFunc based on the provided +// CounterOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a CounterFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. The function should also honor +// the contract for a Counter (values only go up, not down), but compliance will +// not be checked. +func NewCounterFunc(opts CounterOpts, function func() float64) CounterFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), CounterValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go new file mode 100644 index 000000000000..7b8827ffbca9 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -0,0 +1,184 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "sort" + "strings" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// Desc is the descriptor used by every Prometheus Metric. It is essentially +// the immutable meta-data of a Metric. The normal Metric implementations +// included in this package manage their Desc under the hood. Users only have to +// deal with Desc if they use advanced features like the ExpvarCollector or +// custom Collectors and Metrics. +// +// Descriptors registered with the same registry have to fulfill certain +// consistency and uniqueness criteria if they share the same fully-qualified +// name: They must have the same help string and the same label names (aka label +// dimensions) in each, constLabels and variableLabels, but they must differ in +// the values of the constLabels. +// +// Descriptors that share the same fully-qualified names and the same label +// values of their constLabels are considered equal. +// +// Use NewDesc to create new Desc instances. +type Desc struct { + // fqName has been built from Namespace, Subsystem, and Name. + fqName string + // help provides some helpful information about this metric. + help string + // constLabelPairs contains precalculated DTO label pairs based on + // the constant labels. + constLabelPairs []*dto.LabelPair + // VariableLabels contains names of labels for which the metric + // maintains variable values. + variableLabels []string + // id is a hash of the values of the ConstLabels and fqName. This + // must be unique among all registered descriptors and can therefore be + // used as an identifier of the descriptor. + id uint64 + // dimHash is a hash of the label names (preset and variable) and the + // Help string. Each Desc with the same fqName must have the same + // dimHash. + dimHash uint64 + // err is an error that occurred during construction. It is reported on + // registration time. + err error +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName must not be empty. +// +// variableLabels only contain the label names. Their label values are variable +// and therefore not part of the Desc. (They are managed within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Collector example for a usage pattern. +func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + d := &Desc{ + fqName: fqName, + help: help, + variableLabels: variableLabels, + } + if !model.IsValidMetricName(model.LabelValue(fqName)) { + d.err = fmt.Errorf("%q is not a valid metric name", fqName) + return d + } + // labelValues contains the label values of const labels (in order of + // their sorted label names) plus the fqName (at position 0). + labelValues := make([]string, 1, len(constLabels)+1) + labelValues[0] = fqName + labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNameSet := map[string]struct{}{} + // First add only the const label names and sort them... + for labelName := range constLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, labelName) + labelNameSet[labelName] = struct{}{} + } + sort.Strings(labelNames) + // ... so that we can now add const label values in the order of their names. + for _, labelName := range labelNames { + labelValues = append(labelValues, constLabels[labelName]) + } + // Validate the const label values. They can't have a wrong cardinality, so + // use in len(labelValues) as expectedNumberOfValues. + if err := validateLabelValues(labelValues, len(labelValues)); err != nil { + d.err = err + return d + } + // Now add the variable label names, but prefix them with something that + // cannot be in a regular label name. That prevents matching the label + // dimension with a different mix between preset and variable labels. + for _, labelName := range variableLabels { + if !checkLabelName(labelName) { + d.err = fmt.Errorf("%q is not a valid label name", labelName) + return d + } + labelNames = append(labelNames, "$"+labelName) + labelNameSet[labelName] = struct{}{} + } + if len(labelNames) != len(labelNameSet) { + d.err = errors.New("duplicate label names") + return d + } + + vh := hashNew() + for _, val := range labelValues { + vh = hashAdd(vh, val) + vh = hashAddByte(vh, separatorByte) + } + d.id = vh + // Sort labelNames so that order doesn't matter for the hash. + sort.Strings(labelNames) + // Now hash together (in this order) the help string and the sorted + // label names. + lh := hashNew() + lh = hashAdd(lh, help) + lh = hashAddByte(lh, separatorByte) + for _, labelName := range labelNames { + lh = hashAdd(lh, labelName) + lh = hashAddByte(lh, separatorByte) + } + d.dimHash = lh + + d.constLabelPairs = make([]*dto.LabelPair, 0, len(constLabels)) + for n, v := range constLabels { + d.constLabelPairs = append(d.constLabelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(v), + }) + } + sort.Sort(labelPairSorter(d.constLabelPairs)) + return d +} + +// NewInvalidDesc returns an invalid descriptor, i.e. a descriptor with the +// provided error set. If a collector returning such a descriptor is registered, +// registration will fail with the provided error. NewInvalidDesc can be used by +// a Collector to signal inability to describe itself. +func NewInvalidDesc(err error) *Desc { + return &Desc{ + err: err, + } +} + +func (d *Desc) String() string { + lpStrings := make([]string, 0, len(d.constLabelPairs)) + for _, lp := range d.constLabelPairs { + lpStrings = append( + lpStrings, + fmt.Sprintf("%s=%q", lp.GetName(), lp.GetValue()), + ) + } + return fmt.Sprintf( + "Desc{fqName: %q, help: %q, constLabels: {%s}, variableLabels: %v}", + d.fqName, + d.help, + strings.Join(lpStrings, ","), + d.variableLabels, + ) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/doc.go new file mode 100644 index 000000000000..5d9525defc8d --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -0,0 +1,201 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package prometheus is the core instrumentation package. It provides metrics +// primitives to instrument code for monitoring. It also offers a registry for +// metrics. Sub-packages allow to expose the registered metrics via HTTP +// (package promhttp) or push them to a Pushgateway (package push). There is +// also a sub-package promauto, which provides metrics constructors with +// automatic registration. +// +// All exported functions and methods are safe to be used concurrently unless +// specified otherwise. +// +// A Basic Example +// +// As a starting point, a very basic usage example: +// +// package main +// +// import ( +// "log" +// "net/http" +// +// "github.com/prometheus/client_golang/prometheus" +// "github.com/prometheus/client_golang/prometheus/promhttp" +// ) +// +// var ( +// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }) +// hdFailures = prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ) +// ) +// +// func init() { +// // Metrics have to be registered to be exposed: +// prometheus.MustRegister(cpuTemp) +// prometheus.MustRegister(hdFailures) +// } +// +// func main() { +// cpuTemp.Set(65.3) +// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // The Handler function provides a default handler to expose metrics +// // via an HTTP server. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.Handler()) +// log.Fatal(http.ListenAndServe(":8080", nil)) +// } +// +// +// This is a complete program that exports two metrics, a Gauge and a Counter, +// the latter with a label attached to turn it into a (one-dimensional) vector. +// +// Metrics +// +// The number of exported identifiers in this package might appear a bit +// overwhelming. However, in addition to the basic plumbing shown in the example +// above, you only need to understand the different metric types and their +// vector versions for basic usage. Furthermore, if you are not concerned with +// fine-grained control of when and how to register metrics with the registry, +// have a look at the promauto package, which will effectively allow you to +// ignore registration altogether in simple cases. +// +// Above, you have already touched the Counter and the Gauge. There are two more +// advanced metric types: the Summary and Histogram. A more thorough description +// of those four metric types can be found in the Prometheus docs: +// https://prometheus.io/docs/concepts/metric_types/ +// +// A fifth "type" of metric is Untyped. It behaves like a Gauge, but signals the +// Prometheus server not to assume anything about its type. +// +// In addition to the fundamental metric types Gauge, Counter, Summary, +// Histogram, and Untyped, a very important part of the Prometheus data model is +// the partitioning of samples along dimensions called labels, which results in +// metric vectors. The fundamental types are GaugeVec, CounterVec, SummaryVec, +// HistogramVec, and UntypedVec. +// +// While only the fundamental metric types implement the Metric interface, both +// the metrics and their vector versions implement the Collector interface. A +// Collector manages the collection of a number of Metrics, but for convenience, +// a Metric can also “collect itself”. Note that Gauge, Counter, Summary, +// Histogram, and Untyped are interfaces themselves while GaugeVec, CounterVec, +// SummaryVec, HistogramVec, and UntypedVec are not. +// +// To create instances of Metrics and their vector versions, you need a suitable +// …Opts struct, i.e. GaugeOpts, CounterOpts, SummaryOpts, HistogramOpts, or +// UntypedOpts. +// +// Custom Collectors and constant Metrics +// +// While you could create your own implementations of Metric, most likely you +// will only ever implement the Collector interface on your own. At a first +// glance, a custom Collector seems handy to bundle Metrics for common +// registration (with the prime example of the different metric vectors above, +// which bundle all the metrics of the same name but with different labels). +// +// There is a more involved use case, too: If you already have metrics +// available, created outside of the Prometheus context, you don't need the +// interface of the various Metric types. You essentially want to mirror the +// existing numbers into Prometheus Metrics during collection. An own +// implementation of the Collector interface is perfect for that. You can create +// Metric instances “on the fly” using NewConstMetric, NewConstHistogram, and +// NewConstSummary (and their respective Must… versions). That will happen in +// the Collect method. The Describe method has to return separate Desc +// instances, representative of the “throw-away” metrics to be created later. +// NewDesc comes in handy to create those Desc instances. Alternatively, you +// could return no Desc at all, which will marke the Collector “unchecked”. No +// checks are porformed at registration time, but metric consistency will still +// be ensured at scrape time, i.e. any inconsistencies will lead to scrape +// errors. Thus, with unchecked Collectors, the responsibility to not collect +// metrics that lead to inconsistencies in the total scrape result lies with the +// implementer of the Collector. While this is not a desirable state, it is +// sometimes necessary. The typical use case is a situatios where the exact +// metrics to be returned by a Collector cannot be predicted at registration +// time, but the implementer has sufficient knowledge of the whole system to +// guarantee metric consistency. +// +// The Collector example illustrates the use case. You can also look at the +// source code of the processCollector (mirroring process metrics), the +// goCollector (mirroring Go metrics), or the expvarCollector (mirroring expvar +// metrics) as examples that are used in this package itself. +// +// If you just need to call a function to get a single float value to collect as +// a metric, GaugeFunc, CounterFunc, or UntypedFunc might be interesting +// shortcuts. +// +// Advanced Uses of the Registry +// +// While MustRegister is the by far most common way of registering a Collector, +// sometimes you might want to handle the errors the registration might cause. +// As suggested by the name, MustRegister panics if an error occurs. With the +// Register function, the error is returned and can be handled. +// +// An error is returned if the registered Collector is incompatible or +// inconsistent with already registered metrics. The registry aims for +// consistency of the collected metrics according to the Prometheus data model. +// Inconsistencies are ideally detected at registration time, not at collect +// time. The former will usually be detected at start-up time of a program, +// while the latter will only happen at scrape time, possibly not even on the +// first scrape if the inconsistency only becomes relevant later. That is the +// main reason why a Collector and a Metric have to describe themselves to the +// registry. +// +// So far, everything we did operated on the so-called default registry, as it +// can be found in the global DefaultRegisterer variable. With NewRegistry, you +// can create a custom registry, or you can even implement the Registerer or +// Gatherer interfaces yourself. The methods Register and Unregister work in the +// same way on a custom registry as the global functions Register and Unregister +// on the default registry. +// +// There are a number of uses for custom registries: You can use registries with +// special properties, see NewPedanticRegistry. You can avoid global state, as +// it is imposed by the DefaultRegisterer. You can use multiple registries at +// the same time to expose different metrics in different ways. You can use +// separate registries for testing purposes. +// +// Also note that the DefaultRegisterer comes registered with a Collector for Go +// runtime metrics (via NewGoCollector) and a Collector for process metrics (via +// NewProcessCollector). With a custom registry, you are in control and decide +// yourself about the Collectors to register. +// +// HTTP Exposition +// +// The Registry implements the Gatherer interface. The caller of the Gather +// method can then expose the gathered metrics in some way. Usually, the metrics +// are served via HTTP on the /metrics endpoint. That's happening in the example +// above. The tools to expose metrics via HTTP are in the promhttp sub-package. +// (The top-level functions in the prometheus package are deprecated.) +// +// Pushing to the Pushgateway +// +// Function for pushing to the Pushgateway can be found in the push sub-package. +// +// Graphite Bridge +// +// Functions and examples to push metrics from a Gatherer to Graphite can be +// found in the graphite sub-package. +// +// Other Means of Exposition +// +// More ways of exposing metrics can easily be added by following the approaches +// of the existing implementations. +package prometheus diff --git a/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go new file mode 100644 index 000000000000..18a99d5faaa5 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go @@ -0,0 +1,119 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "encoding/json" + "expvar" +) + +type expvarCollector struct { + exports map[string]*Desc +} + +// NewExpvarCollector returns a newly allocated expvar Collector that still has +// to be registered with a Prometheus registry. +// +// An expvar Collector collects metrics from the expvar interface. It provides a +// quick way to expose numeric values that are already exported via expvar as +// Prometheus metrics. Note that the data models of expvar and Prometheus are +// fundamentally different, and that the expvar Collector is inherently slower +// than native Prometheus metrics. Thus, the expvar Collector is probably great +// for experiments and prototying, but you should seriously consider a more +// direct implementation of Prometheus metrics for monitoring production +// systems. +// +// The exports map has the following meaning: +// +// The keys in the map correspond to expvar keys, i.e. for every expvar key you +// want to export as Prometheus metric, you need an entry in the exports +// map. The descriptor mapped to each key describes how to export the expvar +// value. It defines the name and the help string of the Prometheus metric +// proxying the expvar value. The type will always be Untyped. +// +// For descriptors without variable labels, the expvar value must be a number or +// a bool. The number is then directly exported as the Prometheus sample +// value. (For a bool, 'false' translates to 0 and 'true' to 1). Expvar values +// that are not numbers or bools are silently ignored. +// +// If the descriptor has one variable label, the expvar value must be an expvar +// map. The keys in the expvar map become the various values of the one +// Prometheus label. The values in the expvar map must be numbers or bools again +// as above. +// +// For descriptors with more than one variable label, the expvar must be a +// nested expvar map, i.e. where the values of the topmost map are maps again +// etc. until a depth is reached that corresponds to the number of labels. The +// leaves of that structure must be numbers or bools as above to serve as the +// sample values. +// +// Anything that does not fit into the scheme above is silently ignored. +func NewExpvarCollector(exports map[string]*Desc) Collector { + return &expvarCollector{ + exports: exports, + } +} + +// Describe implements Collector. +func (e *expvarCollector) Describe(ch chan<- *Desc) { + for _, desc := range e.exports { + ch <- desc + } +} + +// Collect implements Collector. +func (e *expvarCollector) Collect(ch chan<- Metric) { + for name, desc := range e.exports { + var m Metric + expVar := expvar.Get(name) + if expVar == nil { + continue + } + var v interface{} + labels := make([]string, len(desc.variableLabels)) + if err := json.Unmarshal([]byte(expVar.String()), &v); err != nil { + ch <- NewInvalidMetric(desc, err) + continue + } + var processValue func(v interface{}, i int) + processValue = func(v interface{}, i int) { + if i >= len(labels) { + copiedLabels := append(make([]string, 0, len(labels)), labels...) + switch v := v.(type) { + case float64: + m = MustNewConstMetric(desc, UntypedValue, v, copiedLabels...) + case bool: + if v { + m = MustNewConstMetric(desc, UntypedValue, 1, copiedLabels...) + } else { + m = MustNewConstMetric(desc, UntypedValue, 0, copiedLabels...) + } + default: + return + } + ch <- m + return + } + vm, ok := v.(map[string]interface{}) + if !ok { + return + } + for lv, val := range vm { + labels[i] = lv + processValue(val, i+1) + } + } + processValue(v, 0) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/fnv.go b/vendor/github.com/prometheus/client_golang/prometheus/fnv.go new file mode 100644 index 000000000000..3d383a735c38 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go new file mode 100644 index 000000000000..17c72d7eb0cc --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -0,0 +1,286 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "math" + "sync/atomic" + "time" + + dto "github.com/prometheus/client_model/go" +) + +// Gauge is a Metric that represents a single numerical value that can +// arbitrarily go up and down. +// +// A Gauge is typically used for measured values like temperatures or current +// memory usage, but also "counts" that can go up and down, like the number of +// running goroutines. +// +// To create Gauge instances, use NewGauge. +type Gauge interface { + Metric + Collector + + // Set sets the Gauge to an arbitrary value. + Set(float64) + // Inc increments the Gauge by 1. Use Add to increment it by arbitrary + // values. + Inc() + // Dec decrements the Gauge by 1. Use Sub to decrement it by arbitrary + // values. + Dec() + // Add adds the given value to the Gauge. (The value can be negative, + // resulting in a decrease of the Gauge.) + Add(float64) + // Sub subtracts the given value from the Gauge. (The value can be + // negative, resulting in an increase of the Gauge.) + Sub(float64) + + // SetToCurrentTime sets the Gauge to the current Unix time in seconds. + SetToCurrentTime() +} + +// GaugeOpts is an alias for Opts. See there for doc comments. +type GaugeOpts Opts + +// NewGauge creates a new Gauge based on the provided GaugeOpts. +// +// The returned implementation is optimized for a fast Set method. If you have a +// choice for managing the value of a Gauge via Set vs. Inc/Dec/Add/Sub, pick +// the former. For example, the Inc method of the returned Gauge is slower than +// the Inc method of a Counter returned by NewCounter. This matches the typical +// scenarios for Gauges and Counters, where the former tends to be Set-heavy and +// the latter Inc-heavy. +func NewGauge(opts GaugeOpts) Gauge { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ) + result := &gauge{desc: desc, labelPairs: desc.constLabelPairs} + result.init(result) // Init self-collection. + return result +} + +type gauge struct { + // valBits contains the bits of the represented float64 value. It has + // to go first in the struct to guarantee alignment for atomic + // operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG + valBits uint64 + + selfCollector + + desc *Desc + labelPairs []*dto.LabelPair +} + +func (g *gauge) Desc() *Desc { + return g.desc +} + +func (g *gauge) Set(val float64) { + atomic.StoreUint64(&g.valBits, math.Float64bits(val)) +} + +func (g *gauge) SetToCurrentTime() { + g.Set(float64(time.Now().UnixNano()) / 1e9) +} + +func (g *gauge) Inc() { + g.Add(1) +} + +func (g *gauge) Dec() { + g.Add(-1) +} + +func (g *gauge) Add(val float64) { + for { + oldBits := atomic.LoadUint64(&g.valBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + val) + if atomic.CompareAndSwapUint64(&g.valBits, oldBits, newBits) { + return + } + } +} + +func (g *gauge) Sub(val float64) { + g.Add(val * -1) +} + +func (g *gauge) Write(out *dto.Metric) error { + val := math.Float64frombits(atomic.LoadUint64(&g.valBits)) + return populateMetric(GaugeValue, val, g.labelPairs, out) +} + +// GaugeVec is a Collector that bundles a set of Gauges that all share the same +// Desc, but have different values for their variable labels. This is used if +// you want to count the same thing partitioned by various dimensions +// (e.g. number of operations queued, partitioned by user and operation +// type). Create instances with NewGaugeVec. +type GaugeVec struct { + *metricVec +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and +// partitioned by the given label names. +func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &GaugeVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + if len(lvs) != len(desc.variableLabels) { + panic(errInconsistentCardinality) + } + result := &gauge{desc: desc, labelPairs: makeLabelPairs(desc, lvs)} + result.init(result) // Init self-collection. + return result + }), + } +} + +// GetMetricWithLabelValues returns the Gauge for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Gauge is created. +// +// It is possible to call this method without using the returned Gauge to only +// create the new Gauge but leave it at its starting value 0. See also the +// SummaryVec example. +// +// Keeping the Gauge for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Gauge from the GaugeVec. In that case, the +// Gauge will still exist, but it will not be exported anymore, even if a +// Gauge with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// GetMetricWith returns the Gauge for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Gauge is created. Implications of +// creating a Gauge without using it and keeping the Gauge for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Gauge), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Add(42) +func (v *GaugeVec) WithLabelValues(lvs ...string) Gauge { + g, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return g +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Add(42) +func (v *GaugeVec) With(labels Labels) Gauge { + g, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return g +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the GaugeVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &GaugeVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *GaugeVec) MustCurryWith(labels Labels) *GaugeVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +// GaugeFunc is a Gauge whose value is determined at collect time by calling a +// provided function. +// +// To create GaugeFunc instances, use NewGaugeFunc. +type GaugeFunc interface { + Metric + Collector +} + +// NewGaugeFunc creates a new GaugeFunc based on the provided GaugeOpts. The +// value reported is determined by calling the given function from within the +// Write method. Take into account that metric collection may happen +// concurrently. If that results in concurrent calls to Write, like in the case +// where a GaugeFunc is directly registered with Prometheus, the provided +// function must be concurrency-safe. +func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), GaugeValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go new file mode 100644 index 000000000000..ba3b9333edde --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector.go @@ -0,0 +1,301 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "runtime" + "runtime/debug" + "time" +) + +type goCollector struct { + goroutinesDesc *Desc + threadsDesc *Desc + gcDesc *Desc + goInfoDesc *Desc + + // metrics to describe and collect + metrics memStatsMetrics +} + +// NewGoCollector returns a collector which exports metrics about the current Go +// process. This includes memory stats. To collect those, runtime.ReadMemStats +// is called. This causes a stop-the-world, which is very short with Go1.9+ +// (~25µs). However, with older Go versions, the stop-the-world duration depends +// on the heap size and can be quite significant (~1.7 ms/GiB as per +// https://go-review.googlesource.com/c/go/+/34937). +func NewGoCollector() Collector { + return &goCollector{ + goroutinesDesc: NewDesc( + "go_goroutines", + "Number of goroutines that currently exist.", + nil, nil), + threadsDesc: NewDesc( + "go_threads", + "Number of OS threads created.", + nil, nil), + gcDesc: NewDesc( + "go_gc_duration_seconds", + "A summary of the GC invocation durations.", + nil, nil), + goInfoDesc: NewDesc( + "go_info", + "Information about the Go environment.", + nil, Labels{"version": runtime.Version()}), + metrics: memStatsMetrics{ + { + desc: NewDesc( + memstatNamespace("alloc_bytes"), + "Number of bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Alloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("alloc_bytes_total"), + "Total number of bytes allocated, even if freed.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.TotalAlloc) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("sys_bytes"), + "Number of bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Sys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("lookups_total"), + "Total number of pointer lookups.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Lookups) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("mallocs_total"), + "Total number of mallocs.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Mallocs) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("frees_total"), + "Total number of frees.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.Frees) }, + valType: CounterValue, + }, { + desc: NewDesc( + memstatNamespace("heap_alloc_bytes"), + "Number of heap bytes allocated and still in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapAlloc) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_sys_bytes"), + "Number of heap bytes obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_idle_bytes"), + "Number of heap bytes waiting to be used.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapIdle) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_inuse_bytes"), + "Number of heap bytes that are in use.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_released_bytes"), + "Number of heap bytes released to OS.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapReleased) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("heap_objects"), + "Number of allocated objects.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.HeapObjects) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_inuse_bytes"), + "Number of bytes in use by the stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("stack_sys_bytes"), + "Number of bytes obtained from system for stack allocator.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.StackSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_inuse_bytes"), + "Number of bytes in use by mspan structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mspan_sys_bytes"), + "Number of bytes used for mspan structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MSpanSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_inuse_bytes"), + "Number of bytes in use by mcache structures.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheInuse) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("mcache_sys_bytes"), + "Number of bytes used for mcache structures obtained from system.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.MCacheSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("buck_hash_sys_bytes"), + "Number of bytes used by the profiling bucket hash table.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.BuckHashSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_sys_bytes"), + "Number of bytes used for garbage collection system metadata.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.GCSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("other_sys_bytes"), + "Number of bytes used for other system allocations.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.OtherSys) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("next_gc_bytes"), + "Number of heap bytes when next garbage collection will take place.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.NextGC) }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("last_gc_time_seconds"), + "Number of seconds since 1970 of last garbage collection.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return float64(ms.LastGC) / 1e9 }, + valType: GaugeValue, + }, { + desc: NewDesc( + memstatNamespace("gc_cpu_fraction"), + "The fraction of this program's available CPU time used by the GC since the program started.", + nil, nil, + ), + eval: func(ms *runtime.MemStats) float64 { return ms.GCCPUFraction }, + valType: GaugeValue, + }, + }, + } +} + +func memstatNamespace(s string) string { + return fmt.Sprintf("go_memstats_%s", s) +} + +// Describe returns all descriptions of the collector. +func (c *goCollector) Describe(ch chan<- *Desc) { + ch <- c.goroutinesDesc + ch <- c.threadsDesc + ch <- c.gcDesc + ch <- c.goInfoDesc + for _, i := range c.metrics { + ch <- i.desc + } +} + +// Collect returns the current state of all metrics of the collector. +func (c *goCollector) Collect(ch chan<- Metric) { + ch <- MustNewConstMetric(c.goroutinesDesc, GaugeValue, float64(runtime.NumGoroutine())) + n, _ := runtime.ThreadCreateProfile(nil) + ch <- MustNewConstMetric(c.threadsDesc, GaugeValue, float64(n)) + + var stats debug.GCStats + stats.PauseQuantiles = make([]time.Duration, 5) + debug.ReadGCStats(&stats) + + quantiles := make(map[float64]float64) + for idx, pq := range stats.PauseQuantiles[1:] { + quantiles[float64(idx+1)/float64(len(stats.PauseQuantiles)-1)] = pq.Seconds() + } + quantiles[0.0] = stats.PauseQuantiles[0].Seconds() + ch <- MustNewConstSummary(c.gcDesc, uint64(stats.NumGC), stats.PauseTotal.Seconds(), quantiles) + + ch <- MustNewConstMetric(c.goInfoDesc, GaugeValue, 1) + + ms := &runtime.MemStats{} + runtime.ReadMemStats(ms) + for _, i := range c.metrics { + ch <- MustNewConstMetric(i.desc, i.valType, i.eval(ms)) + } +} + +// memStatsMetrics provide description, value, and value type for memstat metrics. +type memStatsMetrics []struct { + desc *Desc + eval func(*runtime.MemStats) float64 + valType ValueType +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go new file mode 100644 index 000000000000..4d7fa976e47f --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -0,0 +1,614 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "runtime" + "sort" + "sync" + "sync/atomic" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// A Histogram counts individual observations from an event or sample stream in +// configurable buckets. Similar to a summary, it also provides a sum of +// observations and an observation count. +// +// On the Prometheus server, quantiles can be calculated from a Histogram using +// the histogram_quantile function in the query language. +// +// Note that Histograms, in contrast to Summaries, can be aggregated with the +// Prometheus query language (see the documentation for detailed +// procedures). However, Histograms require the user to pre-define suitable +// buckets, and they are in general less accurate. The Observe method of a +// Histogram has a very low performance overhead in comparison with the Observe +// method of a Summary. +// +// To create Histogram instances, use NewHistogram. +type Histogram interface { + Metric + Collector + + // Observe adds a single observation to the histogram. + Observe(float64) +} + +// bucketLabel is used for the label that defines the upper bound of a +// bucket of a histogram ("le" -> "less or equal"). +const bucketLabel = "le" + +// DefBuckets are the default Histogram buckets. The default buckets are +// tailored to broadly measure the response time (in seconds) of a network +// service. Most likely, however, you will be required to define buckets +// customized to your use case. +var ( + DefBuckets = []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10} + + errBucketLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in histograms", bucketLabel, + ) +) + +// LinearBuckets creates 'count' buckets, each 'width' wide, where the lowest +// bucket has an upper bound of 'start'. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is zero or negative. +func LinearBuckets(start, width float64, count int) []float64 { + if count < 1 { + panic("LinearBuckets needs a positive count") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start += width + } + return buckets +} + +// ExponentialBuckets creates 'count' buckets, where the lowest bucket has an +// upper bound of 'start' and each following bucket's upper bound is 'factor' +// times the previous bucket's upper bound. The final +Inf bucket is not counted +// and not included in the returned slice. The returned slice is meant to be +// used for the Buckets field of HistogramOpts. +// +// The function panics if 'count' is 0 or negative, if 'start' is 0 or negative, +// or if 'factor' is less than or equal 1. +func ExponentialBuckets(start, factor float64, count int) []float64 { + if count < 1 { + panic("ExponentialBuckets needs a positive count") + } + if start <= 0 { + panic("ExponentialBuckets needs a positive start value") + } + if factor <= 1 { + panic("ExponentialBuckets needs a factor greater than 1") + } + buckets := make([]float64, count) + for i := range buckets { + buckets[i] = start + start *= factor + } + return buckets +} + +// HistogramOpts bundles the options for creating a Histogram metric. It is +// mandatory to set Name to a non-empty string. All other fields are optional +// and can safely be left at their zero value, although it is strongly +// encouraged to set a Help string. +type HistogramOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Histogram (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Histogram must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Histogram. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + ConstLabels Labels + + // Buckets defines the buckets into which observations are counted. Each + // element in the slice is the upper inclusive bound of a bucket. The + // values must be sorted in strictly increasing order. There is no need + // to add a highest bucket with +Inf bound, it will be added + // implicitly. The default value is DefBuckets. + Buckets []float64 +} + +// NewHistogram creates a new Histogram based on the provided HistogramOpts. It +// panics if the buckets in HistogramOpts are not in strictly increasing order. +func NewHistogram(opts HistogramOpts) Histogram { + return newHistogram( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == bucketLabel { + panic(errBucketLabelNotAllowed) + } + } + + if len(opts.Buckets) == 0 { + opts.Buckets = DefBuckets + } + + h := &histogram{ + desc: desc, + upperBounds: opts.Buckets, + labelPairs: makeLabelPairs(desc, labelValues), + counts: [2]*histogramCounts{&histogramCounts{}, &histogramCounts{}}, + } + for i, upperBound := range h.upperBounds { + if i < len(h.upperBounds)-1 { + if upperBound >= h.upperBounds[i+1] { + panic(fmt.Errorf( + "histogram buckets must be in increasing order: %f >= %f", + upperBound, h.upperBounds[i+1], + )) + } + } else { + if math.IsInf(upperBound, +1) { + // The +Inf bucket is implicit. Remove it here. + h.upperBounds = h.upperBounds[:i] + } + } + } + // Finally we know the final length of h.upperBounds and can make counts + // for both states: + h.counts[0].buckets = make([]uint64, len(h.upperBounds)) + h.counts[1].buckets = make([]uint64, len(h.upperBounds)) + + h.init(h) // Init self-collection. + return h +} + +type histogramCounts struct { + // sumBits contains the bits of the float64 representing the sum of all + // observations. sumBits and count have to go first in the struct to + // guarantee alignment for atomic operations. + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + sumBits uint64 + count uint64 + buckets []uint64 +} + +type histogram struct { + // countAndHotIdx is a complicated one. For lock-free yet atomic + // observations, we need to save the total count of observations again, + // combined with the index of the currently-hot counts struct, so that + // we can perform the operation on both values atomically. The least + // significant bit defines the hot counts struct. The remaining 63 bits + // represent the total count of observations. This happens under the + // assumption that the 63bit count will never overflow. Rationale: An + // observations takes about 30ns. Let's assume it could happen in + // 10ns. Overflowing the counter will then take at least (2^63)*10ns, + // which is about 3000 years. + // + // This has to be first in the struct for 64bit alignment. See + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG + countAndHotIdx uint64 + + selfCollector + desc *Desc + writeMtx sync.Mutex // Only used in the Write method. + + upperBounds []float64 + + // Two counts, one is "hot" for lock-free observations, the other is + // "cold" for writing out a dto.Metric. It has to be an array of + // pointers to guarantee 64bit alignment of the histogramCounts, see + // http://golang.org/pkg/sync/atomic/#pkg-note-BUG. + counts [2]*histogramCounts + hotIdx int // Index of currently-hot counts. Only used within Write. + + labelPairs []*dto.LabelPair +} + +func (h *histogram) Desc() *Desc { + return h.desc +} + +func (h *histogram) Observe(v float64) { + // TODO(beorn7): For small numbers of buckets (<30), a linear search is + // slightly faster than the binary search. If we really care, we could + // switch from one search strategy to the other depending on the number + // of buckets. + // + // Microbenchmarks (BenchmarkHistogramNoLabels): + // 11 buckets: 38.3 ns/op linear - binary 48.7 ns/op + // 100 buckets: 78.1 ns/op linear - binary 54.9 ns/op + // 300 buckets: 154 ns/op linear - binary 61.6 ns/op + i := sort.SearchFloat64s(h.upperBounds, v) + + // We increment h.countAndHotIdx by 2 so that the counter in the upper + // 63 bits gets incremented by 1. At the same time, we get the new value + // back, which we can use to find the currently-hot counts. + n := atomic.AddUint64(&h.countAndHotIdx, 2) + hotCounts := h.counts[n%2] + + if i < len(h.upperBounds) { + atomic.AddUint64(&hotCounts.buckets[i], 1) + } + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + v) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + break + } + } + // Increment count last as we take it as a signal that the observation + // is complete. + atomic.AddUint64(&hotCounts.count, 1) +} + +func (h *histogram) Write(out *dto.Metric) error { + var ( + his = &dto.Histogram{} + buckets = make([]*dto.Bucket, len(h.upperBounds)) + hotCounts, coldCounts *histogramCounts + count uint64 + ) + + // For simplicity, we mutex the rest of this method. It is not in the + // hot path, i.e. Observe is called much more often than Write. The + // complication of making Write lock-free isn't worth it. + h.writeMtx.Lock() + defer h.writeMtx.Unlock() + + // This is a bit arcane, which is why the following spells out this if + // clause in English: + // + // If the currently-hot counts struct is #0, we atomically increment + // h.countAndHotIdx by 1 so that from now on Observe will use the counts + // struct #1. Furthermore, the atomic increment gives us the new value, + // which, in its most significant 63 bits, tells us the count of + // observations done so far up to and including currently ongoing + // observations still using the counts struct just changed from hot to + // cold. To have a normal uint64 for the count, we bitshift by 1 and + // save the result in count. We also set h.hotIdx to 1 for the next + // Write call, and we will refer to counts #1 as hotCounts and to counts + // #0 as coldCounts. + // + // If the currently-hot counts struct is #1, we do the corresponding + // things the other way round. We have to _decrement_ h.countAndHotIdx + // (which is a bit arcane in itself, as we have to express -1 with an + // unsigned int...). + if h.hotIdx == 0 { + count = atomic.AddUint64(&h.countAndHotIdx, 1) >> 1 + h.hotIdx = 1 + hotCounts = h.counts[1] + coldCounts = h.counts[0] + } else { + count = atomic.AddUint64(&h.countAndHotIdx, ^uint64(0)) >> 1 // Decrement. + h.hotIdx = 0 + hotCounts = h.counts[0] + coldCounts = h.counts[1] + } + + // Now we have to wait for the now-declared-cold counts to actually cool + // down, i.e. wait for all observations still using it to finish. That's + // the case once the count in the cold counts struct is the same as the + // one atomically retrieved from the upper 63bits of h.countAndHotIdx. + for { + if count == atomic.LoadUint64(&coldCounts.count) { + break + } + runtime.Gosched() // Let observations get work done. + } + + his.SampleCount = proto.Uint64(count) + his.SampleSum = proto.Float64(math.Float64frombits(atomic.LoadUint64(&coldCounts.sumBits))) + var cumCount uint64 + for i, upperBound := range h.upperBounds { + cumCount += atomic.LoadUint64(&coldCounts.buckets[i]) + buckets[i] = &dto.Bucket{ + CumulativeCount: proto.Uint64(cumCount), + UpperBound: proto.Float64(upperBound), + } + } + + his.Bucket = buckets + out.Histogram = his + out.Label = h.labelPairs + + // Finally add all the cold counts to the new hot counts and reset the cold counts. + atomic.AddUint64(&hotCounts.count, count) + atomic.StoreUint64(&coldCounts.count, 0) + for { + oldBits := atomic.LoadUint64(&hotCounts.sumBits) + newBits := math.Float64bits(math.Float64frombits(oldBits) + his.GetSampleSum()) + if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { + atomic.StoreUint64(&coldCounts.sumBits, 0) + break + } + } + for i := range h.upperBounds { + atomic.AddUint64(&hotCounts.buckets[i], atomic.LoadUint64(&coldCounts.buckets[i])) + atomic.StoreUint64(&coldCounts.buckets[i], 0) + } + return nil +} + +// HistogramVec is a Collector that bundles a set of Histograms that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewHistogramVec. +type HistogramVec struct { + *metricVec +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and +// partitioned by the given label names. +func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &HistogramVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newHistogram(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues returns the Histogram for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Histogram is created. +// +// It is possible to call this method without using the returned Histogram to only +// create the new Histogram but leave it at its starting value, a Histogram without +// any observations. +// +// Keeping the Histogram for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Histogram from the HistogramVec. In that case, the +// Histogram will still exist, but it will not be exported anymore, even if a +// Histogram with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// GetMetricWith returns the Histogram for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Histogram is created. Implications of +// creating a Histogram without using it and keeping the Histogram for later use +// are the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (v *HistogramVec) WithLabelValues(lvs ...string) Observer { + h, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return h +} + +// With works as GetMetricWith but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (v *HistogramVec) With(labels Labels) Observer { + h, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return h +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the HistogramVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &HistogramVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *HistogramVec) MustCurryWith(labels Labels) ObserverVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +type constHistogram struct { + desc *Desc + count uint64 + sum float64 + buckets map[float64]uint64 + labelPairs []*dto.LabelPair +} + +func (h *constHistogram) Desc() *Desc { + return h.desc +} + +func (h *constHistogram) Write(out *dto.Metric) error { + his := &dto.Histogram{} + buckets := make([]*dto.Bucket, 0, len(h.buckets)) + + his.SampleCount = proto.Uint64(h.count) + his.SampleSum = proto.Float64(h.sum) + + for upperBound, count := range h.buckets { + buckets = append(buckets, &dto.Bucket{ + CumulativeCount: proto.Uint64(count), + UpperBound: proto.Float64(upperBound), + }) + } + + if len(buckets) > 0 { + sort.Sort(buckSort(buckets)) + } + his.Bucket = buckets + + out.Histogram = his + out.Label = h.labelPairs + + return nil +} + +// NewConstHistogram returns a metric representing a Prometheus histogram with +// fixed values for the count, sum, and bucket counts. As those parameters +// cannot be changed, the returned value does not implement the Histogram +// interface (but only the Metric interface). Users of this package will not +// have much use for it in regular operations. However, when implementing custom +// Collectors, it is useful as a throw-away metric that is generated on the fly +// to send it to Prometheus in the Collect method. +// +// buckets is a map of upper bounds to cumulative counts, excluding the +Inf +// bucket. +// +// NewConstHistogram returns an error if the length of labelValues is not +// consistent with the variable labels in Desc or if Desc is invalid. +func NewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constHistogram{ + desc: desc, + count: count, + sum: sum, + buckets: buckets, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstHistogram is a version of NewConstHistogram that panics where +// NewConstMetric would have returned an error. +func MustNewConstHistogram( + desc *Desc, + count uint64, + sum float64, + buckets map[float64]uint64, + labelValues ...string, +) Metric { + m, err := NewConstHistogram(desc, count, sum, buckets, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type buckSort []*dto.Bucket + +func (s buckSort) Len() int { + return len(s) +} + +func (s buckSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s buckSort) Less(i, j int) bool { + return s[i].GetUpperBound() < s[j].GetUpperBound() +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/http.go b/vendor/github.com/prometheus/client_golang/prometheus/http.go new file mode 100644 index 000000000000..4b8e60273350 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/http.go @@ -0,0 +1,505 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bufio" + "bytes" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/prometheus/common/expfmt" +) + +// TODO(beorn7): Remove this whole file. It is a partial mirror of +// promhttp/http.go (to avoid circular import chains) where everything HTTP +// related should live. The functions here are just for avoiding +// breakage. Everything is deprecated. + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an HTTP handler for the DefaultGatherer. It is +// already instrumented with InstrumentHandler (using "prometheus" as handler +// name). +// +// Deprecated: Please note the issues described in the doc comment of +// InstrumentHandler. You might want to consider using promhttp.Handler instead. +func Handler() http.Handler { + return InstrumentHandler("prometheus", UninstrumentedHandler()) +} + +// UninstrumentedHandler returns an HTTP handler for the DefaultGatherer. +// +// Deprecated: Use promhttp.HandlerFor(DefaultGatherer, promhttp.HandlerOpts{}) +// instead. See there for further documentation. +func UninstrumentedHandler() http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + mfs, err := DefaultGatherer.Gather() + if err != nil { + http.Error(w, "An error has occurred during metrics collection:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+lastErr.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + w.Write(buf.Bytes()) + }) +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer) (io.Writer, string) { + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} + +var instLabels = []string{"method", "code"} + +type nower interface { + Now() time.Time +} + +type nowFunc func() time.Time + +func (n nowFunc) Now() time.Time { + return n() +} + +var now nower = nowFunc(func() time.Time { + return time.Now() +}) + +// InstrumentHandler wraps the given HTTP handler for instrumentation. It +// registers four metric collectors (if not already done) and reports HTTP +// metrics to the (newly or already) registered collectors: http_requests_total +// (CounterVec), http_request_duration_microseconds (Summary), +// http_request_size_bytes (Summary), http_response_size_bytes (Summary). Each +// has a constant label named "handler" with the provided handlerName as +// value. http_requests_total is a metric vector partitioned by HTTP method +// (label name "method") and HTTP status code (label name "code"). +// +// Deprecated: InstrumentHandler has several issues. Use the tooling provided in +// package promhttp instead. The issues are the following: (1) It uses Summaries +// rather than Histograms. Summaries are not useful if aggregation across +// multiple instances is required. (2) It uses microseconds as unit, which is +// deprecated and should be replaced by seconds. (3) The size of the request is +// calculated in a separate goroutine. Since this calculator requires access to +// the request header, it creates a race with any writes to the header performed +// during request handling. httputil.ReverseProxy is a prominent example for a +// handler performing such writes. (4) It has additional issues with HTTP/2, cf. +// https://github.com/prometheus/client_golang/issues/272. +func InstrumentHandler(handlerName string, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFunc(handlerName, handler.ServeHTTP) +} + +// InstrumentHandlerFunc wraps the given function for instrumentation. It +// otherwise works in the same way as InstrumentHandler (and shares the same +// issues). +// +// Deprecated: InstrumentHandlerFunc is deprecated for the same reasons as +// InstrumentHandler is. Use the tooling provided in package promhttp instead. +func InstrumentHandlerFunc(handlerName string, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts( + SummaryOpts{ + Subsystem: "http", + ConstLabels: Labels{"handler": handlerName}, + Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, + }, + handlerFunc, + ) +} + +// InstrumentHandlerWithOpts works like InstrumentHandler (and shares the same +// issues) but provides more flexibility (at the cost of a more complex call +// syntax). As InstrumentHandler, this function registers four metric +// collectors, but it uses the provided SummaryOpts to create them. However, the +// fields "Name" and "Help" in the SummaryOpts are ignored. "Name" is replaced +// by "requests_total", "request_duration_microseconds", "request_size_bytes", +// and "response_size_bytes", respectively. "Help" is replaced by an appropriate +// help string. The names of the variable labels of the http_requests_total +// CounterVec are "method" (get, post, etc.), and "code" (HTTP status code). +// +// If InstrumentHandlerWithOpts is called as follows, it mimics exactly the +// behavior of InstrumentHandler: +// +// prometheus.InstrumentHandlerWithOpts( +// prometheus.SummaryOpts{ +// Subsystem: "http", +// ConstLabels: prometheus.Labels{"handler": handlerName}, +// }, +// handler, +// ) +// +// Technical detail: "requests_total" is a CounterVec, not a SummaryVec, so it +// cannot use SummaryOpts. Instead, a CounterOpts struct is created internally, +// and all its fields are set to the equally named fields in the provided +// SummaryOpts. +// +// Deprecated: InstrumentHandlerWithOpts is deprecated for the same reasons as +// InstrumentHandler is. Use the tooling provided in package promhttp instead. +func InstrumentHandlerWithOpts(opts SummaryOpts, handler http.Handler) http.HandlerFunc { + return InstrumentHandlerFuncWithOpts(opts, handler.ServeHTTP) +} + +// InstrumentHandlerFuncWithOpts works like InstrumentHandlerFunc (and shares +// the same issues) but provides more flexibility (at the cost of a more complex +// call syntax). See InstrumentHandlerWithOpts for details how the provided +// SummaryOpts are used. +// +// Deprecated: InstrumentHandlerFuncWithOpts is deprecated for the same reasons +// as InstrumentHandler is. Use the tooling provided in package promhttp instead. +func InstrumentHandlerFuncWithOpts(opts SummaryOpts, handlerFunc func(http.ResponseWriter, *http.Request)) http.HandlerFunc { + reqCnt := NewCounterVec( + CounterOpts{ + Namespace: opts.Namespace, + Subsystem: opts.Subsystem, + Name: "requests_total", + Help: "Total number of HTTP requests made.", + ConstLabels: opts.ConstLabels, + }, + instLabels, + ) + if err := Register(reqCnt); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + reqCnt = are.ExistingCollector.(*CounterVec) + } else { + panic(err) + } + } + + opts.Name = "request_duration_microseconds" + opts.Help = "The HTTP request latencies in microseconds." + reqDur := NewSummary(opts) + if err := Register(reqDur); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + reqDur = are.ExistingCollector.(Summary) + } else { + panic(err) + } + } + + opts.Name = "request_size_bytes" + opts.Help = "The HTTP request sizes in bytes." + reqSz := NewSummary(opts) + if err := Register(reqSz); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + reqSz = are.ExistingCollector.(Summary) + } else { + panic(err) + } + } + + opts.Name = "response_size_bytes" + opts.Help = "The HTTP response sizes in bytes." + resSz := NewSummary(opts) + if err := Register(resSz); err != nil { + if are, ok := err.(AlreadyRegisteredError); ok { + resSz = are.ExistingCollector.(Summary) + } else { + panic(err) + } + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + + delegate := &responseWriterDelegator{ResponseWriter: w} + out := computeApproximateRequestSize(r) + + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + var rw http.ResponseWriter + if cn && fl && hj && rf { + rw = &fancyResponseWriterDelegator{delegate} + } else { + rw = delegate + } + handlerFunc(rw, r) + + elapsed := float64(time.Since(now)) / float64(time.Microsecond) + + method := sanitizeMethod(r.Method) + code := sanitizeCode(delegate.status) + reqCnt.WithLabelValues(method, code).Inc() + reqDur.Observe(elapsed) + resSz.Observe(float64(delegate.written)) + reqSz.Observe(float64(<-out)) + }) +} + +func computeApproximateRequestSize(r *http.Request) <-chan int { + // Get URL length in current goroutine for avoiding a race condition. + // HandlerFunc that runs in parallel may modify the URL. + s := 0 + if r.URL != nil { + s += len(r.URL.String()) + } + + out := make(chan int, 1) + + go func() { + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + out <- s + close(out) + }() + + return out +} + +type responseWriterDelegator struct { + http.ResponseWriter + + status int + written int64 + wroteHeader bool +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type fancyResponseWriterDelegator struct { + *responseWriterDelegator +} + +func (f *fancyResponseWriterDelegator) CloseNotify() <-chan bool { + return f.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +func (f *fancyResponseWriterDelegator) Flush() { + f.ResponseWriter.(http.Flusher).Flush() +} + +func (f *fancyResponseWriterDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return f.ResponseWriter.(http.Hijacker).Hijack() +} + +func (f *fancyResponseWriterDelegator) ReadFrom(r io.Reader) (int64, error) { + if !f.wroteHeader { + f.WriteHeader(http.StatusOK) + } + n, err := f.ResponseWriter.(io.ReaderFrom).ReadFrom(r) + f.written += n + return n, err +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go new file mode 100644 index 000000000000..351c26e1aedb --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go @@ -0,0 +1,85 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package internal + +import ( + "sort" + + dto "github.com/prometheus/client_model/go" +) + +// metricSorter is a sortable slice of *dto.Metric. +type metricSorter []*dto.Metric + +func (s metricSorter) Len() int { + return len(s) +} + +func (s metricSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s metricSorter) Less(i, j int) bool { + if len(s[i].Label) != len(s[j].Label) { + // This should not happen. The metrics are + // inconsistent. However, we have to deal with the fact, as + // people might use custom collectors or metric family injection + // to create inconsistent metrics. So let's simply compare the + // number of labels in this case. That will still yield + // reproducible sorting. + return len(s[i].Label) < len(s[j].Label) + } + for n, lp := range s[i].Label { + vi := lp.GetValue() + vj := s[j].Label[n].GetValue() + if vi != vj { + return vi < vj + } + } + + // We should never arrive here. Multiple metrics with the same + // label set in the same scrape will lead to undefined ingestion + // behavior. However, as above, we have to provide stable sorting + // here, even for inconsistent metrics. So sort equal metrics + // by their timestamp, with missing timestamps (implying "now") + // coming last. + if s[i].TimestampMs == nil { + return false + } + if s[j].TimestampMs == nil { + return true + } + return s[i].GetTimestampMs() < s[j].GetTimestampMs() +} + +// NormalizeMetricFamilies returns a MetricFamily slice with empty +// MetricFamilies pruned and the remaining MetricFamilies sorted by name within +// the slice, with the contained Metrics sorted within each MetricFamily. +func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.MetricFamily) []*dto.MetricFamily { + for _, mf := range metricFamiliesByName { + sort.Sort(metricSorter(mf.Metric)) + } + names := make([]string, 0, len(metricFamiliesByName)) + for name, mf := range metricFamiliesByName { + if len(mf.Metric) > 0 { + names = append(names, name) + } + } + sort.Strings(names) + result := make([]*dto.MetricFamily, 0, len(names)) + for _, name := range names { + result = append(result, metricFamiliesByName[name]) + } + return result +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go new file mode 100644 index 000000000000..e68f132ecefe --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -0,0 +1,70 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "fmt" + "strings" + "unicode/utf8" + + "github.com/prometheus/common/model" +) + +// Labels represents a collection of label name -> value mappings. This type is +// commonly used with the With(Labels) and GetMetricWith(Labels) methods of +// metric vector Collectors, e.g.: +// myVec.With(Labels{"code": "404", "method": "GET"}).Add(42) +// +// The other use-case is the specification of constant label pairs in Opts or to +// create a Desc. +type Labels map[string]string + +// reservedLabelPrefix is a prefix which is not legal in user-supplied +// label names. +const reservedLabelPrefix = "__" + +var errInconsistentCardinality = errors.New("inconsistent label cardinality") + +func validateValuesInLabels(labels Labels, expectedNumberOfValues int) error { + if len(labels) != expectedNumberOfValues { + return errInconsistentCardinality + } + + for name, val := range labels { + if !utf8.ValidString(val) { + return fmt.Errorf("label %s: value %q is not valid UTF-8", name, val) + } + } + + return nil +} + +func validateLabelValues(vals []string, expectedNumberOfValues int) error { + if len(vals) != expectedNumberOfValues { + return errInconsistentCardinality + } + + for _, val := range vals { + if !utf8.ValidString(val) { + return fmt.Errorf("label value %q is not valid UTF-8", val) + } + } + + return nil +} + +func checkLabelName(l string) bool { + return model.LabelName(l).IsValid() && !strings.HasPrefix(l, reservedLabelPrefix) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go new file mode 100644 index 000000000000..55e6d86d596f --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -0,0 +1,174 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "strings" + "time" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +const separatorByte byte = 255 + +// A Metric models a single sample value with its meta data being exported to +// Prometheus. Implementations of Metric in this package are Gauge, Counter, +// Histogram, Summary, and Untyped. +type Metric interface { + // Desc returns the descriptor for the Metric. This method idempotently + // returns the same descriptor throughout the lifetime of the + // Metric. The returned descriptor is immutable by contract. A Metric + // unable to describe itself must return an invalid descriptor (created + // with NewInvalidDesc). + Desc() *Desc + // Write encodes the Metric into a "Metric" Protocol Buffer data + // transmission object. + // + // Metric implementations must observe concurrency safety as reads of + // this metric may occur at any time, and any blocking occurs at the + // expense of total performance of rendering all registered + // metrics. Ideally, Metric implementations should support concurrent + // readers. + // + // While populating dto.Metric, it is the responsibility of the + // implementation to ensure validity of the Metric protobuf (like valid + // UTF-8 strings or syntactically valid metric and label names). It is + // recommended to sort labels lexicographically. Callers of Write should + // still make sure of sorting if they depend on it. + Write(*dto.Metric) error + // TODO(beorn7): The original rationale of passing in a pre-allocated + // dto.Metric protobuf to save allocations has disappeared. The + // signature of this method should be changed to "Write() (*dto.Metric, + // error)". +} + +// Opts bundles the options for creating most Metric types. Each metric +// implementation XXX has its own XXXOpts type, but in most cases, it is just be +// an alias of this type (which might change when the requirement arises.) +// +// It is mandatory to set Name to a non-empty string. All other fields are +// optional and can safely be left at their zero value, although it is strongly +// encouraged to set a Help string. +type Opts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Metric (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the metric must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this metric. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + ConstLabels Labels +} + +// BuildFQName joins the given three name components by "_". Empty name +// components are ignored. If the name parameter itself is empty, an empty +// string is returned, no matter what. Metric implementations included in this +// library use this function internally to generate the fully-qualified metric +// name from the name component in their Opts. Users of the library will only +// need this function if they implement their own Metric or instantiate a Desc +// (with NewDesc) directly. +func BuildFQName(namespace, subsystem, name string) string { + if name == "" { + return "" + } + switch { + case namespace != "" && subsystem != "": + return strings.Join([]string{namespace, subsystem, name}, "_") + case namespace != "": + return strings.Join([]string{namespace, name}, "_") + case subsystem != "": + return strings.Join([]string{subsystem, name}, "_") + } + return name +} + +// labelPairSorter implements sort.Interface. It is used to sort a slice of +// dto.LabelPair pointers. +type labelPairSorter []*dto.LabelPair + +func (s labelPairSorter) Len() int { + return len(s) +} + +func (s labelPairSorter) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s labelPairSorter) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +type invalidMetric struct { + desc *Desc + err error +} + +// NewInvalidMetric returns a metric whose Write method always returns the +// provided error. It is useful if a Collector finds itself unable to collect +// a metric and wishes to report an error to the registry. +func NewInvalidMetric(desc *Desc, err error) Metric { + return &invalidMetric{desc, err} +} + +func (m *invalidMetric) Desc() *Desc { return m.desc } + +func (m *invalidMetric) Write(*dto.Metric) error { return m.err } + +type timestampedMetric struct { + Metric + t time.Time +} + +func (m timestampedMetric) Write(pb *dto.Metric) error { + e := m.Metric.Write(pb) + pb.TimestampMs = proto.Int64(m.t.Unix()*1000 + int64(m.t.Nanosecond()/1000000)) + return e +} + +// NewMetricWithTimestamp returns a new Metric wrapping the provided Metric in a +// way that it has an explicit timestamp set to the provided Time. This is only +// useful in rare cases as the timestamp of a Prometheus metric should usually +// be set by the Prometheus server during scraping. Exceptions include mirroring +// metrics with given timestamps from other metric +// sources. +// +// NewMetricWithTimestamp works best with MustNewConstMetric, +// MustNewConstHistogram, and MustNewConstSummary, see example. +// +// Currently, the exposition formats used by Prometheus are limited to +// millisecond resolution. Thus, the provided time will be rounded down to the +// next full millisecond value. +func NewMetricWithTimestamp(t time.Time, m Metric) Metric { + return timestampedMetric{Metric: m, t: t} +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/observer.go b/vendor/github.com/prometheus/client_golang/prometheus/observer.go new file mode 100644 index 000000000000..5806cd09e306 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/observer.go @@ -0,0 +1,52 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// Observer is the interface that wraps the Observe method, which is used by +// Histogram and Summary to add observations. +type Observer interface { + Observe(float64) +} + +// The ObserverFunc type is an adapter to allow the use of ordinary +// functions as Observers. If f is a function with the appropriate +// signature, ObserverFunc(f) is an Observer that calls f. +// +// This adapter is usually used in connection with the Timer type, and there are +// two general use cases: +// +// The most common one is to use a Gauge as the Observer for a Timer. +// See the "Gauge" Timer example. +// +// The more advanced use case is to create a function that dynamically decides +// which Observer to use for observing the duration. See the "Complex" Timer +// example. +type ObserverFunc func(float64) + +// Observe calls f(value). It implements Observer. +func (f ObserverFunc) Observe(value float64) { + f(value) +} + +// ObserverVec is an interface implemented by `HistogramVec` and `SummaryVec`. +type ObserverVec interface { + GetMetricWith(Labels) (Observer, error) + GetMetricWithLabelValues(lvs ...string) (Observer, error) + With(Labels) Observer + WithLabelValues(...string) Observer + CurryWith(Labels) (ObserverVec, error) + MustCurryWith(Labels) ObserverVec + + Collector +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go new file mode 100644 index 000000000000..55176d58ce6a --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/process_collector.go @@ -0,0 +1,204 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "errors" + "os" + + "github.com/prometheus/procfs" +) + +type processCollector struct { + collectFn func(chan<- Metric) + pidFn func() (int, error) + reportErrors bool + cpuTotal *Desc + openFDs, maxFDs *Desc + vsize, maxVsize *Desc + rss *Desc + startTime *Desc +} + +// ProcessCollectorOpts defines the behavior of a process metrics collector +// created with NewProcessCollector. +type ProcessCollectorOpts struct { + // PidFn returns the PID of the process the collector collects metrics + // for. It is called upon each collection. By default, the PID of the + // current process is used, as determined on construction time by + // calling os.Getpid(). + PidFn func() (int, error) + // If non-empty, each of the collected metrics is prefixed by the + // provided string and an underscore ("_"). + Namespace string + // If true, any error encountered during collection is reported as an + // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored + // and the collected metrics will be incomplete. (Possibly, no metrics + // will be collected at all.) While that's usually not desired, it is + // appropriate for the common "mix-in" of process metrics, where process + // metrics are nice to have, but failing to collect them should not + // disrupt the collection of the remaining metrics. + ReportErrors bool +} + +// NewProcessCollector returns a collector which exports the current state of +// process metrics including CPU, memory and file descriptor usage as well as +// the process start time. The detailed behavior is defined by the provided +// ProcessCollectorOpts. The zero value of ProcessCollectorOpts creates a +// collector for the current process with an empty namespace string and no error +// reporting. +// +// Currently, the collector depends on a Linux-style proc filesystem and +// therefore only exports metrics for Linux. +// +// Note: An older version of this function had the following signature: +// +// NewProcessCollector(pid int, namespace string) Collector +// +// Most commonly, it was called as +// +// NewProcessCollector(os.Getpid(), "") +// +// The following call of the current version is equivalent to the above: +// +// NewProcessCollector(ProcessCollectorOpts{}) +func NewProcessCollector(opts ProcessCollectorOpts) Collector { + ns := "" + if len(opts.Namespace) > 0 { + ns = opts.Namespace + "_" + } + + c := &processCollector{ + reportErrors: opts.ReportErrors, + cpuTotal: NewDesc( + ns+"process_cpu_seconds_total", + "Total user and system CPU time spent in seconds.", + nil, nil, + ), + openFDs: NewDesc( + ns+"process_open_fds", + "Number of open file descriptors.", + nil, nil, + ), + maxFDs: NewDesc( + ns+"process_max_fds", + "Maximum number of open file descriptors.", + nil, nil, + ), + vsize: NewDesc( + ns+"process_virtual_memory_bytes", + "Virtual memory size in bytes.", + nil, nil, + ), + maxVsize: NewDesc( + ns+"process_virtual_memory_max_bytes", + "Maximum amount of virtual memory available in bytes.", + nil, nil, + ), + rss: NewDesc( + ns+"process_resident_memory_bytes", + "Resident memory size in bytes.", + nil, nil, + ), + startTime: NewDesc( + ns+"process_start_time_seconds", + "Start time of the process since unix epoch in seconds.", + nil, nil, + ), + } + + if opts.PidFn == nil { + pid := os.Getpid() + c.pidFn = func() (int, error) { return pid, nil } + } else { + c.pidFn = opts.PidFn + } + + // Set up process metric collection if supported by the runtime. + if _, err := procfs.NewStat(); err == nil { + c.collectFn = c.processCollect + } else { + c.collectFn = func(ch chan<- Metric) { + c.reportError(ch, nil, errors.New("process metrics not supported on this platform")) + } + } + + return c +} + +// Describe returns all descriptions of the collector. +func (c *processCollector) Describe(ch chan<- *Desc) { + ch <- c.cpuTotal + ch <- c.openFDs + ch <- c.maxFDs + ch <- c.vsize + ch <- c.maxVsize + ch <- c.rss + ch <- c.startTime +} + +// Collect returns the current state of all metrics of the collector. +func (c *processCollector) Collect(ch chan<- Metric) { + c.collectFn(ch) +} + +func (c *processCollector) processCollect(ch chan<- Metric) { + pid, err := c.pidFn() + if err != nil { + c.reportError(ch, nil, err) + return + } + + p, err := procfs.NewProc(pid) + if err != nil { + c.reportError(ch, nil, err) + return + } + + if stat, err := p.NewStat(); err == nil { + ch <- MustNewConstMetric(c.cpuTotal, CounterValue, stat.CPUTime()) + ch <- MustNewConstMetric(c.vsize, GaugeValue, float64(stat.VirtualMemory())) + ch <- MustNewConstMetric(c.rss, GaugeValue, float64(stat.ResidentMemory())) + if startTime, err := stat.StartTime(); err == nil { + ch <- MustNewConstMetric(c.startTime, GaugeValue, startTime) + } else { + c.reportError(ch, c.startTime, err) + } + } else { + c.reportError(ch, nil, err) + } + + if fds, err := p.FileDescriptorsLen(); err == nil { + ch <- MustNewConstMetric(c.openFDs, GaugeValue, float64(fds)) + } else { + c.reportError(ch, c.openFDs, err) + } + + if limits, err := p.NewLimits(); err == nil { + ch <- MustNewConstMetric(c.maxFDs, GaugeValue, float64(limits.OpenFiles)) + ch <- MustNewConstMetric(c.maxVsize, GaugeValue, float64(limits.AddressSpace)) + } else { + c.reportError(ch, nil, err) + } +} + +func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, err error) { + if !c.reportErrors { + return + } + if desc == nil { + desc = NewInvalidDesc(err) + } + ch <- NewInvalidMetric(desc, err) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go new file mode 100644 index 000000000000..67b56d37cfd7 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go @@ -0,0 +1,199 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package promhttp + +import ( + "bufio" + "io" + "net" + "net/http" +) + +const ( + closeNotifier = 1 << iota + flusher + hijacker + readerFrom + pusher +) + +type delegator interface { + http.ResponseWriter + + Status() int + Written() int64 +} + +type responseWriterDelegator struct { + http.ResponseWriter + + handler, method string + status int + written int64 + wroteHeader bool + observeWriteHeader func(int) +} + +func (r *responseWriterDelegator) Status() int { + return r.status +} + +func (r *responseWriterDelegator) Written() int64 { + return r.written +} + +func (r *responseWriterDelegator) WriteHeader(code int) { + r.status = code + r.wroteHeader = true + r.ResponseWriter.WriteHeader(code) + if r.observeWriteHeader != nil { + r.observeWriteHeader(code) + } +} + +func (r *responseWriterDelegator) Write(b []byte) (int, error) { + if !r.wroteHeader { + r.WriteHeader(http.StatusOK) + } + n, err := r.ResponseWriter.Write(b) + r.written += int64(n) + return n, err +} + +type closeNotifierDelegator struct{ *responseWriterDelegator } +type flusherDelegator struct{ *responseWriterDelegator } +type hijackerDelegator struct{ *responseWriterDelegator } +type readerFromDelegator struct{ *responseWriterDelegator } + +func (d closeNotifierDelegator) CloseNotify() <-chan bool { + return d.ResponseWriter.(http.CloseNotifier).CloseNotify() +} +func (d flusherDelegator) Flush() { + d.ResponseWriter.(http.Flusher).Flush() +} +func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, error) { + return d.ResponseWriter.(http.Hijacker).Hijack() +} +func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) { + if !d.wroteHeader { + d.WriteHeader(http.StatusOK) + } + n, err := d.ResponseWriter.(io.ReaderFrom).ReadFrom(re) + d.written += n + return n, err +} + +var pickDelegator = make([]func(*responseWriterDelegator) delegator, 32) + +func init() { + // TODO(beorn7): Code generation would help here. + pickDelegator[0] = func(d *responseWriterDelegator) delegator { // 0 + return d + } + pickDelegator[closeNotifier] = func(d *responseWriterDelegator) delegator { // 1 + return closeNotifierDelegator{d} + } + pickDelegator[flusher] = func(d *responseWriterDelegator) delegator { // 2 + return flusherDelegator{d} + } + pickDelegator[flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 3 + return struct { + *responseWriterDelegator + http.Flusher + http.CloseNotifier + }{d, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[hijacker] = func(d *responseWriterDelegator) delegator { // 4 + return hijackerDelegator{d} + } + pickDelegator[hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 5 + return struct { + *responseWriterDelegator + http.Hijacker + http.CloseNotifier + }{d, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 6 + return struct { + *responseWriterDelegator + http.Hijacker + http.Flusher + }{d, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 7 + return struct { + *responseWriterDelegator + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[readerFrom] = func(d *responseWriterDelegator) delegator { // 8 + return readerFromDelegator{d} + } + pickDelegator[readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 9 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.CloseNotifier + }{d, readerFromDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 10 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Flusher + }{d, readerFromDelegator{d}, flusherDelegator{d}} + } + pickDelegator[readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 11 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Flusher + http.CloseNotifier + }{d, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 12 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Hijacker + }{d, readerFromDelegator{d}, hijackerDelegator{d}} + } + pickDelegator[readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 13 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Hijacker + http.CloseNotifier + }{d, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 14 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Hijacker + http.Flusher + }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 15 + return struct { + *responseWriterDelegator + io.ReaderFrom + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go new file mode 100644 index 000000000000..31a70695695c --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_1_8.go @@ -0,0 +1,181 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.8 + +package promhttp + +import ( + "io" + "net/http" +) + +type pusherDelegator struct{ *responseWriterDelegator } + +func (d pusherDelegator) Push(target string, opts *http.PushOptions) error { + return d.ResponseWriter.(http.Pusher).Push(target, opts) +} + +func init() { + pickDelegator[pusher] = func(d *responseWriterDelegator) delegator { // 16 + return pusherDelegator{d} + } + pickDelegator[pusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 17 + return struct { + *responseWriterDelegator + http.Pusher + http.CloseNotifier + }{d, pusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+flusher] = func(d *responseWriterDelegator) delegator { // 18 + return struct { + *responseWriterDelegator + http.Pusher + http.Flusher + }{d, pusherDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 19 + return struct { + *responseWriterDelegator + http.Pusher + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+hijacker] = func(d *responseWriterDelegator) delegator { // 20 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + }{d, pusherDelegator{d}, hijackerDelegator{d}} + } + pickDelegator[pusher+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 21 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.CloseNotifier + }{d, pusherDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 22 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.Flusher + }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { //23 + return struct { + *responseWriterDelegator + http.Pusher + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom] = func(d *responseWriterDelegator) delegator { // 24 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + }{d, pusherDelegator{d}, readerFromDelegator{d}} + } + pickDelegator[pusher+readerFrom+closeNotifier] = func(d *responseWriterDelegator) delegator { // 25 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+flusher] = func(d *responseWriterDelegator) delegator { // 26 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Flusher + }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+readerFrom+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 27 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker] = func(d *responseWriterDelegator) delegator { // 28 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+closeNotifier] = func(d *responseWriterDelegator) delegator { // 29 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, closeNotifierDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+flusher] = func(d *responseWriterDelegator) delegator { // 30 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.Flusher + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}} + } + pickDelegator[pusher+readerFrom+hijacker+flusher+closeNotifier] = func(d *responseWriterDelegator) delegator { // 31 + return struct { + *responseWriterDelegator + http.Pusher + io.ReaderFrom + http.Hijacker + http.Flusher + http.CloseNotifier + }{d, pusherDelegator{d}, readerFromDelegator{d}, hijackerDelegator{d}, flusherDelegator{d}, closeNotifierDelegator{d}} + } +} + +func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { + d := &responseWriterDelegator{ + ResponseWriter: w, + observeWriteHeader: observeWriteHeaderFunc, + } + + id := 0 + if _, ok := w.(http.CloseNotifier); ok { + id += closeNotifier + } + if _, ok := w.(http.Flusher); ok { + id += flusher + } + if _, ok := w.(http.Hijacker); ok { + id += hijacker + } + if _, ok := w.(io.ReaderFrom); ok { + id += readerFrom + } + if _, ok := w.(http.Pusher); ok { + id += pusher + } + + return pickDelegator[id](d) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go new file mode 100644 index 000000000000..8bb9b8b68f8b --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator_pre_1_8.go @@ -0,0 +1,44 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !go1.8 + +package promhttp + +import ( + "io" + "net/http" +) + +func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int)) delegator { + d := &responseWriterDelegator{ + ResponseWriter: w, + observeWriteHeader: observeWriteHeaderFunc, + } + + id := 0 + if _, ok := w.(http.CloseNotifier); ok { + id += closeNotifier + } + if _, ok := w.(http.Flusher); ok { + id += flusher + } + if _, ok := w.(http.Hijacker); ok { + id += hijacker + } + if _, ok := w.(io.ReaderFrom); ok { + id += readerFrom + } + + return pickDelegator[id](d) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go new file mode 100644 index 000000000000..01357374feb1 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -0,0 +1,311 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package promhttp provides tooling around HTTP servers and clients. +// +// First, the package allows the creation of http.Handler instances to expose +// Prometheus metrics via HTTP. promhttp.Handler acts on the +// prometheus.DefaultGatherer. With HandlerFor, you can create a handler for a +// custom registry or anything that implements the Gatherer interface. It also +// allows the creation of handlers that act differently on errors or allow to +// log errors. +// +// Second, the package provides tooling to instrument instances of http.Handler +// via middleware. Middleware wrappers follow the naming scheme +// InstrumentHandlerX, where X describes the intended use of the middleware. +// See each function's doc comment for specific details. +// +// Finally, the package allows for an http.RoundTripper to be instrumented via +// middleware. Middleware wrappers follow the naming scheme +// InstrumentRoundTripperX, where X describes the intended use of the +// middleware. See each function's doc comment for specific details. +package promhttp + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "net/http" + "strings" + "sync" + "time" + + "github.com/prometheus/common/expfmt" + + "github.com/prometheus/client_golang/prometheus" +) + +const ( + contentTypeHeader = "Content-Type" + contentLengthHeader = "Content-Length" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" +) + +var bufPool sync.Pool + +func getBuf() *bytes.Buffer { + buf := bufPool.Get() + if buf == nil { + return &bytes.Buffer{} + } + return buf.(*bytes.Buffer) +} + +func giveBuf(buf *bytes.Buffer) { + buf.Reset() + bufPool.Put(buf) +} + +// Handler returns an http.Handler for the prometheus.DefaultGatherer, using +// default HandlerOpts, i.e. it reports the first error as an HTTP error, it has +// no error logging, and it applies compression if requested by the client. +// +// The returned http.Handler is already instrumented using the +// InstrumentMetricHandler function and the prometheus.DefaultRegisterer. If you +// create multiple http.Handlers by separate calls of the Handler function, the +// metrics used for instrumentation will be shared between them, providing +// global scrape counts. +// +// This function is meant to cover the bulk of basic use cases. If you are doing +// anything that requires more customization (including using a non-default +// Gatherer, different instrumentation, and non-default HandlerOpts), use the +// HandlerFor function. See there for details. +func Handler() http.Handler { + return InstrumentMetricHandler( + prometheus.DefaultRegisterer, HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}), + ) +} + +// HandlerFor returns an uninstrumented http.Handler for the provided +// Gatherer. The behavior of the Handler is defined by the provided +// HandlerOpts. Thus, HandlerFor is useful to create http.Handlers for custom +// Gatherers, with non-default HandlerOpts, and/or with custom (or no) +// instrumentation. Use the InstrumentMetricHandler function to apply the same +// kind of instrumentation as it is used by the Handler function. +func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler { + var inFlightSem chan struct{} + if opts.MaxRequestsInFlight > 0 { + inFlightSem = make(chan struct{}, opts.MaxRequestsInFlight) + } + + h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if inFlightSem != nil { + select { + case inFlightSem <- struct{}{}: // All good, carry on. + defer func() { <-inFlightSem }() + default: + http.Error(w, fmt.Sprintf( + "Limit of concurrent requests reached (%d), try again later.", opts.MaxRequestsInFlight, + ), http.StatusServiceUnavailable) + return + } + } + + mfs, err := reg.Gather() + if err != nil { + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error gathering metrics:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + if len(mfs) == 0 { + http.Error(w, "No metrics gathered, last error:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics gathering:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + + contentType := expfmt.Negotiate(req.Header) + buf := getBuf() + defer giveBuf(buf) + writer, encoding := decorateWriter(req, buf, opts.DisableCompression) + enc := expfmt.NewEncoder(writer, contentType) + var lastErr error + for _, mf := range mfs { + if err := enc.Encode(mf); err != nil { + lastErr = err + if opts.ErrorLog != nil { + opts.ErrorLog.Println("error encoding metric family:", err) + } + switch opts.ErrorHandling { + case PanicOnError: + panic(err) + case ContinueOnError: + // Handled later. + case HTTPErrorOnError: + http.Error(w, "An error has occurred during metrics encoding:\n\n"+err.Error(), http.StatusInternalServerError) + return + } + } + } + if closer, ok := writer.(io.Closer); ok { + closer.Close() + } + if lastErr != nil && buf.Len() == 0 { + http.Error(w, "No metrics encoded, last error:\n\n"+lastErr.Error(), http.StatusInternalServerError) + return + } + header := w.Header() + header.Set(contentTypeHeader, string(contentType)) + header.Set(contentLengthHeader, fmt.Sprint(buf.Len())) + if encoding != "" { + header.Set(contentEncodingHeader, encoding) + } + if _, err := w.Write(buf.Bytes()); err != nil && opts.ErrorLog != nil { + opts.ErrorLog.Println("error while sending encoded metrics:", err) + } + // TODO(beorn7): Consider streaming serving of metrics. + }) + + if opts.Timeout <= 0 { + return h + } + return http.TimeoutHandler(h, opts.Timeout, fmt.Sprintf( + "Exceeded configured timeout of %v.\n", + opts.Timeout, + )) +} + +// InstrumentMetricHandler is usually used with an http.Handler returned by the +// HandlerFor function. It instruments the provided http.Handler with two +// metrics: A counter vector "promhttp_metric_handler_requests_total" to count +// scrapes partitioned by HTTP status code, and a gauge +// "promhttp_metric_handler_requests_in_flight" to track the number of +// simultaneous scrapes. This function idempotently registers collectors for +// both metrics with the provided Registerer. It panics if the registration +// fails. The provided metrics are useful to see how many scrapes hit the +// monitored target (which could be from different Prometheus servers or other +// scrapers), and how often they overlap (which would result in more than one +// scrape in flight at the same time). Note that the scrapes-in-flight gauge +// will contain the scrape by which it is exposed, while the scrape counter will +// only get incremented after the scrape is complete (as only then the status +// code is known). For tracking scrape durations, use the +// "scrape_duration_seconds" gauge created by the Prometheus server upon each +// scrape. +func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Handler) http.Handler { + cnt := prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "promhttp_metric_handler_requests_total", + Help: "Total number of scrapes by HTTP status code.", + }, + []string{"code"}, + ) + // Initialize the most likely HTTP status codes. + cnt.WithLabelValues("200") + cnt.WithLabelValues("500") + cnt.WithLabelValues("503") + if err := reg.Register(cnt); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + cnt = are.ExistingCollector.(*prometheus.CounterVec) + } else { + panic(err) + } + } + + gge := prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "promhttp_metric_handler_requests_in_flight", + Help: "Current number of scrapes being served.", + }) + if err := reg.Register(gge); err != nil { + if are, ok := err.(prometheus.AlreadyRegisteredError); ok { + gge = are.ExistingCollector.(prometheus.Gauge) + } else { + panic(err) + } + } + + return InstrumentHandlerCounter(cnt, InstrumentHandlerInFlight(gge, handler)) +} + +// HandlerErrorHandling defines how a Handler serving metrics will handle +// errors. +type HandlerErrorHandling int + +// These constants cause handlers serving metrics to behave as described if +// errors are encountered. +const ( + // Serve an HTTP status code 500 upon the first error + // encountered. Report the error message in the body. + HTTPErrorOnError HandlerErrorHandling = iota + // Ignore errors and try to serve as many metrics as possible. However, + // if no metrics can be served, serve an HTTP status code 500 and the + // last error message in the body. Only use this in deliberate "best + // effort" metrics collection scenarios. It is recommended to at least + // log errors (by providing an ErrorLog in HandlerOpts) to not mask + // errors completely. + ContinueOnError + // Panic upon the first error encountered (useful for "crash only" apps). + PanicOnError +) + +// Logger is the minimal interface HandlerOpts needs for logging. Note that +// log.Logger from the standard library implements this interface, and it is +// easy to implement by custom loggers, if they don't do so already anyway. +type Logger interface { + Println(v ...interface{}) +} + +// HandlerOpts specifies options how to serve metrics via an http.Handler. The +// zero value of HandlerOpts is a reasonable default. +type HandlerOpts struct { + // ErrorLog specifies an optional logger for errors collecting and + // serving metrics. If nil, errors are not logged at all. + ErrorLog Logger + // ErrorHandling defines how errors are handled. Note that errors are + // logged regardless of the configured ErrorHandling provided ErrorLog + // is not nil. + ErrorHandling HandlerErrorHandling + // If DisableCompression is true, the handler will never compress the + // response, even if requested by the client. + DisableCompression bool + // The number of concurrent HTTP requests is limited to + // MaxRequestsInFlight. Additional requests are responded to with 503 + // Service Unavailable and a suitable message in the body. If + // MaxRequestsInFlight is 0 or negative, no limit is applied. + MaxRequestsInFlight int + // If handling a request takes longer than Timeout, it is responded to + // with 503 ServiceUnavailable and a suitable Message. No timeout is + // applied if Timeout is 0 or negative. Note that with the current + // implementation, reaching the timeout simply ends the HTTP requests as + // described above (and even that only if sending of the body hasn't + // started yet), while the bulk work of gathering all the metrics keeps + // running in the background (with the eventual result to be thrown + // away). Until the implementation is improved, it is recommended to + // implement a separate timeout in potentially slow Collectors. + Timeout time.Duration +} + +// decorateWriter wraps a writer to handle gzip compression if requested. It +// returns the decorated writer and the appropriate "Content-Encoding" header +// (which is empty if no compression is enabled). +func decorateWriter(request *http.Request, writer io.Writer, compressionDisabled bool) (io.Writer, string) { + if compressionDisabled { + return writer, "" + } + header := request.Header.Get(acceptEncodingHeader) + parts := strings.Split(header, ",") + for _, part := range parts { + part = strings.TrimSpace(part) + if part == "gzip" || strings.HasPrefix(part, "gzip;") { + return gzip.NewWriter(writer), "gzip" + } + } + return writer, "" +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go new file mode 100644 index 000000000000..86fd564470f8 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go @@ -0,0 +1,97 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package promhttp + +import ( + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +// The RoundTripperFunc type is an adapter to allow the use of ordinary +// functions as RoundTrippers. If f is a function with the appropriate +// signature, RountTripperFunc(f) is a RoundTripper that calls f. +type RoundTripperFunc func(req *http.Request) (*http.Response, error) + +// RoundTrip implements the RoundTripper interface. +func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { + return rt(r) +} + +// InstrumentRoundTripperInFlight is a middleware that wraps the provided +// http.RoundTripper. It sets the provided prometheus.Gauge to the number of +// requests currently handled by the wrapped http.RoundTripper. +// +// See the example for ExampleInstrumentRoundTripperDuration for example usage. +func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.RoundTripper) RoundTripperFunc { + return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + gauge.Inc() + defer gauge.Dec() + return next.RoundTrip(r) + }) +} + +// InstrumentRoundTripperCounter is a middleware that wraps the provided +// http.RoundTripper to observe the request result with the provided CounterVec. +// The CounterVec must have zero, one, or two non-const non-curried labels. For +// those, the only allowed label names are "code" and "method". The function +// panics otherwise. Partitioning of the CounterVec happens by HTTP status code +// and/or HTTP method if the respective instance label names are present in the +// CounterVec. For unpartitioned counting, use a CounterVec with zero labels. +// +// If the wrapped RoundTripper panics or returns a non-nil error, the Counter +// is not incremented. +// +// See the example for ExampleInstrumentRoundTripperDuration for example usage. +func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.RoundTripper) RoundTripperFunc { + code, method := checkLabels(counter) + + return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + resp, err := next.RoundTrip(r) + if err == nil { + counter.With(labels(code, method, r.Method, resp.StatusCode)).Inc() + } + return resp, err + }) +} + +// InstrumentRoundTripperDuration is a middleware that wraps the provided +// http.RoundTripper to observe the request duration with the provided +// ObserverVec. The ObserverVec must have zero, one, or two non-const +// non-curried labels. For those, the only allowed label names are "code" and +// "method". The function panics otherwise. The Observe method of the Observer +// in the ObserverVec is called with the request duration in +// seconds. Partitioning happens by HTTP status code and/or HTTP method if the +// respective instance label names are present in the ObserverVec. For +// unpartitioned observations, use an ObserverVec with zero labels. Note that +// partitioning of Histograms is expensive and should be used judiciously. +// +// If the wrapped RoundTripper panics or returns a non-nil error, no values are +// reported. +// +// Note that this method is only guaranteed to never observe negative durations +// if used with Go1.9+. +func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundTripper) RoundTripperFunc { + code, method := checkLabels(obs) + + return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + start := time.Now() + resp, err := next.RoundTrip(r) + if err == nil { + obs.With(labels(code, method, r.Method, resp.StatusCode)).Observe(time.Since(start).Seconds()) + } + return resp, err + }) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go new file mode 100644 index 000000000000..a034d1ec0f18 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client_1_8.go @@ -0,0 +1,144 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build go1.8 + +package promhttp + +import ( + "context" + "crypto/tls" + "net/http" + "net/http/httptrace" + "time" +) + +// InstrumentTrace is used to offer flexibility in instrumenting the available +// httptrace.ClientTrace hook functions. Each function is passed a float64 +// representing the time in seconds since the start of the http request. A user +// may choose to use separately buckets Histograms, or implement custom +// instance labels on a per function basis. +type InstrumentTrace struct { + GotConn func(float64) + PutIdleConn func(float64) + GotFirstResponseByte func(float64) + Got100Continue func(float64) + DNSStart func(float64) + DNSDone func(float64) + ConnectStart func(float64) + ConnectDone func(float64) + TLSHandshakeStart func(float64) + TLSHandshakeDone func(float64) + WroteHeaders func(float64) + Wait100Continue func(float64) + WroteRequest func(float64) +} + +// InstrumentRoundTripperTrace is a middleware that wraps the provided +// RoundTripper and reports times to hook functions provided in the +// InstrumentTrace struct. Hook functions that are not present in the provided +// InstrumentTrace struct are ignored. Times reported to the hook functions are +// time since the start of the request. Only with Go1.9+, those times are +// guaranteed to never be negative. (Earlier Go versions are not using a +// monotonic clock.) Note that partitioning of Histograms is expensive and +// should be used judiciously. +// +// For hook functions that receive an error as an argument, no observations are +// made in the event of a non-nil error value. +// +// See the example for ExampleInstrumentRoundTripperDuration for example usage. +func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTripper) RoundTripperFunc { + return RoundTripperFunc(func(r *http.Request) (*http.Response, error) { + start := time.Now() + + trace := &httptrace.ClientTrace{ + GotConn: func(_ httptrace.GotConnInfo) { + if it.GotConn != nil { + it.GotConn(time.Since(start).Seconds()) + } + }, + PutIdleConn: func(err error) { + if err != nil { + return + } + if it.PutIdleConn != nil { + it.PutIdleConn(time.Since(start).Seconds()) + } + }, + DNSStart: func(_ httptrace.DNSStartInfo) { + if it.DNSStart != nil { + it.DNSStart(time.Since(start).Seconds()) + } + }, + DNSDone: func(_ httptrace.DNSDoneInfo) { + if it.DNSDone != nil { + it.DNSDone(time.Since(start).Seconds()) + } + }, + ConnectStart: func(_, _ string) { + if it.ConnectStart != nil { + it.ConnectStart(time.Since(start).Seconds()) + } + }, + ConnectDone: func(_, _ string, err error) { + if err != nil { + return + } + if it.ConnectDone != nil { + it.ConnectDone(time.Since(start).Seconds()) + } + }, + GotFirstResponseByte: func() { + if it.GotFirstResponseByte != nil { + it.GotFirstResponseByte(time.Since(start).Seconds()) + } + }, + Got100Continue: func() { + if it.Got100Continue != nil { + it.Got100Continue(time.Since(start).Seconds()) + } + }, + TLSHandshakeStart: func() { + if it.TLSHandshakeStart != nil { + it.TLSHandshakeStart(time.Since(start).Seconds()) + } + }, + TLSHandshakeDone: func(_ tls.ConnectionState, err error) { + if err != nil { + return + } + if it.TLSHandshakeDone != nil { + it.TLSHandshakeDone(time.Since(start).Seconds()) + } + }, + WroteHeaders: func() { + if it.WroteHeaders != nil { + it.WroteHeaders(time.Since(start).Seconds()) + } + }, + Wait100Continue: func() { + if it.Wait100Continue != nil { + it.Wait100Continue(time.Since(start).Seconds()) + } + }, + WroteRequest: func(_ httptrace.WroteRequestInfo) { + if it.WroteRequest != nil { + it.WroteRequest(time.Since(start).Seconds()) + } + }, + } + r = r.WithContext(httptrace.WithClientTrace(context.Background(), trace)) + + return next.RoundTrip(r) + }) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go new file mode 100644 index 000000000000..9db24380533a --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -0,0 +1,447 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package promhttp + +import ( + "errors" + "net/http" + "strconv" + "strings" + "time" + + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus" +) + +// magicString is used for the hacky label test in checkLabels. Remove once fixed. +const magicString = "zZgWfBxLqvG8kc8IMv3POi2Bb0tZI3vAnBx+gBaFi9FyPzB/CzKUer1yufDa" + +// InstrumentHandlerInFlight is a middleware that wraps the provided +// http.Handler. It sets the provided prometheus.Gauge to the number of +// requests currently handled by the wrapped http.Handler. +// +// See the example for InstrumentHandlerDuration for example usage. +func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + g.Inc() + defer g.Dec() + next.ServeHTTP(w, r) + }) +} + +// InstrumentHandlerDuration is a middleware that wraps the provided +// http.Handler to observe the request duration with the provided ObserverVec. +// The ObserverVec must have zero, one, or two non-const non-curried labels. For +// those, the only allowed label names are "code" and "method". The function +// panics otherwise. The Observe method of the Observer in the ObserverVec is +// called with the request duration in seconds. Partitioning happens by HTTP +// status code and/or HTTP method if the respective instance label names are +// present in the ObserverVec. For unpartitioned observations, use an +// ObserverVec with zero labels. Note that partitioning of Histograms is +// expensive and should be used judiciously. +// +// If the wrapped Handler does not set a status code, a status code of 200 is assumed. +// +// If the wrapped Handler panics, no values are reported. +// +// Note that this method is only guaranteed to never observe negative durations +// if used with Go1.9+. +func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { + code, method := checkLabels(obs) + + if code { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + d := newDelegator(w, nil) + next.ServeHTTP(d, r) + + obs.With(labels(code, method, r.Method, d.Status())).Observe(time.Since(now).Seconds()) + }) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + next.ServeHTTP(w, r) + obs.With(labels(code, method, r.Method, 0)).Observe(time.Since(now).Seconds()) + }) +} + +// InstrumentHandlerCounter is a middleware that wraps the provided http.Handler +// to observe the request result with the provided CounterVec. The CounterVec +// must have zero, one, or two non-const non-curried labels. For those, the only +// allowed label names are "code" and "method". The function panics +// otherwise. Partitioning of the CounterVec happens by HTTP status code and/or +// HTTP method if the respective instance label names are present in the +// CounterVec. For unpartitioned counting, use a CounterVec with zero labels. +// +// If the wrapped Handler does not set a status code, a status code of 200 is assumed. +// +// If the wrapped Handler panics, the Counter is not incremented. +// +// See the example for InstrumentHandlerDuration for example usage. +func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler) http.HandlerFunc { + code, method := checkLabels(counter) + + if code { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + d := newDelegator(w, nil) + next.ServeHTTP(d, r) + counter.With(labels(code, method, r.Method, d.Status())).Inc() + }) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r) + counter.With(labels(code, method, r.Method, 0)).Inc() + }) +} + +// InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided +// http.Handler to observe with the provided ObserverVec the request duration +// until the response headers are written. The ObserverVec must have zero, one, +// or two non-const non-curried labels. For those, the only allowed label names +// are "code" and "method". The function panics otherwise. The Observe method of +// the Observer in the ObserverVec is called with the request duration in +// seconds. Partitioning happens by HTTP status code and/or HTTP method if the +// respective instance label names are present in the ObserverVec. For +// unpartitioned observations, use an ObserverVec with zero labels. Note that +// partitioning of Histograms is expensive and should be used judiciously. +// +// If the wrapped Handler panics before calling WriteHeader, no value is +// reported. +// +// Note that this method is only guaranteed to never observe negative durations +// if used with Go1.9+. +// +// See the example for InstrumentHandlerDuration for example usage. +func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { + code, method := checkLabels(obs) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + now := time.Now() + d := newDelegator(w, func(status int) { + obs.With(labels(code, method, r.Method, status)).Observe(time.Since(now).Seconds()) + }) + next.ServeHTTP(d, r) + }) +} + +// InstrumentHandlerRequestSize is a middleware that wraps the provided +// http.Handler to observe the request size with the provided ObserverVec. The +// ObserverVec must have zero, one, or two non-const non-curried labels. For +// those, the only allowed label names are "code" and "method". The function +// panics otherwise. The Observe method of the Observer in the ObserverVec is +// called with the request size in bytes. Partitioning happens by HTTP status +// code and/or HTTP method if the respective instance label names are present in +// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero +// labels. Note that partitioning of Histograms is expensive and should be used +// judiciously. +// +// If the wrapped Handler does not set a status code, a status code of 200 is assumed. +// +// If the wrapped Handler panics, no values are reported. +// +// See the example for InstrumentHandlerDuration for example usage. +func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc { + code, method := checkLabels(obs) + + if code { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + d := newDelegator(w, nil) + next.ServeHTTP(d, r) + size := computeApproximateRequestSize(r) + obs.With(labels(code, method, r.Method, d.Status())).Observe(float64(size)) + }) + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r) + size := computeApproximateRequestSize(r) + obs.With(labels(code, method, r.Method, 0)).Observe(float64(size)) + }) +} + +// InstrumentHandlerResponseSize is a middleware that wraps the provided +// http.Handler to observe the response size with the provided ObserverVec. The +// ObserverVec must have zero, one, or two non-const non-curried labels. For +// those, the only allowed label names are "code" and "method". The function +// panics otherwise. The Observe method of the Observer in the ObserverVec is +// called with the response size in bytes. Partitioning happens by HTTP status +// code and/or HTTP method if the respective instance label names are present in +// the ObserverVec. For unpartitioned observations, use an ObserverVec with zero +// labels. Note that partitioning of Histograms is expensive and should be used +// judiciously. +// +// If the wrapped Handler does not set a status code, a status code of 200 is assumed. +// +// If the wrapped Handler panics, no values are reported. +// +// See the example for InstrumentHandlerDuration for example usage. +func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler) http.Handler { + code, method := checkLabels(obs) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + d := newDelegator(w, nil) + next.ServeHTTP(d, r) + obs.With(labels(code, method, r.Method, d.Status())).Observe(float64(d.Written())) + }) +} + +func checkLabels(c prometheus.Collector) (code bool, method bool) { + // TODO(beorn7): Remove this hacky way to check for instance labels + // once Descriptors can have their dimensionality queried. + var ( + desc *prometheus.Desc + m prometheus.Metric + pm dto.Metric + lvs []string + ) + + // Get the Desc from the Collector. + descc := make(chan *prometheus.Desc, 1) + c.Describe(descc) + + select { + case desc = <-descc: + default: + panic("no description provided by collector") + } + select { + case <-descc: + panic("more than one description provided by collector") + default: + } + + close(descc) + + // Create a ConstMetric with the Desc. Since we don't know how many + // variable labels there are, try for as long as it needs. + for err := errors.New("dummy"); err != nil; lvs = append(lvs, magicString) { + m, err = prometheus.NewConstMetric(desc, prometheus.UntypedValue, 0, lvs...) + } + + // Write out the metric into a proto message and look at the labels. + // If the value is not the magicString, it is a constLabel, which doesn't interest us. + // If the label is curried, it doesn't interest us. + // In all other cases, only "code" or "method" is allowed. + if err := m.Write(&pm); err != nil { + panic("error checking metric for labels") + } + for _, label := range pm.Label { + name, value := label.GetName(), label.GetValue() + if value != magicString || isLabelCurried(c, name) { + continue + } + switch name { + case "code": + code = true + case "method": + method = true + default: + panic("metric partitioned with non-supported labels") + } + } + return +} + +func isLabelCurried(c prometheus.Collector, label string) bool { + // This is even hackier than the label test above. + // We essentially try to curry again and see if it works. + // But for that, we need to type-convert to the two + // types we use here, ObserverVec or *CounterVec. + switch v := c.(type) { + case *prometheus.CounterVec: + if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { + return false + } + case prometheus.ObserverVec: + if _, err := v.CurryWith(prometheus.Labels{label: "dummy"}); err == nil { + return false + } + default: + panic("unsupported metric vec type") + } + return true +} + +// emptyLabels is a one-time allocation for non-partitioned metrics to avoid +// unnecessary allocations on each request. +var emptyLabels = prometheus.Labels{} + +func labels(code, method bool, reqMethod string, status int) prometheus.Labels { + if !(code || method) { + return emptyLabels + } + labels := prometheus.Labels{} + + if code { + labels["code"] = sanitizeCode(status) + } + if method { + labels["method"] = sanitizeMethod(reqMethod) + } + + return labels +} + +func computeApproximateRequestSize(r *http.Request) int { + s := 0 + if r.URL != nil { + s += len(r.URL.String()) + } + + s += len(r.Method) + s += len(r.Proto) + for name, values := range r.Header { + s += len(name) + for _, value := range values { + s += len(value) + } + } + s += len(r.Host) + + // N.B. r.Form and r.MultipartForm are assumed to be included in r.URL. + + if r.ContentLength != -1 { + s += int(r.ContentLength) + } + return s +} + +func sanitizeMethod(m string) string { + switch m { + case "GET", "get": + return "get" + case "PUT", "put": + return "put" + case "HEAD", "head": + return "head" + case "POST", "post": + return "post" + case "DELETE", "delete": + return "delete" + case "CONNECT", "connect": + return "connect" + case "OPTIONS", "options": + return "options" + case "NOTIFY", "notify": + return "notify" + default: + return strings.ToLower(m) + } +} + +// If the wrapped http.Handler has not set a status code, i.e. the value is +// currently 0, santizeCode will return 200, for consistency with behavior in +// the stdlib. +func sanitizeCode(s int) string { + switch s { + case 100: + return "100" + case 101: + return "101" + + case 200, 0: + return "200" + case 201: + return "201" + case 202: + return "202" + case 203: + return "203" + case 204: + return "204" + case 205: + return "205" + case 206: + return "206" + + case 300: + return "300" + case 301: + return "301" + case 302: + return "302" + case 304: + return "304" + case 305: + return "305" + case 307: + return "307" + + case 400: + return "400" + case 401: + return "401" + case 402: + return "402" + case 403: + return "403" + case 404: + return "404" + case 405: + return "405" + case 406: + return "406" + case 407: + return "407" + case 408: + return "408" + case 409: + return "409" + case 410: + return "410" + case 411: + return "411" + case 412: + return "412" + case 413: + return "413" + case 414: + return "414" + case 415: + return "415" + case 416: + return "416" + case 417: + return "417" + case 418: + return "418" + + case 500: + return "500" + case 501: + return "501" + case 502: + return "502" + case 503: + return "503" + case 504: + return "504" + case 505: + return "505" + + case 428: + return "428" + case 429: + return "429" + case 431: + return "431" + case 511: + return "511" + + default: + return strconv.Itoa(s) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go new file mode 100644 index 000000000000..e422ef3834cd --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -0,0 +1,895 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "bytes" + "fmt" + "runtime" + "sort" + "strings" + "sync" + "unicode/utf8" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" + + "github.com/prometheus/client_golang/prometheus/internal" +) + +const ( + // Capacity for the channel to collect metrics and descriptors. + capMetricChan = 1000 + capDescChan = 10 +) + +// DefaultRegisterer and DefaultGatherer are the implementations of the +// Registerer and Gatherer interface a number of convenience functions in this +// package act on. Initially, both variables point to the same Registry, which +// has a process collector (currently on Linux only, see NewProcessCollector) +// and a Go collector (see NewGoCollector, in particular the note about +// stop-the-world implication with Go versions older than 1.9) already +// registered. This approach to keep default instances as global state mirrors +// the approach of other packages in the Go standard library. Note that there +// are caveats. Change the variables with caution and only if you understand the +// consequences. Users who want to avoid global state altogether should not use +// the convenience functions and act on custom instances instead. +var ( + defaultRegistry = NewRegistry() + DefaultRegisterer Registerer = defaultRegistry + DefaultGatherer Gatherer = defaultRegistry +) + +func init() { + MustRegister(NewProcessCollector(ProcessCollectorOpts{})) + MustRegister(NewGoCollector()) +} + +// NewRegistry creates a new vanilla Registry without any Collectors +// pre-registered. +func NewRegistry() *Registry { + return &Registry{ + collectorsByID: map[uint64]Collector{}, + descIDs: map[uint64]struct{}{}, + dimHashesByName: map[string]uint64{}, + } +} + +// NewPedanticRegistry returns a registry that checks during collection if each +// collected Metric is consistent with its reported Desc, and if the Desc has +// actually been registered with the registry. Unchecked Collectors (those whose +// Describe methed does not yield any descriptors) are excluded from the check. +// +// Usually, a Registry will be happy as long as the union of all collected +// Metrics is consistent and valid even if some metrics are not consistent with +// their own Desc or a Desc provided by their registered Collector. Well-behaved +// Collectors and Metrics will only provide consistent Descs. This Registry is +// useful to test the implementation of Collectors and Metrics. +func NewPedanticRegistry() *Registry { + r := NewRegistry() + r.pedanticChecksEnabled = true + return r +} + +// Registerer is the interface for the part of a registry in charge of +// registering and unregistering. Users of custom registries should use +// Registerer as type for registration purposes (rather than the Registry type +// directly). In that way, they are free to use custom Registerer implementation +// (e.g. for testing purposes). +type Registerer interface { + // Register registers a new Collector to be included in metrics + // collection. It returns an error if the descriptors provided by the + // Collector are invalid or if they — in combination with descriptors of + // already registered Collectors — do not fulfill the consistency and + // uniqueness criteria described in the documentation of metric.Desc. + // + // If the provided Collector is equal to a Collector already registered + // (which includes the case of re-registering the same Collector), the + // returned error is an instance of AlreadyRegisteredError, which + // contains the previously registered Collector. + // + // A Collector whose Describe method does not yield any Desc is treated + // as unchecked. Registration will always succeed. No check for + // re-registering (see previous paragraph) is performed. Thus, the + // caller is responsible for not double-registering the same unchecked + // Collector, and for providing a Collector that will not cause + // inconsistent metrics on collection. (This would lead to scrape + // errors.) + Register(Collector) error + // MustRegister works like Register but registers any number of + // Collectors and panics upon the first registration that causes an + // error. + MustRegister(...Collector) + // Unregister unregisters the Collector that equals the Collector passed + // in as an argument. (Two Collectors are considered equal if their + // Describe method yields the same set of descriptors.) The function + // returns whether a Collector was unregistered. Note that an unchecked + // Collector cannot be unregistered (as its Describe method does not + // yield any descriptor). + // + // Note that even after unregistering, it will not be possible to + // register a new Collector that is inconsistent with the unregistered + // Collector, e.g. a Collector collecting metrics with the same name but + // a different help string. The rationale here is that the same registry + // instance must only collect consistent metrics throughout its + // lifetime. + Unregister(Collector) bool +} + +// Gatherer is the interface for the part of a registry in charge of gathering +// the collected metrics into a number of MetricFamilies. The Gatherer interface +// comes with the same general implication as described for the Registerer +// interface. +type Gatherer interface { + // Gather calls the Collect method of the registered Collectors and then + // gathers the collected metrics into a lexicographically sorted slice + // of uniquely named MetricFamily protobufs. Gather ensures that the + // returned slice is valid and self-consistent so that it can be used + // for valid exposition. As an exception to the strict consistency + // requirements described for metric.Desc, Gather will tolerate + // different sets of label names for metrics of the same metric family. + // + // Even if an error occurs, Gather attempts to gather as many metrics as + // possible. Hence, if a non-nil error is returned, the returned + // MetricFamily slice could be nil (in case of a fatal error that + // prevented any meaningful metric collection) or contain a number of + // MetricFamily protobufs, some of which might be incomplete, and some + // might be missing altogether. The returned error (which might be a + // MultiError) explains the details. Note that this is mostly useful for + // debugging purposes. If the gathered protobufs are to be used for + // exposition in actual monitoring, it is almost always better to not + // expose an incomplete result and instead disregard the returned + // MetricFamily protobufs in case the returned error is non-nil. + Gather() ([]*dto.MetricFamily, error) +} + +// Register registers the provided Collector with the DefaultRegisterer. +// +// Register is a shortcut for DefaultRegisterer.Register(c). See there for more +// details. +func Register(c Collector) error { + return DefaultRegisterer.Register(c) +} + +// MustRegister registers the provided Collectors with the DefaultRegisterer and +// panics if any error occurs. +// +// MustRegister is a shortcut for DefaultRegisterer.MustRegister(cs...). See +// there for more details. +func MustRegister(cs ...Collector) { + DefaultRegisterer.MustRegister(cs...) +} + +// Unregister removes the registration of the provided Collector from the +// DefaultRegisterer. +// +// Unregister is a shortcut for DefaultRegisterer.Unregister(c). See there for +// more details. +func Unregister(c Collector) bool { + return DefaultRegisterer.Unregister(c) +} + +// GathererFunc turns a function into a Gatherer. +type GathererFunc func() ([]*dto.MetricFamily, error) + +// Gather implements Gatherer. +func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) { + return gf() +} + +// AlreadyRegisteredError is returned by the Register method if the Collector to +// be registered has already been registered before, or a different Collector +// that collects the same metrics has been registered before. Registration fails +// in that case, but you can detect from the kind of error what has +// happened. The error contains fields for the existing Collector and the +// (rejected) new Collector that equals the existing one. This can be used to +// find out if an equal Collector has been registered before and switch over to +// using the old one, as demonstrated in the example. +type AlreadyRegisteredError struct { + ExistingCollector, NewCollector Collector +} + +func (err AlreadyRegisteredError) Error() string { + return "duplicate metrics collector registration attempted" +} + +// MultiError is a slice of errors implementing the error interface. It is used +// by a Gatherer to report multiple errors during MetricFamily gathering. +type MultiError []error + +func (errs MultiError) Error() string { + if len(errs) == 0 { + return "" + } + buf := &bytes.Buffer{} + fmt.Fprintf(buf, "%d error(s) occurred:", len(errs)) + for _, err := range errs { + fmt.Fprintf(buf, "\n* %s", err) + } + return buf.String() +} + +// Append appends the provided error if it is not nil. +func (errs *MultiError) Append(err error) { + if err != nil { + *errs = append(*errs, err) + } +} + +// MaybeUnwrap returns nil if len(errs) is 0. It returns the first and only +// contained error as error if len(errs is 1). In all other cases, it returns +// the MultiError directly. This is helpful for returning a MultiError in a way +// that only uses the MultiError if needed. +func (errs MultiError) MaybeUnwrap() error { + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return errs + } +} + +// Registry registers Prometheus collectors, collects their metrics, and gathers +// them into MetricFamilies for exposition. It implements both Registerer and +// Gatherer. The zero value is not usable. Create instances with NewRegistry or +// NewPedanticRegistry. +type Registry struct { + mtx sync.RWMutex + collectorsByID map[uint64]Collector // ID is a hash of the descIDs. + descIDs map[uint64]struct{} + dimHashesByName map[string]uint64 + uncheckedCollectors []Collector + pedanticChecksEnabled bool +} + +// Register implements Registerer. +func (r *Registry) Register(c Collector) error { + var ( + descChan = make(chan *Desc, capDescChan) + newDescIDs = map[uint64]struct{}{} + newDimHashesByName = map[string]uint64{} + collectorID uint64 // Just a sum of all desc IDs. + duplicateDescErr error + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + r.mtx.Lock() + defer func() { + // Drain channel in case of premature return to not leak a goroutine. + for range descChan { + } + r.mtx.Unlock() + }() + // Conduct various tests... + for desc := range descChan { + + // Is the descriptor valid at all? + if desc.err != nil { + return fmt.Errorf("descriptor %s is invalid: %s", desc, desc.err) + } + + // Is the descID unique? + // (In other words: Is the fqName + constLabel combination unique?) + if _, exists := r.descIDs[desc.id]; exists { + duplicateDescErr = fmt.Errorf("descriptor %s already exists with the same fully-qualified name and const label values", desc) + } + // If it is not a duplicate desc in this collector, add it to + // the collectorID. (We allow duplicate descs within the same + // collector, but their existence must be a no-op.) + if _, exists := newDescIDs[desc.id]; !exists { + newDescIDs[desc.id] = struct{}{} + collectorID += desc.id + } + + // Are all the label names and the help string consistent with + // previous descriptors of the same name? + // First check existing descriptors... + if dimHash, exists := r.dimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("a previously registered descriptor with the same fully-qualified name as %s has different label names or a different help string", desc) + } + } else { + // ...then check the new descriptors already seen. + if dimHash, exists := newDimHashesByName[desc.fqName]; exists { + if dimHash != desc.dimHash { + return fmt.Errorf("descriptors reported by collector have inconsistent label names or help strings for the same fully-qualified name, offender is %s", desc) + } + } else { + newDimHashesByName[desc.fqName] = desc.dimHash + } + } + } + // A Collector yielding no Desc at all is considered unchecked. + if len(newDescIDs) == 0 { + r.uncheckedCollectors = append(r.uncheckedCollectors, c) + return nil + } + if existing, exists := r.collectorsByID[collectorID]; exists { + return AlreadyRegisteredError{ + ExistingCollector: existing, + NewCollector: c, + } + } + // If the collectorID is new, but at least one of the descs existed + // before, we are in trouble. + if duplicateDescErr != nil { + return duplicateDescErr + } + + // Only after all tests have passed, actually register. + r.collectorsByID[collectorID] = c + for hash := range newDescIDs { + r.descIDs[hash] = struct{}{} + } + for name, dimHash := range newDimHashesByName { + r.dimHashesByName[name] = dimHash + } + return nil +} + +// Unregister implements Registerer. +func (r *Registry) Unregister(c Collector) bool { + var ( + descChan = make(chan *Desc, capDescChan) + descIDs = map[uint64]struct{}{} + collectorID uint64 // Just a sum of the desc IDs. + ) + go func() { + c.Describe(descChan) + close(descChan) + }() + for desc := range descChan { + if _, exists := descIDs[desc.id]; !exists { + collectorID += desc.id + descIDs[desc.id] = struct{}{} + } + } + + r.mtx.RLock() + if _, exists := r.collectorsByID[collectorID]; !exists { + r.mtx.RUnlock() + return false + } + r.mtx.RUnlock() + + r.mtx.Lock() + defer r.mtx.Unlock() + + delete(r.collectorsByID, collectorID) + for id := range descIDs { + delete(r.descIDs, id) + } + // dimHashesByName is left untouched as those must be consistent + // throughout the lifetime of a program. + return true +} + +// MustRegister implements Registerer. +func (r *Registry) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +// Gather implements Gatherer. +func (r *Registry) Gather() ([]*dto.MetricFamily, error) { + var ( + checkedMetricChan = make(chan Metric, capMetricChan) + uncheckedMetricChan = make(chan Metric, capMetricChan) + metricHashes = map[uint64]struct{}{} + wg sync.WaitGroup + errs MultiError // The collected errors to return in the end. + registeredDescIDs map[uint64]struct{} // Only used for pedantic checks + ) + + r.mtx.RLock() + goroutineBudget := len(r.collectorsByID) + len(r.uncheckedCollectors) + metricFamiliesByName := make(map[string]*dto.MetricFamily, len(r.dimHashesByName)) + checkedCollectors := make(chan Collector, len(r.collectorsByID)) + uncheckedCollectors := make(chan Collector, len(r.uncheckedCollectors)) + for _, collector := range r.collectorsByID { + checkedCollectors <- collector + } + for _, collector := range r.uncheckedCollectors { + uncheckedCollectors <- collector + } + // In case pedantic checks are enabled, we have to copy the map before + // giving up the RLock. + if r.pedanticChecksEnabled { + registeredDescIDs = make(map[uint64]struct{}, len(r.descIDs)) + for id := range r.descIDs { + registeredDescIDs[id] = struct{}{} + } + } + r.mtx.RUnlock() + + wg.Add(goroutineBudget) + + collectWorker := func() { + for { + select { + case collector := <-checkedCollectors: + collector.Collect(checkedMetricChan) + case collector := <-uncheckedCollectors: + collector.Collect(uncheckedMetricChan) + default: + return + } + wg.Done() + } + } + + // Start the first worker now to make sure at least one is running. + go collectWorker() + goroutineBudget-- + + // Close checkedMetricChan and uncheckedMetricChan once all collectors + // are collected. + go func() { + wg.Wait() + close(checkedMetricChan) + close(uncheckedMetricChan) + }() + + // Drain checkedMetricChan and uncheckedMetricChan in case of premature return. + defer func() { + if checkedMetricChan != nil { + for range checkedMetricChan { + } + } + if uncheckedMetricChan != nil { + for range uncheckedMetricChan { + } + } + }() + + // Copy the channel references so we can nil them out later to remove + // them from the select statements below. + cmc := checkedMetricChan + umc := uncheckedMetricChan + + for { + select { + case metric, ok := <-cmc: + if !ok { + cmc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + registeredDescIDs, + )) + case metric, ok := <-umc: + if !ok { + umc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + nil, + )) + default: + if goroutineBudget <= 0 || len(checkedCollectors)+len(uncheckedCollectors) == 0 { + // All collectors are already being worked on or + // we have already as many goroutines started as + // there are collectors. Do the same as above, + // just without the default. + select { + case metric, ok := <-cmc: + if !ok { + cmc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + registeredDescIDs, + )) + case metric, ok := <-umc: + if !ok { + umc = nil + break + } + errs.Append(processMetric( + metric, metricFamiliesByName, + metricHashes, + nil, + )) + } + break + } + // Start more workers. + go collectWorker() + goroutineBudget-- + runtime.Gosched() + } + // Once both checkedMetricChan and uncheckdMetricChan are closed + // and drained, the contraption above will nil out cmc and umc, + // and then we can leave the collect loop here. + if cmc == nil && umc == nil { + break + } + } + return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// processMetric is an internal helper method only used by the Gather method. +func processMetric( + metric Metric, + metricFamiliesByName map[string]*dto.MetricFamily, + metricHashes map[uint64]struct{}, + registeredDescIDs map[uint64]struct{}, +) error { + desc := metric.Desc() + // Wrapped metrics collected by an unchecked Collector can have an + // invalid Desc. + if desc.err != nil { + return desc.err + } + dtoMetric := &dto.Metric{} + if err := metric.Write(dtoMetric); err != nil { + return fmt.Errorf("error collecting metric %v: %s", desc, err) + } + metricFamily, ok := metricFamiliesByName[desc.fqName] + if ok { // Existing name. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + desc.fqName, dtoMetric, desc.help, metricFamily.GetHelp(), + ) + } + // TODO(beorn7): Simplify switch once Desc has type. + switch metricFamily.GetType() { + case dto.MetricType_COUNTER: + if dtoMetric.Counter == nil { + return fmt.Errorf( + "collected metric %s %s should be a Counter", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_GAUGE: + if dtoMetric.Gauge == nil { + return fmt.Errorf( + "collected metric %s %s should be a Gauge", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_SUMMARY: + if dtoMetric.Summary == nil { + return fmt.Errorf( + "collected metric %s %s should be a Summary", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_UNTYPED: + if dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %s %s should be Untyped", + desc.fqName, dtoMetric, + ) + } + case dto.MetricType_HISTOGRAM: + if dtoMetric.Histogram == nil { + return fmt.Errorf( + "collected metric %s %s should be a Histogram", + desc.fqName, dtoMetric, + ) + } + default: + panic("encountered MetricFamily with invalid type") + } + } else { // New name. + metricFamily = &dto.MetricFamily{} + metricFamily.Name = proto.String(desc.fqName) + metricFamily.Help = proto.String(desc.help) + // TODO(beorn7): Simplify switch once Desc has type. + switch { + case dtoMetric.Gauge != nil: + metricFamily.Type = dto.MetricType_GAUGE.Enum() + case dtoMetric.Counter != nil: + metricFamily.Type = dto.MetricType_COUNTER.Enum() + case dtoMetric.Summary != nil: + metricFamily.Type = dto.MetricType_SUMMARY.Enum() + case dtoMetric.Untyped != nil: + metricFamily.Type = dto.MetricType_UNTYPED.Enum() + case dtoMetric.Histogram != nil: + metricFamily.Type = dto.MetricType_HISTOGRAM.Enum() + default: + return fmt.Errorf("empty metric collected: %s", dtoMetric) + } + if err := checkSuffixCollisions(metricFamily, metricFamiliesByName); err != nil { + return err + } + metricFamiliesByName[desc.fqName] = metricFamily + } + if err := checkMetricConsistency(metricFamily, dtoMetric, metricHashes); err != nil { + return err + } + if registeredDescIDs != nil { + // Is the desc registered at all? + if _, exist := registeredDescIDs[desc.id]; !exist { + return fmt.Errorf( + "collected metric %s %s with unregistered descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + if err := checkDescConsistency(metricFamily, dtoMetric, desc); err != nil { + return err + } + } + metricFamily.Metric = append(metricFamily.Metric, dtoMetric) + return nil +} + +// Gatherers is a slice of Gatherer instances that implements the Gatherer +// interface itself. Its Gather method calls Gather on all Gatherers in the +// slice in order and returns the merged results. Errors returned from the +// Gather calles are all returned in a flattened MultiError. Duplicate and +// inconsistent Metrics are skipped (first occurrence in slice order wins) and +// reported in the returned error. +// +// Gatherers can be used to merge the Gather results from multiple +// Registries. It also provides a way to directly inject existing MetricFamily +// protobufs into the gathering by creating a custom Gatherer with a Gather +// method that simply returns the existing MetricFamily protobufs. Note that no +// registration is involved (in contrast to Collector registration), so +// obviously registration-time checks cannot happen. Any inconsistencies between +// the gathered MetricFamilies are reported as errors by the Gather method, and +// inconsistent Metrics are dropped. Invalid parts of the MetricFamilies +// (e.g. syntactically invalid metric or label names) will go undetected. +type Gatherers []Gatherer + +// Gather implements Gatherer. +func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) { + var ( + metricFamiliesByName = map[string]*dto.MetricFamily{} + metricHashes = map[uint64]struct{}{} + errs MultiError // The collected errors to return in the end. + ) + + for i, g := range gs { + mfs, err := g.Gather() + if err != nil { + if multiErr, ok := err.(MultiError); ok { + for _, err := range multiErr { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } else { + errs = append(errs, fmt.Errorf("[from Gatherer #%d] %s", i+1, err)) + } + } + for _, mf := range mfs { + existingMF, exists := metricFamiliesByName[mf.GetName()] + if exists { + if existingMF.GetHelp() != mf.GetHelp() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has help %q but should have %q", + mf.GetName(), mf.GetHelp(), existingMF.GetHelp(), + )) + continue + } + if existingMF.GetType() != mf.GetType() { + errs = append(errs, fmt.Errorf( + "gathered metric family %s has type %s but should have %s", + mf.GetName(), mf.GetType(), existingMF.GetType(), + )) + continue + } + } else { + existingMF = &dto.MetricFamily{} + existingMF.Name = mf.Name + existingMF.Help = mf.Help + existingMF.Type = mf.Type + if err := checkSuffixCollisions(existingMF, metricFamiliesByName); err != nil { + errs = append(errs, err) + continue + } + metricFamiliesByName[mf.GetName()] = existingMF + } + for _, m := range mf.Metric { + if err := checkMetricConsistency(existingMF, m, metricHashes); err != nil { + errs = append(errs, err) + continue + } + existingMF.Metric = append(existingMF.Metric, m) + } + } + } + return internal.NormalizeMetricFamilies(metricFamiliesByName), errs.MaybeUnwrap() +} + +// checkSuffixCollisions checks for collisions with the “magic” suffixes the +// Prometheus text format and the internal metric representation of the +// Prometheus server add while flattening Summaries and Histograms. +func checkSuffixCollisions(mf *dto.MetricFamily, mfs map[string]*dto.MetricFamily) error { + var ( + newName = mf.GetName() + newType = mf.GetType() + newNameWithoutSuffix = "" + ) + switch { + case strings.HasSuffix(newName, "_count"): + newNameWithoutSuffix = newName[:len(newName)-6] + case strings.HasSuffix(newName, "_sum"): + newNameWithoutSuffix = newName[:len(newName)-4] + case strings.HasSuffix(newName, "_bucket"): + newNameWithoutSuffix = newName[:len(newName)-7] + } + if newNameWithoutSuffix != "" { + if existingMF, ok := mfs[newNameWithoutSuffix]; ok { + switch existingMF.GetType() { + case dto.MetricType_SUMMARY: + if !strings.HasSuffix(newName, "_bucket") { + return fmt.Errorf( + "collected metric named %q collides with previously collected summary named %q", + newName, newNameWithoutSuffix, + ) + } + case dto.MetricType_HISTOGRAM: + return fmt.Errorf( + "collected metric named %q collides with previously collected histogram named %q", + newName, newNameWithoutSuffix, + ) + } + } + } + if newType == dto.MetricType_SUMMARY || newType == dto.MetricType_HISTOGRAM { + if _, ok := mfs[newName+"_count"]; ok { + return fmt.Errorf( + "collected histogram or summary named %q collides with previously collected metric named %q", + newName, newName+"_count", + ) + } + if _, ok := mfs[newName+"_sum"]; ok { + return fmt.Errorf( + "collected histogram or summary named %q collides with previously collected metric named %q", + newName, newName+"_sum", + ) + } + } + if newType == dto.MetricType_HISTOGRAM { + if _, ok := mfs[newName+"_bucket"]; ok { + return fmt.Errorf( + "collected histogram named %q collides with previously collected metric named %q", + newName, newName+"_bucket", + ) + } + } + return nil +} + +// checkMetricConsistency checks if the provided Metric is consistent with the +// provided MetricFamily. It also hashes the Metric labels and the MetricFamily +// name. If the resulting hash is already in the provided metricHashes, an error +// is returned. If not, it is added to metricHashes. +func checkMetricConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + metricHashes map[uint64]struct{}, +) error { + name := metricFamily.GetName() + + // Type consistency with metric family. + if metricFamily.GetType() == dto.MetricType_GAUGE && dtoMetric.Gauge == nil || + metricFamily.GetType() == dto.MetricType_COUNTER && dtoMetric.Counter == nil || + metricFamily.GetType() == dto.MetricType_SUMMARY && dtoMetric.Summary == nil || + metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || + metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { + return fmt.Errorf( + "collected metric %q { %s} is not a %s", + name, dtoMetric, metricFamily.GetType(), + ) + } + + previousLabelName := "" + for _, labelPair := range dtoMetric.GetLabel() { + labelName := labelPair.GetName() + if labelName == previousLabelName { + return fmt.Errorf( + "collected metric %q { %s} has two or more labels with the same name: %s", + name, dtoMetric, labelName, + ) + } + if !checkLabelName(labelName) { + return fmt.Errorf( + "collected metric %q { %s} has a label with an invalid name: %s", + name, dtoMetric, labelName, + ) + } + if dtoMetric.Summary != nil && labelName == quantileLabel { + return fmt.Errorf( + "collected metric %q { %s} must not have an explicit %q label", + name, dtoMetric, quantileLabel, + ) + } + if !utf8.ValidString(labelPair.GetValue()) { + return fmt.Errorf( + "collected metric %q { %s} has a label named %q whose value is not utf8: %#v", + name, dtoMetric, labelName, labelPair.GetValue()) + } + previousLabelName = labelName + } + + // Is the metric unique (i.e. no other metric with the same name and the same labels)? + h := hashNew() + h = hashAdd(h, name) + h = hashAddByte(h, separatorByte) + // Make sure label pairs are sorted. We depend on it for the consistency + // check. + sort.Sort(labelPairSorter(dtoMetric.Label)) + for _, lp := range dtoMetric.Label { + h = hashAdd(h, lp.GetName()) + h = hashAddByte(h, separatorByte) + h = hashAdd(h, lp.GetValue()) + h = hashAddByte(h, separatorByte) + } + if _, exists := metricHashes[h]; exists { + return fmt.Errorf( + "collected metric %q { %s} was collected before with the same name and label values", + name, dtoMetric, + ) + } + metricHashes[h] = struct{}{} + return nil +} + +func checkDescConsistency( + metricFamily *dto.MetricFamily, + dtoMetric *dto.Metric, + desc *Desc, +) error { + // Desc help consistency with metric family help. + if metricFamily.GetHelp() != desc.help { + return fmt.Errorf( + "collected metric %s %s has help %q but should have %q", + metricFamily.GetName(), dtoMetric, metricFamily.GetHelp(), desc.help, + ) + } + + // Is the desc consistent with the content of the metric? + lpsFromDesc := make([]*dto.LabelPair, 0, len(dtoMetric.Label)) + lpsFromDesc = append(lpsFromDesc, desc.constLabelPairs...) + for _, l := range desc.variableLabels { + lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ + Name: proto.String(l), + }) + } + if len(lpsFromDesc) != len(dtoMetric.Label) { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + sort.Sort(labelPairSorter(lpsFromDesc)) + for i, lpFromDesc := range lpsFromDesc { + lpFromMetric := dtoMetric.Label[i] + if lpFromDesc.GetName() != lpFromMetric.GetName() || + lpFromDesc.Value != nil && lpFromDesc.GetValue() != lpFromMetric.GetValue() { + return fmt.Errorf( + "labels in collected metric %s %s are inconsistent with descriptor %s", + metricFamily.GetName(), dtoMetric, desc, + ) + } + } + return nil +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go new file mode 100644 index 000000000000..f7e92d829450 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -0,0 +1,626 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "math" + "sort" + "sync" + "time" + + "github.com/beorn7/perks/quantile" + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// quantileLabel is used for the label that defines the quantile in a +// summary. +const quantileLabel = "quantile" + +// A Summary captures individual observations from an event or sample stream and +// summarizes them in a manner similar to traditional summary statistics: 1. sum +// of observations, 2. observation count, 3. rank estimations. +// +// A typical use-case is the observation of request latencies. By default, a +// Summary provides the median, the 90th and the 99th percentile of the latency +// as rank estimations. However, the default behavior will change in the +// upcoming v0.10 of the library. There will be no rank estimations at all by +// default. For a sane transition, it is recommended to set the desired rank +// estimations explicitly. +// +// Note that the rank estimations cannot be aggregated in a meaningful way with +// the Prometheus query language (i.e. you cannot average or add them). If you +// need aggregatable quantiles (e.g. you want the 99th percentile latency of all +// queries served across all instances of a service), consider the Histogram +// metric type. See the Prometheus documentation for more details. +// +// To create Summary instances, use NewSummary. +type Summary interface { + Metric + Collector + + // Observe adds a single observation to the summary. + Observe(float64) +} + +// DefObjectives are the default Summary quantile values. +// +// Deprecated: DefObjectives will not be used as the default objectives in +// v0.10 of the library. The default Summary will have no quantiles then. +var ( + DefObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001} + + errQuantileLabelNotAllowed = fmt.Errorf( + "%q is not allowed as label name in summaries", quantileLabel, + ) +) + +// Default values for SummaryOpts. +const ( + // DefMaxAge is the default duration for which observations stay + // relevant. + DefMaxAge time.Duration = 10 * time.Minute + // DefAgeBuckets is the default number of buckets used to calculate the + // age of observations. + DefAgeBuckets = 5 + // DefBufCap is the standard buffer size for collecting Summary observations. + DefBufCap = 500 +) + +// SummaryOpts bundles the options for creating a Summary metric. It is +// mandatory to set Name to a non-empty string. While all other fields are +// optional and can safely be left at their zero value, it is recommended to set +// a help string and to explicitly set the Objectives field to the desired value +// as the default value will change in the upcoming v0.10 of the library. +type SummaryOpts struct { + // Namespace, Subsystem, and Name are components of the fully-qualified + // name of the Summary (created by joining these components with + // "_"). Only Name is mandatory, the others merely help structuring the + // name. Note that the fully-qualified name of the Summary must be a + // valid Prometheus metric name. + Namespace string + Subsystem string + Name string + + // Help provides information about this Summary. + // + // Metrics with the same fully-qualified name must have the same Help + // string. + Help string + + // ConstLabels are used to attach fixed labels to this metric. Metrics + // with the same fully-qualified name must have the same label names in + // their ConstLabels. + // + // Due to the way a Summary is represented in the Prometheus text format + // and how it is handled by the Prometheus server internally, “quantile” + // is an illegal label name. Construction of a Summary or SummaryVec + // will panic if this label name is used in ConstLabels. + // + // ConstLabels are only used rarely. In particular, do not use them to + // attach the same labels to all your metrics. Those use cases are + // better covered by target labels set by the scraping Prometheus + // server, or by one specific metric (e.g. a build_info or a + // machine_role metric). See also + // https://prometheus.io/docs/instrumenting/writing_exporters/#target-labels,-not-static-scraped-labels + ConstLabels Labels + + // Objectives defines the quantile rank estimates with their respective + // absolute error. If Objectives[q] = e, then the value reported for q + // will be the φ-quantile value for some φ between q-e and q+e. The + // default value is DefObjectives. It is used if Objectives is left at + // its zero value (i.e. nil). To create a Summary without Objectives, + // set it to an empty map (i.e. map[float64]float64{}). + // + // Deprecated: Note that the current value of DefObjectives is + // deprecated. It will be replaced by an empty map in v0.10 of the + // library. Please explicitly set Objectives to the desired value. + Objectives map[float64]float64 + + // MaxAge defines the duration for which an observation stays relevant + // for the summary. Must be positive. The default value is DefMaxAge. + MaxAge time.Duration + + // AgeBuckets is the number of buckets used to exclude observations that + // are older than MaxAge from the summary. A higher number has a + // resource penalty, so only increase it if the higher resolution is + // really required. For very high observation rates, you might want to + // reduce the number of age buckets. With only one age bucket, you will + // effectively see a complete reset of the summary each time MaxAge has + // passed. The default value is DefAgeBuckets. + AgeBuckets uint32 + + // BufCap defines the default sample stream buffer size. The default + // value of DefBufCap should suffice for most uses. If there is a need + // to increase the value, a multiple of 500 is recommended (because that + // is the internal buffer size of the underlying package + // "github.com/bmizerany/perks/quantile"). + BufCap uint32 +} + +// Great fuck-up with the sliding-window decay algorithm... The Merge method of +// perk/quantile is actually not working as advertised - and it might be +// unfixable, as the underlying algorithm is apparently not capable of merging +// summaries in the first place. To avoid using Merge, we are currently adding +// observations to _each_ age bucket, i.e. the effort to add a sample is +// essentially multiplied by the number of age buckets. When rotating age +// buckets, we empty the previous head stream. On scrape time, we simply take +// the quantiles from the head stream (no merging required). Result: More effort +// on observation time, less effort on scrape time, which is exactly the +// opposite of what we try to accomplish, but at least the results are correct. +// +// The quite elegant previous contraption to merge the age buckets efficiently +// on scrape time (see code up commit 6b9530d72ea715f0ba612c0120e6e09fbf1d49d0) +// can't be used anymore. + +// NewSummary creates a new Summary based on the provided SummaryOpts. +func NewSummary(opts SummaryOpts) Summary { + return newSummary( + NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), + opts, + ) +} + +func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { + if len(desc.variableLabels) != len(labelValues) { + panic(errInconsistentCardinality) + } + + for _, n := range desc.variableLabels { + if n == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + for _, lp := range desc.constLabelPairs { + if lp.GetName() == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + + if opts.Objectives == nil { + opts.Objectives = DefObjectives + } + + if opts.MaxAge < 0 { + panic(fmt.Errorf("illegal max age MaxAge=%v", opts.MaxAge)) + } + if opts.MaxAge == 0 { + opts.MaxAge = DefMaxAge + } + + if opts.AgeBuckets == 0 { + opts.AgeBuckets = DefAgeBuckets + } + + if opts.BufCap == 0 { + opts.BufCap = DefBufCap + } + + s := &summary{ + desc: desc, + + objectives: opts.Objectives, + sortedObjectives: make([]float64, 0, len(opts.Objectives)), + + labelPairs: makeLabelPairs(desc, labelValues), + + hotBuf: make([]float64, 0, opts.BufCap), + coldBuf: make([]float64, 0, opts.BufCap), + streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets), + } + s.headStreamExpTime = time.Now().Add(s.streamDuration) + s.hotBufExpTime = s.headStreamExpTime + + for i := uint32(0); i < opts.AgeBuckets; i++ { + s.streams = append(s.streams, s.newStream()) + } + s.headStream = s.streams[0] + + for qu := range s.objectives { + s.sortedObjectives = append(s.sortedObjectives, qu) + } + sort.Float64s(s.sortedObjectives) + + s.init(s) // Init self-collection. + return s +} + +type summary struct { + selfCollector + + bufMtx sync.Mutex // Protects hotBuf and hotBufExpTime. + mtx sync.Mutex // Protects every other moving part. + // Lock bufMtx before mtx if both are needed. + + desc *Desc + + objectives map[float64]float64 + sortedObjectives []float64 + + labelPairs []*dto.LabelPair + + sum float64 + cnt uint64 + + hotBuf, coldBuf []float64 + + streams []*quantile.Stream + streamDuration time.Duration + headStream *quantile.Stream + headStreamIdx int + headStreamExpTime, hotBufExpTime time.Time +} + +func (s *summary) Desc() *Desc { + return s.desc +} + +func (s *summary) Observe(v float64) { + s.bufMtx.Lock() + defer s.bufMtx.Unlock() + + now := time.Now() + if now.After(s.hotBufExpTime) { + s.asyncFlush(now) + } + s.hotBuf = append(s.hotBuf, v) + if len(s.hotBuf) == cap(s.hotBuf) { + s.asyncFlush(now) + } +} + +func (s *summary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.objectives)) + + s.bufMtx.Lock() + s.mtx.Lock() + // Swap bufs even if hotBuf is empty to set new hotBufExpTime. + s.swapBufs(time.Now()) + s.bufMtx.Unlock() + + s.flushColdBuf() + sum.SampleCount = proto.Uint64(s.cnt) + sum.SampleSum = proto.Float64(s.sum) + + for _, rank := range s.sortedObjectives { + var q float64 + if s.headStream.Count() == 0 { + q = math.NaN() + } else { + q = s.headStream.Query(rank) + } + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + s.mtx.Unlock() + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + return nil +} + +func (s *summary) newStream() *quantile.Stream { + return quantile.NewTargeted(s.objectives) +} + +// asyncFlush needs bufMtx locked. +func (s *summary) asyncFlush(now time.Time) { + s.mtx.Lock() + s.swapBufs(now) + + // Unblock the original goroutine that was responsible for the mutation + // that triggered the compaction. But hold onto the global non-buffer + // state mutex until the operation finishes. + go func() { + s.flushColdBuf() + s.mtx.Unlock() + }() +} + +// rotateStreams needs mtx AND bufMtx locked. +func (s *summary) maybeRotateStreams() { + for !s.hotBufExpTime.Equal(s.headStreamExpTime) { + s.headStream.Reset() + s.headStreamIdx++ + if s.headStreamIdx >= len(s.streams) { + s.headStreamIdx = 0 + } + s.headStream = s.streams[s.headStreamIdx] + s.headStreamExpTime = s.headStreamExpTime.Add(s.streamDuration) + } +} + +// flushColdBuf needs mtx locked. +func (s *summary) flushColdBuf() { + for _, v := range s.coldBuf { + for _, stream := range s.streams { + stream.Insert(v) + } + s.cnt++ + s.sum += v + } + s.coldBuf = s.coldBuf[0:0] + s.maybeRotateStreams() +} + +// swapBufs needs mtx AND bufMtx locked, coldBuf must be empty. +func (s *summary) swapBufs(now time.Time) { + if len(s.coldBuf) != 0 { + panic("coldBuf is not empty") + } + s.hotBuf, s.coldBuf = s.coldBuf, s.hotBuf + // hotBuf is now empty and gets new expiration set. + for now.After(s.hotBufExpTime) { + s.hotBufExpTime = s.hotBufExpTime.Add(s.streamDuration) + } +} + +type quantSort []*dto.Quantile + +func (s quantSort) Len() int { + return len(s) +} + +func (s quantSort) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +func (s quantSort) Less(i, j int) bool { + return s[i].GetQuantile() < s[j].GetQuantile() +} + +// SummaryVec is a Collector that bundles a set of Summaries that all share the +// same Desc, but have different values for their variable labels. This is used +// if you want to count the same thing partitioned by various dimensions +// (e.g. HTTP request latencies, partitioned by status code and method). Create +// instances with NewSummaryVec. +type SummaryVec struct { + *metricVec +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryOpts and +// partitioned by the given label names. +// +// Due to the way a Summary is represented in the Prometheus text format and how +// it is handled by the Prometheus server internally, “quantile” is an illegal +// label name. NewSummaryVec will panic if this label name is used. +func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { + for _, ln := range labelNames { + if ln == quantileLabel { + panic(errQuantileLabelNotAllowed) + } + } + desc := NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + labelNames, + opts.ConstLabels, + ) + return &SummaryVec{ + metricVec: newMetricVec(desc, func(lvs ...string) Metric { + return newSummary(desc, opts, lvs...) + }), + } +} + +// GetMetricWithLabelValues returns the Summary for the given slice of label +// values (same order as the VariableLabels in Desc). If that combination of +// label values is accessed for the first time, a new Summary is created. +// +// It is possible to call this method without using the returned Summary to only +// create the new Summary but leave it at its starting value, a Summary without +// any observations. +// +// Keeping the Summary for later use is possible (and should be considered if +// performance is critical), but keep in mind that Reset, DeleteLabelValues and +// Delete can be used to delete the Summary from the SummaryVec. In that case, +// the Summary will still exist, but it will not be exported anymore, even if a +// Summary with the same label values is created later. See also the CounterVec +// example. +// +// An error is returned if the number of label values is not the same as the +// number of VariableLabels in Desc (minus any curried labels). +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider GetMetricWith(Labels) as +// an alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the GaugeVec example. +func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer, error) { + metric, err := v.metricVec.getMetricWithLabelValues(lvs...) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// GetMetricWith returns the Summary for the given Labels map (the label names +// must match those of the VariableLabels in Desc). If that label map is +// accessed for the first time, a new Summary is created. Implications of +// creating a Summary without using it and keeping the Summary for later use are +// the same as for GetMetricWithLabelValues. +// +// An error is returned if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc (minus any curried labels). +// +// This method is used for the same purpose as +// GetMetricWithLabelValues(...string). See there for pros and cons of the two +// methods. +func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) { + metric, err := v.metricVec.getMetricWith(labels) + if metric != nil { + return metric.(Observer), err + } + return nil, err +} + +// WithLabelValues works as GetMetricWithLabelValues, but panics where +// GetMetricWithLabelValues would have returned an error. Not returning an +// error allows shortcuts like +// myVec.WithLabelValues("404", "GET").Observe(42.21) +func (v *SummaryVec) WithLabelValues(lvs ...string) Observer { + s, err := v.GetMetricWithLabelValues(lvs...) + if err != nil { + panic(err) + } + return s +} + +// With works as GetMetricWith, but panics where GetMetricWithLabels would have +// returned an error. Not returning an error allows shortcuts like +// myVec.With(prometheus.Labels{"code": "404", "method": "GET"}).Observe(42.21) +func (v *SummaryVec) With(labels Labels) Observer { + s, err := v.GetMetricWith(labels) + if err != nil { + panic(err) + } + return s +} + +// CurryWith returns a vector curried with the provided labels, i.e. the +// returned vector has those labels pre-set for all labeled operations performed +// on it. The cardinality of the curried vector is reduced accordingly. The +// order of the remaining labels stays the same (just with the curried labels +// taken out of the sequence – which is relevant for the +// (GetMetric)WithLabelValues methods). It is possible to curry a curried +// vector, but only with labels not yet used for currying before. +// +// The metrics contained in the SummaryVec are shared between the curried and +// uncurried vectors. They are just accessed differently. Curried and uncurried +// vectors behave identically in terms of collection. Only one must be +// registered with a given registry (usually the uncurried version). The Reset +// method deletes all metrics, even if called on a curried vector. +func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) { + vec, err := v.curryWith(labels) + if vec != nil { + return &SummaryVec{vec}, err + } + return nil, err +} + +// MustCurryWith works as CurryWith but panics where CurryWith would have +// returned an error. +func (v *SummaryVec) MustCurryWith(labels Labels) ObserverVec { + vec, err := v.CurryWith(labels) + if err != nil { + panic(err) + } + return vec +} + +type constSummary struct { + desc *Desc + count uint64 + sum float64 + quantiles map[float64]float64 + labelPairs []*dto.LabelPair +} + +func (s *constSummary) Desc() *Desc { + return s.desc +} + +func (s *constSummary) Write(out *dto.Metric) error { + sum := &dto.Summary{} + qs := make([]*dto.Quantile, 0, len(s.quantiles)) + + sum.SampleCount = proto.Uint64(s.count) + sum.SampleSum = proto.Float64(s.sum) + + for rank, q := range s.quantiles { + qs = append(qs, &dto.Quantile{ + Quantile: proto.Float64(rank), + Value: proto.Float64(q), + }) + } + + if len(qs) > 0 { + sort.Sort(quantSort(qs)) + } + sum.Quantile = qs + + out.Summary = sum + out.Label = s.labelPairs + + return nil +} + +// NewConstSummary returns a metric representing a Prometheus summary with fixed +// values for the count, sum, and quantiles. As those parameters cannot be +// changed, the returned value does not implement the Summary interface (but +// only the Metric interface). Users of this package will not have much use for +// it in regular operations. However, when implementing custom Collectors, it is +// useful as a throw-away metric that is generated on the fly to send it to +// Prometheus in the Collect method. +// +// quantiles maps ranks to quantile values. For example, a median latency of +// 0.23s and a 99th percentile latency of 0.56s would be expressed as: +// map[float64]float64{0.5: 0.23, 0.99: 0.56} +// +// NewConstSummary returns an error if the length of labelValues is not +// consistent with the variable labels in Desc or if Desc is invalid. +func NewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constSummary{ + desc: desc, + count: count, + sum: sum, + quantiles: quantiles, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstSummary is a version of NewConstSummary that panics where +// NewConstMetric would have returned an error. +func MustNewConstSummary( + desc *Desc, + count uint64, + sum float64, + quantiles map[float64]float64, + labelValues ...string, +) Metric { + m, err := NewConstSummary(desc, count, sum, quantiles, labelValues...) + if err != nil { + panic(err) + } + return m +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go new file mode 100644 index 000000000000..b8fc5f18c853 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/timer.go @@ -0,0 +1,51 @@ +// Copyright 2016 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import "time" + +// Timer is a helper type to time functions. Use NewTimer to create new +// instances. +type Timer struct { + begin time.Time + observer Observer +} + +// NewTimer creates a new Timer. The provided Observer is used to observe a +// duration in seconds. Timer is usually used to time a function call in the +// following way: +// func TimeMe() { +// timer := NewTimer(myHistogram) +// defer timer.ObserveDuration() +// // Do actual work. +// } +func NewTimer(o Observer) *Timer { + return &Timer{ + begin: time.Now(), + observer: o, + } +} + +// ObserveDuration records the duration passed since the Timer was created with +// NewTimer. It calls the Observe method of the Observer provided during +// construction with the duration in seconds as an argument. ObserveDuration is +// usually called with a defer statement. +// +// Note that this method is only guaranteed to never observe negative durations +// if used with Go1.9+. +func (t *Timer) ObserveDuration() { + if t.observer != nil { + t.observer.Observe(time.Since(t.begin).Seconds()) + } +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/untyped.go b/vendor/github.com/prometheus/client_golang/prometheus/untyped.go new file mode 100644 index 000000000000..0f9ce63f4093 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/untyped.go @@ -0,0 +1,42 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +// UntypedOpts is an alias for Opts. See there for doc comments. +type UntypedOpts Opts + +// UntypedFunc works like GaugeFunc but the collected metric is of type +// "Untyped". UntypedFunc is useful to mirror an external metric of unknown +// type. +// +// To create UntypedFunc instances, use NewUntypedFunc. +type UntypedFunc interface { + Metric + Collector +} + +// NewUntypedFunc creates a new UntypedFunc based on the provided +// UntypedOpts. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where an UntypedFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFunc { + return newValueFunc(NewDesc( + BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), + opts.Help, + nil, + opts.ConstLabels, + ), UntypedValue, function) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go new file mode 100644 index 000000000000..eb248f108743 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -0,0 +1,162 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// ValueType is an enumeration of metric types that represent a simple value. +type ValueType int + +// Possible values for the ValueType enum. +const ( + _ ValueType = iota + CounterValue + GaugeValue + UntypedValue +) + +// valueFunc is a generic metric for simple values retrieved on collect time +// from a function. It implements Metric and Collector. Its effective type is +// determined by ValueType. This is a low-level building block used by the +// library to back the implementations of CounterFunc, GaugeFunc, and +// UntypedFunc. +type valueFunc struct { + selfCollector + + desc *Desc + valType ValueType + function func() float64 + labelPairs []*dto.LabelPair +} + +// newValueFunc returns a newly allocated valueFunc with the given Desc and +// ValueType. The value reported is determined by calling the given function +// from within the Write method. Take into account that metric collection may +// happen concurrently. If that results in concurrent calls to Write, like in +// the case where a valueFunc is directly registered with Prometheus, the +// provided function must be concurrency-safe. +func newValueFunc(desc *Desc, valueType ValueType, function func() float64) *valueFunc { + result := &valueFunc{ + desc: desc, + valType: valueType, + function: function, + labelPairs: makeLabelPairs(desc, nil), + } + result.init(result) + return result +} + +func (v *valueFunc) Desc() *Desc { + return v.desc +} + +func (v *valueFunc) Write(out *dto.Metric) error { + return populateMetric(v.valType, v.function(), v.labelPairs, out) +} + +// NewConstMetric returns a metric with one fixed value that cannot be +// changed. Users of this package will not have much use for it in regular +// operations. However, when implementing custom Collectors, it is useful as a +// throw-away metric that is generated on the fly to send it to Prometheus in +// the Collect method. NewConstMetric returns an error if the length of +// labelValues is not consistent with the variable labels in Desc or if Desc is +// invalid. +func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { + if desc.err != nil { + return nil, desc.err + } + if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil { + return nil, err + } + return &constMetric{ + desc: desc, + valType: valueType, + val: value, + labelPairs: makeLabelPairs(desc, labelValues), + }, nil +} + +// MustNewConstMetric is a version of NewConstMetric that panics where +// NewConstMetric would have returned an error. +func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric { + m, err := NewConstMetric(desc, valueType, value, labelValues...) + if err != nil { + panic(err) + } + return m +} + +type constMetric struct { + desc *Desc + valType ValueType + val float64 + labelPairs []*dto.LabelPair +} + +func (m *constMetric) Desc() *Desc { + return m.desc +} + +func (m *constMetric) Write(out *dto.Metric) error { + return populateMetric(m.valType, m.val, m.labelPairs, out) +} + +func populateMetric( + t ValueType, + v float64, + labelPairs []*dto.LabelPair, + m *dto.Metric, +) error { + m.Label = labelPairs + switch t { + case CounterValue: + m.Counter = &dto.Counter{Value: proto.Float64(v)} + case GaugeValue: + m.Gauge = &dto.Gauge{Value: proto.Float64(v)} + case UntypedValue: + m.Untyped = &dto.Untyped{Value: proto.Float64(v)} + default: + return fmt.Errorf("encountered unknown type %v", t) + } + return nil +} + +func makeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { + totalLen := len(desc.variableLabels) + len(desc.constLabelPairs) + if totalLen == 0 { + // Super fast path. + return nil + } + if len(desc.variableLabels) == 0 { + // Moderately fast path. + return desc.constLabelPairs + } + labelPairs := make([]*dto.LabelPair, 0, totalLen) + for i, n := range desc.variableLabels { + labelPairs = append(labelPairs, &dto.LabelPair{ + Name: proto.String(n), + Value: proto.String(labelValues[i]), + }) + } + labelPairs = append(labelPairs, desc.constLabelPairs...) + sort.Sort(labelPairSorter(labelPairs)) + return labelPairs +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go new file mode 100644 index 000000000000..14ed9e856d1c --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -0,0 +1,472 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sync" + + "github.com/prometheus/common/model" +) + +// metricVec is a Collector to bundle metrics of the same name that differ in +// their label values. metricVec is not used directly (and therefore +// unexported). It is used as a building block for implementations of vectors of +// a given metric type, like GaugeVec, CounterVec, SummaryVec, and HistogramVec. +// It also handles label currying. It uses basicMetricVec internally. +type metricVec struct { + *metricMap + + curry []curriedLabelValue + + // hashAdd and hashAddByte can be replaced for testing collision handling. + hashAdd func(h uint64, s string) uint64 + hashAddByte func(h uint64, b byte) uint64 +} + +// newMetricVec returns an initialized metricVec. +func newMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *metricVec { + return &metricVec{ + metricMap: &metricMap{ + metrics: map[uint64][]metricWithLabelValues{}, + desc: desc, + newMetric: newMetric, + }, + hashAdd: hashAdd, + hashAddByte: hashAddByte, + } +} + +// DeleteLabelValues removes the metric where the variable labels are the same +// as those passed in as labels (same order as the VariableLabels in Desc). It +// returns true if a metric was deleted. +// +// It is not an error if the number of label values is not the same as the +// number of VariableLabels in Desc. However, such inconsistent label count can +// never match an actual metric, so the method will always return false in that +// case. +// +// Note that for more than one label value, this method is prone to mistakes +// caused by an incorrect order of arguments. Consider Delete(Labels) as an +// alternative to avoid that type of mistake. For higher label numbers, the +// latter has a much more readable (albeit more verbose) syntax, but it comes +// with a performance overhead (for creating and processing the Labels map). +// See also the CounterVec example. +func (m *metricVec) DeleteLabelValues(lvs ...string) bool { + h, err := m.hashLabelValues(lvs) + if err != nil { + return false + } + + return m.metricMap.deleteByHashWithLabelValues(h, lvs, m.curry) +} + +// Delete deletes the metric where the variable labels are the same as those +// passed in as labels. It returns true if a metric was deleted. +// +// It is not an error if the number and names of the Labels are inconsistent +// with those of the VariableLabels in Desc. However, such inconsistent Labels +// can never match an actual metric, so the method will always return false in +// that case. +// +// This method is used for the same purpose as DeleteLabelValues(...string). See +// there for pros and cons of the two methods. +func (m *metricVec) Delete(labels Labels) bool { + h, err := m.hashLabels(labels) + if err != nil { + return false + } + + return m.metricMap.deleteByHashWithLabels(h, labels, m.curry) +} + +func (m *metricVec) curryWith(labels Labels) (*metricVec, error) { + var ( + newCurry []curriedLabelValue + oldCurry = m.curry + iCurry int + ) + for i, label := range m.desc.variableLabels { + val, ok := labels[label] + if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { + if ok { + return nil, fmt.Errorf("label name %q is already curried", label) + } + newCurry = append(newCurry, oldCurry[iCurry]) + iCurry++ + } else { + if !ok { + continue // Label stays uncurried. + } + newCurry = append(newCurry, curriedLabelValue{i, val}) + } + } + if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { + return nil, fmt.Errorf("%d unknown label(s) found during currying", l) + } + + return &metricVec{ + metricMap: m.metricMap, + curry: newCurry, + hashAdd: m.hashAdd, + hashAddByte: m.hashAddByte, + }, nil +} + +func (m *metricVec) getMetricWithLabelValues(lvs ...string) (Metric, error) { + h, err := m.hashLabelValues(lvs) + if err != nil { + return nil, err + } + + return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil +} + +func (m *metricVec) getMetricWith(labels Labels) (Metric, error) { + h, err := m.hashLabels(labels) + if err != nil { + return nil, err + } + + return m.metricMap.getOrCreateMetricWithLabels(h, labels, m.curry), nil +} + +func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { + if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil { + return 0, err + } + + var ( + h = hashNew() + curry = m.curry + iVals, iCurry int + ) + for i := 0; i < len(m.desc.variableLabels); i++ { + if iCurry < len(curry) && curry[iCurry].index == i { + h = m.hashAdd(h, curry[iCurry].value) + iCurry++ + } else { + h = m.hashAdd(h, vals[iVals]) + iVals++ + } + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +func (m *metricVec) hashLabels(labels Labels) (uint64, error) { + if err := validateValuesInLabels(labels, len(m.desc.variableLabels)-len(m.curry)); err != nil { + return 0, err + } + + var ( + h = hashNew() + curry = m.curry + iCurry int + ) + for i, label := range m.desc.variableLabels { + val, ok := labels[label] + if iCurry < len(curry) && curry[iCurry].index == i { + if ok { + return 0, fmt.Errorf("label name %q is already curried", label) + } + h = m.hashAdd(h, curry[iCurry].value) + iCurry++ + } else { + if !ok { + return 0, fmt.Errorf("label name %q missing in label map", label) + } + h = m.hashAdd(h, val) + } + h = m.hashAddByte(h, model.SeparatorByte) + } + return h, nil +} + +// metricWithLabelValues provides the metric and its label values for +// disambiguation on hash collision. +type metricWithLabelValues struct { + values []string + metric Metric +} + +// curriedLabelValue sets the curried value for a label at the given index. +type curriedLabelValue struct { + index int + value string +} + +// metricMap is a helper for metricVec and shared between differently curried +// metricVecs. +type metricMap struct { + mtx sync.RWMutex // Protects metrics. + metrics map[uint64][]metricWithLabelValues + desc *Desc + newMetric func(labelValues ...string) Metric +} + +// Describe implements Collector. It will send exactly one Desc to the provided +// channel. +func (m *metricMap) Describe(ch chan<- *Desc) { + ch <- m.desc +} + +// Collect implements Collector. +func (m *metricMap) Collect(ch chan<- Metric) { + m.mtx.RLock() + defer m.mtx.RUnlock() + + for _, metrics := range m.metrics { + for _, metric := range metrics { + ch <- metric.metric + } + } +} + +// Reset deletes all metrics in this vector. +func (m *metricMap) Reset() { + m.mtx.Lock() + defer m.mtx.Unlock() + + for h := range m.metrics { + delete(m.metrics, h) + } +} + +// deleteByHashWithLabelValues removes the metric from the hash bucket h. If +// there are multiple matches in the bucket, use lvs to select a metric and +// remove only that metric. +func (m *metricMap) deleteByHashWithLabelValues( + h uint64, lvs []string, curry []curriedLabelValue, +) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + metrics, ok := m.metrics[h] + if !ok { + return false + } + + i := findMetricWithLabelValues(metrics, lvs, curry) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.metrics, h) + } + return true +} + +// deleteByHashWithLabels removes the metric from the hash bucket h. If there +// are multiple matches in the bucket, use lvs to select a metric and remove +// only that metric. +func (m *metricMap) deleteByHashWithLabels( + h uint64, labels Labels, curry []curriedLabelValue, +) bool { + m.mtx.Lock() + defer m.mtx.Unlock() + + metrics, ok := m.metrics[h] + if !ok { + return false + } + i := findMetricWithLabels(m.desc, metrics, labels, curry) + if i >= len(metrics) { + return false + } + + if len(metrics) > 1 { + m.metrics[h] = append(metrics[:i], metrics[i+1:]...) + } else { + delete(m.metrics, h) + } + return true +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *metricMap) getOrCreateMetricWithLabelValues( + hash uint64, lvs []string, curry []curriedLabelValue, +) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithHashAndLabelValues(hash, lvs, curry) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithHashAndLabelValues(hash, lvs, curry) + if !ok { + inlinedLVs := inlineLabelValues(lvs, curry) + metric = m.newMetric(inlinedLVs...) + m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: inlinedLVs, metric: metric}) + } + return metric +} + +// getOrCreateMetricWithLabelValues retrieves the metric by hash and label value +// or creates it and returns the new one. +// +// This function holds the mutex. +func (m *metricMap) getOrCreateMetricWithLabels( + hash uint64, labels Labels, curry []curriedLabelValue, +) Metric { + m.mtx.RLock() + metric, ok := m.getMetricWithHashAndLabels(hash, labels, curry) + m.mtx.RUnlock() + if ok { + return metric + } + + m.mtx.Lock() + defer m.mtx.Unlock() + metric, ok = m.getMetricWithHashAndLabels(hash, labels, curry) + if !ok { + lvs := extractLabelValues(m.desc, labels, curry) + metric = m.newMetric(lvs...) + m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: lvs, metric: metric}) + } + return metric +} + +// getMetricWithHashAndLabelValues gets a metric while handling possible +// collisions in the hash space. Must be called while holding the read mutex. +func (m *metricMap) getMetricWithHashAndLabelValues( + h uint64, lvs []string, curry []curriedLabelValue, +) (Metric, bool) { + metrics, ok := m.metrics[h] + if ok { + if i := findMetricWithLabelValues(metrics, lvs, curry); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// getMetricWithHashAndLabels gets a metric while handling possible collisions in +// the hash space. Must be called while holding read mutex. +func (m *metricMap) getMetricWithHashAndLabels( + h uint64, labels Labels, curry []curriedLabelValue, +) (Metric, bool) { + metrics, ok := m.metrics[h] + if ok { + if i := findMetricWithLabels(m.desc, metrics, labels, curry); i < len(metrics) { + return metrics[i].metric, true + } + } + return nil, false +} + +// findMetricWithLabelValues returns the index of the matching metric or +// len(metrics) if not found. +func findMetricWithLabelValues( + metrics []metricWithLabelValues, lvs []string, curry []curriedLabelValue, +) int { + for i, metric := range metrics { + if matchLabelValues(metric.values, lvs, curry) { + return i + } + } + return len(metrics) +} + +// findMetricWithLabels returns the index of the matching metric or len(metrics) +// if not found. +func findMetricWithLabels( + desc *Desc, metrics []metricWithLabelValues, labels Labels, curry []curriedLabelValue, +) int { + for i, metric := range metrics { + if matchLabels(desc, metric.values, labels, curry) { + return i + } + } + return len(metrics) +} + +func matchLabelValues(values []string, lvs []string, curry []curriedLabelValue) bool { + if len(values) != len(lvs)+len(curry) { + return false + } + var iLVs, iCurry int + for i, v := range values { + if iCurry < len(curry) && curry[iCurry].index == i { + if v != curry[iCurry].value { + return false + } + iCurry++ + continue + } + if v != lvs[iLVs] { + return false + } + iLVs++ + } + return true +} + +func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { + if len(values) != len(labels)+len(curry) { + return false + } + iCurry := 0 + for i, k := range desc.variableLabels { + if iCurry < len(curry) && curry[iCurry].index == i { + if values[i] != curry[iCurry].value { + return false + } + iCurry++ + continue + } + if values[i] != labels[k] { + return false + } + } + return true +} + +func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) []string { + labelValues := make([]string, len(labels)+len(curry)) + iCurry := 0 + for i, k := range desc.variableLabels { + if iCurry < len(curry) && curry[iCurry].index == i { + labelValues[i] = curry[iCurry].value + iCurry++ + continue + } + labelValues[i] = labels[k] + } + return labelValues +} + +func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { + labelValues := make([]string, len(lvs)+len(curry)) + var iCurry, iLVs int + for i := range labelValues { + if iCurry < len(curry) && curry[iCurry].index == i { + labelValues[i] = curry[iCurry].value + iCurry++ + continue + } + labelValues[i] = lvs[iLVs] + iLVs++ + } + return labelValues +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go new file mode 100644 index 000000000000..49159bf3eb05 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -0,0 +1,179 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +import ( + "fmt" + "sort" + + "github.com/golang/protobuf/proto" + + dto "github.com/prometheus/client_model/go" +) + +// WrapRegistererWith returns a Registerer wrapping the provided +// Registerer. Collectors registered with the returned Registerer will be +// registered with the wrapped Registerer in a modified way. The modified +// Collector adds the provided Labels to all Metrics it collects (as +// ConstLabels). The Metrics collected by the unmodified Collector must not +// duplicate any of those labels. +// +// WrapRegistererWith provides a way to add fixed labels to a subset of +// Collectors. It should not be used to add fixed labels to all metrics exposed. +// +// The Collector example demonstrates a use of WrapRegistererWith. +func WrapRegistererWith(labels Labels, reg Registerer) Registerer { + return &wrappingRegisterer{ + wrappedRegisterer: reg, + labels: labels, + } +} + +// WrapRegistererWithPrefix returns a Registerer wrapping the provided +// Registerer. Collectors registered with the returned Registerer will be +// registered with the wrapped Registerer in a modified way. The modified +// Collector adds the provided prefix to the name of all Metrics it collects. +// +// WrapRegistererWithPrefix is useful to have one place to prefix all metrics of +// a sub-system. To make this work, register metrics of the sub-system with the +// wrapping Registerer returned by WrapRegistererWithPrefix. It is rarely useful +// to use the same prefix for all metrics exposed. In particular, do not prefix +// metric names that are standardized across applications, as that would break +// horizontal monitoring, for example the metrics provided by the Go collector +// (see NewGoCollector) and the process collector (see NewProcessCollector). (In +// fact, those metrics are already prefixed with “go_” or “process_”, +// respectively.) +func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer { + return &wrappingRegisterer{ + wrappedRegisterer: reg, + prefix: prefix, + } +} + +type wrappingRegisterer struct { + wrappedRegisterer Registerer + prefix string + labels Labels +} + +func (r *wrappingRegisterer) Register(c Collector) error { + return r.wrappedRegisterer.Register(&wrappingCollector{ + wrappedCollector: c, + prefix: r.prefix, + labels: r.labels, + }) +} + +func (r *wrappingRegisterer) MustRegister(cs ...Collector) { + for _, c := range cs { + if err := r.Register(c); err != nil { + panic(err) + } + } +} + +func (r *wrappingRegisterer) Unregister(c Collector) bool { + return r.wrappedRegisterer.Unregister(&wrappingCollector{ + wrappedCollector: c, + prefix: r.prefix, + labels: r.labels, + }) +} + +type wrappingCollector struct { + wrappedCollector Collector + prefix string + labels Labels +} + +func (c *wrappingCollector) Collect(ch chan<- Metric) { + wrappedCh := make(chan Metric) + go func() { + c.wrappedCollector.Collect(wrappedCh) + close(wrappedCh) + }() + for m := range wrappedCh { + ch <- &wrappingMetric{ + wrappedMetric: m, + prefix: c.prefix, + labels: c.labels, + } + } +} + +func (c *wrappingCollector) Describe(ch chan<- *Desc) { + wrappedCh := make(chan *Desc) + go func() { + c.wrappedCollector.Describe(wrappedCh) + close(wrappedCh) + }() + for desc := range wrappedCh { + ch <- wrapDesc(desc, c.prefix, c.labels) + } +} + +type wrappingMetric struct { + wrappedMetric Metric + prefix string + labels Labels +} + +func (m *wrappingMetric) Desc() *Desc { + return wrapDesc(m.wrappedMetric.Desc(), m.prefix, m.labels) +} + +func (m *wrappingMetric) Write(out *dto.Metric) error { + if err := m.wrappedMetric.Write(out); err != nil { + return err + } + if len(m.labels) == 0 { + // No wrapping labels. + return nil + } + for ln, lv := range m.labels { + out.Label = append(out.Label, &dto.LabelPair{ + Name: proto.String(ln), + Value: proto.String(lv), + }) + } + sort.Sort(labelPairSorter(out.Label)) + return nil +} + +func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { + constLabels := Labels{} + for _, lp := range desc.constLabelPairs { + constLabels[*lp.Name] = *lp.Value + } + for ln, lv := range labels { + if _, alreadyUsed := constLabels[ln]; alreadyUsed { + return &Desc{ + fqName: desc.fqName, + help: desc.help, + variableLabels: desc.variableLabels, + constLabelPairs: desc.constLabelPairs, + err: fmt.Errorf("attempted wrapping with already existing label name %q", ln), + } + } + constLabels[ln] = lv + } + // NewDesc will do remaining validations. + newDesc := NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) + // Propagate errors if there was any. This will override any errer + // created by NewDesc above, i.e. earlier errors get precedence. + if desc.err != nil { + newDesc.err = desc.err + } + return newDesc +} diff --git a/vendor/github.com/prometheus/client_model/LICENSE b/vendor/github.com/prometheus/client_model/LICENSE new file mode 100644 index 000000000000..261eeb9e9f8b --- /dev/null +++ b/vendor/github.com/prometheus/client_model/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/client_model/NOTICE b/vendor/github.com/prometheus/client_model/NOTICE new file mode 100644 index 000000000000..20110e410e57 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/NOTICE @@ -0,0 +1,5 @@ +Data model artifacts for Prometheus. +Copyright 2012-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go new file mode 100644 index 000000000000..9805432c2a4c --- /dev/null +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -0,0 +1,629 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: metrics.proto + +package io_prometheus_client // import "github.com/prometheus/client_model/go" + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package + +type MetricType int32 + +const ( + MetricType_COUNTER MetricType = 0 + MetricType_GAUGE MetricType = 1 + MetricType_SUMMARY MetricType = 2 + MetricType_UNTYPED MetricType = 3 + MetricType_HISTOGRAM MetricType = 4 +) + +var MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", +} +var MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, +} + +func (x MetricType) Enum() *MetricType { + p := new(MetricType) + *p = x + return p +} +func (x MetricType) String() string { + return proto.EnumName(MetricType_name, int32(x)) +} +func (x *MetricType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") + if err != nil { + return err + } + *x = MetricType(value) + return nil +} +func (MetricType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} +} + +type LabelPair struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *LabelPair) Reset() { *m = LabelPair{} } +func (m *LabelPair) String() string { return proto.CompactTextString(m) } +func (*LabelPair) ProtoMessage() {} +func (*LabelPair) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{0} +} +func (m *LabelPair) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LabelPair.Unmarshal(m, b) +} +func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) +} +func (dst *LabelPair) XXX_Merge(src proto.Message) { + xxx_messageInfo_LabelPair.Merge(dst, src) +} +func (m *LabelPair) XXX_Size() int { + return xxx_messageInfo_LabelPair.Size(m) +} +func (m *LabelPair) XXX_DiscardUnknown() { + xxx_messageInfo_LabelPair.DiscardUnknown(m) +} + +var xxx_messageInfo_LabelPair proto.InternalMessageInfo + +func (m *LabelPair) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *LabelPair) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Gauge struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Gauge) Reset() { *m = Gauge{} } +func (m *Gauge) String() string { return proto.CompactTextString(m) } +func (*Gauge) ProtoMessage() {} +func (*Gauge) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{1} +} +func (m *Gauge) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Gauge.Unmarshal(m, b) +} +func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) +} +func (dst *Gauge) XXX_Merge(src proto.Message) { + xxx_messageInfo_Gauge.Merge(dst, src) +} +func (m *Gauge) XXX_Size() int { + return xxx_messageInfo_Gauge.Size(m) +} +func (m *Gauge) XXX_DiscardUnknown() { + xxx_messageInfo_Gauge.DiscardUnknown(m) +} + +var xxx_messageInfo_Gauge proto.InternalMessageInfo + +func (m *Gauge) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Counter struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Counter) Reset() { *m = Counter{} } +func (m *Counter) String() string { return proto.CompactTextString(m) } +func (*Counter) ProtoMessage() {} +func (*Counter) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{2} +} +func (m *Counter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Counter.Unmarshal(m, b) +} +func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Counter.Marshal(b, m, deterministic) +} +func (dst *Counter) XXX_Merge(src proto.Message) { + xxx_messageInfo_Counter.Merge(dst, src) +} +func (m *Counter) XXX_Size() int { + return xxx_messageInfo_Counter.Size(m) +} +func (m *Counter) XXX_DiscardUnknown() { + xxx_messageInfo_Counter.DiscardUnknown(m) +} + +var xxx_messageInfo_Counter proto.InternalMessageInfo + +func (m *Counter) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Quantile struct { + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Quantile) Reset() { *m = Quantile{} } +func (m *Quantile) String() string { return proto.CompactTextString(m) } +func (*Quantile) ProtoMessage() {} +func (*Quantile) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{3} +} +func (m *Quantile) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Quantile.Unmarshal(m, b) +} +func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) +} +func (dst *Quantile) XXX_Merge(src proto.Message) { + xxx_messageInfo_Quantile.Merge(dst, src) +} +func (m *Quantile) XXX_Size() int { + return xxx_messageInfo_Quantile.Size(m) +} +func (m *Quantile) XXX_DiscardUnknown() { + xxx_messageInfo_Quantile.DiscardUnknown(m) +} + +var xxx_messageInfo_Quantile proto.InternalMessageInfo + +func (m *Quantile) GetQuantile() float64 { + if m != nil && m.Quantile != nil { + return *m.Quantile + } + return 0 +} + +func (m *Quantile) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Summary struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Summary) Reset() { *m = Summary{} } +func (m *Summary) String() string { return proto.CompactTextString(m) } +func (*Summary) ProtoMessage() {} +func (*Summary) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{4} +} +func (m *Summary) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Summary.Unmarshal(m, b) +} +func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Summary.Marshal(b, m, deterministic) +} +func (dst *Summary) XXX_Merge(src proto.Message) { + xxx_messageInfo_Summary.Merge(dst, src) +} +func (m *Summary) XXX_Size() int { + return xxx_messageInfo_Summary.Size(m) +} +func (m *Summary) XXX_DiscardUnknown() { + xxx_messageInfo_Summary.DiscardUnknown(m) +} + +var xxx_messageInfo_Summary proto.InternalMessageInfo + +func (m *Summary) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Summary) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Summary) GetQuantile() []*Quantile { + if m != nil { + return m.Quantile + } + return nil +} + +type Untyped struct { + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Untyped) Reset() { *m = Untyped{} } +func (m *Untyped) String() string { return proto.CompactTextString(m) } +func (*Untyped) ProtoMessage() {} +func (*Untyped) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{5} +} +func (m *Untyped) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Untyped.Unmarshal(m, b) +} +func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) +} +func (dst *Untyped) XXX_Merge(src proto.Message) { + xxx_messageInfo_Untyped.Merge(dst, src) +} +func (m *Untyped) XXX_Size() int { + return xxx_messageInfo_Untyped.Size(m) +} +func (m *Untyped) XXX_DiscardUnknown() { + xxx_messageInfo_Untyped.DiscardUnknown(m) +} + +var xxx_messageInfo_Untyped proto.InternalMessageInfo + +func (m *Untyped) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Histogram struct { + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Histogram) Reset() { *m = Histogram{} } +func (m *Histogram) String() string { return proto.CompactTextString(m) } +func (*Histogram) ProtoMessage() {} +func (*Histogram) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{6} +} +func (m *Histogram) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Histogram.Unmarshal(m, b) +} +func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) +} +func (dst *Histogram) XXX_Merge(src proto.Message) { + xxx_messageInfo_Histogram.Merge(dst, src) +} +func (m *Histogram) XXX_Size() int { + return xxx_messageInfo_Histogram.Size(m) +} +func (m *Histogram) XXX_DiscardUnknown() { + xxx_messageInfo_Histogram.DiscardUnknown(m) +} + +var xxx_messageInfo_Histogram proto.InternalMessageInfo + +func (m *Histogram) GetSampleCount() uint64 { + if m != nil && m.SampleCount != nil { + return *m.SampleCount + } + return 0 +} + +func (m *Histogram) GetSampleSum() float64 { + if m != nil && m.SampleSum != nil { + return *m.SampleSum + } + return 0 +} + +func (m *Histogram) GetBucket() []*Bucket { + if m != nil { + return m.Bucket + } + return nil +} + +type Bucket struct { + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Bucket) Reset() { *m = Bucket{} } +func (m *Bucket) String() string { return proto.CompactTextString(m) } +func (*Bucket) ProtoMessage() {} +func (*Bucket) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{7} +} +func (m *Bucket) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Bucket.Unmarshal(m, b) +} +func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) +} +func (dst *Bucket) XXX_Merge(src proto.Message) { + xxx_messageInfo_Bucket.Merge(dst, src) +} +func (m *Bucket) XXX_Size() int { + return xxx_messageInfo_Bucket.Size(m) +} +func (m *Bucket) XXX_DiscardUnknown() { + xxx_messageInfo_Bucket.DiscardUnknown(m) +} + +var xxx_messageInfo_Bucket proto.InternalMessageInfo + +func (m *Bucket) GetCumulativeCount() uint64 { + if m != nil && m.CumulativeCount != nil { + return *m.CumulativeCount + } + return 0 +} + +func (m *Bucket) GetUpperBound() float64 { + if m != nil && m.UpperBound != nil { + return *m.UpperBound + } + return 0 +} + +type Metric struct { + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Metric) Reset() { *m = Metric{} } +func (m *Metric) String() string { return proto.CompactTextString(m) } +func (*Metric) ProtoMessage() {} +func (*Metric) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{8} +} +func (m *Metric) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Metric.Unmarshal(m, b) +} +func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Metric.Marshal(b, m, deterministic) +} +func (dst *Metric) XXX_Merge(src proto.Message) { + xxx_messageInfo_Metric.Merge(dst, src) +} +func (m *Metric) XXX_Size() int { + return xxx_messageInfo_Metric.Size(m) +} +func (m *Metric) XXX_DiscardUnknown() { + xxx_messageInfo_Metric.DiscardUnknown(m) +} + +var xxx_messageInfo_Metric proto.InternalMessageInfo + +func (m *Metric) GetLabel() []*LabelPair { + if m != nil { + return m.Label + } + return nil +} + +func (m *Metric) GetGauge() *Gauge { + if m != nil { + return m.Gauge + } + return nil +} + +func (m *Metric) GetCounter() *Counter { + if m != nil { + return m.Counter + } + return nil +} + +func (m *Metric) GetSummary() *Summary { + if m != nil { + return m.Summary + } + return nil +} + +func (m *Metric) GetUntyped() *Untyped { + if m != nil { + return m.Untyped + } + return nil +} + +func (m *Metric) GetHistogram() *Histogram { + if m != nil { + return m.Histogram + } + return nil +} + +func (m *Metric) GetTimestampMs() int64 { + if m != nil && m.TimestampMs != nil { + return *m.TimestampMs + } + return 0 +} + +type MetricFamily struct { + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MetricFamily) Reset() { *m = MetricFamily{} } +func (m *MetricFamily) String() string { return proto.CompactTextString(m) } +func (*MetricFamily) ProtoMessage() {} +func (*MetricFamily) Descriptor() ([]byte, []int) { + return fileDescriptor_metrics_c97c9a2b9560cb8f, []int{9} +} +func (m *MetricFamily) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MetricFamily.Unmarshal(m, b) +} +func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) +} +func (dst *MetricFamily) XXX_Merge(src proto.Message) { + xxx_messageInfo_MetricFamily.Merge(dst, src) +} +func (m *MetricFamily) XXX_Size() int { + return xxx_messageInfo_MetricFamily.Size(m) +} +func (m *MetricFamily) XXX_DiscardUnknown() { + xxx_messageInfo_MetricFamily.DiscardUnknown(m) +} + +var xxx_messageInfo_MetricFamily proto.InternalMessageInfo + +func (m *MetricFamily) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *MetricFamily) GetHelp() string { + if m != nil && m.Help != nil { + return *m.Help + } + return "" +} + +func (m *MetricFamily) GetType() MetricType { + if m != nil && m.Type != nil { + return *m.Type + } + return MetricType_COUNTER +} + +func (m *MetricFamily) GetMetric() []*Metric { + if m != nil { + return m.Metric + } + return nil +} + +func init() { + proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") + proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") + proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") + proto.RegisterType((*Quantile)(nil), "io.prometheus.client.Quantile") + proto.RegisterType((*Summary)(nil), "io.prometheus.client.Summary") + proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") + proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") + proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") + proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") + proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") + proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) +} + +func init() { proto.RegisterFile("metrics.proto", fileDescriptor_metrics_c97c9a2b9560cb8f) } + +var fileDescriptor_metrics_c97c9a2b9560cb8f = []byte{ + // 591 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4f, 0x4f, 0xdb, 0x4e, + 0x14, 0xfc, 0x99, 0xd8, 0x09, 0x7e, 0x86, 0x5f, 0xad, 0x15, 0x07, 0xab, 0x2d, 0x25, 0xcd, 0x89, + 0xf6, 0x10, 0x54, 0x04, 0xaa, 0x44, 0xdb, 0x03, 0x50, 0x1a, 0x2a, 0xd5, 0x40, 0x37, 0xc9, 0x81, + 0x5e, 0xac, 0x8d, 0x59, 0x25, 0x56, 0xbd, 0xb6, 0x6b, 0xef, 0x22, 0xe5, 0xdc, 0x43, 0xbf, 0x47, + 0xbf, 0x68, 0xab, 0xfd, 0xe3, 0x18, 0x24, 0xc3, 0xa9, 0xb7, 0xb7, 0xf3, 0x66, 0xde, 0x8e, 0x77, + 0xc7, 0x0b, 0x9b, 0x8c, 0xf2, 0x32, 0x89, 0xab, 0x61, 0x51, 0xe6, 0x3c, 0x47, 0x5b, 0x49, 0x2e, + 0x2b, 0x46, 0xf9, 0x82, 0x8a, 0x6a, 0x18, 0xa7, 0x09, 0xcd, 0xf8, 0xe0, 0x10, 0xdc, 0x2f, 0x64, + 0x46, 0xd3, 0x2b, 0x92, 0x94, 0x08, 0x81, 0x9d, 0x11, 0x46, 0x03, 0xab, 0x6f, 0xed, 0xba, 0x58, + 0xd5, 0x68, 0x0b, 0x9c, 0x5b, 0x92, 0x0a, 0x1a, 0xac, 0x29, 0x50, 0x2f, 0x06, 0xdb, 0xe0, 0x8c, + 0x88, 0x98, 0xdf, 0x69, 0x4b, 0x8d, 0x55, 0xb7, 0x77, 0xa0, 0x77, 0x9a, 0x8b, 0x8c, 0xd3, 0xf2, + 0x01, 0xc2, 0x7b, 0x58, 0xff, 0x2a, 0x48, 0xc6, 0x93, 0x94, 0xa2, 0xa7, 0xb0, 0xfe, 0xc3, 0xd4, + 0x86, 0xb4, 0x5a, 0xdf, 0xdf, 0x7d, 0xa5, 0xfe, 0x65, 0x41, 0x6f, 0x2c, 0x18, 0x23, 0xe5, 0x12, + 0xbd, 0x84, 0x8d, 0x8a, 0xb0, 0x22, 0xa5, 0x51, 0x2c, 0x77, 0x54, 0x13, 0x6c, 0xec, 0x69, 0x4c, + 0x99, 0x40, 0xdb, 0x00, 0x86, 0x52, 0x09, 0x66, 0x26, 0xb9, 0x1a, 0x19, 0x0b, 0x86, 0x8e, 0xee, + 0xec, 0xdf, 0xe9, 0x77, 0x76, 0xbd, 0xfd, 0x17, 0xc3, 0xb6, 0xb3, 0x1a, 0xd6, 0x8e, 0x1b, 0x7f, + 0xf2, 0x43, 0xa7, 0x19, 0x5f, 0x16, 0xf4, 0xe6, 0x81, 0x0f, 0xfd, 0x69, 0x81, 0x7b, 0x9e, 0x54, + 0x3c, 0x9f, 0x97, 0x84, 0xfd, 0x03, 0xb3, 0x07, 0xd0, 0x9d, 0x89, 0xf8, 0x3b, 0xe5, 0xc6, 0xea, + 0xf3, 0x76, 0xab, 0x27, 0x8a, 0x83, 0x0d, 0x77, 0x30, 0x81, 0xae, 0x46, 0xd0, 0x2b, 0xf0, 0x63, + 0xc1, 0x44, 0x4a, 0x78, 0x72, 0x7b, 0xdf, 0xc5, 0x93, 0x06, 0xd7, 0x4e, 0x76, 0xc0, 0x13, 0x45, + 0x41, 0xcb, 0x68, 0x96, 0x8b, 0xec, 0xc6, 0x58, 0x01, 0x05, 0x9d, 0x48, 0x64, 0xf0, 0x67, 0x0d, + 0xba, 0xa1, 0xca, 0x18, 0x3a, 0x04, 0x27, 0x95, 0x31, 0x0a, 0x2c, 0xe5, 0x6a, 0xa7, 0xdd, 0xd5, + 0x2a, 0x69, 0x58, 0xb3, 0xd1, 0x1b, 0x70, 0xe6, 0x32, 0x46, 0x6a, 0xb8, 0xb7, 0xff, 0xac, 0x5d, + 0xa6, 0x92, 0x86, 0x35, 0x13, 0xbd, 0x85, 0x5e, 0xac, 0xa3, 0x15, 0x74, 0x94, 0x68, 0xbb, 0x5d, + 0x64, 0xf2, 0x87, 0x6b, 0xb6, 0x14, 0x56, 0x3a, 0x33, 0x81, 0xfd, 0x98, 0xd0, 0x04, 0x0b, 0xd7, + 0x6c, 0x29, 0x14, 0xfa, 0x8e, 0x03, 0xe7, 0x31, 0xa1, 0x09, 0x02, 0xae, 0xd9, 0xe8, 0x03, 0xb8, + 0x8b, 0xfa, 0xea, 0x83, 0x9e, 0x92, 0x3e, 0x70, 0x30, 0xab, 0x84, 0xe0, 0x46, 0x21, 0xc3, 0xc2, + 0x13, 0x46, 0x2b, 0x4e, 0x58, 0x11, 0xb1, 0x2a, 0xe8, 0xf6, 0xad, 0xdd, 0x0e, 0xf6, 0x56, 0x58, + 0x58, 0x0d, 0x7e, 0x5b, 0xb0, 0xa1, 0x6f, 0xe0, 0x13, 0x61, 0x49, 0xba, 0x6c, 0xfd, 0x83, 0x11, + 0xd8, 0x0b, 0x9a, 0x16, 0xe6, 0x07, 0x56, 0x35, 0x3a, 0x00, 0x5b, 0x7a, 0x54, 0x47, 0xf8, 0xff, + 0x7e, 0xbf, 0xdd, 0x95, 0x9e, 0x3c, 0x59, 0x16, 0x14, 0x2b, 0xb6, 0x0c, 0x9f, 0x7e, 0x53, 0x02, + 0xfb, 0xb1, 0xf0, 0x69, 0x1d, 0x36, 0xdc, 0xd7, 0x21, 0x40, 0x33, 0x09, 0x79, 0xd0, 0x3b, 0xbd, + 0x9c, 0x5e, 0x4c, 0xce, 0xb0, 0xff, 0x1f, 0x72, 0xc1, 0x19, 0x1d, 0x4f, 0x47, 0x67, 0xbe, 0x25, + 0xf1, 0xf1, 0x34, 0x0c, 0x8f, 0xf1, 0xb5, 0xbf, 0x26, 0x17, 0xd3, 0x8b, 0xc9, 0xf5, 0xd5, 0xd9, + 0x47, 0xbf, 0x83, 0x36, 0xc1, 0x3d, 0xff, 0x3c, 0x9e, 0x5c, 0x8e, 0xf0, 0x71, 0xe8, 0xdb, 0x27, + 0x18, 0x5a, 0x5f, 0xb2, 0x6f, 0x47, 0xf3, 0x84, 0x2f, 0xc4, 0x6c, 0x18, 0xe7, 0x6c, 0xaf, 0xe9, + 0xee, 0xe9, 0x6e, 0xc4, 0xf2, 0x1b, 0x9a, 0xee, 0xcd, 0xf3, 0x77, 0x49, 0x1e, 0x35, 0xdd, 0x48, + 0x77, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x45, 0x21, 0x7f, 0x64, 0x2b, 0x05, 0x00, 0x00, +} diff --git a/vendor/github.com/prometheus/client_model/ruby/LICENSE b/vendor/github.com/prometheus/client_model/ruby/LICENSE new file mode 100644 index 000000000000..11069edd7901 --- /dev/null +++ b/vendor/github.com/prometheus/client_model/ruby/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/prometheus/common/LICENSE b/vendor/github.com/prometheus/common/LICENSE new file mode 100644 index 000000000000..261eeb9e9f8b --- /dev/null +++ b/vendor/github.com/prometheus/common/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/common/NOTICE b/vendor/github.com/prometheus/common/NOTICE new file mode 100644 index 000000000000..636a2c1a5e88 --- /dev/null +++ b/vendor/github.com/prometheus/common/NOTICE @@ -0,0 +1,5 @@ +Common libraries shared by Prometheus Go components. +Copyright 2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go new file mode 100644 index 000000000000..c092723e84a4 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -0,0 +1,429 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "math" + "mime" + "net/http" + + dto "github.com/prometheus/client_model/go" + + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/model" +) + +// Decoder types decode an input stream into metric families. +type Decoder interface { + Decode(*dto.MetricFamily) error +} + +// DecodeOptions contains options used by the Decoder and in sample extraction. +type DecodeOptions struct { + // Timestamp is added to each value from the stream that has no explicit timestamp set. + Timestamp model.Time +} + +// ResponseFormat extracts the correct format from a HTTP response header. +// If no matching format can be found FormatUnknown is returned. +func ResponseFormat(h http.Header) Format { + ct := h.Get(hdrContentType) + + mediatype, params, err := mime.ParseMediaType(ct) + if err != nil { + return FmtUnknown + } + + const textType = "text/plain" + + switch mediatype { + case ProtoType: + if p, ok := params["proto"]; ok && p != ProtoProtocol { + return FmtUnknown + } + if e, ok := params["encoding"]; ok && e != "delimited" { + return FmtUnknown + } + return FmtProtoDelim + + case textType: + if v, ok := params["version"]; ok && v != TextVersion { + return FmtUnknown + } + return FmtText + } + + return FmtUnknown +} + +// NewDecoder returns a new decoder based on the given input format. +// If the input format does not imply otherwise, a text format decoder is returned. +func NewDecoder(r io.Reader, format Format) Decoder { + switch format { + case FmtProtoDelim: + return &protoDecoder{r: r} + } + return &textDecoder{r: r} +} + +// protoDecoder implements the Decoder interface for protocol buffers. +type protoDecoder struct { + r io.Reader +} + +// Decode implements the Decoder interface. +func (d *protoDecoder) Decode(v *dto.MetricFamily) error { + _, err := pbutil.ReadDelimited(d.r, v) + if err != nil { + return err + } + if !model.IsValidMetricName(model.LabelValue(v.GetName())) { + return fmt.Errorf("invalid metric name %q", v.GetName()) + } + for _, m := range v.GetMetric() { + if m == nil { + continue + } + for _, l := range m.GetLabel() { + if l == nil { + continue + } + if !model.LabelValue(l.GetValue()).IsValid() { + return fmt.Errorf("invalid label value %q", l.GetValue()) + } + if !model.LabelName(l.GetName()).IsValid() { + return fmt.Errorf("invalid label name %q", l.GetName()) + } + } + } + return nil +} + +// textDecoder implements the Decoder interface for the text protocol. +type textDecoder struct { + r io.Reader + p TextParser + fams []*dto.MetricFamily +} + +// Decode implements the Decoder interface. +func (d *textDecoder) Decode(v *dto.MetricFamily) error { + // TODO(fabxc): Wrap this as a line reader to make streaming safer. + if len(d.fams) == 0 { + // No cached metric families, read everything and parse metrics. + fams, err := d.p.TextToMetricFamilies(d.r) + if err != nil { + return err + } + if len(fams) == 0 { + return io.EOF + } + d.fams = make([]*dto.MetricFamily, 0, len(fams)) + for _, f := range fams { + d.fams = append(d.fams, f) + } + } + + *v = *d.fams[0] + d.fams = d.fams[1:] + + return nil +} + +// SampleDecoder wraps a Decoder to extract samples from the metric families +// decoded by the wrapped Decoder. +type SampleDecoder struct { + Dec Decoder + Opts *DecodeOptions + + f dto.MetricFamily +} + +// Decode calls the Decode method of the wrapped Decoder and then extracts the +// samples from the decoded MetricFamily into the provided model.Vector. +func (sd *SampleDecoder) Decode(s *model.Vector) error { + err := sd.Dec.Decode(&sd.f) + if err != nil { + return err + } + *s, err = extractSamples(&sd.f, sd.Opts) + return err +} + +// ExtractSamples builds a slice of samples from the provided metric +// families. If an error occurrs during sample extraction, it continues to +// extract from the remaining metric families. The returned error is the last +// error that has occurred. +func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model.Vector, error) { + var ( + all model.Vector + lastErr error + ) + for _, f := range fams { + some, err := extractSamples(f, o) + if err != nil { + lastErr = err + continue + } + all = append(all, some...) + } + return all, lastErr +} + +func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector, error) { + switch f.GetType() { + case dto.MetricType_COUNTER: + return extractCounter(o, f), nil + case dto.MetricType_GAUGE: + return extractGauge(o, f), nil + case dto.MetricType_SUMMARY: + return extractSummary(o, f), nil + case dto.MetricType_UNTYPED: + return extractUntyped(o, f), nil + case dto.MetricType_HISTOGRAM: + return extractHistogram(o, f), nil + } + return nil, fmt.Errorf("expfmt.extractSamples: unknown metric family type %v", f.GetType()) +} + +func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Counter == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Counter.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Gauge == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Gauge.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Untyped == nil { + continue + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + smpl := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Untyped.GetValue()), + } + + if m.TimestampMs != nil { + smpl.Timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } else { + smpl.Timestamp = o.Timestamp + } + + samples = append(samples, smpl) + } + + return samples +} + +func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Summary == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + for _, q := range m.Summary.Quantile { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + // BUG(matt): Update other names to "quantile". + lset[model.LabelName(model.QuantileLabel)] = model.LabelValue(fmt.Sprint(q.GetQuantile())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName()) + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetValue()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Summary.GetSampleCount()), + Timestamp: timestamp, + }) + } + + return samples +} + +func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector { + samples := make(model.Vector, 0, len(f.Metric)) + + for _, m := range f.Metric { + if m.Histogram == nil { + continue + } + + timestamp := o.Timestamp + if m.TimestampMs != nil { + timestamp = model.TimeFromUnixNano(*m.TimestampMs * 1000000) + } + + infSeen := false + + for _, q := range m.Histogram.Bucket { + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue(fmt.Sprint(q.GetUpperBound())) + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + if math.IsInf(q.GetUpperBound(), +1) { + infSeen = true + } + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(q.GetCumulativeCount()), + Timestamp: timestamp, + }) + } + + lset := make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_sum") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleSum()), + Timestamp: timestamp, + }) + + lset = make(model.LabelSet, len(m.Label)+1) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_count") + + count := &model.Sample{ + Metric: model.Metric(lset), + Value: model.SampleValue(m.Histogram.GetSampleCount()), + Timestamp: timestamp, + } + samples = append(samples, count) + + if !infSeen { + // Append an infinity bucket sample. + lset := make(model.LabelSet, len(m.Label)+2) + for _, p := range m.Label { + lset[model.LabelName(p.GetName())] = model.LabelValue(p.GetValue()) + } + lset[model.LabelName(model.BucketLabel)] = model.LabelValue("+Inf") + lset[model.MetricNameLabel] = model.LabelValue(f.GetName() + "_bucket") + + samples = append(samples, &model.Sample{ + Metric: model.Metric(lset), + Value: count.Value, + Timestamp: timestamp, + }) + } + } + + return samples +} diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go new file mode 100644 index 000000000000..11839ed65ce3 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -0,0 +1,88 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "fmt" + "io" + "net/http" + + "github.com/golang/protobuf/proto" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + + dto "github.com/prometheus/client_model/go" +) + +// Encoder types encode metric families into an underlying wire protocol. +type Encoder interface { + Encode(*dto.MetricFamily) error +} + +type encoder func(*dto.MetricFamily) error + +func (e encoder) Encode(v *dto.MetricFamily) error { + return e(v) +} + +// Negotiate returns the Content-Type based on the given Accept header. +// If no appropriate accepted type is found, FmtText is returned. +func Negotiate(h http.Header) Format { + for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { + // Check for protocol buffer + if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { + switch ac.Params["encoding"] { + case "delimited": + return FmtProtoDelim + case "text": + return FmtProtoText + case "compact-text": + return FmtProtoCompact + } + } + // Check for text format. + ver := ac.Params["version"] + if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { + return FmtText + } + } + return FmtText +} + +// NewEncoder returns a new encoder based on content type negotiation. +func NewEncoder(w io.Writer, format Format) Encoder { + switch format { + case FmtProtoDelim: + return encoder(func(v *dto.MetricFamily) error { + _, err := pbutil.WriteDelimited(w, v) + return err + }) + case FmtProtoCompact: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, v.String()) + return err + }) + case FmtProtoText: + return encoder(func(v *dto.MetricFamily) error { + _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + return err + }) + case FmtText: + return encoder(func(v *dto.MetricFamily) error { + _, err := MetricFamilyToText(w, v) + return err + }) + } + panic("expfmt.NewEncoder: unknown format") +} diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go new file mode 100644 index 000000000000..c71bcb98167c --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -0,0 +1,38 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package expfmt contains tools for reading and writing Prometheus metrics. +package expfmt + +// Format specifies the HTTP content type of the different wire protocols. +type Format string + +// Constants to assemble the Content-Type values for the different wire protocols. +const ( + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + + // The Content-Type values for the different wire protocols. + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` +) + +const ( + hdrContentType = "Content-Type" + hdrAccept = "Accept" +) diff --git a/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/prometheus/common/expfmt/fuzz.go new file mode 100644 index 000000000000..dc2eedeefcac --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -0,0 +1,36 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Build only when actually fuzzing +// +build gofuzz + +package expfmt + +import "bytes" + +// Fuzz text metric parser with with github.com/dvyukov/go-fuzz: +// +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// +// Further input samples should go in the folder fuzz/corpus. +func Fuzz(in []byte) int { + parser := TextParser{} + _, err := parser.TextToMetricFamilies(bytes.NewReader(in)) + + if err != nil { + return 0 + } + + return 1 +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go new file mode 100644 index 000000000000..8e473d0fe92d --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -0,0 +1,468 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + "sync" + + "github.com/prometheus/common/model" + + dto "github.com/prometheus/client_model/go" +) + +// enhancedWriter has all the enhanced write functions needed here. bytes.Buffer +// implements it. +type enhancedWriter interface { + io.Writer + WriteRune(r rune) (n int, err error) + WriteString(s string) (n int, err error) + WriteByte(c byte) error +} + +const ( + initialBufSize = 512 + initialNumBufSize = 24 +) + +var ( + bufPool = sync.Pool{ + New: func() interface{} { + return bytes.NewBuffer(make([]byte, 0, initialBufSize)) + }, + } + numBufPool = sync.Pool{ + New: func() interface{} { + b := make([]byte, 0, initialNumBufSize) + return &b + }, + } +) + +// MetricFamilyToText converts a MetricFamily proto message into text format and +// writes the resulting lines to 'out'. It returns the number of bytes written +// and any error encountered. The output will have the same order as the input, +// no further sorting is performed. Furthermore, this function assumes the input +// is already sanitized and does not perform any sanity checks. If the input +// contains duplicate metrics or invalid metric or label names, the conversion +// will result in invalid text format output. +// +// This method fulfills the type 'prometheus.encoder'. +func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { + // Fail-fast checks. + if len(in.Metric) == 0 { + return 0, fmt.Errorf("MetricFamily has no metrics: %s", in) + } + name := in.GetName() + if name == "" { + return 0, fmt.Errorf("MetricFamily has no name: %s", in) + } + + // Try the interface upgrade. If it doesn't work, we'll use a + // bytes.Buffer from the sync.Pool and write out its content to out in a + // single go in the end. + w, ok := out.(enhancedWriter) + if !ok { + b := bufPool.Get().(*bytes.Buffer) + b.Reset() + w = b + defer func() { + bWritten, bErr := out.Write(b.Bytes()) + written = bWritten + if err == nil { + err = bErr + } + bufPool.Put(b) + }() + } + + var n int + + // Comments, first HELP, then TYPE. + if in.Help != nil { + n, err = w.WriteString("# HELP ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + err = w.WriteByte(' ') + written++ + if err != nil { + return + } + n, err = writeEscapedString(w, *in.Help, false) + written += n + if err != nil { + return + } + err = w.WriteByte('\n') + written++ + if err != nil { + return + } + } + n, err = w.WriteString("# TYPE ") + written += n + if err != nil { + return + } + n, err = w.WriteString(name) + written += n + if err != nil { + return + } + metricType := in.GetType() + switch metricType { + case dto.MetricType_COUNTER: + n, err = w.WriteString(" counter\n") + case dto.MetricType_GAUGE: + n, err = w.WriteString(" gauge\n") + case dto.MetricType_SUMMARY: + n, err = w.WriteString(" summary\n") + case dto.MetricType_UNTYPED: + n, err = w.WriteString(" untyped\n") + case dto.MetricType_HISTOGRAM: + n, err = w.WriteString(" histogram\n") + default: + return written, fmt.Errorf("unknown metric type %s", metricType.String()) + } + written += n + if err != nil { + return + } + + // Finally the samples, one line for each. + for _, metric := range in.Metric { + switch metricType { + case dto.MetricType_COUNTER: + if metric.Counter == nil { + return written, fmt.Errorf( + "expected counter in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Counter.GetValue(), + ) + case dto.MetricType_GAUGE: + if metric.Gauge == nil { + return written, fmt.Errorf( + "expected gauge in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Gauge.GetValue(), + ) + case dto.MetricType_UNTYPED: + if metric.Untyped == nil { + return written, fmt.Errorf( + "expected untyped in metric %s %s", name, metric, + ) + } + n, err = writeSample( + w, name, "", metric, "", 0, + metric.Untyped.GetValue(), + ) + case dto.MetricType_SUMMARY: + if metric.Summary == nil { + return written, fmt.Errorf( + "expected summary in metric %s %s", name, metric, + ) + } + for _, q := range metric.Summary.Quantile { + n, err = writeSample( + w, name, "", metric, + model.QuantileLabel, q.GetQuantile(), + q.GetValue(), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Summary.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Summary.GetSampleCount()), + ) + case dto.MetricType_HISTOGRAM: + if metric.Histogram == nil { + return written, fmt.Errorf( + "expected histogram in metric %s %s", name, metric, + ) + } + infSeen := false + for _, b := range metric.Histogram.Bucket { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, b.GetUpperBound(), + float64(b.GetCumulativeCount()), + ) + written += n + if err != nil { + return + } + if math.IsInf(b.GetUpperBound(), +1) { + infSeen = true + } + } + if !infSeen { + n, err = writeSample( + w, name, "_bucket", metric, + model.BucketLabel, math.Inf(+1), + float64(metric.Histogram.GetSampleCount()), + ) + written += n + if err != nil { + return + } + } + n, err = writeSample( + w, name, "_sum", metric, "", 0, + metric.Histogram.GetSampleSum(), + ) + written += n + if err != nil { + return + } + n, err = writeSample( + w, name, "_count", metric, "", 0, + float64(metric.Histogram.GetSampleCount()), + ) + default: + return written, fmt.Errorf( + "unexpected type in metric %s %s", name, metric, + ) + } + written += n + if err != nil { + return + } + } + return +} + +// writeSample writes a single sample in text format to w, given the metric +// name, the metric proto message itself, optionally an additional label name +// with a float64 value (use empty string as label name if not required), and +// the value. The function returns the number of bytes written and any error +// encountered. +func writeSample( + w enhancedWriter, + name, suffix string, + metric *dto.Metric, + additionalLabelName string, additionalLabelValue float64, + value float64, +) (int, error) { + var written int + n, err := w.WriteString(name) + written += n + if err != nil { + return written, err + } + if suffix != "" { + n, err = w.WriteString(suffix) + written += n + if err != nil { + return written, err + } + } + n, err = writeLabelPairs( + w, metric.Label, additionalLabelName, additionalLabelValue, + ) + written += n + if err != nil { + return written, err + } + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeFloat(w, value) + written += n + if err != nil { + return written, err + } + if metric.TimestampMs != nil { + err = w.WriteByte(' ') + written++ + if err != nil { + return written, err + } + n, err = writeInt(w, *metric.TimestampMs) + written += n + if err != nil { + return written, err + } + } + err = w.WriteByte('\n') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeLabelPairs converts a slice of LabelPair proto messages plus the +// explicitly given additional label pair into text formatted as required by the +// text format and writes it to 'w'. An empty slice in combination with an empty +// string 'additionalLabelName' results in nothing being written. Otherwise, the +// label pairs are written, escaped as required by the text format, and enclosed +// in '{...}'. The function returns the number of bytes written and any error +// encountered. +func writeLabelPairs( + w enhancedWriter, + in []*dto.LabelPair, + additionalLabelName string, additionalLabelValue float64, +) (int, error) { + if len(in) == 0 && additionalLabelName == "" { + return 0, nil + } + var ( + written int + separator byte = '{' + ) + for _, lp := range in { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(lp.GetName()) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeEscapedString(w, lp.GetValue(), true) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + separator = ',' + } + if additionalLabelName != "" { + err := w.WriteByte(separator) + written++ + if err != nil { + return written, err + } + n, err := w.WriteString(additionalLabelName) + written += n + if err != nil { + return written, err + } + n, err = w.WriteString(`="`) + written += n + if err != nil { + return written, err + } + n, err = writeFloat(w, additionalLabelValue) + written += n + if err != nil { + return written, err + } + err = w.WriteByte('"') + written++ + if err != nil { + return written, err + } + } + err := w.WriteByte('}') + written++ + if err != nil { + return written, err + } + return written, nil +} + +// writeEscapedString replaces '\' by '\\', new line character by '\n', and - if +// includeDoubleQuote is true - '"' by '\"'. +var ( + escaper = strings.NewReplacer("\\", `\\`, "\n", `\n`) + quotedEscaper = strings.NewReplacer("\\", `\\`, "\n", `\n`, "\"", `\"`) +) + +func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote bool) (int, error) { + if includeDoubleQuote { + return quotedEscaper.WriteString(w, v) + } else { + return escaper.WriteString(w, v) + } +} + +// writeFloat is equivalent to fmt.Fprint with a float64 argument but hardcodes +// a few common cases for increased efficiency. For non-hardcoded cases, it uses +// strconv.AppendFloat to avoid allocations, similar to writeInt. +func writeFloat(w enhancedWriter, f float64) (int, error) { + switch { + case f == 1: + return 1, w.WriteByte('1') + case f == 0: + return 1, w.WriteByte('0') + case f == -1: + return w.WriteString("-1") + case math.IsNaN(f): + return w.WriteString("NaN") + case math.IsInf(f, +1): + return w.WriteString("+Inf") + case math.IsInf(f, -1): + return w.WriteString("-Inf") + default: + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err + } +} + +// writeInt is equivalent to fmt.Fprint with an int64 argument but uses +// strconv.AppendInt with a byte slice taken from a sync.Pool to avoid +// allocations. +func writeInt(w enhancedWriter, i int64) (int, error) { + bp := numBufPool.Get().(*[]byte) + *bp = strconv.AppendInt((*bp)[:0], i, 10) + written, err := w.Write(*bp) + numBufPool.Put(bp) + return written, err +} diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go new file mode 100644 index 000000000000..ec3d86ba7ce1 --- /dev/null +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -0,0 +1,757 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package expfmt + +import ( + "bufio" + "bytes" + "fmt" + "io" + "math" + "strconv" + "strings" + + dto "github.com/prometheus/client_model/go" + + "github.com/golang/protobuf/proto" + "github.com/prometheus/common/model" +) + +// A stateFn is a function that represents a state in a state machine. By +// executing it, the state is progressed to the next state. The stateFn returns +// another stateFn, which represents the new state. The end state is represented +// by nil. +type stateFn func() stateFn + +// ParseError signals errors while parsing the simple and flat text-based +// exchange format. +type ParseError struct { + Line int + Msg string +} + +// Error implements the error interface. +func (e ParseError) Error() string { + return fmt.Sprintf("text format parsing error in line %d: %s", e.Line, e.Msg) +} + +// TextParser is used to parse the simple and flat text-based exchange format. Its +// zero value is ready to use. +type TextParser struct { + metricFamiliesByName map[string]*dto.MetricFamily + buf *bufio.Reader // Where the parsed input is read through. + err error // Most recent error. + lineCount int // Tracks the line count for error messages. + currentByte byte // The most recent byte read. + currentToken bytes.Buffer // Re-used each time a token has to be gathered from multiple bytes. + currentMF *dto.MetricFamily + currentMetric *dto.Metric + currentLabelPair *dto.LabelPair + + // The remaining member variables are only used for summaries/histograms. + currentLabels map[string]string // All labels including '__name__' but excluding 'quantile'/'le' + // Summary specific. + summaries map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentQuantile float64 + // Histogram specific. + histograms map[uint64]*dto.Metric // Key is created with LabelsToSignature. + currentBucket float64 + // These tell us if the currently processed line ends on '_count' or + // '_sum' respectively and belong to a summary/histogram, representing the sample + // count and sum of that summary/histogram. + currentIsSummaryCount, currentIsSummarySum bool + currentIsHistogramCount, currentIsHistogramSum bool +} + +// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange +// format and creates MetricFamily proto messages. It returns the MetricFamily +// proto messages in a map where the metric names are the keys, along with any +// error encountered. +// +// If the input contains duplicate metrics (i.e. lines with the same metric name +// and exactly the same label set), the resulting MetricFamily will contain +// duplicate Metric proto messages. Similar is true for duplicate label +// names. Checks for duplicates have to be performed separately, if required. +// Also note that neither the metrics within each MetricFamily are sorted nor +// the label pairs within each Metric. Sorting is not required for the most +// frequent use of this method, which is sample ingestion in the Prometheus +// server. However, for presentation purposes, you might want to sort the +// metrics, and in some cases, you must sort the labels, e.g. for consumption by +// the metric family injection hook of the Prometheus registry. +// +// Summaries and histograms are rather special beasts. You would probably not +// use them in the simple text format anyway. This method can deal with +// summaries and histograms if they are presented in exactly the way the +// text.Create function creates them. +// +// This method must not be called concurrently. If you want to parse different +// input concurrently, instantiate a separate Parser for each goroutine. +func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricFamily, error) { + p.reset(in) + for nextState := p.startOfLine; nextState != nil; nextState = nextState() { + // Magic happens here... + } + // Get rid of empty metric families. + for k, mf := range p.metricFamiliesByName { + if len(mf.GetMetric()) == 0 { + delete(p.metricFamiliesByName, k) + } + } + // If p.err is io.EOF now, we have run into a premature end of the input + // stream. Turn this error into something nicer and more + // meaningful. (io.EOF is often used as a signal for the legitimate end + // of an input stream.) + if p.err == io.EOF { + p.parseError("unexpected end of input stream") + } + return p.metricFamiliesByName, p.err +} + +func (p *TextParser) reset(in io.Reader) { + p.metricFamiliesByName = map[string]*dto.MetricFamily{} + if p.buf == nil { + p.buf = bufio.NewReader(in) + } else { + p.buf.Reset(in) + } + p.err = nil + p.lineCount = 0 + if p.summaries == nil || len(p.summaries) > 0 { + p.summaries = map[uint64]*dto.Metric{} + } + if p.histograms == nil || len(p.histograms) > 0 { + p.histograms = map[uint64]*dto.Metric{} + } + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() +} + +// startOfLine represents the state where the next byte read from p.buf is the +// start of a line (or whitespace leading up to it). +func (p *TextParser) startOfLine() stateFn { + p.lineCount++ + if p.skipBlankTab(); p.err != nil { + // End of input reached. This is the only case where + // that is not an error but a signal that we are done. + p.err = nil + return nil + } + switch p.currentByte { + case '#': + return p.startComment + case '\n': + return p.startOfLine // Empty line, start the next one. + } + return p.readingMetricName +} + +// startComment represents the state where the next byte read from p.buf is the +// start of a comment (or whitespace leading up to it). +func (p *TextParser) startComment() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + return p.startOfLine + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + // If we have hit the end of line already, there is nothing left + // to do. This is not considered a syntax error. + if p.currentByte == '\n' { + return p.startOfLine + } + keyword := p.currentToken.String() + if keyword != "HELP" && keyword != "TYPE" { + // Generic comment, ignore by fast forwarding to end of line. + for p.currentByte != '\n' { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return nil // Unexpected end of input. + } + } + return p.startOfLine + } + // There is something. Next has to be a metric name. + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenAsMetricName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + if !isBlankOrTab(p.currentByte) { + p.parseError("invalid metric name in comment") + return nil + } + p.setOrCreateCurrentMF() + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '\n' { + // At the end of the line already. + // Again, this is not considered a syntax error. + return p.startOfLine + } + switch keyword { + case "HELP": + return p.readingHelp + case "TYPE": + return p.readingType + } + panic(fmt.Sprintf("code error: unexpected keyword %q", keyword)) +} + +// readingMetricName represents the state where the last byte read (now in +// p.currentByte) is the first byte of a metric name. +func (p *TextParser) readingMetricName() stateFn { + if p.readTokenAsMetricName(); p.err != nil { + return nil + } + if p.currentToken.Len() == 0 { + p.parseError("invalid metric name") + return nil + } + p.setOrCreateCurrentMF() + // Now is the time to fix the type if it hasn't happened yet. + if p.currentMF.Type == nil { + p.currentMF.Type = dto.MetricType_UNTYPED.Enum() + } + p.currentMetric = &dto.Metric{} + // Do not append the newly created currentMetric to + // currentMF.Metric right now. First wait if this is a summary, + // and the metric exists already, which we can only know after + // having read all the labels. + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingLabels +} + +// readingLabels represents the state where the last byte read (now in +// p.currentByte) is either the first byte of the label set (i.e. a '{'), or the +// first byte of the value (otherwise). +func (p *TextParser) readingLabels() stateFn { + // Summaries/histograms are special. We have to reset the + // currentLabels map, currentQuantile and currentBucket before starting to + // read labels. + if p.currentMF.GetType() == dto.MetricType_SUMMARY || p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + p.currentLabels = map[string]string{} + p.currentLabels[string(model.MetricNameLabel)] = p.currentMF.GetName() + p.currentQuantile = math.NaN() + p.currentBucket = math.NaN() + } + if p.currentByte != '{' { + return p.readingValue + } + return p.startLabelName +} + +// startLabelName represents the state where the next byte read from p.buf is +// the start of a label name (or whitespace leading up to it). +func (p *TextParser) startLabelName() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte == '}' { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + } + if p.readTokenAsLabelName(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() == 0 { + p.parseError(fmt.Sprintf("invalid label name for metric %q", p.currentMF.GetName())) + return nil + } + p.currentLabelPair = &dto.LabelPair{Name: proto.String(p.currentToken.String())} + if p.currentLabelPair.GetName() == string(model.MetricNameLabel) { + p.parseError(fmt.Sprintf("label name %q is reserved", model.MetricNameLabel)) + return nil + } + // Special summary/histogram treatment. Don't add 'quantile' and 'le' + // labels to 'real' labels. + if !(p.currentMF.GetType() == dto.MetricType_SUMMARY && p.currentLabelPair.GetName() == model.QuantileLabel) && + !(p.currentMF.GetType() == dto.MetricType_HISTOGRAM && p.currentLabelPair.GetName() == model.BucketLabel) { + p.currentMetric.Label = append(p.currentMetric.Label, p.currentLabelPair) + } + if p.skipBlankTabIfCurrentBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '=' { + p.parseError(fmt.Sprintf("expected '=' after label name, found %q", p.currentByte)) + return nil + } + return p.startLabelValue +} + +// startLabelValue represents the state where the next byte read from p.buf is +// the start of a (quoted) label value (or whitespace leading up to it). +func (p *TextParser) startLabelValue() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentByte != '"' { + p.parseError(fmt.Sprintf("expected '\"' at start of label value, found %q", p.currentByte)) + return nil + } + if p.readTokenAsLabelValue(); p.err != nil { + return nil + } + if !model.LabelValue(p.currentToken.String()).IsValid() { + p.parseError(fmt.Sprintf("invalid label value %q", p.currentToken.String())) + return nil + } + p.currentLabelPair.Value = proto.String(p.currentToken.String()) + // Special treatment of summaries: + // - Quantile labels are special, will result in dto.Quantile later. + // - Other labels have to be added to currentLabels for signature calculation. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if p.currentLabelPair.GetName() == model.QuantileLabel { + if p.currentQuantile, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'quantile' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + // Similar special treatment of histograms. + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if p.currentLabelPair.GetName() == model.BucketLabel { + if p.currentBucket, p.err = strconv.ParseFloat(p.currentLabelPair.GetValue(), 64); p.err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value for 'le' label, got %q", p.currentLabelPair.GetValue())) + return nil + } + } else { + p.currentLabels[p.currentLabelPair.GetName()] = p.currentLabelPair.GetValue() + } + } + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + switch p.currentByte { + case ',': + return p.startLabelName + + case '}': + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + return p.readingValue + default: + p.parseError(fmt.Sprintf("unexpected end of label value %q", p.currentLabelPair.GetValue())) + return nil + } +} + +// readingValue represents the state where the last byte read (now in +// p.currentByte) is the first byte of the sample value (i.e. a float). +func (p *TextParser) readingValue() stateFn { + // When we are here, we have read all the labels, so for the + // special case of a summary/histogram, we can finally find out + // if the metric already exists. + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + signature := model.LabelsToSignature(p.currentLabels) + if summary := p.summaries[signature]; summary != nil { + p.currentMetric = summary + } else { + p.summaries[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + signature := model.LabelsToSignature(p.currentLabels) + if histogram := p.histograms[signature]; histogram != nil { + p.currentMetric = histogram + } else { + p.histograms[signature] = p.currentMetric + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + } else { + p.currentMF.Metric = append(p.currentMF.Metric, p.currentMetric) + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + value, err := strconv.ParseFloat(p.currentToken.String(), 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected float as value, got %q", p.currentToken.String())) + return nil + } + switch p.currentMF.GetType() { + case dto.MetricType_COUNTER: + p.currentMetric.Counter = &dto.Counter{Value: proto.Float64(value)} + case dto.MetricType_GAUGE: + p.currentMetric.Gauge = &dto.Gauge{Value: proto.Float64(value)} + case dto.MetricType_UNTYPED: + p.currentMetric.Untyped = &dto.Untyped{Value: proto.Float64(value)} + case dto.MetricType_SUMMARY: + // *sigh* + if p.currentMetric.Summary == nil { + p.currentMetric.Summary = &dto.Summary{} + } + switch { + case p.currentIsSummaryCount: + p.currentMetric.Summary.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsSummarySum: + p.currentMetric.Summary.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentQuantile): + p.currentMetric.Summary.Quantile = append( + p.currentMetric.Summary.Quantile, + &dto.Quantile{ + Quantile: proto.Float64(p.currentQuantile), + Value: proto.Float64(value), + }, + ) + } + case dto.MetricType_HISTOGRAM: + // *sigh* + if p.currentMetric.Histogram == nil { + p.currentMetric.Histogram = &dto.Histogram{} + } + switch { + case p.currentIsHistogramCount: + p.currentMetric.Histogram.SampleCount = proto.Uint64(uint64(value)) + case p.currentIsHistogramSum: + p.currentMetric.Histogram.SampleSum = proto.Float64(value) + case !math.IsNaN(p.currentBucket): + p.currentMetric.Histogram.Bucket = append( + p.currentMetric.Histogram.Bucket, + &dto.Bucket{ + UpperBound: proto.Float64(p.currentBucket), + CumulativeCount: proto.Uint64(uint64(value)), + }, + ) + } + default: + p.err = fmt.Errorf("unexpected type for metric name %q", p.currentMF.GetName()) + } + if p.currentByte == '\n' { + return p.startOfLine + } + return p.startTimestamp +} + +// startTimestamp represents the state where the next byte read from p.buf is +// the start of the timestamp (or whitespace leading up to it). +func (p *TextParser) startTimestamp() stateFn { + if p.skipBlankTab(); p.err != nil { + return nil // Unexpected end of input. + } + if p.readTokenUntilWhitespace(); p.err != nil { + return nil // Unexpected end of input. + } + timestamp, err := strconv.ParseInt(p.currentToken.String(), 10, 64) + if err != nil { + // Create a more helpful error message. + p.parseError(fmt.Sprintf("expected integer as timestamp, got %q", p.currentToken.String())) + return nil + } + p.currentMetric.TimestampMs = proto.Int64(timestamp) + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + if p.currentToken.Len() > 0 { + p.parseError(fmt.Sprintf("spurious string after timestamp: %q", p.currentToken.String())) + return nil + } + return p.startOfLine +} + +// readingHelp represents the state where the last byte read (now in +// p.currentByte) is the first byte of the docstring after 'HELP'. +func (p *TextParser) readingHelp() stateFn { + if p.currentMF.Help != nil { + p.parseError(fmt.Sprintf("second HELP line for metric name %q", p.currentMF.GetName())) + return nil + } + // Rest of line is the docstring. + if p.readTokenUntilNewline(true); p.err != nil { + return nil // Unexpected end of input. + } + p.currentMF.Help = proto.String(p.currentToken.String()) + return p.startOfLine +} + +// readingType represents the state where the last byte read (now in +// p.currentByte) is the first byte of the type hint after 'HELP'. +func (p *TextParser) readingType() stateFn { + if p.currentMF.Type != nil { + p.parseError(fmt.Sprintf("second TYPE line for metric name %q, or TYPE reported after samples", p.currentMF.GetName())) + return nil + } + // Rest of line is the type. + if p.readTokenUntilNewline(false); p.err != nil { + return nil // Unexpected end of input. + } + metricType, ok := dto.MetricType_value[strings.ToUpper(p.currentToken.String())] + if !ok { + p.parseError(fmt.Sprintf("unknown metric type %q", p.currentToken.String())) + return nil + } + p.currentMF.Type = dto.MetricType(metricType).Enum() + return p.startOfLine +} + +// parseError sets p.err to a ParseError at the current line with the given +// message. +func (p *TextParser) parseError(msg string) { + p.err = ParseError{ + Line: p.lineCount, + Msg: msg, + } +} + +// skipBlankTab reads (and discards) bytes from p.buf until it encounters a byte +// that is neither ' ' nor '\t'. That byte is left in p.currentByte. +func (p *TextParser) skipBlankTab() { + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil || !isBlankOrTab(p.currentByte) { + return + } + } +} + +// skipBlankTabIfCurrentBlankTab works exactly as skipBlankTab but doesn't do +// anything if p.currentByte is neither ' ' nor '\t'. +func (p *TextParser) skipBlankTabIfCurrentBlankTab() { + if isBlankOrTab(p.currentByte) { + p.skipBlankTab() + } +} + +// readTokenUntilWhitespace copies bytes from p.buf into p.currentToken. The +// first byte considered is the byte already read (now in p.currentByte). The +// first whitespace byte encountered is still copied into p.currentByte, but not +// into p.currentToken. +func (p *TextParser) readTokenUntilWhitespace() { + p.currentToken.Reset() + for p.err == nil && !isBlankOrTab(p.currentByte) && p.currentByte != '\n' { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenUntilNewline copies bytes from p.buf into p.currentToken. The first +// byte considered is the byte already read (now in p.currentByte). The first +// newline byte encountered is still copied into p.currentByte, but not into +// p.currentToken. If recognizeEscapeSequence is true, two escape sequences are +// recognized: '\\' translates into '\', and '\n' into a line-feed character. +// All other escape sequences are invalid and cause an error. +func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence bool) { + p.currentToken.Reset() + escaped := false + for p.err == nil { + if recognizeEscapeSequence && escaped { + switch p.currentByte { + case '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + } else { + switch p.currentByte { + case '\n': + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } + p.currentByte, p.err = p.buf.ReadByte() + } +} + +// readTokenAsMetricName copies a metric name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a metric name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsMetricName() { + p.currentToken.Reset() + if !isValidMetricNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidMetricNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelName copies a label name from p.buf into p.currentToken. +// The first byte considered is the byte already read (now in p.currentByte). +// The first byte not part of a label name is still copied into p.currentByte, +// but not into p.currentToken. +func (p *TextParser) readTokenAsLabelName() { + p.currentToken.Reset() + if !isValidLabelNameStart(p.currentByte) { + return + } + for { + p.currentToken.WriteByte(p.currentByte) + p.currentByte, p.err = p.buf.ReadByte() + if p.err != nil || !isValidLabelNameContinuation(p.currentByte) { + return + } + } +} + +// readTokenAsLabelValue copies a label value from p.buf into p.currentToken. +// In contrast to the other 'readTokenAs...' functions, which start with the +// last read byte in p.currentByte, this method ignores p.currentByte and starts +// with reading a new byte from p.buf. The first byte not part of a label value +// is still copied into p.currentByte, but not into p.currentToken. +func (p *TextParser) readTokenAsLabelValue() { + p.currentToken.Reset() + escaped := false + for { + if p.currentByte, p.err = p.buf.ReadByte(); p.err != nil { + return + } + if escaped { + switch p.currentByte { + case '"', '\\': + p.currentToken.WriteByte(p.currentByte) + case 'n': + p.currentToken.WriteByte('\n') + default: + p.parseError(fmt.Sprintf("invalid escape sequence '\\%c'", p.currentByte)) + return + } + escaped = false + continue + } + switch p.currentByte { + case '"': + return + case '\n': + p.parseError(fmt.Sprintf("label value %q contains unescaped new-line", p.currentToken.String())) + return + case '\\': + escaped = true + default: + p.currentToken.WriteByte(p.currentByte) + } + } +} + +func (p *TextParser) setOrCreateCurrentMF() { + p.currentIsSummaryCount = false + p.currentIsSummarySum = false + p.currentIsHistogramCount = false + p.currentIsHistogramSum = false + name := p.currentToken.String() + if p.currentMF = p.metricFamiliesByName[name]; p.currentMF != nil { + return + } + // Try out if this is a _sum or _count for a summary/histogram. + summaryName := summaryMetricName(name) + if p.currentMF = p.metricFamiliesByName[summaryName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_SUMMARY { + if isCount(name) { + p.currentIsSummaryCount = true + } + if isSum(name) { + p.currentIsSummarySum = true + } + return + } + } + histogramName := histogramMetricName(name) + if p.currentMF = p.metricFamiliesByName[histogramName]; p.currentMF != nil { + if p.currentMF.GetType() == dto.MetricType_HISTOGRAM { + if isCount(name) { + p.currentIsHistogramCount = true + } + if isSum(name) { + p.currentIsHistogramSum = true + } + return + } + } + p.currentMF = &dto.MetricFamily{Name: proto.String(name)} + p.metricFamiliesByName[name] = p.currentMF +} + +func isValidLabelNameStart(b byte) bool { + return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' +} + +func isValidLabelNameContinuation(b byte) bool { + return isValidLabelNameStart(b) || (b >= '0' && b <= '9') +} + +func isValidMetricNameStart(b byte) bool { + return isValidLabelNameStart(b) || b == ':' +} + +func isValidMetricNameContinuation(b byte) bool { + return isValidLabelNameContinuation(b) || b == ':' +} + +func isBlankOrTab(b byte) bool { + return b == ' ' || b == '\t' +} + +func isCount(name string) bool { + return len(name) > 6 && name[len(name)-6:] == "_count" +} + +func isSum(name string) bool { + return len(name) > 4 && name[len(name)-4:] == "_sum" +} + +func isBucket(name string) bool { + return len(name) > 7 && name[len(name)-7:] == "_bucket" +} + +func summaryMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + default: + return name + } +} + +func histogramMetricName(name string) string { + switch { + case isCount(name): + return name[:len(name)-6] + case isSum(name): + return name[:len(name)-4] + case isBucket(name): + return name[:len(name)-7] + default: + return name + } +} diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go new file mode 100644 index 000000000000..648b38cb6546 --- /dev/null +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -0,0 +1,162 @@ +/* +HTTP Content-Type Autonegotiation. + +The functions in this package implement the behaviour specified in +http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + +Copyright (c) 2011, Open Knowledge Foundation Ltd. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ +package goautoneg + +import ( + "sort" + "strconv" + "strings" +) + +// Structure to represent a clause in an HTTP Accept Header +type Accept struct { + Type, SubType string + Q float64 + Params map[string]string +} + +// For internal use, so that we can use the sort interface +type accept_slice []Accept + +func (accept accept_slice) Len() int { + slice := []Accept(accept) + return len(slice) +} + +func (accept accept_slice) Less(i, j int) bool { + slice := []Accept(accept) + ai, aj := slice[i], slice[j] + if ai.Q > aj.Q { + return true + } + if ai.Type != "*" && aj.Type == "*" { + return true + } + if ai.SubType != "*" && aj.SubType == "*" { + return true + } + return false +} + +func (accept accept_slice) Swap(i, j int) { + slice := []Accept(accept) + slice[i], slice[j] = slice[j], slice[i] +} + +// Parse an Accept Header string returning a sorted list +// of clauses +func ParseAccept(header string) (accept []Accept) { + parts := strings.Split(header, ",") + accept = make([]Accept, 0, len(parts)) + for _, part := range parts { + part := strings.Trim(part, " ") + + a := Accept{} + a.Params = make(map[string]string) + a.Q = 1.0 + + mrp := strings.Split(part, ";") + + media_range := mrp[0] + sp := strings.Split(media_range, "/") + a.Type = strings.Trim(sp[0], " ") + + switch { + case len(sp) == 1 && a.Type == "*": + a.SubType = "*" + case len(sp) == 2: + a.SubType = strings.Trim(sp[1], " ") + default: + continue + } + + if len(mrp) == 1 { + accept = append(accept, a) + continue + } + + for _, param := range mrp[1:] { + sp := strings.SplitN(param, "=", 2) + if len(sp) != 2 { + continue + } + token := strings.Trim(sp[0], " ") + if token == "q" { + a.Q, _ = strconv.ParseFloat(sp[1], 32) + } else { + a.Params[token] = strings.Trim(sp[1], " ") + } + } + + accept = append(accept, a) + } + + slice := accept_slice(accept) + sort.Sort(slice) + + return +} + +// Negotiate the most appropriate content_type given the accept header +// and a list of alternatives. +func Negotiate(header string, alternatives []string) (content_type string) { + asp := make([][]string, 0, len(alternatives)) + for _, ctype := range alternatives { + asp = append(asp, strings.SplitN(ctype, "/", 2)) + } + for _, clause := range ParseAccept(header) { + for i, ctsp := range asp { + if clause.Type == ctsp[0] && clause.SubType == ctsp[1] { + content_type = alternatives[i] + return + } + if clause.Type == ctsp[0] && clause.SubType == "*" { + content_type = alternatives[i] + return + } + if clause.Type == "*" && clause.SubType == "*" { + content_type = alternatives[i] + return + } + } + } + return +} diff --git a/vendor/github.com/prometheus/common/model/alert.go b/vendor/github.com/prometheus/common/model/alert.go new file mode 100644 index 000000000000..35e739c7ad21 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/alert.go @@ -0,0 +1,136 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "time" +) + +type AlertStatus string + +const ( + AlertFiring AlertStatus = "firing" + AlertResolved AlertStatus = "resolved" +) + +// Alert is a generic representation of an alert in the Prometheus eco-system. +type Alert struct { + // Label value pairs for purpose of aggregation, matching, and disposition + // dispatching. This must minimally include an "alertname" label. + Labels LabelSet `json:"labels"` + + // Extra key/value information which does not define alert identity. + Annotations LabelSet `json:"annotations"` + + // The known time range for this alert. Both ends are optional. + StartsAt time.Time `json:"startsAt,omitempty"` + EndsAt time.Time `json:"endsAt,omitempty"` + GeneratorURL string `json:"generatorURL"` +} + +// Name returns the name of the alert. It is equivalent to the "alertname" label. +func (a *Alert) Name() string { + return string(a.Labels[AlertNameLabel]) +} + +// Fingerprint returns a unique hash for the alert. It is equivalent to +// the fingerprint of the alert's label set. +func (a *Alert) Fingerprint() Fingerprint { + return a.Labels.Fingerprint() +} + +func (a *Alert) String() string { + s := fmt.Sprintf("%s[%s]", a.Name(), a.Fingerprint().String()[:7]) + if a.Resolved() { + return s + "[resolved]" + } + return s + "[active]" +} + +// Resolved returns true iff the activity interval ended in the past. +func (a *Alert) Resolved() bool { + return a.ResolvedAt(time.Now()) +} + +// ResolvedAt returns true off the activity interval ended before +// the given timestamp. +func (a *Alert) ResolvedAt(ts time.Time) bool { + if a.EndsAt.IsZero() { + return false + } + return !a.EndsAt.After(ts) +} + +// Status returns the status of the alert. +func (a *Alert) Status() AlertStatus { + if a.Resolved() { + return AlertResolved + } + return AlertFiring +} + +// Validate checks whether the alert data is inconsistent. +func (a *Alert) Validate() error { + if a.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if !a.EndsAt.IsZero() && a.EndsAt.Before(a.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if err := a.Labels.Validate(); err != nil { + return fmt.Errorf("invalid label set: %s", err) + } + if len(a.Labels) == 0 { + return fmt.Errorf("at least one label pair required") + } + if err := a.Annotations.Validate(); err != nil { + return fmt.Errorf("invalid annotations: %s", err) + } + return nil +} + +// Alert is a list of alerts that can be sorted in chronological order. +type Alerts []*Alert + +func (as Alerts) Len() int { return len(as) } +func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + +func (as Alerts) Less(i, j int) bool { + if as[i].StartsAt.Before(as[j].StartsAt) { + return true + } + if as[i].EndsAt.Before(as[j].EndsAt) { + return true + } + return as[i].Fingerprint() < as[j].Fingerprint() +} + +// HasFiring returns true iff one of the alerts is not resolved. +func (as Alerts) HasFiring() bool { + for _, a := range as { + if !a.Resolved() { + return true + } + } + return false +} + +// Status returns StatusFiring iff at least one of the alerts is firing. +func (as Alerts) Status() AlertStatus { + if as.HasFiring() { + return AlertFiring + } + return AlertResolved +} diff --git a/vendor/github.com/prometheus/common/model/fingerprinting.go b/vendor/github.com/prometheus/common/model/fingerprinting.go new file mode 100644 index 000000000000..fc4de4106e85 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/fingerprinting.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "strconv" +) + +// Fingerprint provides a hash-capable representation of a Metric. +// For our purposes, FNV-1A 64-bit is used. +type Fingerprint uint64 + +// FingerprintFromString transforms a string representation into a Fingerprint. +func FingerprintFromString(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + return Fingerprint(num), err +} + +// ParseFingerprint parses the input string into a fingerprint. +func ParseFingerprint(s string) (Fingerprint, error) { + num, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return 0, err + } + return Fingerprint(num), nil +} + +func (f Fingerprint) String() string { + return fmt.Sprintf("%016x", uint64(f)) +} + +// Fingerprints represents a collection of Fingerprint subject to a given +// natural sorting scheme. It implements sort.Interface. +type Fingerprints []Fingerprint + +// Len implements sort.Interface. +func (f Fingerprints) Len() int { + return len(f) +} + +// Less implements sort.Interface. +func (f Fingerprints) Less(i, j int) bool { + return f[i] < f[j] +} + +// Swap implements sort.Interface. +func (f Fingerprints) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// FingerprintSet is a set of Fingerprints. +type FingerprintSet map[Fingerprint]struct{} + +// Equal returns true if both sets contain the same elements (and not more). +func (s FingerprintSet) Equal(o FingerprintSet) bool { + if len(s) != len(o) { + return false + } + + for k := range s { + if _, ok := o[k]; !ok { + return false + } + } + + return true +} + +// Intersection returns the elements contained in both sets. +func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet { + myLength, otherLength := len(s), len(o) + if myLength == 0 || otherLength == 0 { + return FingerprintSet{} + } + + subSet := s + superSet := o + + if otherLength < myLength { + subSet = o + superSet = s + } + + out := FingerprintSet{} + + for k := range subSet { + if _, ok := superSet[k]; ok { + out[k] = struct{}{} + } + } + + return out +} diff --git a/vendor/github.com/prometheus/common/model/fnv.go b/vendor/github.com/prometheus/common/model/fnv.go new file mode 100644 index 000000000000..038fc1c9003c --- /dev/null +++ b/vendor/github.com/prometheus/common/model/fnv.go @@ -0,0 +1,42 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +// Inline and byte-free variant of hash/fnv's fnv64a. + +const ( + offset64 = 14695981039346656037 + prime64 = 1099511628211 +) + +// hashNew initializies a new fnv64a hash value. +func hashNew() uint64 { + return offset64 +} + +// hashAdd adds a string to a fnv64a hash value, returning the updated hash. +func hashAdd(h uint64, s string) uint64 { + for i := 0; i < len(s); i++ { + h ^= uint64(s[i]) + h *= prime64 + } + return h +} + +// hashAddByte adds a byte to a fnv64a hash value, returning the updated hash. +func hashAddByte(h uint64, b byte) uint64 { + h ^= uint64(b) + h *= prime64 + return h +} diff --git a/vendor/github.com/prometheus/common/model/labels.go b/vendor/github.com/prometheus/common/model/labels.go new file mode 100644 index 000000000000..41051a01a36d --- /dev/null +++ b/vendor/github.com/prometheus/common/model/labels.go @@ -0,0 +1,210 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "strings" + "unicode/utf8" +) + +const ( + // AlertNameLabel is the name of the label containing the an alert's name. + AlertNameLabel = "alertname" + + // ExportedLabelPrefix is the prefix to prepend to the label names present in + // exported metrics if a label of the same name is added by the server. + ExportedLabelPrefix = "exported_" + + // MetricNameLabel is the label name indicating the metric name of a + // timeseries. + MetricNameLabel = "__name__" + + // SchemeLabel is the name of the label that holds the scheme on which to + // scrape a target. + SchemeLabel = "__scheme__" + + // AddressLabel is the name of the label that holds the address of + // a scrape target. + AddressLabel = "__address__" + + // MetricsPathLabel is the name of the label that holds the path on which to + // scrape a target. + MetricsPathLabel = "__metrics_path__" + + // ReservedLabelPrefix is a prefix which is not legal in user-supplied + // label names. + ReservedLabelPrefix = "__" + + // MetaLabelPrefix is a prefix for labels that provide meta information. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. + MetaLabelPrefix = "__meta_" + + // TmpLabelPrefix is a prefix for temporary labels as part of relabelling. + // Labels with this prefix are used for intermediate label processing and + // will not be attached to time series. This is reserved for use in + // Prometheus configuration files by users. + TmpLabelPrefix = "__tmp_" + + // ParamLabelPrefix is a prefix for labels that provide URL parameters + // used to scrape a target. + ParamLabelPrefix = "__param_" + + // JobLabel is the label name indicating the job from which a timeseries + // was scraped. + JobLabel = "job" + + // InstanceLabel is the label name used for the instance label. + InstanceLabel = "instance" + + // BucketLabel is used for the label that defines the upper bound of a + // bucket of a histogram ("le" -> "less or equal"). + BucketLabel = "le" + + // QuantileLabel is used for the label that defines the quantile in a + // summary. + QuantileLabel = "quantile" +) + +// LabelNameRE is a regular expression matching valid label names. Note that the +// IsValid method of LabelName performs the same check but faster than a match +// with this regular expression. +var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") + +// A LabelName is a key for a LabelSet or Metric. It has a value associated +// therewith. +type LabelName string + +// IsValid is true iff the label name matches the pattern of LabelNameRE. This +// method, however, does not use LabelNameRE for the check but a much faster +// hardcoded implementation. +func (ln LabelName) IsValid() bool { + if len(ln) == 0 { + return false + } + for i, b := range ln { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (ln *LabelName) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + if !LabelName(s).IsValid() { + return fmt.Errorf("%q is not a valid label name", s) + } + *ln = LabelName(s) + return nil +} + +// LabelNames is a sortable LabelName slice. In implements sort.Interface. +type LabelNames []LabelName + +func (l LabelNames) Len() int { + return len(l) +} + +func (l LabelNames) Less(i, j int) bool { + return l[i] < l[j] +} + +func (l LabelNames) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +func (l LabelNames) String() string { + labelStrings := make([]string, 0, len(l)) + for _, label := range l { + labelStrings = append(labelStrings, string(label)) + } + return strings.Join(labelStrings, ", ") +} + +// A LabelValue is an associated value for a LabelName. +type LabelValue string + +// IsValid returns true iff the string is a valid UTF8. +func (lv LabelValue) IsValid() bool { + return utf8.ValidString(string(lv)) +} + +// LabelValues is a sortable LabelValue slice. It implements sort.Interface. +type LabelValues []LabelValue + +func (l LabelValues) Len() int { + return len(l) +} + +func (l LabelValues) Less(i, j int) bool { + return string(l[i]) < string(l[j]) +} + +func (l LabelValues) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// LabelPair pairs a name with a value. +type LabelPair struct { + Name LabelName + Value LabelValue +} + +// LabelPairs is a sortable slice of LabelPair pointers. It implements +// sort.Interface. +type LabelPairs []*LabelPair + +func (l LabelPairs) Len() int { + return len(l) +} + +func (l LabelPairs) Less(i, j int) bool { + switch { + case l[i].Name > l[j].Name: + return false + case l[i].Name < l[j].Name: + return true + case l[i].Value > l[j].Value: + return false + case l[i].Value < l[j].Value: + return true + default: + return false + } +} + +func (l LabelPairs) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} diff --git a/vendor/github.com/prometheus/common/model/labelset.go b/vendor/github.com/prometheus/common/model/labelset.go new file mode 100644 index 000000000000..6eda08a7395a --- /dev/null +++ b/vendor/github.com/prometheus/common/model/labelset.go @@ -0,0 +1,169 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "sort" + "strings" +) + +// A LabelSet is a collection of LabelName and LabelValue pairs. The LabelSet +// may be fully-qualified down to the point where it may resolve to a single +// Metric in the data store or not. All operations that occur within the realm +// of a LabelSet can emit a vector of Metric entities to which the LabelSet may +// match. +type LabelSet map[LabelName]LabelValue + +// Validate checks whether all names and values in the label set +// are valid. +func (ls LabelSet) Validate() error { + for ln, lv := range ls { + if !ln.IsValid() { + return fmt.Errorf("invalid name %q", ln) + } + if !lv.IsValid() { + return fmt.Errorf("invalid value %q", lv) + } + } + return nil +} + +// Equal returns true iff both label sets have exactly the same key/value pairs. +func (ls LabelSet) Equal(o LabelSet) bool { + if len(ls) != len(o) { + return false + } + for ln, lv := range ls { + olv, ok := o[ln] + if !ok { + return false + } + if olv != lv { + return false + } + } + return true +} + +// Before compares the metrics, using the following criteria: +// +// If m has fewer labels than o, it is before o. If it has more, it is not. +// +// If the number of labels is the same, the superset of all label names is +// sorted alphanumerically. The first differing label pair found in that order +// determines the outcome: If the label does not exist at all in m, then m is +// before o, and vice versa. Otherwise the label value is compared +// alphanumerically. +// +// If m and o are equal, the method returns false. +func (ls LabelSet) Before(o LabelSet) bool { + if len(ls) < len(o) { + return true + } + if len(ls) > len(o) { + return false + } + + lns := make(LabelNames, 0, len(ls)+len(o)) + for ln := range ls { + lns = append(lns, ln) + } + for ln := range o { + lns = append(lns, ln) + } + // It's probably not worth it to de-dup lns. + sort.Sort(lns) + for _, ln := range lns { + mlv, ok := ls[ln] + if !ok { + return true + } + olv, ok := o[ln] + if !ok { + return false + } + if mlv < olv { + return true + } + if mlv > olv { + return false + } + } + return false +} + +// Clone returns a copy of the label set. +func (ls LabelSet) Clone() LabelSet { + lsn := make(LabelSet, len(ls)) + for ln, lv := range ls { + lsn[ln] = lv + } + return lsn +} + +// Merge is a helper function to non-destructively merge two label sets. +func (l LabelSet) Merge(other LabelSet) LabelSet { + result := make(LabelSet, len(l)) + + for k, v := range l { + result[k] = v + } + + for k, v := range other { + result[k] = v + } + + return result +} + +func (l LabelSet) String() string { + lstrs := make([]string, 0, len(l)) + for l, v := range l { + lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v)) + } + + sort.Strings(lstrs) + return fmt.Sprintf("{%s}", strings.Join(lstrs, ", ")) +} + +// Fingerprint returns the LabelSet's fingerprint. +func (ls LabelSet) Fingerprint() Fingerprint { + return labelSetToFingerprint(ls) +} + +// FastFingerprint returns the LabelSet's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (ls LabelSet) FastFingerprint() Fingerprint { + return labelSetToFastFingerprint(ls) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (l *LabelSet) UnmarshalJSON(b []byte) error { + var m map[LabelName]LabelValue + if err := json.Unmarshal(b, &m); err != nil { + return err + } + // encoding/json only unmarshals maps of the form map[string]T. It treats + // LabelName as a string and does not call its UnmarshalJSON method. + // Thus, we have to replicate the behavior here. + for ln := range m { + if !ln.IsValid() { + return fmt.Errorf("%q is not a valid label name", ln) + } + } + *l = LabelSet(m) + return nil +} diff --git a/vendor/github.com/prometheus/common/model/metric.go b/vendor/github.com/prometheus/common/model/metric.go new file mode 100644 index 000000000000..f7250909b9fd --- /dev/null +++ b/vendor/github.com/prometheus/common/model/metric.go @@ -0,0 +1,103 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "regexp" + "sort" + "strings" +) + +var ( + separator = []byte{0} + // MetricNameRE is a regular expression matching valid metric + // names. Note that the IsValidMetricName function performs the same + // check but faster than a match with this regular expression. + MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) +) + +// A Metric is similar to a LabelSet, but the key difference is that a Metric is +// a singleton and refers to one and only one stream of samples. +type Metric LabelSet + +// Equal compares the metrics. +func (m Metric) Equal(o Metric) bool { + return LabelSet(m).Equal(LabelSet(o)) +} + +// Before compares the metrics' underlying label sets. +func (m Metric) Before(o Metric) bool { + return LabelSet(m).Before(LabelSet(o)) +} + +// Clone returns a copy of the Metric. +func (m Metric) Clone() Metric { + clone := make(Metric, len(m)) + for k, v := range m { + clone[k] = v + } + return clone +} + +func (m Metric) String() string { + metricName, hasName := m[MetricNameLabel] + numLabels := len(m) - 1 + if !hasName { + numLabels = len(m) + } + labelStrings := make([]string, 0, numLabels) + for label, value := range m { + if label != MetricNameLabel { + labelStrings = append(labelStrings, fmt.Sprintf("%s=%q", label, value)) + } + } + + switch numLabels { + case 0: + if hasName { + return string(metricName) + } + return "{}" + default: + sort.Strings(labelStrings) + return fmt.Sprintf("%s{%s}", metricName, strings.Join(labelStrings, ", ")) + } +} + +// Fingerprint returns a Metric's Fingerprint. +func (m Metric) Fingerprint() Fingerprint { + return LabelSet(m).Fingerprint() +} + +// FastFingerprint returns a Metric's Fingerprint calculated by a faster hashing +// algorithm, which is, however, more susceptible to hash collisions. +func (m Metric) FastFingerprint() Fingerprint { + return LabelSet(m).FastFingerprint() +} + +// IsValidMetricName returns true iff name matches the pattern of MetricNameRE. +// This function, however, does not use MetricNameRE for the check but a much +// faster hardcoded implementation. +func IsValidMetricName(n LabelValue) bool { + if len(n) == 0 { + return false + } + for i, b := range n { + if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { + return false + } + } + return true +} diff --git a/vendor/github.com/prometheus/common/model/model.go b/vendor/github.com/prometheus/common/model/model.go new file mode 100644 index 000000000000..a7b9691707e8 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/model.go @@ -0,0 +1,16 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package model contains common data structures that are shared across +// Prometheus components and libraries. +package model diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/prometheus/common/model/signature.go new file mode 100644 index 000000000000..8762b13c63d1 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/signature.go @@ -0,0 +1,144 @@ +// Copyright 2014 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "sort" +) + +// SeparatorByte is a byte that cannot occur in valid UTF-8 sequences and is +// used to separate label names, label values, and other strings from each other +// when calculating their combined hash value (aka signature aka fingerprint). +const SeparatorByte byte = 255 + +var ( + // cache the signature of an empty label set. + emptyLabelSignature = hashNew() +) + +// LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a +// given label set. (Collisions are possible but unlikely if the number of label +// sets the function is applied to is small.) +func LabelsToSignature(labels map[string]string) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + labelNames := make([]string, 0, len(labels)) + for labelName := range labels { + labelNames = append(labelNames, labelName) + } + sort.Strings(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, labelName) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, labels[labelName]) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// labelSetToFingerprint works exactly as LabelsToSignature but takes a LabelSet as +// parameter (rather than a label map) and returns a Fingerprint. +func labelSetToFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + labelNames := make(LabelNames, 0, len(ls)) + for labelName := range ls { + labelNames = append(labelNames, labelName) + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(ls[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return Fingerprint(sum) +} + +// labelSetToFastFingerprint works similar to labelSetToFingerprint but uses a +// faster and less allocation-heavy hash function, which is more susceptible to +// create hash collisions. Therefore, collision detection should be applied. +func labelSetToFastFingerprint(ls LabelSet) Fingerprint { + if len(ls) == 0 { + return Fingerprint(emptyLabelSignature) + } + + var result uint64 + for labelName, labelValue := range ls { + sum := hashNew() + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(labelValue)) + result ^= sum + } + return Fingerprint(result) +} + +// SignatureForLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and only includes the labels with the +// specified LabelNames into the signature calculation. The labels passed in +// will be sorted by this function. +func SignatureForLabels(m Metric, labels ...LabelName) uint64 { + if len(labels) == 0 { + return emptyLabelSignature + } + + sort.Sort(LabelNames(labels)) + + sum := hashNew() + for _, label := range labels { + sum = hashAdd(sum, string(label)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[label])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} + +// SignatureWithoutLabels works like LabelsToSignature but takes a Metric as +// parameter (rather than a label map) and excludes the labels with any of the +// specified LabelNames from the signature calculation. +func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uint64 { + if len(m) == 0 { + return emptyLabelSignature + } + + labelNames := make(LabelNames, 0, len(m)) + for labelName := range m { + if _, exclude := labels[labelName]; !exclude { + labelNames = append(labelNames, labelName) + } + } + if len(labelNames) == 0 { + return emptyLabelSignature + } + sort.Sort(labelNames) + + sum := hashNew() + for _, labelName := range labelNames { + sum = hashAdd(sum, string(labelName)) + sum = hashAddByte(sum, SeparatorByte) + sum = hashAdd(sum, string(m[labelName])) + sum = hashAddByte(sum, SeparatorByte) + } + return sum +} diff --git a/vendor/github.com/prometheus/common/model/silence.go b/vendor/github.com/prometheus/common/model/silence.go new file mode 100644 index 000000000000..bb99889d2cc6 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/silence.go @@ -0,0 +1,106 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "regexp" + "time" +) + +// Matcher describes a matches the value of a given label. +type Matcher struct { + Name LabelName `json:"name"` + Value string `json:"value"` + IsRegex bool `json:"isRegex"` +} + +func (m *Matcher) UnmarshalJSON(b []byte) error { + type plain Matcher + if err := json.Unmarshal(b, (*plain)(m)); err != nil { + return err + } + + if len(m.Name) == 0 { + return fmt.Errorf("label name in matcher must not be empty") + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return err + } + } + return nil +} + +// Validate returns true iff all fields of the matcher have valid values. +func (m *Matcher) Validate() error { + if !m.Name.IsValid() { + return fmt.Errorf("invalid name %q", m.Name) + } + if m.IsRegex { + if _, err := regexp.Compile(m.Value); err != nil { + return fmt.Errorf("invalid regular expression %q", m.Value) + } + } else if !LabelValue(m.Value).IsValid() || len(m.Value) == 0 { + return fmt.Errorf("invalid value %q", m.Value) + } + return nil +} + +// Silence defines the representation of a silence definition in the Prometheus +// eco-system. +type Silence struct { + ID uint64 `json:"id,omitempty"` + + Matchers []*Matcher `json:"matchers"` + + StartsAt time.Time `json:"startsAt"` + EndsAt time.Time `json:"endsAt"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + CreatedBy string `json:"createdBy"` + Comment string `json:"comment,omitempty"` +} + +// Validate returns true iff all fields of the silence have valid values. +func (s *Silence) Validate() error { + if len(s.Matchers) == 0 { + return fmt.Errorf("at least one matcher required") + } + for _, m := range s.Matchers { + if err := m.Validate(); err != nil { + return fmt.Errorf("invalid matcher: %s", err) + } + } + if s.StartsAt.IsZero() { + return fmt.Errorf("start time missing") + } + if s.EndsAt.IsZero() { + return fmt.Errorf("end time missing") + } + if s.EndsAt.Before(s.StartsAt) { + return fmt.Errorf("start time must be before end time") + } + if s.CreatedBy == "" { + return fmt.Errorf("creator information missing") + } + if s.Comment == "" { + return fmt.Errorf("comment missing") + } + if s.CreatedAt.IsZero() { + return fmt.Errorf("creation timestamp missing") + } + return nil +} diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go new file mode 100644 index 000000000000..46259b1f1094 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/time.go @@ -0,0 +1,264 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "fmt" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + // MinimumTick is the minimum supported time resolution. This has to be + // at least time.Second in order for the code below to work. + minimumTick = time.Millisecond + // second is the Time duration equivalent to one second. + second = int64(time.Second / minimumTick) + // The number of nanoseconds per minimum tick. + nanosPerTick = int64(minimumTick / time.Nanosecond) + + // Earliest is the earliest Time representable. Handy for + // initializing a high watermark. + Earliest = Time(math.MinInt64) + // Latest is the latest Time representable. Handy for initializing + // a low watermark. + Latest = Time(math.MaxInt64) +) + +// Time is the number of milliseconds since the epoch +// (1970-01-01 00:00 UTC) excluding leap seconds. +type Time int64 + +// Interval describes an interval between two timestamps. +type Interval struct { + Start, End Time +} + +// Now returns the current time as a Time. +func Now() Time { + return TimeFromUnixNano(time.Now().UnixNano()) +} + +// TimeFromUnix returns the Time equivalent to the Unix Time t +// provided in seconds. +func TimeFromUnix(t int64) Time { + return Time(t * second) +} + +// TimeFromUnixNano returns the Time equivalent to the Unix Time +// t provided in nanoseconds. +func TimeFromUnixNano(t int64) Time { + return Time(t / nanosPerTick) +} + +// Equal reports whether two Times represent the same instant. +func (t Time) Equal(o Time) bool { + return t == o +} + +// Before reports whether the Time t is before o. +func (t Time) Before(o Time) bool { + return t < o +} + +// After reports whether the Time t is after o. +func (t Time) After(o Time) bool { + return t > o +} + +// Add returns the Time t + d. +func (t Time) Add(d time.Duration) Time { + return t + Time(d/minimumTick) +} + +// Sub returns the Duration t - o. +func (t Time) Sub(o Time) time.Duration { + return time.Duration(t-o) * minimumTick +} + +// Time returns the time.Time representation of t. +func (t Time) Time() time.Time { + return time.Unix(int64(t)/second, (int64(t)%second)*nanosPerTick) +} + +// Unix returns t as a Unix time, the number of seconds elapsed +// since January 1, 1970 UTC. +func (t Time) Unix() int64 { + return int64(t) / second +} + +// UnixNano returns t as a Unix time, the number of nanoseconds elapsed +// since January 1, 1970 UTC. +func (t Time) UnixNano() int64 { + return int64(t) * nanosPerTick +} + +// The number of digits after the dot. +var dotPrecision = int(math.Log10(float64(second))) + +// String returns a string representation of the Time. +func (t Time) String() string { + return strconv.FormatFloat(float64(t)/float64(second), 'f', -1, 64) +} + +// MarshalJSON implements the json.Marshaler interface. +func (t Time) MarshalJSON() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (t *Time) UnmarshalJSON(b []byte) error { + p := strings.Split(string(b), ".") + switch len(p) { + case 1: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + *t = Time(v * second) + + case 2: + v, err := strconv.ParseInt(string(p[0]), 10, 64) + if err != nil { + return err + } + v *= second + + prec := dotPrecision - len(p[1]) + if prec < 0 { + p[1] = p[1][:dotPrecision] + } else if prec > 0 { + p[1] = p[1] + strings.Repeat("0", prec) + } + + va, err := strconv.ParseInt(p[1], 10, 32) + if err != nil { + return err + } + + *t = Time(v + va) + + default: + return fmt.Errorf("invalid time %q", string(b)) + } + return nil +} + +// Duration wraps time.Duration. It is used to parse the custom duration format +// from YAML. +// This type should not propagate beyond the scope of input/output processing. +type Duration time.Duration + +// Set implements pflag/flag.Value +func (d *Duration) Set(s string) error { + var err error + *d, err = ParseDuration(s) + return err +} + +// Type implements pflag.Value +func (d *Duration) Type() string { + return "duration" +} + +var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$") + +// ParseDuration parses a string into a time.Duration, assuming that a year +// always has 365d, a week always has 7d, and a day always has 24h. +func ParseDuration(durationStr string) (Duration, error) { + matches := durationRE.FindStringSubmatch(durationStr) + if len(matches) != 3 { + return 0, fmt.Errorf("not a valid duration string: %q", durationStr) + } + var ( + n, _ = strconv.Atoi(matches[1]) + dur = time.Duration(n) * time.Millisecond + ) + switch unit := matches[2]; unit { + case "y": + dur *= 1000 * 60 * 60 * 24 * 365 + case "w": + dur *= 1000 * 60 * 60 * 24 * 7 + case "d": + dur *= 1000 * 60 * 60 * 24 + case "h": + dur *= 1000 * 60 * 60 + case "m": + dur *= 1000 * 60 + case "s": + dur *= 1000 + case "ms": + // Value already correct + default: + return 0, fmt.Errorf("invalid time unit in duration string: %q", unit) + } + return Duration(dur), nil +} + +func (d Duration) String() string { + var ( + ms = int64(time.Duration(d) / time.Millisecond) + unit = "ms" + ) + if ms == 0 { + return "0s" + } + factors := map[string]int64{ + "y": 1000 * 60 * 60 * 24 * 365, + "w": 1000 * 60 * 60 * 24 * 7, + "d": 1000 * 60 * 60 * 24, + "h": 1000 * 60 * 60, + "m": 1000 * 60, + "s": 1000, + "ms": 1, + } + + switch int64(0) { + case ms % factors["y"]: + unit = "y" + case ms % factors["w"]: + unit = "w" + case ms % factors["d"]: + unit = "d" + case ms % factors["h"]: + unit = "h" + case ms % factors["m"]: + unit = "m" + case ms % factors["s"]: + unit = "s" + } + return fmt.Sprintf("%v%v", ms/factors[unit], unit) +} + +// MarshalYAML implements the yaml.Marshaler interface. +func (d Duration) MarshalYAML() (interface{}, error) { + return d.String(), nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + dur, err := ParseDuration(s) + if err != nil { + return err + } + *d = dur + return nil +} diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go new file mode 100644 index 000000000000..c9d8fb1a2831 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value.go @@ -0,0 +1,416 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "sort" + "strconv" + "strings" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} + + // ZeroSample is the pseudo zero-value of Sample used to signal a + // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, + // and metric nil. Note that the natural zero value of Sample has a timestamp + // of 0, which is possible to appear in a real Sample and thus not suitable + // to signal a non-existing Sample. + ZeroSample = Sample{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +// MarshalJSON implements json.Marshaler. +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} + +// Sample is a sample pair associated with a metric. +type Sample struct { + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +// Equal compares first the metrics, then the timestamp, then the value. The +// semantics of value equality is defined by SampleValue.Equal. +func (s *Sample) Equal(o *Sample) bool { + if s == o { + return true + } + + if !s.Metric.Equal(o.Metric) { + return false + } + if !s.Timestamp.Equal(o.Timestamp) { + return false + } + + return s.Value.Equal(o.Value) +} + +func (s Sample) String() string { + return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }) +} + +// MarshalJSON implements json.Marshaler. +func (s Sample) MarshalJSON() ([]byte, error) { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + return json.Marshal(&v) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Sample) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + }{ + Metric: s.Metric, + Value: SamplePair{ + Timestamp: s.Timestamp, + Value: s.Value, + }, + } + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + s.Metric = v.Metric + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + + return nil +} + +// Samples is a sortable Sample slice. It implements sort.Interface. +type Samples []*Sample + +func (s Samples) Len() int { + return len(s) +} + +// Less compares first the metrics, then the timestamp. +func (s Samples) Less(i, j int) bool { + switch { + case s[i].Metric.Before(s[j].Metric): + return true + case s[j].Metric.Before(s[i].Metric): + return false + case s[i].Timestamp.Before(s[j].Timestamp): + return true + default: + return false + } +} + +func (s Samples) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} + +// Equal compares two sets of samples and returns true if they are equal. +func (s Samples) Equal(o Samples) bool { + if len(s) != len(o) { + return false + } + + for i, sample := range s { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// SampleStream is a stream of Values belonging to an attached COWMetric. +type SampleStream struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` +} + +func (ss SampleStream) String() string { + vals := make([]string, len(ss.Values)) + for i, v := range ss.Values { + vals[i] = v.String() + } + return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) +} + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} + +// Scalar is a scalar value evaluated at the set timestamp. +type Scalar struct { + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s Scalar) String() string { + return fmt.Sprintf("scalar: %v @[%v]", s.Value, s.Timestamp) +} + +// MarshalJSON implements json.Marshaler. +func (s Scalar) MarshalJSON() ([]byte, error) { + v := strconv.FormatFloat(float64(s.Value), 'f', -1, 64) + return json.Marshal([...]interface{}{s.Timestamp, string(v)}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *Scalar) UnmarshalJSON(b []byte) error { + var f string + v := [...]interface{}{&s.Timestamp, &f} + + if err := json.Unmarshal(b, &v); err != nil { + return err + } + + value, err := strconv.ParseFloat(f, 64) + if err != nil { + return fmt.Errorf("error parsing sample value: %s", err) + } + s.Value = SampleValue(value) + return nil +} + +// String is a string value evaluated at the set timestamp. +type String struct { + Value string `json:"value"` + Timestamp Time `json:"timestamp"` +} + +func (s *String) String() string { + return s.Value +} + +// MarshalJSON implements json.Marshaler. +func (s String) MarshalJSON() ([]byte, error) { + return json.Marshal([]interface{}{s.Timestamp, s.Value}) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *String) UnmarshalJSON(b []byte) error { + v := [...]interface{}{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Vector is basically only an alias for Samples, but the +// contract is that in a Vector, all Samples have the same timestamp. +type Vector []*Sample + +func (vec Vector) String() string { + entries := make([]string, len(vec)) + for i, s := range vec { + entries[i] = s.String() + } + return strings.Join(entries, "\n") +} + +func (vec Vector) Len() int { return len(vec) } +func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] } + +// Less compares first the metrics, then the timestamp. +func (vec Vector) Less(i, j int) bool { + switch { + case vec[i].Metric.Before(vec[j].Metric): + return true + case vec[j].Metric.Before(vec[i].Metric): + return false + case vec[i].Timestamp.Before(vec[j].Timestamp): + return true + default: + return false + } +} + +// Equal compares two sets of samples and returns true if they are equal. +func (vec Vector) Equal(o Vector) bool { + if len(vec) != len(o) { + return false + } + + for i, sample := range vec { + if !sample.Equal(o[i]) { + return false + } + } + return true +} + +// Matrix is a list of time series. +type Matrix []*SampleStream + +func (m Matrix) Len() int { return len(m) } +func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].Metric) } +func (m Matrix) Swap(i, j int) { m[i], m[j] = m[j], m[i] } + +func (mat Matrix) String() string { + matCp := make(Matrix, len(mat)) + copy(matCp, mat) + sort.Sort(matCp) + + strs := make([]string, len(matCp)) + + for i, ss := range matCp { + strs[i] = ss.String() + } + + return strings.Join(strs, "\n") +} diff --git a/vendor/github.com/prometheus/procfs/LICENSE b/vendor/github.com/prometheus/procfs/LICENSE new file mode 100644 index 000000000000..261eeb9e9f8b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/prometheus/procfs/NOTICE b/vendor/github.com/prometheus/procfs/NOTICE new file mode 100644 index 000000000000..53c5e9aa1112 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/NOTICE @@ -0,0 +1,7 @@ +procfs provides functions to retrieve system, kernel and process +metrics from the pseudo-filesystem proc. + +Copyright 2014-2015 The Prometheus Authors + +This product includes software developed at +SoundCloud Ltd. (http://soundcloud.com/). diff --git a/vendor/github.com/prometheus/procfs/buddyinfo.go b/vendor/github.com/prometheus/procfs/buddyinfo.go new file mode 100644 index 000000000000..d3a8268078c7 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/buddyinfo.go @@ -0,0 +1,95 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// A BuddyInfo is the details parsed from /proc/buddyinfo. +// The data is comprised of an array of free fragments of each size. +// The sizes are 2^n*PAGE_SIZE, where n is the array index. +type BuddyInfo struct { + Node string + Zone string + Sizes []float64 +} + +// NewBuddyInfo reads the buddyinfo statistics. +func NewBuddyInfo() ([]BuddyInfo, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewBuddyInfo() +} + +// NewBuddyInfo reads the buddyinfo statistics from the specified `proc` filesystem. +func (fs FS) NewBuddyInfo() ([]BuddyInfo, error) { + file, err := os.Open(fs.Path("buddyinfo")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseBuddyInfo(file) +} + +func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) { + var ( + buddyInfo = []BuddyInfo{} + scanner = bufio.NewScanner(r) + bucketCount = -1 + ) + + for scanner.Scan() { + var err error + line := scanner.Text() + parts := strings.Fields(line) + + if len(parts) < 4 { + return nil, fmt.Errorf("invalid number of fields when parsing buddyinfo") + } + + node := strings.TrimRight(parts[1], ",") + zone := strings.TrimRight(parts[3], ",") + arraySize := len(parts[4:]) + + if bucketCount == -1 { + bucketCount = arraySize + } else { + if bucketCount != arraySize { + return nil, fmt.Errorf("mismatch in number of buddyinfo buckets, previous count %d, new count %d", bucketCount, arraySize) + } + } + + sizes := make([]float64, arraySize) + for i := 0; i < arraySize; i++ { + sizes[i], err = strconv.ParseFloat(parts[i+4], 64) + if err != nil { + return nil, fmt.Errorf("invalid value in buddyinfo: %s", err) + } + } + + buddyInfo = append(buddyInfo, BuddyInfo{node, zone, sizes}) + } + + return buddyInfo, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/prometheus/procfs/doc.go new file mode 100644 index 000000000000..e2acd6d40a6b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/doc.go @@ -0,0 +1,45 @@ +// Copyright 2014 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package procfs provides functions to retrieve system, kernel and process +// metrics from the pseudo-filesystem proc. +// +// Example: +// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.NewStat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } +// +package procfs diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go new file mode 100644 index 000000000000..b6c6b2ce1f06 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -0,0 +1,82 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "path" + + "github.com/prometheus/procfs/nfs" + "github.com/prometheus/procfs/xfs" +) + +// FS represents the pseudo-filesystem proc, which provides an interface to +// kernel data structures. +type FS string + +// DefaultMountPoint is the common mount point of the proc filesystem. +const DefaultMountPoint = "/proc" + +// NewFS returns a new FS mounted under the given mountPoint. It will error +// if the mount point can't be read. +func NewFS(mountPoint string) (FS, error) { + info, err := os.Stat(mountPoint) + if err != nil { + return "", fmt.Errorf("could not read %s: %s", mountPoint, err) + } + if !info.IsDir() { + return "", fmt.Errorf("mount point %s is not a directory", mountPoint) + } + + return FS(mountPoint), nil +} + +// Path returns the path of the given subsystem relative to the procfs root. +func (fs FS) Path(p ...string) string { + return path.Join(append([]string{string(fs)}, p...)...) +} + +// XFSStats retrieves XFS filesystem runtime statistics. +func (fs FS) XFSStats() (*xfs.Stats, error) { + f, err := os.Open(fs.Path("fs/xfs/stat")) + if err != nil { + return nil, err + } + defer f.Close() + + return xfs.ParseStats(f) +} + +// NFSClientRPCStats retrieves NFS client RPC statistics. +func (fs FS) NFSClientRPCStats() (*nfs.ClientRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfs")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseClientRPCStats(f) +} + +// NFSdServerRPCStats retrieves NFS daemon RPC statistics. +func (fs FS) NFSdServerRPCStats() (*nfs.ServerRPCStats, error) { + f, err := os.Open(fs.Path("net/rpc/nfsd")) + if err != nil { + return nil, err + } + defer f.Close() + + return nfs.ParseServerRPCStats(f) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go new file mode 100644 index 000000000000..2ff228e9d1f3 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -0,0 +1,59 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "io/ioutil" + "strconv" + "strings" +) + +// ParseUint32s parses a slice of strings into a slice of uint32s. +func ParseUint32s(ss []string) ([]uint32, error) { + us := make([]uint32, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 32) + if err != nil { + return nil, err + } + + us = append(us, uint32(u)) + } + + return us, nil +} + +// ParseUint64s parses a slice of strings into a slice of uint64s. +func ParseUint64s(ss []string) ([]uint64, error) { + us := make([]uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + us = append(us, u) + } + + return us, nil +} + +// ReadUintFromFile reads a file and attempts to parse a uint64 from it. +func ReadUintFromFile(path string) (uint64, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + return strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go new file mode 100644 index 000000000000..df0d567b7806 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/internal/util/sysreadfile_linux.go @@ -0,0 +1,45 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package util + +import ( + "bytes" + "os" + "syscall" +) + +// SysReadFile is a simplified ioutil.ReadFile that invokes syscall.Read directly. +// https://github.com/prometheus/node_exporter/pull/728/files +func SysReadFile(file string) (string, error) { + f, err := os.Open(file) + if err != nil { + return "", err + } + defer f.Close() + + // On some machines, hwmon drivers are broken and return EAGAIN. This causes + // Go's ioutil.ReadFile implementation to poll forever. + // + // Since we either want to read data or bail immediately, do the simplest + // possible read using syscall directly. + b := make([]byte, 128) + n, err := syscall.Read(int(f.Fd()), b) + if err != nil { + return "", err + } + + return string(bytes.TrimSpace(b[:n])), nil +} diff --git a/vendor/github.com/prometheus/procfs/ipvs.go b/vendor/github.com/prometheus/procfs/ipvs.go new file mode 100644 index 000000000000..e36d4a3bd08e --- /dev/null +++ b/vendor/github.com/prometheus/procfs/ipvs.go @@ -0,0 +1,259 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "os" + "strconv" + "strings" +) + +// IPVSStats holds IPVS statistics, as exposed by the kernel in `/proc/net/ip_vs_stats`. +type IPVSStats struct { + // Total count of connections. + Connections uint64 + // Total incoming packages processed. + IncomingPackets uint64 + // Total outgoing packages processed. + OutgoingPackets uint64 + // Total incoming traffic. + IncomingBytes uint64 + // Total outgoing traffic. + OutgoingBytes uint64 +} + +// IPVSBackendStatus holds current metrics of one virtual / real address pair. +type IPVSBackendStatus struct { + // The local (virtual) IP address. + LocalAddress net.IP + // The remote (real) IP address. + RemoteAddress net.IP + // The local (virtual) port. + LocalPort uint16 + // The remote (real) port. + RemotePort uint16 + // The local firewall mark + LocalMark string + // The transport protocol (TCP, UDP). + Proto string + // The current number of active connections for this virtual/real address pair. + ActiveConn uint64 + // The current number of inactive connections for this virtual/real address pair. + InactConn uint64 + // The current weight of this virtual/real address pair. + Weight uint64 +} + +// NewIPVSStats reads the IPVS statistics. +func NewIPVSStats() (IPVSStats, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return IPVSStats{}, err + } + + return fs.NewIPVSStats() +} + +// NewIPVSStats reads the IPVS statistics from the specified `proc` filesystem. +func (fs FS) NewIPVSStats() (IPVSStats, error) { + file, err := os.Open(fs.Path("net/ip_vs_stats")) + if err != nil { + return IPVSStats{}, err + } + defer file.Close() + + return parseIPVSStats(file) +} + +// parseIPVSStats performs the actual parsing of `ip_vs_stats`. +func parseIPVSStats(file io.Reader) (IPVSStats, error) { + var ( + statContent []byte + statLines []string + statFields []string + stats IPVSStats + ) + + statContent, err := ioutil.ReadAll(file) + if err != nil { + return IPVSStats{}, err + } + + statLines = strings.SplitN(string(statContent), "\n", 4) + if len(statLines) != 4 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: too short") + } + + statFields = strings.Fields(statLines[2]) + if len(statFields) != 5 { + return IPVSStats{}, errors.New("ip_vs_stats corrupt: unexpected number of fields") + } + + stats.Connections, err = strconv.ParseUint(statFields[0], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingPackets, err = strconv.ParseUint(statFields[1], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingPackets, err = strconv.ParseUint(statFields[2], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.IncomingBytes, err = strconv.ParseUint(statFields[3], 16, 64) + if err != nil { + return IPVSStats{}, err + } + stats.OutgoingBytes, err = strconv.ParseUint(statFields[4], 16, 64) + if err != nil { + return IPVSStats{}, err + } + + return stats, nil +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs. +func NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return []IPVSBackendStatus{}, err + } + + return fs.NewIPVSBackendStatus() +} + +// NewIPVSBackendStatus reads and returns the status of all (virtual,real) server pairs from the specified `proc` filesystem. +func (fs FS) NewIPVSBackendStatus() ([]IPVSBackendStatus, error) { + file, err := os.Open(fs.Path("net/ip_vs")) + if err != nil { + return nil, err + } + defer file.Close() + + return parseIPVSBackendStatus(file) +} + +func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) { + var ( + status []IPVSBackendStatus + scanner = bufio.NewScanner(file) + proto string + localMark string + localAddress net.IP + localPort uint16 + err error + ) + + for scanner.Scan() { + fields := strings.Fields(scanner.Text()) + if len(fields) == 0 { + continue + } + switch { + case fields[0] == "IP" || fields[0] == "Prot" || fields[1] == "RemoteAddress:Port": + continue + case fields[0] == "TCP" || fields[0] == "UDP": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = "" + localAddress, localPort, err = parseIPPort(fields[1]) + if err != nil { + return nil, err + } + case fields[0] == "FWM": + if len(fields) < 2 { + continue + } + proto = fields[0] + localMark = fields[1] + localAddress = nil + localPort = 0 + case fields[0] == "->": + if len(fields) < 6 { + continue + } + remoteAddress, remotePort, err := parseIPPort(fields[1]) + if err != nil { + return nil, err + } + weight, err := strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + activeConn, err := strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + inactConn, err := strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + status = append(status, IPVSBackendStatus{ + LocalAddress: localAddress, + LocalPort: localPort, + LocalMark: localMark, + RemoteAddress: remoteAddress, + RemotePort: remotePort, + Proto: proto, + Weight: weight, + ActiveConn: activeConn, + InactConn: inactConn, + }) + } + } + return status, nil +} + +func parseIPPort(s string) (net.IP, uint16, error) { + var ( + ip net.IP + err error + ) + + switch len(s) { + case 13: + ip, err = hex.DecodeString(s[0:8]) + if err != nil { + return nil, 0, err + } + case 46: + ip = net.ParseIP(s[1:40]) + if ip == nil { + return nil, 0, fmt.Errorf("invalid IPv6 address: %s", s[1:40]) + } + default: + return nil, 0, fmt.Errorf("unexpected IP:Port: %s", s) + } + + portString := s[len(s)-4:] + if len(portString) != 4 { + return nil, 0, fmt.Errorf("unexpected port string format: %s", portString) + } + port, err := strconv.ParseUint(portString, 16, 16) + if err != nil { + return nil, 0, err + } + + return ip, uint16(port), nil +} diff --git a/vendor/github.com/prometheus/procfs/mdstat.go b/vendor/github.com/prometheus/procfs/mdstat.go new file mode 100644 index 000000000000..9dc19583d8d0 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mdstat.go @@ -0,0 +1,151 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "regexp" + "strconv" + "strings" +) + +var ( + statuslineRE = regexp.MustCompile(`(\d+) blocks .*\[(\d+)/(\d+)\] \[[U_]+\]`) + buildlineRE = regexp.MustCompile(`\((\d+)/\d+\)`) +) + +// MDStat holds info parsed from /proc/mdstat. +type MDStat struct { + // Name of the device. + Name string + // activity-state of the device. + ActivityState string + // Number of active disks. + DisksActive int64 + // Total number of disks the device consists of. + DisksTotal int64 + // Number of blocks the device holds. + BlocksTotal int64 + // Number of blocks on the device that are in sync. + BlocksSynced int64 +} + +// ParseMDStat parses an mdstat-file and returns a struct with the relevant infos. +func (fs FS) ParseMDStat() (mdstates []MDStat, err error) { + mdStatusFilePath := fs.Path("mdstat") + content, err := ioutil.ReadFile(mdStatusFilePath) + if err != nil { + return []MDStat{}, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + mdStates := []MDStat{} + lines := strings.Split(string(content), "\n") + for i, l := range lines { + if l == "" { + continue + } + if l[0] == ' ' { + continue + } + if strings.HasPrefix(l, "Personalities") || strings.HasPrefix(l, "unused") { + continue + } + + mainLine := strings.Split(l, " ") + if len(mainLine) < 3 { + return mdStates, fmt.Errorf("error parsing mdline: %s", l) + } + mdName := mainLine[0] + activityState := mainLine[2] + + if len(lines) <= i+3 { + return mdStates, fmt.Errorf( + "error parsing %s: too few lines for md device %s", + mdStatusFilePath, + mdName, + ) + } + + active, total, size, err := evalStatusline(lines[i+1]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + + // j is the line number of the syncing-line. + j := i + 2 + if strings.Contains(lines[i+2], "bitmap") { // skip bitmap line + j = i + 3 + } + + // If device is syncing at the moment, get the number of currently + // synced bytes, otherwise that number equals the size of the device. + syncedBlocks := size + if strings.Contains(lines[j], "recovery") || strings.Contains(lines[j], "resync") { + syncedBlocks, err = evalBuildline(lines[j]) + if err != nil { + return mdStates, fmt.Errorf("error parsing %s: %s", mdStatusFilePath, err) + } + } + + mdStates = append(mdStates, MDStat{ + Name: mdName, + ActivityState: activityState, + DisksActive: active, + DisksTotal: total, + BlocksTotal: size, + BlocksSynced: syncedBlocks, + }) + } + + return mdStates, nil +} + +func evalStatusline(statusline string) (active, total, size int64, err error) { + matches := statuslineRE.FindStringSubmatch(statusline) + if len(matches) != 4 { + return 0, 0, 0, fmt.Errorf("unexpected statusline: %s", statusline) + } + + size, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + total, err = strconv.ParseInt(matches[2], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + active, err = strconv.ParseInt(matches[3], 10, 64) + if err != nil { + return 0, 0, 0, fmt.Errorf("unexpected statusline %s: %s", statusline, err) + } + + return active, total, size, nil +} + +func evalBuildline(buildline string) (syncedBlocks int64, err error) { + matches := buildlineRE.FindStringSubmatch(buildline) + if len(matches) != 2 { + return 0, fmt.Errorf("unexpected buildline: %s", buildline) + } + + syncedBlocks, err = strconv.ParseInt(matches[1], 10, 64) + if err != nil { + return 0, fmt.Errorf("%s in buildline: %s", err, buildline) + } + + return syncedBlocks, nil +} diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go new file mode 100644 index 000000000000..7a8a1e099014 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -0,0 +1,606 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +// While implementing parsing of /proc/[pid]/mountstats, this blog was used +// heavily as a reference: +// https://utcc.utoronto.ca/~cks/space/blog/linux/NFSMountstatsIndex +// +// Special thanks to Chris Siebenmann for all of his posts explaining the +// various statistics available for NFS. + +import ( + "bufio" + "fmt" + "io" + "strconv" + "strings" + "time" +) + +// Constants shared between multiple functions. +const ( + deviceEntryLen = 8 + + fieldBytesLen = 8 + fieldEventsLen = 27 + + statVersion10 = "1.0" + statVersion11 = "1.1" + + fieldTransport10TCPLen = 10 + fieldTransport10UDPLen = 7 + + fieldTransport11TCPLen = 13 + fieldTransport11UDPLen = 10 +) + +// A Mount is a device mount parsed from /proc/[pid]/mountstats. +type Mount struct { + // Name of the device. + Device string + // The mount point of the device. + Mount string + // The filesystem type used by the device. + Type string + // If available additional statistics related to this Mount. + // Use a type assertion to determine if additional statistics are available. + Stats MountStats +} + +// A MountStats is a type which contains detailed statistics for a specific +// type of Mount. +type MountStats interface { + mountStats() +} + +// A MountStatsNFS is a MountStats implementation for NFSv3 and v4 mounts. +type MountStatsNFS struct { + // The version of statistics provided. + StatVersion string + // The age of the NFS mount. + Age time.Duration + // Statistics related to byte counters for various operations. + Bytes NFSBytesStats + // Statistics related to various NFS event occurrences. + Events NFSEventsStats + // Statistics broken down by filesystem operation. + Operations []NFSOperationStats + // Statistics about the NFS RPC transport. + Transport NFSTransportStats +} + +// mountStats implements MountStats. +func (m MountStatsNFS) mountStats() {} + +// A NFSBytesStats contains statistics about the number of bytes read and written +// by an NFS client to and from an NFS server. +type NFSBytesStats struct { + // Number of bytes read using the read() syscall. + Read uint64 + // Number of bytes written using the write() syscall. + Write uint64 + // Number of bytes read using the read() syscall in O_DIRECT mode. + DirectRead uint64 + // Number of bytes written using the write() syscall in O_DIRECT mode. + DirectWrite uint64 + // Number of bytes read from the NFS server, in total. + ReadTotal uint64 + // Number of bytes written to the NFS server, in total. + WriteTotal uint64 + // Number of pages read directly via mmap()'d files. + ReadPages uint64 + // Number of pages written directly via mmap()'d files. + WritePages uint64 +} + +// A NFSEventsStats contains statistics about NFS event occurrences. +type NFSEventsStats struct { + // Number of times cached inode attributes are re-validated from the server. + InodeRevalidate uint64 + // Number of times cached dentry nodes are re-validated from the server. + DnodeRevalidate uint64 + // Number of times an inode cache is cleared. + DataInvalidate uint64 + // Number of times cached inode attributes are invalidated. + AttributeInvalidate uint64 + // Number of times files or directories have been open()'d. + VFSOpen uint64 + // Number of times a directory lookup has occurred. + VFSLookup uint64 + // Number of times permissions have been checked. + VFSAccess uint64 + // Number of updates (and potential writes) to pages. + VFSUpdatePage uint64 + // Number of pages read directly via mmap()'d files. + VFSReadPage uint64 + // Number of times a group of pages have been read. + VFSReadPages uint64 + // Number of pages written directly via mmap()'d files. + VFSWritePage uint64 + // Number of times a group of pages have been written. + VFSWritePages uint64 + // Number of times directory entries have been read with getdents(). + VFSGetdents uint64 + // Number of times attributes have been set on inodes. + VFSSetattr uint64 + // Number of pending writes that have been forcefully flushed to the server. + VFSFlush uint64 + // Number of times fsync() has been called on directories and files. + VFSFsync uint64 + // Number of times locking has been attempted on a file. + VFSLock uint64 + // Number of times files have been closed and released. + VFSFileRelease uint64 + // Unknown. Possibly unused. + CongestionWait uint64 + // Number of times files have been truncated. + Truncation uint64 + // Number of times a file has been grown due to writes beyond its existing end. + WriteExtension uint64 + // Number of times a file was removed while still open by another process. + SillyRename uint64 + // Number of times the NFS server gave less data than expected while reading. + ShortRead uint64 + // Number of times the NFS server wrote less data than expected while writing. + ShortWrite uint64 + // Number of times the NFS server indicated EJUKEBOX; retrieving data from + // offline storage. + JukeboxDelay uint64 + // Number of NFS v4.1+ pNFS reads. + PNFSRead uint64 + // Number of NFS v4.1+ pNFS writes. + PNFSWrite uint64 +} + +// A NFSOperationStats contains statistics for a single operation. +type NFSOperationStats struct { + // The name of the operation. + Operation string + // Number of requests performed for this operation. + Requests uint64 + // Number of times an actual RPC request has been transmitted for this operation. + Transmissions uint64 + // Number of times a request has had a major timeout. + MajorTimeouts uint64 + // Number of bytes sent for this operation, including RPC headers and payload. + BytesSent uint64 + // Number of bytes received for this operation, including RPC headers and payload. + BytesReceived uint64 + // Duration all requests spent queued for transmission before they were sent. + CumulativeQueueTime time.Duration + // Duration it took to get a reply back after the request was transmitted. + CumulativeTotalResponseTime time.Duration + // Duration from when a request was enqueued to when it was completely handled. + CumulativeTotalRequestTime time.Duration +} + +// A NFSTransportStats contains statistics for the NFS mount RPC requests and +// responses. +type NFSTransportStats struct { + // The transport protocol used for the NFS mount. + Protocol string + // The local port used for the NFS mount. + Port uint64 + // Number of times the client has had to establish a connection from scratch + // to the NFS server. + Bind uint64 + // Number of times the client has made a TCP connection to the NFS server. + Connect uint64 + // Duration (in jiffies, a kernel internal unit of time) the NFS mount has + // spent waiting for connections to the server to be established. + ConnectIdleTime uint64 + // Duration since the NFS mount last saw any RPC traffic. + IdleTime time.Duration + // Number of RPC requests for this mount sent to the NFS server. + Sends uint64 + // Number of RPC responses for this mount received from the NFS server. + Receives uint64 + // Number of times the NFS server sent a response with a transaction ID + // unknown to this client. + BadTransactionIDs uint64 + // A running counter, incremented on each request as the current difference + // ebetween sends and receives. + CumulativeActiveRequests uint64 + // A running counter, incremented on each request by the current backlog + // queue size. + CumulativeBacklog uint64 + + // Stats below only available with stat version 1.1. + + // Maximum number of simultaneously active RPC requests ever used. + MaximumRPCSlotsUsed uint64 + // A running counter, incremented on each request as the current size of the + // sending queue. + CumulativeSendingQueue uint64 + // A running counter, incremented on each request as the current size of the + // pending queue. + CumulativePendingQueue uint64 +} + +// parseMountStats parses a /proc/[pid]/mountstats file and returns a slice +// of Mount structures containing detailed information about each mount. +// If available, statistics for each mount are parsed as well. +func parseMountStats(r io.Reader) ([]*Mount, error) { + const ( + device = "device" + statVersionPrefix = "statvers=" + + nfs3Type = "nfs" + nfs4Type = "nfs4" + ) + + var mounts []*Mount + + s := bufio.NewScanner(r) + for s.Scan() { + // Only look for device entries in this function + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 || ss[0] != device { + continue + } + + m, err := parseMount(ss) + if err != nil { + return nil, err + } + + // Does this mount also possess statistics information? + if len(ss) > deviceEntryLen { + // Only NFSv3 and v4 are supported for parsing statistics + if m.Type != nfs3Type && m.Type != nfs4Type { + return nil, fmt.Errorf("cannot parse MountStats for fstype %q", m.Type) + } + + statVersion := strings.TrimPrefix(ss[8], statVersionPrefix) + + stats, err := parseMountStatsNFS(s, statVersion) + if err != nil { + return nil, err + } + + m.Stats = stats + } + + mounts = append(mounts, m) + } + + return mounts, s.Err() +} + +// parseMount parses an entry in /proc/[pid]/mountstats in the format: +// device [device] mounted on [mount] with fstype [type] +func parseMount(ss []string) (*Mount, error) { + if len(ss) < deviceEntryLen { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + + // Check for specific words appearing at specific indices to ensure + // the format is consistent with what we expect + format := []struct { + i int + s string + }{ + {i: 0, s: "device"}, + {i: 2, s: "mounted"}, + {i: 3, s: "on"}, + {i: 5, s: "with"}, + {i: 6, s: "fstype"}, + } + + for _, f := range format { + if ss[f.i] != f.s { + return nil, fmt.Errorf("invalid device entry: %v", ss) + } + } + + return &Mount{ + Device: ss[1], + Mount: ss[4], + Type: ss[7], + }, nil +} + +// parseMountStatsNFS parses a MountStatsNFS by scanning additional information +// related to NFS statistics. +func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountStatsNFS, error) { + // Field indicators for parsing specific types of data + const ( + fieldAge = "age:" + fieldBytes = "bytes:" + fieldEvents = "events:" + fieldPerOpStats = "per-op" + fieldTransport = "xprt:" + ) + + stats := &MountStatsNFS{ + StatVersion: statVersion, + } + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + break + } + if len(ss) < 2 { + return nil, fmt.Errorf("not enough information for NFS stats: %v", ss) + } + + switch ss[0] { + case fieldAge: + // Age integer is in seconds + d, err := time.ParseDuration(ss[1] + "s") + if err != nil { + return nil, err + } + + stats.Age = d + case fieldBytes: + bstats, err := parseNFSBytesStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Bytes = *bstats + case fieldEvents: + estats, err := parseNFSEventsStats(ss[1:]) + if err != nil { + return nil, err + } + + stats.Events = *estats + case fieldTransport: + if len(ss) < 3 { + return nil, fmt.Errorf("not enough information for NFS transport stats: %v", ss) + } + + tstats, err := parseNFSTransportStats(ss[1:], statVersion) + if err != nil { + return nil, err + } + + stats.Transport = *tstats + } + + // When encountering "per-operation statistics", we must break this + // loop and parse them separately to ensure we can terminate parsing + // before reaching another device entry; hence why this 'if' statement + // is not just another switch case + if ss[0] == fieldPerOpStats { + break + } + } + + if err := s.Err(); err != nil { + return nil, err + } + + // NFS per-operation stats appear last before the next device entry + perOpStats, err := parseNFSOperationStats(s) + if err != nil { + return nil, err + } + + stats.Operations = perOpStats + + return stats, nil +} + +// parseNFSBytesStats parses a NFSBytesStats line using an input set of +// integer fields. +func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) { + if len(ss) != fieldBytesLen { + return nil, fmt.Errorf("invalid NFS bytes stats: %v", ss) + } + + ns := make([]uint64, 0, fieldBytesLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSBytesStats{ + Read: ns[0], + Write: ns[1], + DirectRead: ns[2], + DirectWrite: ns[3], + ReadTotal: ns[4], + WriteTotal: ns[5], + ReadPages: ns[6], + WritePages: ns[7], + }, nil +} + +// parseNFSEventsStats parses a NFSEventsStats line using an input set of +// integer fields. +func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) { + if len(ss) != fieldEventsLen { + return nil, fmt.Errorf("invalid NFS events stats: %v", ss) + } + + ns := make([]uint64, 0, fieldEventsLen) + for _, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + return &NFSEventsStats{ + InodeRevalidate: ns[0], + DnodeRevalidate: ns[1], + DataInvalidate: ns[2], + AttributeInvalidate: ns[3], + VFSOpen: ns[4], + VFSLookup: ns[5], + VFSAccess: ns[6], + VFSUpdatePage: ns[7], + VFSReadPage: ns[8], + VFSReadPages: ns[9], + VFSWritePage: ns[10], + VFSWritePages: ns[11], + VFSGetdents: ns[12], + VFSSetattr: ns[13], + VFSFlush: ns[14], + VFSFsync: ns[15], + VFSLock: ns[16], + VFSFileRelease: ns[17], + CongestionWait: ns[18], + Truncation: ns[19], + WriteExtension: ns[20], + SillyRename: ns[21], + ShortRead: ns[22], + ShortWrite: ns[23], + JukeboxDelay: ns[24], + PNFSRead: ns[25], + PNFSWrite: ns[26], + }, nil +} + +// parseNFSOperationStats parses a slice of NFSOperationStats by scanning +// additional information about per-operation statistics until an empty +// line is reached. +func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { + const ( + // Number of expected fields in each per-operation statistics set + numFields = 9 + ) + + var ops []NFSOperationStats + + for s.Scan() { + ss := strings.Fields(string(s.Bytes())) + if len(ss) == 0 { + // Must break when reading a blank line after per-operation stats to + // enable top-level function to parse the next device entry + break + } + + if len(ss) != numFields { + return nil, fmt.Errorf("invalid NFS per-operations stats: %v", ss) + } + + // Skip string operation name for integers + ns := make([]uint64, 0, numFields-1) + for _, st := range ss[1:] { + n, err := strconv.ParseUint(st, 10, 64) + if err != nil { + return nil, err + } + + ns = append(ns, n) + } + + ops = append(ops, NFSOperationStats{ + Operation: strings.TrimSuffix(ss[0], ":"), + Requests: ns[0], + Transmissions: ns[1], + MajorTimeouts: ns[2], + BytesSent: ns[3], + BytesReceived: ns[4], + CumulativeQueueTime: time.Duration(ns[5]) * time.Millisecond, + CumulativeTotalResponseTime: time.Duration(ns[6]) * time.Millisecond, + CumulativeTotalRequestTime: time.Duration(ns[7]) * time.Millisecond, + }) + } + + return ops, s.Err() +} + +// parseNFSTransportStats parses a NFSTransportStats line using an input set of +// integer fields matched to a specific stats version. +func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransportStats, error) { + // Extract the protocol field. It is the only string value in the line + protocol := ss[0] + ss = ss[1:] + + switch statVersion { + case statVersion10: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport10TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport10UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.0 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.0 statement: %v", ss) + } + case statVersion11: + var expectedLength int + if protocol == "tcp" { + expectedLength = fieldTransport11TCPLen + } else if protocol == "udp" { + expectedLength = fieldTransport11UDPLen + } else { + return nil, fmt.Errorf("invalid NFS protocol \"%s\" in stats 1.1 statement: %v", protocol, ss) + } + if len(ss) != expectedLength { + return nil, fmt.Errorf("invalid NFS transport stats 1.1 statement: %v", ss) + } + default: + return nil, fmt.Errorf("unrecognized NFS transport stats version: %q", statVersion) + } + + // Allocate enough for v1.1 stats since zero value for v1.1 stats will be okay + // in a v1.0 response. Since the stat length is bigger for TCP stats, we use + // the TCP length here. + // + // Note: slice length must be set to length of v1.1 stats to avoid a panic when + // only v1.0 stats are present. + // See: https://github.com/prometheus/node_exporter/issues/571. + ns := make([]uint64, fieldTransport11TCPLen) + for i, s := range ss { + n, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return nil, err + } + + ns[i] = n + } + + // The fields differ depending on the transport protocol (TCP or UDP) + // From https://utcc.utoronto.ca/%7Ecks/space/blog/linux/NFSMountstatsXprt + // + // For the udp RPC transport there is no connection count, connect idle time, + // or idle time (fields #3, #4, and #5); all other fields are the same. So + // we set them to 0 here. + if protocol == "udp" { + ns = append(ns[:2], append(make([]uint64, 3), ns[2:]...)...) + } + + return &NFSTransportStats{ + Protocol: protocol, + Port: ns[0], + Bind: ns[1], + Connect: ns[2], + ConnectIdleTime: ns[3], + IdleTime: time.Duration(ns[4]) * time.Second, + Sends: ns[5], + Receives: ns[6], + BadTransactionIDs: ns[7], + CumulativeActiveRequests: ns[8], + CumulativeBacklog: ns[9], + MaximumRPCSlotsUsed: ns[10], + CumulativeSendingQueue: ns[11], + CumulativePendingQueue: ns[12], + }, nil +} diff --git a/vendor/github.com/prometheus/procfs/net_dev.go b/vendor/github.com/prometheus/procfs/net_dev.go new file mode 100644 index 000000000000..3f2523371ab1 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_dev.go @@ -0,0 +1,216 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "errors" + "os" + "sort" + "strconv" + "strings" +) + +// NetDevLine is single line parsed from /proc/net/dev or /proc/[pid]/net/dev. +type NetDevLine struct { + Name string `json:"name"` // The name of the interface. + RxBytes uint64 `json:"rx_bytes"` // Cumulative count of bytes received. + RxPackets uint64 `json:"rx_packets"` // Cumulative count of packets received. + RxErrors uint64 `json:"rx_errors"` // Cumulative count of receive errors encountered. + RxDropped uint64 `json:"rx_dropped"` // Cumulative count of packets dropped while receiving. + RxFIFO uint64 `json:"rx_fifo"` // Cumulative count of FIFO buffer errors. + RxFrame uint64 `json:"rx_frame"` // Cumulative count of packet framing errors. + RxCompressed uint64 `json:"rx_compressed"` // Cumulative count of compressed packets received by the device driver. + RxMulticast uint64 `json:"rx_multicast"` // Cumulative count of multicast frames received by the device driver. + TxBytes uint64 `json:"tx_bytes"` // Cumulative count of bytes transmitted. + TxPackets uint64 `json:"tx_packets"` // Cumulative count of packets transmitted. + TxErrors uint64 `json:"tx_errors"` // Cumulative count of transmit errors encountered. + TxDropped uint64 `json:"tx_dropped"` // Cumulative count of packets dropped while transmitting. + TxFIFO uint64 `json:"tx_fifo"` // Cumulative count of FIFO buffer errors. + TxCollisions uint64 `json:"tx_collisions"` // Cumulative count of collisions detected on the interface. + TxCarrier uint64 `json:"tx_carrier"` // Cumulative count of carrier losses detected by the device driver. + TxCompressed uint64 `json:"tx_compressed"` // Cumulative count of compressed packets transmitted by the device driver. +} + +// NetDev is parsed from /proc/net/dev or /proc/[pid]/net/dev. The map keys +// are interface names. +type NetDev map[string]NetDevLine + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func NewNetDev() (NetDev, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return nil, err + } + + return fs.NewNetDev() +} + +// NewNetDev returns kernel/system statistics read from /proc/net/dev. +func (fs FS) NewNetDev() (NetDev, error) { + return newNetDev(fs.Path("net/dev")) +} + +// NewNetDev returns kernel/system statistics read from /proc/[pid]/net/dev. +func (p Proc) NewNetDev() (NetDev, error) { + return newNetDev(p.path("net/dev")) +} + +// newNetDev creates a new NetDev from the contents of the given file. +func newNetDev(file string) (NetDev, error) { + f, err := os.Open(file) + if err != nil { + return NetDev{}, err + } + defer f.Close() + + nd := NetDev{} + s := bufio.NewScanner(f) + for n := 0; s.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line, err := nd.parseLine(s.Text()) + if err != nil { + return nd, err + } + + nd[line.Name] = *line + } + + return nd, s.Err() +} + +// parseLine parses a single line from the /proc/net/dev file. Header lines +// must be filtered prior to calling this method. +func (nd NetDev) parseLine(rawLine string) (*NetDevLine, error) { + parts := strings.SplitN(rawLine, ":", 2) + if len(parts) != 2 { + return nil, errors.New("invalid net/dev line, missing colon") + } + fields := strings.Fields(strings.TrimSpace(parts[1])) + + var err error + line := &NetDevLine{} + + // Interface Name + line.Name = strings.TrimSpace(parts[0]) + if line.Name == "" { + return nil, errors.New("invalid net/dev line, empty interface name") + } + + // RX + line.RxBytes, err = strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + line.RxPackets, err = strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + line.RxErrors, err = strconv.ParseUint(fields[2], 10, 64) + if err != nil { + return nil, err + } + line.RxDropped, err = strconv.ParseUint(fields[3], 10, 64) + if err != nil { + return nil, err + } + line.RxFIFO, err = strconv.ParseUint(fields[4], 10, 64) + if err != nil { + return nil, err + } + line.RxFrame, err = strconv.ParseUint(fields[5], 10, 64) + if err != nil { + return nil, err + } + line.RxCompressed, err = strconv.ParseUint(fields[6], 10, 64) + if err != nil { + return nil, err + } + line.RxMulticast, err = strconv.ParseUint(fields[7], 10, 64) + if err != nil { + return nil, err + } + + // TX + line.TxBytes, err = strconv.ParseUint(fields[8], 10, 64) + if err != nil { + return nil, err + } + line.TxPackets, err = strconv.ParseUint(fields[9], 10, 64) + if err != nil { + return nil, err + } + line.TxErrors, err = strconv.ParseUint(fields[10], 10, 64) + if err != nil { + return nil, err + } + line.TxDropped, err = strconv.ParseUint(fields[11], 10, 64) + if err != nil { + return nil, err + } + line.TxFIFO, err = strconv.ParseUint(fields[12], 10, 64) + if err != nil { + return nil, err + } + line.TxCollisions, err = strconv.ParseUint(fields[13], 10, 64) + if err != nil { + return nil, err + } + line.TxCarrier, err = strconv.ParseUint(fields[14], 10, 64) + if err != nil { + return nil, err + } + line.TxCompressed, err = strconv.ParseUint(fields[15], 10, 64) + if err != nil { + return nil, err + } + + return line, nil +} + +// Total aggregates the values across interfaces and returns a new NetDevLine. +// The Name field will be a sorted comma separated list of interface names. +func (nd NetDev) Total() NetDevLine { + total := NetDevLine{} + + names := make([]string, 0, len(nd)) + for _, ifc := range nd { + names = append(names, ifc.Name) + total.RxBytes += ifc.RxBytes + total.RxPackets += ifc.RxPackets + total.RxPackets += ifc.RxPackets + total.RxErrors += ifc.RxErrors + total.RxDropped += ifc.RxDropped + total.RxFIFO += ifc.RxFIFO + total.RxFrame += ifc.RxFrame + total.RxCompressed += ifc.RxCompressed + total.RxMulticast += ifc.RxMulticast + total.TxBytes += ifc.TxBytes + total.TxPackets += ifc.TxPackets + total.TxErrors += ifc.TxErrors + total.TxDropped += ifc.TxDropped + total.TxFIFO += ifc.TxFIFO + total.TxCollisions += ifc.TxCollisions + total.TxCarrier += ifc.TxCarrier + total.TxCompressed += ifc.TxCompressed + } + sort.Strings(names) + total.Name = strings.Join(names, ", ") + + return total +} diff --git a/vendor/github.com/prometheus/procfs/nfs/nfs.go b/vendor/github.com/prometheus/procfs/nfs/nfs.go new file mode 100644 index 000000000000..651bf6819528 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/nfs/nfs.go @@ -0,0 +1,263 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package nfs implements parsing of /proc/net/rpc/nfsd. +// Fields are documented in https://www.svennd.be/nfsd-stats-explained-procnetrpcnfsd/ +package nfs + +// ReplyCache models the "rc" line. +type ReplyCache struct { + Hits uint64 + Misses uint64 + NoCache uint64 +} + +// FileHandles models the "fh" line. +type FileHandles struct { + Stale uint64 + TotalLookups uint64 + AnonLookups uint64 + DirNoCache uint64 + NoDirNoCache uint64 +} + +// InputOutput models the "io" line. +type InputOutput struct { + Read uint64 + Write uint64 +} + +// Threads models the "th" line. +type Threads struct { + Threads uint64 + FullCnt uint64 +} + +// ReadAheadCache models the "ra" line. +type ReadAheadCache struct { + CacheSize uint64 + CacheHistogram []uint64 + NotFound uint64 +} + +// Network models the "net" line. +type Network struct { + NetCount uint64 + UDPCount uint64 + TCPCount uint64 + TCPConnect uint64 +} + +// ClientRPC models the nfs "rpc" line. +type ClientRPC struct { + RPCCount uint64 + Retransmissions uint64 + AuthRefreshes uint64 +} + +// ServerRPC models the nfsd "rpc" line. +type ServerRPC struct { + RPCCount uint64 + BadCnt uint64 + BadFmt uint64 + BadAuth uint64 + BadcInt uint64 +} + +// V2Stats models the "proc2" line. +type V2Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Root uint64 + Lookup uint64 + ReadLink uint64 + Read uint64 + WrCache uint64 + Write uint64 + Create uint64 + Remove uint64 + Rename uint64 + Link uint64 + SymLink uint64 + MkDir uint64 + RmDir uint64 + ReadDir uint64 + FsStat uint64 +} + +// V3Stats models the "proc3" line. +type V3Stats struct { + Null uint64 + GetAttr uint64 + SetAttr uint64 + Lookup uint64 + Access uint64 + ReadLink uint64 + Read uint64 + Write uint64 + Create uint64 + MkDir uint64 + SymLink uint64 + MkNod uint64 + Remove uint64 + RmDir uint64 + Rename uint64 + Link uint64 + ReadDir uint64 + ReadDirPlus uint64 + FsStat uint64 + FsInfo uint64 + PathConf uint64 + Commit uint64 +} + +// ClientV4Stats models the nfs "proc4" line. +type ClientV4Stats struct { + Null uint64 + Read uint64 + Write uint64 + Commit uint64 + Open uint64 + OpenConfirm uint64 + OpenNoattr uint64 + OpenDowngrade uint64 + Close uint64 + Setattr uint64 + FsInfo uint64 + Renew uint64 + SetClientID uint64 + SetClientIDConfirm uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Access uint64 + Getattr uint64 + Lookup uint64 + LookupRoot uint64 + Remove uint64 + Rename uint64 + Link uint64 + Symlink uint64 + Create uint64 + Pathconf uint64 + StatFs uint64 + ReadLink uint64 + ReadDir uint64 + ServerCaps uint64 + DelegReturn uint64 + GetACL uint64 + SetACL uint64 + FsLocations uint64 + ReleaseLockowner uint64 + Secinfo uint64 + FsidPresent uint64 + ExchangeID uint64 + CreateSession uint64 + DestroySession uint64 + Sequence uint64 + GetLeaseTime uint64 + ReclaimComplete uint64 + LayoutGet uint64 + GetDeviceInfo uint64 + LayoutCommit uint64 + LayoutReturn uint64 + SecinfoNoName uint64 + TestStateID uint64 + FreeStateID uint64 + GetDeviceList uint64 + BindConnToSession uint64 + DestroyClientID uint64 + Seek uint64 + Allocate uint64 + DeAllocate uint64 + LayoutStats uint64 + Clone uint64 +} + +// ServerV4Stats models the nfsd "proc4" line. +type ServerV4Stats struct { + Null uint64 + Compound uint64 +} + +// V4Ops models the "proc4ops" line: NFSv4 operations +// Variable list, see: +// v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) +// v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) +// v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) +type V4Ops struct { + //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? + Op0Unused uint64 + Op1Unused uint64 + Op2Future uint64 + Access uint64 + Close uint64 + Commit uint64 + Create uint64 + DelegPurge uint64 + DelegReturn uint64 + GetAttr uint64 + GetFH uint64 + Link uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Lookup uint64 + LookupRoot uint64 + Nverify uint64 + Open uint64 + OpenAttr uint64 + OpenConfirm uint64 + OpenDgrd uint64 + PutFH uint64 + PutPubFH uint64 + PutRootFH uint64 + Read uint64 + ReadDir uint64 + ReadLink uint64 + Remove uint64 + Rename uint64 + Renew uint64 + RestoreFH uint64 + SaveFH uint64 + SecInfo uint64 + SetAttr uint64 + Verify uint64 + Write uint64 + RelLockOwner uint64 +} + +// ClientRPCStats models all stats from /proc/net/rpc/nfs. +type ClientRPCStats struct { + Network Network + ClientRPC ClientRPC + V2Stats V2Stats + V3Stats V3Stats + ClientV4Stats ClientV4Stats +} + +// ServerRPCStats models all stats from /proc/net/rpc/nfsd. +type ServerRPCStats struct { + ReplyCache ReplyCache + FileHandles FileHandles + InputOutput InputOutput + Threads Threads + ReadAheadCache ReadAheadCache + Network Network + ServerRPC ServerRPC + V2Stats V2Stats + V3Stats V3Stats + ServerV4Stats ServerV4Stats + V4Ops V4Ops +} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse.go b/vendor/github.com/prometheus/procfs/nfs/parse.go new file mode 100644 index 000000000000..95a83cc5bc5f --- /dev/null +++ b/vendor/github.com/prometheus/procfs/nfs/parse.go @@ -0,0 +1,317 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "fmt" +) + +func parseReplyCache(v []uint64) (ReplyCache, error) { + if len(v) != 3 { + return ReplyCache{}, fmt.Errorf("invalid ReplyCache line %q", v) + } + + return ReplyCache{ + Hits: v[0], + Misses: v[1], + NoCache: v[2], + }, nil +} + +func parseFileHandles(v []uint64) (FileHandles, error) { + if len(v) != 5 { + return FileHandles{}, fmt.Errorf("invalid FileHandles, line %q", v) + } + + return FileHandles{ + Stale: v[0], + TotalLookups: v[1], + AnonLookups: v[2], + DirNoCache: v[3], + NoDirNoCache: v[4], + }, nil +} + +func parseInputOutput(v []uint64) (InputOutput, error) { + if len(v) != 2 { + return InputOutput{}, fmt.Errorf("invalid InputOutput line %q", v) + } + + return InputOutput{ + Read: v[0], + Write: v[1], + }, nil +} + +func parseThreads(v []uint64) (Threads, error) { + if len(v) != 2 { + return Threads{}, fmt.Errorf("invalid Threads line %q", v) + } + + return Threads{ + Threads: v[0], + FullCnt: v[1], + }, nil +} + +func parseReadAheadCache(v []uint64) (ReadAheadCache, error) { + if len(v) != 12 { + return ReadAheadCache{}, fmt.Errorf("invalid ReadAheadCache line %q", v) + } + + return ReadAheadCache{ + CacheSize: v[0], + CacheHistogram: v[1:11], + NotFound: v[11], + }, nil +} + +func parseNetwork(v []uint64) (Network, error) { + if len(v) != 4 { + return Network{}, fmt.Errorf("invalid Network line %q", v) + } + + return Network{ + NetCount: v[0], + UDPCount: v[1], + TCPCount: v[2], + TCPConnect: v[3], + }, nil +} + +func parseServerRPC(v []uint64) (ServerRPC, error) { + if len(v) != 5 { + return ServerRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ServerRPC{ + RPCCount: v[0], + BadCnt: v[1], + BadFmt: v[2], + BadAuth: v[3], + BadcInt: v[4], + }, nil +} + +func parseClientRPC(v []uint64) (ClientRPC, error) { + if len(v) != 3 { + return ClientRPC{}, fmt.Errorf("invalid RPC line %q", v) + } + + return ClientRPC{ + RPCCount: v[0], + Retransmissions: v[1], + AuthRefreshes: v[2], + }, nil +} + +func parseV2Stats(v []uint64) (V2Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 18 { + return V2Stats{}, fmt.Errorf("invalid V2Stats line %q", v) + } + + return V2Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Root: v[4], + Lookup: v[5], + ReadLink: v[6], + Read: v[7], + WrCache: v[8], + Write: v[9], + Create: v[10], + Remove: v[11], + Rename: v[12], + Link: v[13], + SymLink: v[14], + MkDir: v[15], + RmDir: v[16], + ReadDir: v[17], + FsStat: v[18], + }, nil +} + +func parseV3Stats(v []uint64) (V3Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 22 { + return V3Stats{}, fmt.Errorf("invalid V3Stats line %q", v) + } + + return V3Stats{ + Null: v[1], + GetAttr: v[2], + SetAttr: v[3], + Lookup: v[4], + Access: v[5], + ReadLink: v[6], + Read: v[7], + Write: v[8], + Create: v[9], + MkDir: v[10], + SymLink: v[11], + MkNod: v[12], + Remove: v[13], + RmDir: v[14], + Rename: v[15], + Link: v[16], + ReadDir: v[17], + ReadDirPlus: v[18], + FsStat: v[19], + FsInfo: v[20], + PathConf: v[21], + Commit: v[22], + }, nil +} + +func parseClientV4Stats(v []uint64) (ClientV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values { + return ClientV4Stats{}, fmt.Errorf("invalid ClientV4Stats line %q", v) + } + + // This function currently supports mapping 59 NFS v4 client stats. Older + // kernels may emit fewer stats, so we must detect this and pad out the + // values to match the expected slice size. + if values < 59 { + newValues := make([]uint64, 60) + copy(newValues, v) + v = newValues + } + + return ClientV4Stats{ + Null: v[1], + Read: v[2], + Write: v[3], + Commit: v[4], + Open: v[5], + OpenConfirm: v[6], + OpenNoattr: v[7], + OpenDowngrade: v[8], + Close: v[9], + Setattr: v[10], + FsInfo: v[11], + Renew: v[12], + SetClientID: v[13], + SetClientIDConfirm: v[14], + Lock: v[15], + Lockt: v[16], + Locku: v[17], + Access: v[18], + Getattr: v[19], + Lookup: v[20], + LookupRoot: v[21], + Remove: v[22], + Rename: v[23], + Link: v[24], + Symlink: v[25], + Create: v[26], + Pathconf: v[27], + StatFs: v[28], + ReadLink: v[29], + ReadDir: v[30], + ServerCaps: v[31], + DelegReturn: v[32], + GetACL: v[33], + SetACL: v[34], + FsLocations: v[35], + ReleaseLockowner: v[36], + Secinfo: v[37], + FsidPresent: v[38], + ExchangeID: v[39], + CreateSession: v[40], + DestroySession: v[41], + Sequence: v[42], + GetLeaseTime: v[43], + ReclaimComplete: v[44], + LayoutGet: v[45], + GetDeviceInfo: v[46], + LayoutCommit: v[47], + LayoutReturn: v[48], + SecinfoNoName: v[49], + TestStateID: v[50], + FreeStateID: v[51], + GetDeviceList: v[52], + BindConnToSession: v[53], + DestroyClientID: v[54], + Seek: v[55], + Allocate: v[56], + DeAllocate: v[57], + LayoutStats: v[58], + Clone: v[59], + }, nil +} + +func parseServerV4Stats(v []uint64) (ServerV4Stats, error) { + values := int(v[0]) + if len(v[1:]) != values || values != 2 { + return ServerV4Stats{}, fmt.Errorf("invalid V4Stats line %q", v) + } + + return ServerV4Stats{ + Null: v[1], + Compound: v[2], + }, nil +} + +func parseV4Ops(v []uint64) (V4Ops, error) { + values := int(v[0]) + if len(v[1:]) != values || values < 39 { + return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) + } + + stats := V4Ops{ + Op0Unused: v[1], + Op1Unused: v[2], + Op2Future: v[3], + Access: v[4], + Close: v[5], + Commit: v[6], + Create: v[7], + DelegPurge: v[8], + DelegReturn: v[9], + GetAttr: v[10], + GetFH: v[11], + Link: v[12], + Lock: v[13], + Lockt: v[14], + Locku: v[15], + Lookup: v[16], + LookupRoot: v[17], + Nverify: v[18], + Open: v[19], + OpenAttr: v[20], + OpenConfirm: v[21], + OpenDgrd: v[22], + PutFH: v[23], + PutPubFH: v[24], + PutRootFH: v[25], + Read: v[26], + ReadDir: v[27], + ReadLink: v[28], + Remove: v[29], + Rename: v[30], + Renew: v[31], + RestoreFH: v[32], + SaveFH: v[33], + SecInfo: v[34], + SetAttr: v[35], + Verify: v[36], + Write: v[37], + RelLockOwner: v[38], + } + + return stats, nil +} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go new file mode 100644 index 000000000000..c0d3a5ad9bdf --- /dev/null +++ b/vendor/github.com/prometheus/procfs/nfs/parse_nfs.go @@ -0,0 +1,67 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseClientRPCStats returns stats read from /proc/net/rpc/nfs +func ParseClientRPCStats(r io.Reader) (*ClientRPCStats, error) { + stats := &ClientRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFS metric line %q", line) + } + + values, err := util.ParseUint64s(parts[1:]) + if err != nil { + return nil, fmt.Errorf("error parsing NFS metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ClientRPC, err = parseClientRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ClientV4Stats, err = parseClientV4Stats(values) + default: + return nil, fmt.Errorf("unknown NFS metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFS metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFS file: %s", err) + } + + return stats, nil +} diff --git a/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go b/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go new file mode 100644 index 000000000000..57bb4a35858c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/nfs/parse_nfsd.go @@ -0,0 +1,89 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package nfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseServerRPCStats returns stats read from /proc/net/rpc/nfsd +func ParseServerRPCStats(r io.Reader) (*ServerRPCStats, error) { + stats := &ServerRPCStats{} + + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + return nil, fmt.Errorf("invalid NFSd metric line %q", line) + } + label := parts[0] + + var values []uint64 + var err error + if label == "th" { + if len(parts) < 3 { + return nil, fmt.Errorf("invalid NFSd th metric line %q", line) + } + values, err = util.ParseUint64s(parts[1:3]) + } else { + values, err = util.ParseUint64s(parts[1:]) + } + if err != nil { + return nil, fmt.Errorf("error parsing NFSd metric line: %s", err) + } + + switch metricLine := parts[0]; metricLine { + case "rc": + stats.ReplyCache, err = parseReplyCache(values) + case "fh": + stats.FileHandles, err = parseFileHandles(values) + case "io": + stats.InputOutput, err = parseInputOutput(values) + case "th": + stats.Threads, err = parseThreads(values) + case "ra": + stats.ReadAheadCache, err = parseReadAheadCache(values) + case "net": + stats.Network, err = parseNetwork(values) + case "rpc": + stats.ServerRPC, err = parseServerRPC(values) + case "proc2": + stats.V2Stats, err = parseV2Stats(values) + case "proc3": + stats.V3Stats, err = parseV3Stats(values) + case "proc4": + stats.ServerV4Stats, err = parseServerV4Stats(values) + case "proc4ops": + stats.V4Ops, err = parseV4Ops(values) + default: + return nil, fmt.Errorf("unknown NFSd metric line %q", metricLine) + } + if err != nil { + return nil, fmt.Errorf("errors parsing NFSd metric line: %s", err) + } + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("error scanning NFSd file: %s", err) + } + + return stats, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go new file mode 100644 index 000000000000..06bed0ef4a3a --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -0,0 +1,258 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strconv" + "strings" +) + +// Proc provides information about a running process. +type Proc struct { + // The process ID. + PID int + + fs FS +} + +// Procs represents a list of Proc structs. +type Procs []Proc + +func (p Procs) Len() int { return len(p) } +func (p Procs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } +func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID } + +// Self returns a process for the current process read via /proc/self. +func Self() (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.Self() +} + +// NewProc returns a process for the given pid under /proc. +func NewProc(pid int) (Proc, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// AllProcs returns a list of all currently available processes under /proc. +func AllProcs() (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllProcs() +} + +// Self returns a process for the current process. +func (fs FS) Self() (Proc, error) { + p, err := os.Readlink(fs.Path("self")) + if err != nil { + return Proc{}, err + } + pid, err := strconv.Atoi(strings.Replace(p, string(fs), "", -1)) + if err != nil { + return Proc{}, err + } + return fs.NewProc(pid) +} + +// NewProc returns a process for the given pid. +func (fs FS) NewProc(pid int) (Proc, error) { + if _, err := os.Stat(fs.Path(strconv.Itoa(pid))); err != nil { + return Proc{}, err + } + return Proc{PID: pid, fs: fs}, nil +} + +// AllProcs returns a list of all currently available processes. +func (fs FS) AllProcs() (Procs, error) { + d, err := os.Open(fs.Path()) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + p := Procs{} + for _, n := range names { + pid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + p = append(p, Proc{PID: int(pid), fs: fs}) + } + + return p, nil +} + +// CmdLine returns the command line of a process. +func (p Proc) CmdLine() ([]string, error) { + f, err := os.Open(p.path("cmdline")) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + + if len(data) < 1 { + return []string{}, nil + } + + return strings.Split(string(bytes.TrimRight(data, string("\x00"))), string(byte(0))), nil +} + +// Comm returns the command name of a process. +func (p Proc) Comm() (string, error) { + f, err := os.Open(p.path("comm")) + if err != nil { + return "", err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return "", err + } + + return strings.TrimSpace(string(data)), nil +} + +// Executable returns the absolute path of the executable command of a process. +func (p Proc) Executable() (string, error) { + exe, err := os.Readlink(p.path("exe")) + if os.IsNotExist(err) { + return "", nil + } + + return exe, err +} + +// Cwd returns the absolute path to the current working directory of the process. +func (p Proc) Cwd() (string, error) { + wd, err := os.Readlink(p.path("cwd")) + if os.IsNotExist(err) { + return "", nil + } + + return wd, err +} + +// RootDir returns the absolute path to the process's root directory (as set by chroot) +func (p Proc) RootDir() (string, error) { + rdir, err := os.Readlink(p.path("root")) + if os.IsNotExist(err) { + return "", nil + } + + return rdir, err +} + +// FileDescriptors returns the currently open file descriptors of a process. +func (p Proc) FileDescriptors() ([]uintptr, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + fds := make([]uintptr, len(names)) + for i, n := range names { + fd, err := strconv.ParseInt(n, 10, 32) + if err != nil { + return nil, fmt.Errorf("could not parse fd %s: %s", n, err) + } + fds[i] = uintptr(fd) + } + + return fds, nil +} + +// FileDescriptorTargets returns the targets of all file descriptors of a process. +// If a file descriptor is not a symlink to a file (like a socket), that value will be the empty string. +func (p Proc) FileDescriptorTargets() ([]string, error) { + names, err := p.fileDescriptors() + if err != nil { + return nil, err + } + + targets := make([]string, len(names)) + + for i, name := range names { + target, err := os.Readlink(p.path("fd", name)) + if err == nil { + targets[i] = target + } + } + + return targets, nil +} + +// FileDescriptorsLen returns the number of currently open file descriptors of +// a process. +func (p Proc) FileDescriptorsLen() (int, error) { + fds, err := p.fileDescriptors() + if err != nil { + return 0, err + } + + return len(fds), nil +} + +// MountStats retrieves statistics and configuration for mount points in a +// process's namespace. +func (p Proc) MountStats() ([]*Mount, error) { + f, err := os.Open(p.path("mountstats")) + if err != nil { + return nil, err + } + defer f.Close() + + return parseMountStats(f) +} + +func (p Proc) fileDescriptors() ([]string, error) { + d, err := os.Open(p.path("fd")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("could not read %s: %s", d.Name(), err) + } + + return names, nil +} + +func (p Proc) path(pa ...string) string { + return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) +} diff --git a/vendor/github.com/prometheus/procfs/proc_io.go b/vendor/github.com/prometheus/procfs/proc_io.go new file mode 100644 index 000000000000..0251c83bfe81 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_io.go @@ -0,0 +1,65 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "io/ioutil" + "os" +) + +// ProcIO models the content of /proc//io. +type ProcIO struct { + // Chars read. + RChar uint64 + // Chars written. + WChar uint64 + // Read syscalls. + SyscR uint64 + // Write syscalls. + SyscW uint64 + // Bytes read. + ReadBytes uint64 + // Bytes written. + WriteBytes uint64 + // Bytes written, but taking into account truncation. See + // Documentation/filesystems/proc.txt in the kernel sources for + // detailed explanation. + CancelledWriteBytes int64 +} + +// NewIO creates a new ProcIO instance from a given Proc instance. +func (p Proc) NewIO() (ProcIO, error) { + pio := ProcIO{} + + f, err := os.Open(p.path("io")) + if err != nil { + return pio, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return pio, err + } + + ioFormat := "rchar: %d\nwchar: %d\nsyscr: %d\nsyscw: %d\n" + + "read_bytes: %d\nwrite_bytes: %d\n" + + "cancelled_write_bytes: %d\n" + + _, err = fmt.Sscanf(string(data), ioFormat, &pio.RChar, &pio.WChar, &pio.SyscR, + &pio.SyscW, &pio.ReadBytes, &pio.WriteBytes, &pio.CancelledWriteBytes) + + return pio, err +} diff --git a/vendor/github.com/prometheus/procfs/proc_limits.go b/vendor/github.com/prometheus/procfs/proc_limits.go new file mode 100644 index 000000000000..f04ba6fda852 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_limits.go @@ -0,0 +1,150 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "regexp" + "strconv" +) + +// ProcLimits represents the soft limits for each of the process's resource +// limits. For more information see getrlimit(2): +// http://man7.org/linux/man-pages/man2/getrlimit.2.html. +type ProcLimits struct { + // CPU time limit in seconds. + CPUTime int64 + // Maximum size of files that the process may create. + FileSize int64 + // Maximum size of the process's data segment (initialized data, + // uninitialized data, and heap). + DataSize int64 + // Maximum size of the process stack in bytes. + StackSize int64 + // Maximum size of a core file. + CoreFileSize int64 + // Limit of the process's resident set in pages. + ResidentSet int64 + // Maximum number of processes that can be created for the real user ID of + // the calling process. + Processes int64 + // Value one greater than the maximum file descriptor number that can be + // opened by this process. + OpenFiles int64 + // Maximum number of bytes of memory that may be locked into RAM. + LockedMemory int64 + // Maximum size of the process's virtual memory address space in bytes. + AddressSpace int64 + // Limit on the combined number of flock(2) locks and fcntl(2) leases that + // this process may establish. + FileLocks int64 + // Limit of signals that may be queued for the real user ID of the calling + // process. + PendingSignals int64 + // Limit on the number of bytes that can be allocated for POSIX message + // queues for the real user ID of the calling process. + MsqqueueSize int64 + // Limit of the nice priority set using setpriority(2) or nice(2). + NicePriority int64 + // Limit of the real-time priority set using sched_setscheduler(2) or + // sched_setparam(2). + RealtimePriority int64 + // Limit (in microseconds) on the amount of CPU time that a process + // scheduled under a real-time scheduling policy may consume without making + // a blocking system call. + RealtimeTimeout int64 +} + +const ( + limitsFields = 3 + limitsUnlimited = "unlimited" +) + +var ( + limitsDelimiter = regexp.MustCompile(" +") +) + +// NewLimits returns the current soft limits of the process. +func (p Proc) NewLimits() (ProcLimits, error) { + f, err := os.Open(p.path("limits")) + if err != nil { + return ProcLimits{}, err + } + defer f.Close() + + var ( + l = ProcLimits{} + s = bufio.NewScanner(f) + ) + for s.Scan() { + fields := limitsDelimiter.Split(s.Text(), limitsFields) + if len(fields) != limitsFields { + return ProcLimits{}, fmt.Errorf( + "couldn't parse %s line %s", f.Name(), s.Text()) + } + + switch fields[0] { + case "Max cpu time": + l.CPUTime, err = parseInt(fields[1]) + case "Max file size": + l.FileSize, err = parseInt(fields[1]) + case "Max data size": + l.DataSize, err = parseInt(fields[1]) + case "Max stack size": + l.StackSize, err = parseInt(fields[1]) + case "Max core file size": + l.CoreFileSize, err = parseInt(fields[1]) + case "Max resident set": + l.ResidentSet, err = parseInt(fields[1]) + case "Max processes": + l.Processes, err = parseInt(fields[1]) + case "Max open files": + l.OpenFiles, err = parseInt(fields[1]) + case "Max locked memory": + l.LockedMemory, err = parseInt(fields[1]) + case "Max address space": + l.AddressSpace, err = parseInt(fields[1]) + case "Max file locks": + l.FileLocks, err = parseInt(fields[1]) + case "Max pending signals": + l.PendingSignals, err = parseInt(fields[1]) + case "Max msgqueue size": + l.MsqqueueSize, err = parseInt(fields[1]) + case "Max nice priority": + l.NicePriority, err = parseInt(fields[1]) + case "Max realtime priority": + l.RealtimePriority, err = parseInt(fields[1]) + case "Max realtime timeout": + l.RealtimeTimeout, err = parseInt(fields[1]) + } + if err != nil { + return ProcLimits{}, err + } + } + + return l, s.Err() +} + +func parseInt(s string) (int64, error) { + if s == limitsUnlimited { + return -1, nil + } + i, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return 0, fmt.Errorf("couldn't parse value %s: %s", s, err) + } + return i, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_ns.go b/vendor/github.com/prometheus/procfs/proc_ns.go new file mode 100644 index 000000000000..d06c26ebad9b --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_ns.go @@ -0,0 +1,68 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "strconv" + "strings" +) + +// Namespace represents a single namespace of a process. +type Namespace struct { + Type string // Namespace type. + Inode uint32 // Inode number of the namespace. If two processes are in the same namespace their inodes will match. +} + +// Namespaces contains all of the namespaces that the process is contained in. +type Namespaces map[string]Namespace + +// NewNamespaces reads from /proc/[pid/ns/* to get the namespaces of which the +// process is a member. +func (p Proc) NewNamespaces() (Namespaces, error) { + d, err := os.Open(p.path("ns")) + if err != nil { + return nil, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return nil, fmt.Errorf("failed to read contents of ns dir: %v", err) + } + + ns := make(Namespaces, len(names)) + for _, name := range names { + target, err := os.Readlink(p.path("ns", name)) + if err != nil { + return nil, err + } + + fields := strings.SplitN(target, ":", 2) + if len(fields) != 2 { + return nil, fmt.Errorf("failed to parse namespace type and inode from '%v'", target) + } + + typ := fields[0] + inode, err := strconv.ParseUint(strings.Trim(fields[1], "[]"), 10, 32) + if err != nil { + return nil, fmt.Errorf("failed to parse inode from '%v': %v", fields[1], err) + } + + ns[name] = Namespace{typ, uint32(inode)} + } + + return ns, nil +} diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go new file mode 100644 index 000000000000..3cf2a9f18f00 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -0,0 +1,188 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" +) + +// Originally, this USER_HZ value was dynamically retrieved via a sysconf call +// which required cgo. However, that caused a lot of problems regarding +// cross-compilation. Alternatives such as running a binary to determine the +// value, or trying to derive it in some other way were all problematic. After +// much research it was determined that USER_HZ is actually hardcoded to 100 on +// all Go-supported platforms as of the time of this writing. This is why we +// decided to hardcode it here as well. It is not impossible that there could +// be systems with exceptions, but they should be very exotic edge cases, and +// in that case, the worst outcome will be two misreported metrics. +// +// See also the following discussions: +// +// - https://github.com/prometheus/node_exporter/issues/52 +// - https://github.com/prometheus/procfs/pull/2 +// - http://stackoverflow.com/questions/17410841/how-does-user-hz-solve-the-jiffy-scaling-issue +const userHZ = 100 + +// ProcStat provides status information about the process, +// read from /proc/[pid]/stat. +type ProcStat struct { + // The process ID. + PID int + // The filename of the executable. + Comm string + // The process state. + State string + // The PID of the parent of this process. + PPID int + // The process group ID of the process. + PGRP int + // The session ID of the process. + Session int + // The controlling terminal of the process. + TTY int + // The ID of the foreground process group of the controlling terminal of + // the process. + TPGID int + // The kernel flags word of the process. + Flags uint + // The number of minor faults the process has made which have not required + // loading a memory page from disk. + MinFlt uint + // The number of minor faults that the process's waited-for children have + // made. + CMinFlt uint + // The number of major faults the process has made which have required + // loading a memory page from disk. + MajFlt uint + // The number of major faults that the process's waited-for children have + // made. + CMajFlt uint + // Amount of time that this process has been scheduled in user mode, + // measured in clock ticks. + UTime uint + // Amount of time that this process has been scheduled in kernel mode, + // measured in clock ticks. + STime uint + // Amount of time that this process's waited-for children have been + // scheduled in user mode, measured in clock ticks. + CUTime uint + // Amount of time that this process's waited-for children have been + // scheduled in kernel mode, measured in clock ticks. + CSTime uint + // For processes running a real-time scheduling policy, this is the negated + // scheduling priority, minus one. + Priority int + // The nice value, a value in the range 19 (low priority) to -20 (high + // priority). + Nice int + // Number of threads in this process. + NumThreads int + // The time the process started after system boot, the value is expressed + // in clock ticks. + Starttime uint64 + // Virtual memory size in bytes. + VSize int + // Resident set size in pages. + RSS int + + fs FS +} + +// NewStat returns the current status information of the process. +func (p Proc) NewStat() (ProcStat, error) { + f, err := os.Open(p.path("stat")) + if err != nil { + return ProcStat{}, err + } + defer f.Close() + + data, err := ioutil.ReadAll(f) + if err != nil { + return ProcStat{}, err + } + + var ( + ignore int + + s = ProcStat{PID: p.PID, fs: p.fs} + l = bytes.Index(data, []byte("(")) + r = bytes.LastIndex(data, []byte(")")) + ) + + if l < 0 || r < 0 { + return ProcStat{}, fmt.Errorf( + "unexpected format, couldn't extract comm: %s", + data, + ) + } + + s.Comm = string(data[l+1 : r]) + _, err = fmt.Fscan( + bytes.NewBuffer(data[r+2:]), + &s.State, + &s.PPID, + &s.PGRP, + &s.Session, + &s.TTY, + &s.TPGID, + &s.Flags, + &s.MinFlt, + &s.CMinFlt, + &s.MajFlt, + &s.CMajFlt, + &s.UTime, + &s.STime, + &s.CUTime, + &s.CSTime, + &s.Priority, + &s.Nice, + &s.NumThreads, + &ignore, + &s.Starttime, + &s.VSize, + &s.RSS, + ) + if err != nil { + return ProcStat{}, err + } + + return s, nil +} + +// VirtualMemory returns the virtual memory size in bytes. +func (s ProcStat) VirtualMemory() int { + return s.VSize +} + +// ResidentMemory returns the resident memory size in bytes. +func (s ProcStat) ResidentMemory() int { + return s.RSS * os.Getpagesize() +} + +// StartTime returns the unix timestamp of the process in seconds. +func (s ProcStat) StartTime() (float64, error) { + stat, err := s.fs.NewStat() + if err != nil { + return 0, err + } + return float64(stat.BootTime) + (float64(s.Starttime) / userHZ), nil +} + +// CPUTime returns the total CPU user and system time in seconds. +func (s ProcStat) CPUTime() float64 { + return float64(s.UTime+s.STime) / userHZ +} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go new file mode 100644 index 000000000000..61eb6b0e3cea --- /dev/null +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -0,0 +1,232 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +// CPUStat shows how much time the cpu spend in various stages. +type CPUStat struct { + User float64 + Nice float64 + System float64 + Idle float64 + Iowait float64 + IRQ float64 + SoftIRQ float64 + Steal float64 + Guest float64 + GuestNice float64 +} + +// SoftIRQStat represent the softirq statistics as exported in the procfs stat file. +// A nice introduction can be found at https://0xax.gitbooks.io/linux-insides/content/interrupts/interrupts-9.html +// It is possible to get per-cpu stats by reading /proc/softirqs +type SoftIRQStat struct { + Hi uint64 + Timer uint64 + NetTx uint64 + NetRx uint64 + Block uint64 + BlockIoPoll uint64 + Tasklet uint64 + Sched uint64 + Hrtimer uint64 + Rcu uint64 +} + +// Stat represents kernel/system statistics. +type Stat struct { + // Boot time in seconds since the Epoch. + BootTime uint64 + // Summed up cpu statistics. + CPUTotal CPUStat + // Per-CPU statistics. + CPU []CPUStat + // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. + IRQTotal uint64 + // Number of times a numbered IRQ was triggered. + IRQ []uint64 + // Number of times a context switch happened. + ContextSwitches uint64 + // Number of times a process was created. + ProcessCreated uint64 + // Number of processes currently running. + ProcessesRunning uint64 + // Number of processes currently blocked (waiting for IO). + ProcessesBlocked uint64 + // Number of times a softirq was scheduled. + SoftIRQTotal uint64 + // Detailed softirq statistics. + SoftIRQ SoftIRQStat +} + +// NewStat returns kernel/system statistics read from /proc/stat. +func NewStat() (Stat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Stat{}, err + } + + return fs.NewStat() +} + +// Parse a cpu statistics line and returns the CPUStat struct plus the cpu id (or -1 for the overall sum). +func parseCPUStat(line string) (CPUStat, int64, error) { + cpuStat := CPUStat{} + var cpu string + + count, err := fmt.Sscanf(line, "%s %f %f %f %f %f %f %f %f %f %f", + &cpu, + &cpuStat.User, &cpuStat.Nice, &cpuStat.System, &cpuStat.Idle, + &cpuStat.Iowait, &cpuStat.IRQ, &cpuStat.SoftIRQ, &cpuStat.Steal, + &cpuStat.Guest, &cpuStat.GuestNice) + + if err != nil && err != io.EOF { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): %s", line, err) + } + if count == 0 { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu): 0 elements parsed", line) + } + + cpuStat.User /= userHZ + cpuStat.Nice /= userHZ + cpuStat.System /= userHZ + cpuStat.Idle /= userHZ + cpuStat.Iowait /= userHZ + cpuStat.IRQ /= userHZ + cpuStat.SoftIRQ /= userHZ + cpuStat.Steal /= userHZ + cpuStat.Guest /= userHZ + cpuStat.GuestNice /= userHZ + + if cpu == "cpu" { + return cpuStat, -1, nil + } + + cpuID, err := strconv.ParseInt(cpu[3:], 10, 64) + if err != nil { + return CPUStat{}, -1, fmt.Errorf("couldn't parse %s (cpu/cpuid): %s", line, err) + } + + return cpuStat, cpuID, nil +} + +// Parse a softirq line. +func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) { + softIRQStat := SoftIRQStat{} + var total uint64 + var prefix string + + _, err := fmt.Sscanf(line, "%s %d %d %d %d %d %d %d %d %d %d %d", + &prefix, &total, + &softIRQStat.Hi, &softIRQStat.Timer, &softIRQStat.NetTx, &softIRQStat.NetRx, + &softIRQStat.Block, &softIRQStat.BlockIoPoll, + &softIRQStat.Tasklet, &softIRQStat.Sched, + &softIRQStat.Hrtimer, &softIRQStat.Rcu) + + if err != nil { + return SoftIRQStat{}, 0, fmt.Errorf("couldn't parse %s (softirq): %s", line, err) + } + + return softIRQStat, total, nil +} + +// NewStat returns an information about current kernel/system statistics. +func (fs FS) NewStat() (Stat, error) { + // See https://www.kernel.org/doc/Documentation/filesystems/proc.txt + + f, err := os.Open(fs.Path("stat")) + if err != nil { + return Stat{}, err + } + defer f.Close() + + stat := Stat{} + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + parts := strings.Fields(scanner.Text()) + // require at least + if len(parts) < 2 { + continue + } + switch { + case parts[0] == "btime": + if stat.BootTime, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (btime): %s", parts[1], err) + } + case parts[0] == "intr": + if stat.IRQTotal, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr): %s", parts[1], err) + } + numberedIRQs := parts[2:] + stat.IRQ = make([]uint64, len(numberedIRQs)) + for i, count := range numberedIRQs { + if stat.IRQ[i], err = strconv.ParseUint(count, 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (intr%d): %s", count, i, err) + } + } + case parts[0] == "ctxt": + if stat.ContextSwitches, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (ctxt): %s", parts[1], err) + } + case parts[0] == "processes": + if stat.ProcessCreated, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (processes): %s", parts[1], err) + } + case parts[0] == "procs_running": + if stat.ProcessesRunning, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_running): %s", parts[1], err) + } + case parts[0] == "procs_blocked": + if stat.ProcessesBlocked, err = strconv.ParseUint(parts[1], 10, 64); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s (procs_blocked): %s", parts[1], err) + } + case parts[0] == "softirq": + softIRQStats, total, err := parseSoftIRQStat(line) + if err != nil { + return Stat{}, err + } + stat.SoftIRQTotal = total + stat.SoftIRQ = softIRQStats + case strings.HasPrefix(parts[0], "cpu"): + cpuStat, cpuID, err := parseCPUStat(line) + if err != nil { + return Stat{}, err + } + if cpuID == -1 { + stat.CPUTotal = cpuStat + } else { + for int64(len(stat.CPU)) <= cpuID { + stat.CPU = append(stat.CPU, CPUStat{}) + } + stat.CPU[cpuID] = cpuStat + } + } + } + + if err := scanner.Err(); err != nil { + return Stat{}, fmt.Errorf("couldn't parse %s: %s", f.Name(), err) + } + + return stat, nil +} diff --git a/vendor/github.com/prometheus/procfs/xfrm.go b/vendor/github.com/prometheus/procfs/xfrm.go new file mode 100644 index 000000000000..8f1508f0fd11 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfrm.go @@ -0,0 +1,187 @@ +// Copyright 2017 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "fmt" + "os" + "strconv" + "strings" +) + +// XfrmStat models the contents of /proc/net/xfrm_stat. +type XfrmStat struct { + // All errors which are not matched by other + XfrmInError int + // No buffer is left + XfrmInBufferError int + // Header Error + XfrmInHdrError int + // No state found + // i.e. either inbound SPI, address, or IPSEC protocol at SA is wrong + XfrmInNoStates int + // Transformation protocol specific error + // e.g. SA Key is wrong + XfrmInStateProtoError int + // Transformation mode specific error + XfrmInStateModeError int + // Sequence error + // e.g. sequence number is out of window + XfrmInStateSeqError int + // State is expired + XfrmInStateExpired int + // State has mismatch option + // e.g. UDP encapsulation type is mismatched + XfrmInStateMismatch int + // State is invalid + XfrmInStateInvalid int + // No matching template for states + // e.g. Inbound SAs are correct but SP rule is wrong + XfrmInTmplMismatch int + // No policy is found for states + // e.g. Inbound SAs are correct but no SP is found + XfrmInNoPols int + // Policy discards + XfrmInPolBlock int + // Policy error + XfrmInPolError int + // All errors which are not matched by others + XfrmOutError int + // Bundle generation error + XfrmOutBundleGenError int + // Bundle check error + XfrmOutBundleCheckError int + // No state was found + XfrmOutNoStates int + // Transformation protocol specific error + XfrmOutStateProtoError int + // Transportation mode specific error + XfrmOutStateModeError int + // Sequence error + // i.e sequence number overflow + XfrmOutStateSeqError int + // State is expired + XfrmOutStateExpired int + // Policy discads + XfrmOutPolBlock int + // Policy is dead + XfrmOutPolDead int + // Policy Error + XfrmOutPolError int + XfrmFwdHdrError int + XfrmOutStateInvalid int + XfrmAcquireError int +} + +// NewXfrmStat reads the xfrm_stat statistics. +func NewXfrmStat() (XfrmStat, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return XfrmStat{}, err + } + + return fs.NewXfrmStat() +} + +// NewXfrmStat reads the xfrm_stat statistics from the 'proc' filesystem. +func (fs FS) NewXfrmStat() (XfrmStat, error) { + file, err := os.Open(fs.Path("net/xfrm_stat")) + if err != nil { + return XfrmStat{}, err + } + defer file.Close() + + var ( + x = XfrmStat{} + s = bufio.NewScanner(file) + ) + + for s.Scan() { + fields := strings.Fields(s.Text()) + + if len(fields) != 2 { + return XfrmStat{}, fmt.Errorf( + "couldn't parse %s line %s", file.Name(), s.Text()) + } + + name := fields[0] + value, err := strconv.Atoi(fields[1]) + if err != nil { + return XfrmStat{}, err + } + + switch name { + case "XfrmInError": + x.XfrmInError = value + case "XfrmInBufferError": + x.XfrmInBufferError = value + case "XfrmInHdrError": + x.XfrmInHdrError = value + case "XfrmInNoStates": + x.XfrmInNoStates = value + case "XfrmInStateProtoError": + x.XfrmInStateProtoError = value + case "XfrmInStateModeError": + x.XfrmInStateModeError = value + case "XfrmInStateSeqError": + x.XfrmInStateSeqError = value + case "XfrmInStateExpired": + x.XfrmInStateExpired = value + case "XfrmInStateInvalid": + x.XfrmInStateInvalid = value + case "XfrmInTmplMismatch": + x.XfrmInTmplMismatch = value + case "XfrmInNoPols": + x.XfrmInNoPols = value + case "XfrmInPolBlock": + x.XfrmInPolBlock = value + case "XfrmInPolError": + x.XfrmInPolError = value + case "XfrmOutError": + x.XfrmOutError = value + case "XfrmInStateMismatch": + x.XfrmInStateMismatch = value + case "XfrmOutBundleGenError": + x.XfrmOutBundleGenError = value + case "XfrmOutBundleCheckError": + x.XfrmOutBundleCheckError = value + case "XfrmOutNoStates": + x.XfrmOutNoStates = value + case "XfrmOutStateProtoError": + x.XfrmOutStateProtoError = value + case "XfrmOutStateModeError": + x.XfrmOutStateModeError = value + case "XfrmOutStateSeqError": + x.XfrmOutStateSeqError = value + case "XfrmOutStateExpired": + x.XfrmOutStateExpired = value + case "XfrmOutPolBlock": + x.XfrmOutPolBlock = value + case "XfrmOutPolDead": + x.XfrmOutPolDead = value + case "XfrmOutPolError": + x.XfrmOutPolError = value + case "XfrmFwdHdrError": + x.XfrmFwdHdrError = value + case "XfrmOutStateInvalid": + x.XfrmOutStateInvalid = value + case "XfrmAcquireError": + x.XfrmAcquireError = value + } + + } + + return x, s.Err() +} diff --git a/vendor/github.com/prometheus/procfs/xfs/parse.go b/vendor/github.com/prometheus/procfs/xfs/parse.go new file mode 100644 index 000000000000..2bc0ef3427d2 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfs/parse.go @@ -0,0 +1,330 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package xfs + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ParseStats parses a Stats from an input io.Reader, using the format +// found in /proc/fs/xfs/stat. +func ParseStats(r io.Reader) (*Stats, error) { + const ( + // Fields parsed into stats structures. + fieldExtentAlloc = "extent_alloc" + fieldAbt = "abt" + fieldBlkMap = "blk_map" + fieldBmbt = "bmbt" + fieldDir = "dir" + fieldTrans = "trans" + fieldIg = "ig" + fieldLog = "log" + fieldRw = "rw" + fieldAttr = "attr" + fieldIcluster = "icluster" + fieldVnodes = "vnodes" + fieldBuf = "buf" + fieldXpc = "xpc" + + // Unimplemented at this time due to lack of documentation. + fieldPushAil = "push_ail" + fieldXstrat = "xstrat" + fieldAbtb2 = "abtb2" + fieldAbtc2 = "abtc2" + fieldBmbt2 = "bmbt2" + fieldIbt2 = "ibt2" + fieldFibt2 = "fibt2" + fieldQm = "qm" + fieldDebug = "debug" + ) + + var xfss Stats + + s := bufio.NewScanner(r) + for s.Scan() { + // Expect at least a string label and a single integer value, ex: + // - abt 0 + // - rw 1 2 + ss := strings.Fields(string(s.Bytes())) + if len(ss) < 2 { + continue + } + label := ss[0] + + // Extended precision counters are uint64 values. + if label == fieldXpc { + us, err := util.ParseUint64s(ss[1:]) + if err != nil { + return nil, err + } + + xfss.ExtendedPrecision, err = extendedPrecisionStats(us) + if err != nil { + return nil, err + } + + continue + } + + // All other counters are uint32 values. + us, err := util.ParseUint32s(ss[1:]) + if err != nil { + return nil, err + } + + switch label { + case fieldExtentAlloc: + xfss.ExtentAllocation, err = extentAllocationStats(us) + case fieldAbt: + xfss.AllocationBTree, err = btreeStats(us) + case fieldBlkMap: + xfss.BlockMapping, err = blockMappingStats(us) + case fieldBmbt: + xfss.BlockMapBTree, err = btreeStats(us) + case fieldDir: + xfss.DirectoryOperation, err = directoryOperationStats(us) + case fieldTrans: + xfss.Transaction, err = transactionStats(us) + case fieldIg: + xfss.InodeOperation, err = inodeOperationStats(us) + case fieldLog: + xfss.LogOperation, err = logOperationStats(us) + case fieldRw: + xfss.ReadWrite, err = readWriteStats(us) + case fieldAttr: + xfss.AttributeOperation, err = attributeOperationStats(us) + case fieldIcluster: + xfss.InodeClustering, err = inodeClusteringStats(us) + case fieldVnodes: + xfss.Vnode, err = vnodeStats(us) + case fieldBuf: + xfss.Buffer, err = bufferStats(us) + } + if err != nil { + return nil, err + } + } + + return &xfss, s.Err() +} + +// extentAllocationStats builds an ExtentAllocationStats from a slice of uint32s. +func extentAllocationStats(us []uint32) (ExtentAllocationStats, error) { + if l := len(us); l != 4 { + return ExtentAllocationStats{}, fmt.Errorf("incorrect number of values for XFS extent allocation stats: %d", l) + } + + return ExtentAllocationStats{ + ExtentsAllocated: us[0], + BlocksAllocated: us[1], + ExtentsFreed: us[2], + BlocksFreed: us[3], + }, nil +} + +// btreeStats builds a BTreeStats from a slice of uint32s. +func btreeStats(us []uint32) (BTreeStats, error) { + if l := len(us); l != 4 { + return BTreeStats{}, fmt.Errorf("incorrect number of values for XFS btree stats: %d", l) + } + + return BTreeStats{ + Lookups: us[0], + Compares: us[1], + RecordsInserted: us[2], + RecordsDeleted: us[3], + }, nil +} + +// BlockMappingStat builds a BlockMappingStats from a slice of uint32s. +func blockMappingStats(us []uint32) (BlockMappingStats, error) { + if l := len(us); l != 7 { + return BlockMappingStats{}, fmt.Errorf("incorrect number of values for XFS block mapping stats: %d", l) + } + + return BlockMappingStats{ + Reads: us[0], + Writes: us[1], + Unmaps: us[2], + ExtentListInsertions: us[3], + ExtentListDeletions: us[4], + ExtentListLookups: us[5], + ExtentListCompares: us[6], + }, nil +} + +// DirectoryOperationStats builds a DirectoryOperationStats from a slice of uint32s. +func directoryOperationStats(us []uint32) (DirectoryOperationStats, error) { + if l := len(us); l != 4 { + return DirectoryOperationStats{}, fmt.Errorf("incorrect number of values for XFS directory operation stats: %d", l) + } + + return DirectoryOperationStats{ + Lookups: us[0], + Creates: us[1], + Removes: us[2], + Getdents: us[3], + }, nil +} + +// TransactionStats builds a TransactionStats from a slice of uint32s. +func transactionStats(us []uint32) (TransactionStats, error) { + if l := len(us); l != 3 { + return TransactionStats{}, fmt.Errorf("incorrect number of values for XFS transaction stats: %d", l) + } + + return TransactionStats{ + Sync: us[0], + Async: us[1], + Empty: us[2], + }, nil +} + +// InodeOperationStats builds an InodeOperationStats from a slice of uint32s. +func inodeOperationStats(us []uint32) (InodeOperationStats, error) { + if l := len(us); l != 7 { + return InodeOperationStats{}, fmt.Errorf("incorrect number of values for XFS inode operation stats: %d", l) + } + + return InodeOperationStats{ + Attempts: us[0], + Found: us[1], + Recycle: us[2], + Missed: us[3], + Duplicate: us[4], + Reclaims: us[5], + AttributeChange: us[6], + }, nil +} + +// LogOperationStats builds a LogOperationStats from a slice of uint32s. +func logOperationStats(us []uint32) (LogOperationStats, error) { + if l := len(us); l != 5 { + return LogOperationStats{}, fmt.Errorf("incorrect number of values for XFS log operation stats: %d", l) + } + + return LogOperationStats{ + Writes: us[0], + Blocks: us[1], + NoInternalBuffers: us[2], + Force: us[3], + ForceSleep: us[4], + }, nil +} + +// ReadWriteStats builds a ReadWriteStats from a slice of uint32s. +func readWriteStats(us []uint32) (ReadWriteStats, error) { + if l := len(us); l != 2 { + return ReadWriteStats{}, fmt.Errorf("incorrect number of values for XFS read write stats: %d", l) + } + + return ReadWriteStats{ + Read: us[0], + Write: us[1], + }, nil +} + +// AttributeOperationStats builds an AttributeOperationStats from a slice of uint32s. +func attributeOperationStats(us []uint32) (AttributeOperationStats, error) { + if l := len(us); l != 4 { + return AttributeOperationStats{}, fmt.Errorf("incorrect number of values for XFS attribute operation stats: %d", l) + } + + return AttributeOperationStats{ + Get: us[0], + Set: us[1], + Remove: us[2], + List: us[3], + }, nil +} + +// InodeClusteringStats builds an InodeClusteringStats from a slice of uint32s. +func inodeClusteringStats(us []uint32) (InodeClusteringStats, error) { + if l := len(us); l != 3 { + return InodeClusteringStats{}, fmt.Errorf("incorrect number of values for XFS inode clustering stats: %d", l) + } + + return InodeClusteringStats{ + Iflush: us[0], + Flush: us[1], + FlushInode: us[2], + }, nil +} + +// VnodeStats builds a VnodeStats from a slice of uint32s. +func vnodeStats(us []uint32) (VnodeStats, error) { + // The attribute "Free" appears to not be available on older XFS + // stats versions. Therefore, 7 or 8 elements may appear in + // this slice. + l := len(us) + if l != 7 && l != 8 { + return VnodeStats{}, fmt.Errorf("incorrect number of values for XFS vnode stats: %d", l) + } + + s := VnodeStats{ + Active: us[0], + Allocate: us[1], + Get: us[2], + Hold: us[3], + Release: us[4], + Reclaim: us[5], + Remove: us[6], + } + + // Skip adding free, unless it is present. The zero value will + // be used in place of an actual count. + if l == 7 { + return s, nil + } + + s.Free = us[7] + return s, nil +} + +// BufferStats builds a BufferStats from a slice of uint32s. +func bufferStats(us []uint32) (BufferStats, error) { + if l := len(us); l != 9 { + return BufferStats{}, fmt.Errorf("incorrect number of values for XFS buffer stats: %d", l) + } + + return BufferStats{ + Get: us[0], + Create: us[1], + GetLocked: us[2], + GetLockedWaited: us[3], + BusyLocked: us[4], + MissLocked: us[5], + PageRetries: us[6], + PageFound: us[7], + GetRead: us[8], + }, nil +} + +// ExtendedPrecisionStats builds an ExtendedPrecisionStats from a slice of uint32s. +func extendedPrecisionStats(us []uint64) (ExtendedPrecisionStats, error) { + if l := len(us); l != 3 { + return ExtendedPrecisionStats{}, fmt.Errorf("incorrect number of values for XFS extended precision stats: %d", l) + } + + return ExtendedPrecisionStats{ + FlushBytes: us[0], + WriteBytes: us[1], + ReadBytes: us[2], + }, nil +} diff --git a/vendor/github.com/prometheus/procfs/xfs/xfs.go b/vendor/github.com/prometheus/procfs/xfs/xfs.go new file mode 100644 index 000000000000..d86794b7ca99 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/xfs/xfs.go @@ -0,0 +1,163 @@ +// Copyright 2017 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package xfs provides access to statistics exposed by the XFS filesystem. +package xfs + +// Stats contains XFS filesystem runtime statistics, parsed from +// /proc/fs/xfs/stat. +// +// The names and meanings of each statistic were taken from +// http://xfs.org/index.php/Runtime_Stats and xfs_stats.h in the Linux +// kernel source. Most counters are uint32s (same data types used in +// xfs_stats.h), but some of the "extended precision stats" are uint64s. +type Stats struct { + // The name of the filesystem used to source these statistics. + // If empty, this indicates aggregated statistics for all XFS + // filesystems on the host. + Name string + + ExtentAllocation ExtentAllocationStats + AllocationBTree BTreeStats + BlockMapping BlockMappingStats + BlockMapBTree BTreeStats + DirectoryOperation DirectoryOperationStats + Transaction TransactionStats + InodeOperation InodeOperationStats + LogOperation LogOperationStats + ReadWrite ReadWriteStats + AttributeOperation AttributeOperationStats + InodeClustering InodeClusteringStats + Vnode VnodeStats + Buffer BufferStats + ExtendedPrecision ExtendedPrecisionStats +} + +// ExtentAllocationStats contains statistics regarding XFS extent allocations. +type ExtentAllocationStats struct { + ExtentsAllocated uint32 + BlocksAllocated uint32 + ExtentsFreed uint32 + BlocksFreed uint32 +} + +// BTreeStats contains statistics regarding an XFS internal B-tree. +type BTreeStats struct { + Lookups uint32 + Compares uint32 + RecordsInserted uint32 + RecordsDeleted uint32 +} + +// BlockMappingStats contains statistics regarding XFS block maps. +type BlockMappingStats struct { + Reads uint32 + Writes uint32 + Unmaps uint32 + ExtentListInsertions uint32 + ExtentListDeletions uint32 + ExtentListLookups uint32 + ExtentListCompares uint32 +} + +// DirectoryOperationStats contains statistics regarding XFS directory entries. +type DirectoryOperationStats struct { + Lookups uint32 + Creates uint32 + Removes uint32 + Getdents uint32 +} + +// TransactionStats contains statistics regarding XFS metadata transactions. +type TransactionStats struct { + Sync uint32 + Async uint32 + Empty uint32 +} + +// InodeOperationStats contains statistics regarding XFS inode operations. +type InodeOperationStats struct { + Attempts uint32 + Found uint32 + Recycle uint32 + Missed uint32 + Duplicate uint32 + Reclaims uint32 + AttributeChange uint32 +} + +// LogOperationStats contains statistics regarding the XFS log buffer. +type LogOperationStats struct { + Writes uint32 + Blocks uint32 + NoInternalBuffers uint32 + Force uint32 + ForceSleep uint32 +} + +// ReadWriteStats contains statistics regarding the number of read and write +// system calls for XFS filesystems. +type ReadWriteStats struct { + Read uint32 + Write uint32 +} + +// AttributeOperationStats contains statistics regarding manipulation of +// XFS extended file attributes. +type AttributeOperationStats struct { + Get uint32 + Set uint32 + Remove uint32 + List uint32 +} + +// InodeClusteringStats contains statistics regarding XFS inode clustering +// operations. +type InodeClusteringStats struct { + Iflush uint32 + Flush uint32 + FlushInode uint32 +} + +// VnodeStats contains statistics regarding XFS vnode operations. +type VnodeStats struct { + Active uint32 + Allocate uint32 + Get uint32 + Hold uint32 + Release uint32 + Reclaim uint32 + Remove uint32 + Free uint32 +} + +// BufferStats contains statistics regarding XFS read/write I/O buffers. +type BufferStats struct { + Get uint32 + Create uint32 + GetLocked uint32 + GetLockedWaited uint32 + BusyLocked uint32 + MissLocked uint32 + PageRetries uint32 + PageFound uint32 + GetRead uint32 +} + +// ExtendedPrecisionStats contains high precision counters used to track the +// total number of bytes read, written, or flushed, during XFS operations. +type ExtendedPrecisionStats struct { + FlushBytes uint64 + WriteBytes uint64 + ReadBytes uint64 +} From 6054ac87c21e06474581b00843725c64d7eaaee0 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Wed, 7 Nov 2018 06:48:53 +0200 Subject: [PATCH 414/447] Remove maxlines option for file logger (#5282) --- modules/log/file.go | 19 +------------------ modules/setting/setting.go | 6 ++---- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/modules/log/file.go b/modules/log/file.go index 18e82f722884..38a28fc651ec 100644 --- a/modules/log/file.go +++ b/modules/log/file.go @@ -8,7 +8,6 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "log" "os" "path/filepath" @@ -25,9 +24,6 @@ type FileLogWriter struct { // The opened file Filename string `json:"filename"` - Maxlines int `json:"maxlines"` - maxlinesCurlines int - // Rotate at size Maxsize int `json:"maxsize"` maxsizeCursize int @@ -69,7 +65,6 @@ func (l *MuxWriter) SetFd(fd *os.File) { func NewFileWriter() LoggerInterface { w := &FileLogWriter{ Filename: "", - Maxlines: 1000000, Maxsize: 1 << 28, //256 MB Daily: true, Maxdays: 7, @@ -87,7 +82,6 @@ func NewFileWriter() LoggerInterface { // config like: // { // "filename":"log/gogs.log", -// "maxlines":10000, // "maxsize":1<<30, // "daily":true, // "maxdays":15, @@ -116,15 +110,13 @@ func (w *FileLogWriter) StartLogger() error { func (w *FileLogWriter) docheck(size int) { w.startLock.Lock() defer w.startLock.Unlock() - if w.Rotate && ((w.Maxlines > 0 && w.maxlinesCurlines >= w.Maxlines) || - (w.Maxsize > 0 && w.maxsizeCursize >= w.Maxsize) || + if w.Rotate && ((w.Maxsize > 0 && w.maxsizeCursize >= w.Maxsize) || (w.Daily && time.Now().Day() != w.dailyOpenDate)) { if err := w.DoRotate(); err != nil { fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) return } } - w.maxlinesCurlines++ w.maxsizeCursize += size } @@ -152,15 +144,6 @@ func (w *FileLogWriter) initFd() error { } w.maxsizeCursize = int(finfo.Size()) w.dailyOpenDate = time.Now().Day() - if finfo.Size() > 0 { - content, err := ioutil.ReadFile(w.Filename) - if err != nil { - return err - } - w.maxlinesCurlines = len(strings.Split(string(content), "\n")) - } else { - w.maxlinesCurlines = 0 - } return nil } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 42ee102e0d75..b31162c140bf 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1342,10 +1342,9 @@ func newLogService() { } LogConfigs[i] = fmt.Sprintf( - `{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, + `{"level":%s,"filename":"%s","rotate":%v,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, logPath, sec.Key("LOG_ROTATE").MustBool(true), - sec.Key("MAX_LINES").MustInt(1000000), 1< Date: Wed, 7 Nov 2018 04:50:40 +0000 Subject: [PATCH 415/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_es-ES.ini | 2 +- options/locale/locale_lv-LV.ini | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini index a4a4bab6fbb4..c646ced17ce9 100644 --- a/options/locale/locale_es-ES.ini +++ b/options/locale/locale_es-ES.ini @@ -456,7 +456,7 @@ issues.next=Página Siguiente issues.open_title=Abierta issues.closed_title=Cerrada issues.num_comments=%d comentarios -issues.commented_at=`comentado %s` +issues.commented_at=`comentado %s` issues.delete_comment_confirm=¿Seguro que deseas eliminar este comentario? issues.no_content=Aún no existe contenido. issues.close_issue=Cerrar diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index dce5ad24dd22..acf7e73b3130 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -229,6 +229,12 @@ twofa_passcode_incorrect=Jūsu kods nav pareizs. Ja esat pazaudējis ierīci, iz twofa_scratch_token_incorrect=Ievadīts nepareizs vienreizējais kods. login_userpass=Pierakstīties login_openid=OpenID +oauth_signup_tab=Reģistrēt jaunu kontu +oauth_signup_title=Pievienot e-pasta adresi un paroli (konta atjaunošanai) +oauth_signup_submit=Pabeigt reģistrāciju +oauth_signin_tab=Savienot ar esošu kontu +oauth_signin_title=Pierakstīties, lai autorizētu saistīto kontu +oauth_signin_submit=Savienot kontu openid_connect_submit=Pievienoties openid_connect_title=Pievienoties jau esošam kontam openid_connect_desc=Izvēlētais OpenID konts sistēmā netika atpazīts, bet Jūs to varat piesaistīt esošam kontam. @@ -319,6 +325,7 @@ starred=Atzīmēti repozitoriji following=Seko follow=Sekot unfollow=Nesekot +heatmap.loading=Ielādē intensitātes karti… form.name_reserved=Lietotājvārdu '%s' nedrīkst izmantot. form.name_pattern_not_allowed=Lietotājvārds '%s' nav atļauts. @@ -585,6 +592,7 @@ file_view_raw=Rādīt neapstrādātu file_permalink=Patstāvīgā saite file_too_large=Šis fails ir par lielu, lai to parādītu. video_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 video. +audio_not_supported_in_browser=Jūsu pārlūks neatbalsta HTML5 audio. stored_lfs=Saglabāts Git LFS commit_graph=Revīziju grafs From 41d70dcfcaab8da6046a2202270c63e93ed6dfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20L=C3=BChne?= Date: Thu, 8 Nov 2018 16:16:07 +0100 Subject: [PATCH 416/447] Fix typo in configuration (#5295) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Patrick Lühne --- custom/conf/app.ini.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 781fe3ca5f7d..f42fa122b817 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -146,7 +146,7 @@ START_SSH_SERVER = false BUILTIN_SSH_SERVER_USER = ; Domain name to be exposed in clone URL SSH_DOMAIN = %(DOMAIN)s -; THe network interface the builtin SSH server should listen on +; The network interface the builtin SSH server should listen on SSH_LISTEN_HOST = ; Port number to be exposed in clone URL SSH_PORT = 22 From df9b85b738e2245846da95c7f6cae9e9dea776b4 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Fri, 9 Nov 2018 00:46:44 +0200 Subject: [PATCH 417/447] Fix U2F if gitea is configured in subpath (#5302) --- public/js/index.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/public/js/index.js b/public/js/index.js index f5d3ef2d93d7..c6531cb2255e 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1530,7 +1530,7 @@ function initU2FAuth() { } u2fApi.ensureSupport() .then(function () { - $.getJSON('/user/u2f/challenge').success(function(req) { + $.getJSON(suburl + '/user/u2f/challenge').success(function(req) { u2fApi.sign(req.appId, req.challenge, req.registeredKeys, 30) .then(u2fSigned) .catch(function (err) { @@ -1543,16 +1543,16 @@ function initU2FAuth() { }); }).catch(function () { // Fallback in case browser do not support U2F - window.location.href = "/user/two_factor" + window.location.href = suburl + "/user/two_factor" }) } function u2fSigned(resp) { $.ajax({ - url:'/user/u2f/sign', - type:"POST", + url: suburl + '/user/u2f/sign', + type: "POST", headers: {"X-Csrf-Token": csrf}, data: JSON.stringify(resp), - contentType:"application/json; charset=utf-8", + contentType: "application/json; charset=utf-8", }).done(function(res){ window.location.replace(res); }).fail(function (xhr, textStatus) { @@ -1565,11 +1565,11 @@ function u2fRegistered(resp) { return; } $.ajax({ - url:'/user/settings/security/u2f/register', - type:"POST", + url: suburl + '/user/settings/security/u2f/register', + type: "POST", headers: {"X-Csrf-Token": csrf}, data: JSON.stringify(resp), - contentType:"application/json; charset=utf-8", + contentType: "application/json; charset=utf-8", success: function(){ window.location.reload(); }, @@ -1623,7 +1623,7 @@ function initU2FRegister() { } function u2fRegisterRequest() { - $.post("/user/settings/security/u2f/request_register", { + $.post(suburl + "/user/settings/security/u2f/request_register", { "_csrf": csrf, "name": $('#nickname').val() }).success(function(req) { From 4f21e0b9658167630143bc587033f00aa7ec42da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Br=C3=B6ms?= <9416498+cez81@users.noreply.github.com> Date: Fri, 9 Nov 2018 00:58:02 +0100 Subject: [PATCH 418/447] Add option to disable automatic mirror syncing. (#5242) Setting the interval to 0 will disable to automatic syncing. --- models/repo_mirror.go | 7 ++++++- options/locale/locale_en-US.ini | 2 +- routers/repo/setting.go | 8 ++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/models/repo_mirror.go b/models/repo_mirror.go index 447d05530774..9f8c9bee659a 100644 --- a/models/repo_mirror.go +++ b/models/repo_mirror.go @@ -63,7 +63,11 @@ func (m *Mirror) AfterLoad(session *xorm.Session) { // ScheduleNextUpdate calculates and sets next update time. func (m *Mirror) ScheduleNextUpdate() { - m.NextUpdateUnix = util.TimeStampNow().AddDuration(m.Interval) + if m.Interval != 0 { + m.NextUpdateUnix = util.TimeStampNow().AddDuration(m.Interval) + } else { + m.NextUpdateUnix = 0 + } } func remoteAddress(repoPath string) (string, error) { @@ -302,6 +306,7 @@ func MirrorUpdate() { if err := x. Where("next_update_unix<=?", time.Now().Unix()). + And("next_update_unix!=0"). Iterate(new(Mirror), func(idx int, bean interface{}) error { m := bean.(*Mirror) if m.Repo == nil { diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 6f323415754b..a82acc3dd10f 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -524,7 +524,7 @@ create_repo = Create Repository default_branch = Default Branch mirror_prune = Prune mirror_prune_desc = Remove obsolete remote-tracking references -mirror_interval = Mirror Interval (valid time units are 'h', 'm', 's') +mirror_interval = Mirror Interval (valid time units are 'h', 'm', 's'). 0 to disable automatic sync. mirror_interval_invalid = The mirror interval is not valid. mirror_address = Clone From URL mirror_address_desc = Include any required authorization credentials in the URL. diff --git a/routers/repo/setting.go b/routers/repo/setting.go index ff6b07f8e0e7..61b00d793bfa 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -117,12 +117,16 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) { } interval, err := time.ParseDuration(form.Interval) - if err != nil || interval < setting.Mirror.MinInterval { + if err != nil && (interval != 0 || interval < setting.Mirror.MinInterval) { ctx.RenderWithErr(ctx.Tr("repo.mirror_interval_invalid"), tplSettingsOptions, &form) } else { ctx.Repo.Mirror.EnablePrune = form.EnablePrune ctx.Repo.Mirror.Interval = interval - ctx.Repo.Mirror.NextUpdateUnix = util.TimeStampNow().AddDuration(interval) + if interval != 0 { + ctx.Repo.Mirror.NextUpdateUnix = util.TimeStampNow().AddDuration(interval) + } else { + ctx.Repo.Mirror.NextUpdateUnix = 0 + } if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil { ctx.RenderWithErr(ctx.Tr("repo.mirror_interval_invalid"), tplSettingsOptions, &form) return From 3197f73fddb438a9bf336876b1e9fc19fc00e4f9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 9 Nov 2018 14:16:52 +0800 Subject: [PATCH 419/447] fix bug when users have serval teams with different units on different repositories (#5307) --- models/org_team.go | 10 ++++++++++ models/repo.go | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/models/org_team.go b/models/org_team.go index 505f11d39df5..ad11431a4954 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -525,6 +525,16 @@ func getUserTeams(e Engine, orgID, userID int64) (teams []*Team, err error) { Find(&teams) } +func getUserRepoTeams(e Engine, orgID, userID, repoID int64) (teams []*Team, err error) { + return teams, e. + Join("INNER", "team_user", "team_user.team_id = team.id"). + Join("INNER", "team_repo", "team_repo.team_id = team.id"). + Where("team.org_id = ?", orgID). + And("team_user.uid=?", userID). + And("team_repo.repo_id=?", repoID). + Find(&teams) +} + // GetUserTeams returns all teams that user belongs to in given organization. func GetUserTeams(orgID, userID int64) ([]*Team, error) { return getUserTeams(x, orgID, userID) diff --git a/models/repo.go b/models/repo.go index 3e1877604606..b7be50e9d17a 100644 --- a/models/repo.go +++ b/models/repo.go @@ -364,7 +364,7 @@ func (repo *Repository) getUnitsByUserID(e Engine, userID int64, isAdmin bool) ( return nil } - teams, err := getUserTeams(e, repo.OwnerID, userID) + teams, err := getUserRepoTeams(e, repo.OwnerID, userID, repo.ID) if err != nil { return err } From 25edcd9bc03b9eab1cc936d720190a1aec265367 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 9 Nov 2018 06:18:32 +0000 Subject: [PATCH 420/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_de-DE.ini | 1 - options/locale/locale_fr-FR.ini | 1 - options/locale/locale_it-IT.ini | 1 - options/locale/locale_ja-JP.ini | 1 - options/locale/locale_lv-LV.ini | 1 - options/locale/locale_pl-PL.ini | 1 - options/locale/locale_pt-BR.ini | 1 - options/locale/locale_ru-RU.ini | 1 - options/locale/locale_sv-SE.ini | 1 - options/locale/locale_uk-UA.ini | 1 - options/locale/locale_zh-CN.ini | 1 - 11 files changed, 11 deletions(-) diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini index 2c9cee227f8f..8e2899443784 100644 --- a/options/locale/locale_de-DE.ini +++ b/options/locale/locale_de-DE.ini @@ -524,7 +524,6 @@ create_repo=Repository erstellen default_branch=Standardbranch mirror_prune=Entfernen mirror_prune_desc=Entferne veraltete remote-tracking Referenzen -mirror_interval=Spiegelintervall (gültige Zeiteinheiten sind „h“, „m“, „s“) mirror_interval_invalid=Das Spiegel-Intervall ist ungültig. mirror_address=Klonen via URL mirror_address_desc=Bitte gib alle benötigten Zugangsdaten in der URL an. diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini index 97e0cf30e4d9..5a614bb1e090 100644 --- a/options/locale/locale_fr-FR.ini +++ b/options/locale/locale_fr-FR.ini @@ -515,7 +515,6 @@ create_repo=Créer un dépôt default_branch=Branche par défaut mirror_prune=Purger mirror_prune_desc=Supprimer les références externes obsolètes -mirror_interval=Intervalle de synchronisation (les unités de temps valides sont "h", "m" et "s") mirror_interval_invalid=L'intervalle de synchronisation est invalide. mirror_address=Cloner depuis une URL mirror_address_desc=Inclure les informations d'authentification requises dans l'URL. diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini index 8b6a0db10f7c..932c404bb45e 100644 --- a/options/locale/locale_it-IT.ini +++ b/options/locale/locale_it-IT.ini @@ -489,7 +489,6 @@ create_repo=Crea Repository default_branch=Ramo (Branch) predefinito mirror_prune=Rimuovi mirror_prune_desc=Rimuovi i riferimenti di puntamento-remoto obsoleti -mirror_interval=Intervallo di aggiornamento dei mirror (le unità di tempo valide sono 'h', 'm', 's') mirror_interval_invalid=L'intervallo di aggiornamento dei mirror non è valido. mirror_address=Clona da URL mirror_address_desc=Includere eventuali credenziali di autorizzazione necessarie nell'URL. diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 2d3c15a9299f..97c8fac1a259 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -524,7 +524,6 @@ create_repo=リポジトリを作成 default_branch=デフォルトブランチ mirror_prune=Prune mirror_prune_desc=不要になった古いリモートトラッキング参照を削除 -mirror_interval=ミラーの間隔 (有効な単位は "h", "m", "s" です) mirror_interval_invalid=ミラーの間隔が不正です。 mirror_address=クローンするURL mirror_address_desc=必要な認証情報はURLに含めてください。 diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini index acf7e73b3130..b720a6c99e39 100644 --- a/options/locale/locale_lv-LV.ini +++ b/options/locale/locale_lv-LV.ini @@ -524,7 +524,6 @@ create_repo=Izveidot repozitoriju default_branch=Noklusējuma atzars mirror_prune=Izmest mirror_prune_desc=Izdzēst visas ārējās atsauces, kas ārējā repozitorijā vairs neeksistē -mirror_interval=Spoguļošanas intervāls (derīgās laika vienības ir "h", "m" un "s") mirror_interval_invalid=Nekorekts spoguļošanas intervāls. mirror_address=Spoguļa adrese mirror_address_desc=Lūdzu iekļaujiet adresē, ja nepieciešams, arī lietotājvārdu un paroli. diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini index 40aca1a70557..34700568309a 100644 --- a/options/locale/locale_pl-PL.ini +++ b/options/locale/locale_pl-PL.ini @@ -510,7 +510,6 @@ create_repo=Utwórz repozytorium default_branch=Domyślna gałąź mirror_prune=Wyczyść mirror_prune_desc=Usuń przestarzałe odwołania do zdalnych śledzeń -mirror_interval=Interwał lustrzanej kopii (poprawne jednostki czasu to "h", "m", "s") mirror_interval_invalid=Interwał lustrzanej kopii jest niepoprawny. mirror_address=Sklonuj z adresu URL mirror_address_desc=Dodaj wymagane poświadczenia do uwierzytelnienia dla tego adresu URL. diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index a3de69906c53..1bdcf44c8497 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -524,7 +524,6 @@ create_repo=Criar repositório default_branch=Branch padrão mirror_prune=Varrer mirror_prune_desc=Remover referências obsoletas de controle remoto -mirror_interval=Intervalo do espelho (unidades de tempo válidas são 'h', 'm', 's') mirror_interval_invalid=O intervalo do espelho não é válido. mirror_address=Clonar de URL mirror_address_desc=Inclua quaisquer credenciais de autorização exigida na URL. diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini index bc7f50c32d81..85008a996b02 100644 --- a/options/locale/locale_ru-RU.ini +++ b/options/locale/locale_ru-RU.ini @@ -517,7 +517,6 @@ create_repo=Создать репозиторий default_branch=Ветка по умолчанию mirror_prune=Очистить mirror_prune_desc=Удаление устаревших отслеживаемых ссылок -mirror_interval=Интервал зеркалирования (допустимы единицы времени 'h', 'm', 's') mirror_interval_invalid=Недопустимый интервал зеркалирования. mirror_address=Клонировать по URL mirror_address_desc=Укажите необходимые учетные данные в адресе. diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini index d142dc98b47b..22221113ba94 100644 --- a/options/locale/locale_sv-SE.ini +++ b/options/locale/locale_sv-SE.ini @@ -506,7 +506,6 @@ create_repo=Skapa utvecklingskatalog default_branch=Standardgren mirror_prune=Rensa mirror_prune_desc=Ta bort förlegade fjärrföljande referenser -mirror_interval=Intervall för spegling (giltiga tidsenheter är 'h', 'm' och 's') mirror_interval_invalid=Speglingsintervallen är inte giltig. mirror_address=Klona Från URL mirror_address_desc=Inkludera eventuella autentiseringsuppgifter som krävs i länken. diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini index cd70136a581d..16571efbf90e 100644 --- a/options/locale/locale_uk-UA.ini +++ b/options/locale/locale_uk-UA.ini @@ -517,7 +517,6 @@ create_repo=Створити репозиторій default_branch=Головна гілка mirror_prune=Очистити mirror_prune_desc=Видалення застарілих посилань які ви відслідковуєте -mirror_interval=Інтервал дзеркалювання (доступні значення 'h', 'm', 's') mirror_interval_invalid=Інтервал дзеркалювання є неприпустимим. mirror_address=Клонування з URL-адреси mirror_address_desc=Включіть необхідні облікові дані в URL-адресу. diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini index d81557d38250..b3ee76634f18 100644 --- a/options/locale/locale_zh-CN.ini +++ b/options/locale/locale_zh-CN.ini @@ -517,7 +517,6 @@ create_repo=创建仓库 default_branch=默认分支 mirror_prune=修剪 mirror_prune_desc=删除过时的远程跟踪引用 -mirror_interval=镜像间隔 (有效的时间单位是 ' h ', 'm', 's') mirror_interval_invalid=镜像间隔无效。 mirror_address=从URL克隆 mirror_address_desc=在 URL 中包含任何必需的授权凭据。 From 9c51b7888ab1a3958468f3ad2390893101a31ff0 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Fri, 9 Nov 2018 14:05:43 +0200 Subject: [PATCH 421/447] Fix file edit change preview functionality (#5300) --- templates/repo/editor/diff_preview.tmpl | 4 +--- templates/repo/editor/edit.tmpl | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/templates/repo/editor/diff_preview.tmpl b/templates/repo/editor/diff_preview.tmpl index 06b4a2e830cc..b663e4e93d5a 100644 --- a/templates/repo/editor/diff_preview.tmpl +++ b/templates/repo/editor/diff_preview.tmpl @@ -3,9 +3,7 @@
- {{with .File}} - {{template "repo/diff/section_unified" .}} - {{end}} + {{template "repo/diff/section_unified" dict "file" .File "root" $}}
diff --git a/templates/repo/editor/edit.tmpl b/templates/repo/editor/edit.tmpl index b08838cac883..82656d65575b 100644 --- a/templates/repo/editor/edit.tmpl +++ b/templates/repo/editor/edit.tmpl @@ -30,7 +30,7 @@ From 0eac73aa87f52f6e19a9d8f0a4dd4a98234962e7 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 9 Nov 2018 12:07:58 +0000 Subject: [PATCH 422/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 35 +++++++++++++++++---------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 1bdcf44c8497..7b5ef59b1f3c 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -45,10 +45,10 @@ u2f_reload=Recarregar repository=Repositório organization=Organização -mirror=Espelho +mirror=Espelhamento new_repo=Novo repositório new_migrate=Nova migração -new_mirror=Novo mirror +new_mirror=Novo espelhamento new_fork=Novo Fork de Repositório new_org=Nova organização manage_org=Gerenciar organizações @@ -61,7 +61,7 @@ your_settings=Configurações all=Todos sources=Fontes -mirrors=Espelhos +mirrors=Espelhamentos collaborative=Coloborativo forks=Forks @@ -174,7 +174,7 @@ my_repos=Repositórios show_more_repos=Mostrar mais repositórios… collaborative_repos=Repositórios colaborativos my_orgs=Minhas organizações -my_mirrors=Meus mirrors +my_mirrors=Meus espelhamentos view_home=Ver %s search_repos=Encontre um repositório… @@ -524,7 +524,8 @@ create_repo=Criar repositório default_branch=Branch padrão mirror_prune=Varrer mirror_prune_desc=Remover referências obsoletas de controle remoto -mirror_interval_invalid=O intervalo do espelho não é válido. +mirror_interval=Intervalo de espelhamento (as unidades de tempo válidas são 'h', 'm', 's'). 0 para desativar a sincronização automática. +mirror_interval_invalid=O intervalo do espelhamento não é válido. mirror_address=Clonar de URL mirror_address_desc=Inclua quaisquer credenciais de autorização exigida na URL. mirror_last_synced=Última sincronização @@ -540,7 +541,7 @@ form.name_pattern_not_allowed=O padrão de '%s' não é permitido em um nome de need_auth=Autorização de clone migrate_type=Tipo de migração -migrate_type_helper=Este repositório será um espelho +migrate_type_helper=Este repositório será um espelhamento migrate_repo=Migrar repositório migrate.clone_address=Migrar / Clonar de URL migrate.clone_address_desc=URL HTTP (S) ou Git 'clone' de um repositório existente @@ -550,7 +551,7 @@ migrate.invalid_local_path=O caminho local é inválido. Ele não existe ou não migrate.failed=Migração falhou: %v migrate.lfs_mirror_unsupported=Espelhamento de objetos Git LFS não é suportado; ao invés use 'git lfs fetch --all' e 'git lfs push --all'. -mirror_from=espelho de +mirror_from=espelhamento de forked_from=feito fork de fork_from_self=Você não pode criar um fork de um repositório que já é seu. copy_link=Copiar @@ -978,9 +979,9 @@ settings.collaboration.undefined=Indefinido settings.hooks=Webhooks settings.githooks=Hooks do Git settings.basic_settings=Configurações básicas -settings.mirror_settings=Opções de mirror +settings.mirror_settings=Opções de espelhamento settings.sync_mirror=Sincronizar agora -settings.mirror_sync_in_progress=Sincronização do espelho está em andamento. Verifique novamente em um minuto. +settings.mirror_sync_in_progress=Sincronização do espelhamento está em andamento. Verifique novamente em um minuto. settings.site=Site settings.update_settings=Atualizar configurações settings.advanced_settings=Configurações avançadas @@ -1014,10 +1015,10 @@ settings.admin_enable_health_check=Habilitar verificações de integridade (git settings.danger_zone=Zona de perigo settings.new_owner_has_same_repo=O novo proprietário já tem um repositório com o mesmo nome. Por favor, escolha outro nome. settings.convert=Converter para repositório tradicional -settings.convert_desc=Você pode converter este espelho em um repositório tradicional. Esta ação não pode ser revertida. -settings.convert_notices_1=Esta operação vai converter este repositório espelho em um repositório tradicional. Esta ação não pode ser desfeita. +settings.convert_desc=Você pode converter este espelhamento em um repositório tradicional. Esta ação não pode ser revertida. +settings.convert_notices_1=Esta operação vai converter este espelhamento em um repositório tradicional. Esta ação não pode ser desfeita. settings.convert_confirm=Converter o repositório -settings.convert_succeed=O espelho foi convertido em um repositório comum. +settings.convert_succeed=O espelhamento foi convertido em um repositório tradicional. settings.transfer=Transferir propriedade settings.transfer_desc=Transferir este repositório para outro usuário ou para uma organização onde você tem direitos de administrador. settings.transfer_notices_1=- Você perderá o acesso ao repositório se transferir para um usuário individual. @@ -1341,7 +1342,7 @@ total=Total: %d dashboard.statistic=Resumo dashboard.operations=Operações de manutenção dashboard.system_status=Status do sistema -dashboard.statistic_info=O banco de dados do Gitea contém %d usuários, %d organizações, %d chaves públicas, %d repositórios, %d observadores, %d favoritos, %d ações, %d acessos, %d questões, %d comentários, %d contas sociais, %d seguidores, %d espelhos, %d versões, %d origens de login, %d Hooks da Web, %d marcos, %d etiquetas, %d tarefas hook, %d equipes, %d tarefas de atualização, %d anexos. +dashboard.statistic_info=O banco de dados do Gitea contém %d usuários, %d organizações, %d chaves públicas, %d repositórios, %d observadores, %d favoritos, %d ações, %d acessos, %d questões, %d comentários, %d contas sociais, %d seguidores, %d espelhamentoss, %d versões, %d origens de login, %d Hooks da Web, %d marcos, %d etiquetas, %d tarefas hook, %d equipes, %d tarefas de atualização, %d anexos. dashboard.operation_name=Nome da operação dashboard.operation_switch=Trocar dashboard.operation_run=Executar @@ -1622,7 +1623,7 @@ config.git_max_diff_line_characters=Máximo de caracteres mostrados no diff (par config.git_max_diff_files=Máximo de arquivos a serem mostrados no diff config.git_gc_args=Argumentos do GC config.git_migrate_timeout=Tempo limite de migração -config.git_mirror_timeout=Tempo limite de atualização de espelho +config.git_mirror_timeout=Tempo limite de atualização de espelhamento config.git_clone_timeout=Tempo limite para operação de clone config.git_pull_timeout=Tempo limite para operação de pull config.git_gc_timeout=Tempo limite para execução do GC @@ -1672,9 +1673,9 @@ push_tag=realizou push da tag %[2]s para %[3]s delete_branch=excluiu branch %[2]s de %[3]s compare_commits=Compare %d commits -mirror_sync_push=commits sincronizados para %[3]s em %[4]s do espelho -mirror_sync_create=nova referência sincronizada %[2]s para %[3]s do espelho -mirror_sync_delete=referência excluída e sincronizada %[2]s em %[3]s do espelho +mirror_sync_push=commits sincronizados para %[3]s em %[4]s do espelhamento +mirror_sync_create=nova referência sincronizada %[2]s para %[3]s do espelhamento +mirror_sync_delete=referência excluída e sincronizada %[2]s em %[3]s do espelhamento [tool] ago=%s atrás From b5c770ffa23d39cb553d427259ea015818637f71 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 11 Nov 2018 03:45:32 +0800 Subject: [PATCH 423/447] Fix create team, update team missing units (#5188) --- Gopkg.lock | 4 +- models/org_team.go | 26 ++++++++++++ models/unit.go | 17 ++++++++ routers/api/v1/convert/convert.go | 1 + routers/api/v1/org/team.go | 27 ++++++++++++ templates/swagger/v1_json.tmpl | 48 ++++++++++++++++++++++ vendor/code.gitea.io/sdk/gitea/org_team.go | 7 ++++ 7 files changed, 128 insertions(+), 2 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 2da402ba741a..1a2b4b5f5bc6 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -11,11 +11,11 @@ [[projects]] branch = "master" - digest = "1:bf4f822f636b99ac7d4f8fa5210a7439bacaf8d1f15d5783956bdd5dd2069bdc" + digest = "1:b194da40b41ae99546dfeec5a85f1fec2a6c51350d438e511ef90f4293c6dcd7" name = "code.gitea.io/sdk" packages = ["gitea"] pruneopts = "NUT" - revision = "11c860c8e49a23be26e6d6c6a039a46ad2ae1d27" + revision = "4f96d9ac89886e78c50de8c835ebe87461578a5e" [[projects]] digest = "1:3fcef06a1a6561955c94af6c7757a6fa37605eb653f0d06ab960e5bb80092195" diff --git a/models/org_team.go b/models/org_team.go index ad11431a4954..53c1ec34d8bd 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -40,6 +40,14 @@ func (t *Team) getUnits(e Engine) (err error) { return err } +// GetUnitNames returns the team units names +func (t *Team) GetUnitNames() (res []string) { + for _, u := range t.Units { + res = append(res, Units[u.Type].NameKey) + } + return +} + // HasWriteAccess returns true if team has at least write level access mode. func (t *Team) HasWriteAccess() bool { return t.Authorize >= AccessModeWrite @@ -367,6 +375,24 @@ func UpdateTeam(t *Team, authChanged bool) (err error) { return fmt.Errorf("update: %v", err) } + // update units for team + if len(t.Units) > 0 { + for _, unit := range t.Units { + unit.TeamID = t.ID + } + // Delete team-unit. + if _, err := sess. + Where("team_id=?", t.ID). + Delete(new(TeamUnit)); err != nil { + return err + } + + if _, err = sess.Insert(&t.Units); err != nil { + sess.Rollback() + return err + } + } + // Update access for team members if needed. if authChanged { if err = t.getRepositories(sess); err != nil { diff --git a/models/unit.go b/models/unit.go index 1d263595280e..9619232cf4c1 100644 --- a/models/unit.go +++ b/models/unit.go @@ -4,6 +4,10 @@ package models +import ( + "strings" +) + // UnitType is Unit's Type type UnitType int @@ -137,3 +141,16 @@ var ( UnitTypeExternalWiki: UnitExternalWiki, } ) + +// FindUnitTypes give the unit key name and return unit +func FindUnitTypes(nameKeys ...string) (res []UnitType) { + for _, key := range nameKeys { + for t, u := range Units { + if strings.EqualFold(key, u.NameKey) { + res = append(res, t) + break + } + } + } + return +} diff --git a/routers/api/v1/convert/convert.go b/routers/api/v1/convert/convert.go index 1bfeae34bfe3..35416dea5181 100644 --- a/routers/api/v1/convert/convert.go +++ b/routers/api/v1/convert/convert.go @@ -198,5 +198,6 @@ func ToTeam(team *models.Team) *api.Team { Name: team.Name, Description: team.Description, Permission: team.Authorize.String(), + Units: team.GetUnitNames(), } } diff --git a/routers/api/v1/org/team.go b/routers/api/v1/org/team.go index 2e319a18310c..8b67eda42fdf 100644 --- a/routers/api/v1/org/team.go +++ b/routers/api/v1/org/team.go @@ -90,6 +90,20 @@ func CreateTeam(ctx *context.APIContext, form api.CreateTeamOption) { Description: form.Description, Authorize: models.ParseAccessMode(form.Permission), } + + unitTypes := models.FindUnitTypes(form.Units...) + + if team.Authorize < models.AccessModeOwner { + var units = make([]*models.TeamUnit, 0, len(form.Units)) + for _, tp := range unitTypes { + units = append(units, &models.TeamUnit{ + OrgID: ctx.Org.Organization.ID, + Type: tp, + }) + } + team.Units = units + } + if err := models.NewTeam(team); err != nil { if models.IsErrTeamAlreadyExist(err) { ctx.Error(422, "", err) @@ -128,6 +142,19 @@ func EditTeam(ctx *context.APIContext, form api.EditTeamOption) { team.Name = form.Name team.Description = form.Description team.Authorize = models.ParseAccessMode(form.Permission) + unitTypes := models.FindUnitTypes(form.Units...) + + if team.Authorize < models.AccessModeOwner { + var units = make([]*models.TeamUnit, 0, len(form.Units)) + for _, tp := range unitTypes { + units = append(units, &models.TeamUnit{ + OrgID: ctx.Org.Organization.ID, + Type: tp, + }) + } + team.Units = units + } + if err := models.UpdateTeam(team, true); err != nil { ctx.Error(500, "EditTeam", err) return diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 56a169c295d5..5c8c666041f5 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -6322,6 +6322,22 @@ "admin" ], "x-go-name": "Permission" + }, + "units": { + "type": "array", + "enum": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.ext_wiki" + ], + "items": { + "type": "string" + }, + "x-go-name": "Units" } }, "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" @@ -6697,6 +6713,22 @@ "admin" ], "x-go-name": "Permission" + }, + "units": { + "type": "array", + "enum": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.ext_wiki" + ], + "items": { + "type": "string" + }, + "x-go-name": "Units" } }, "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" @@ -7744,6 +7776,22 @@ "owner" ], "x-go-name": "Permission" + }, + "units": { + "type": "array", + "enum": [ + "repo.code", + "repo.issues", + "repo.ext_issues", + "repo.wiki", + "repo.pulls", + "repo.releases", + "repo.ext_wiki" + ], + "items": { + "type": "string" + }, + "x-go-name": "Units" } }, "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" diff --git a/vendor/code.gitea.io/sdk/gitea/org_team.go b/vendor/code.gitea.io/sdk/gitea/org_team.go index 2fc6796d43ff..f3e98b932e91 100644 --- a/vendor/code.gitea.io/sdk/gitea/org_team.go +++ b/vendor/code.gitea.io/sdk/gitea/org_team.go @@ -1,4 +1,5 @@ // Copyright 2016 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -11,6 +12,8 @@ type Team struct { Description string `json:"description"` // enum: none,read,write,admin,owner Permission string `json:"permission"` + // enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki + Units []string `json:"units"` } // CreateTeamOption options for creating a team @@ -20,6 +23,8 @@ type CreateTeamOption struct { Description string `json:"description" binding:"MaxSize(255)"` // enum: read,write,admin Permission string `json:"permission"` + // enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki + Units []string `json:"units"` } // EditTeamOption options for editing a team @@ -29,4 +34,6 @@ type EditTeamOption struct { Description string `json:"description" binding:"MaxSize(255)"` // enum: read,write,admin Permission string `json:"permission"` + // enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki + Units []string `json:"units"` } From 0bd5f6f51c3b2e168ecd80247b59a42f9dfa8b74 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Sun, 11 Nov 2018 00:55:36 +0100 Subject: [PATCH 424/447] Remove x/net/context vendor by using std package (#5202) * Update dep github.com/markbates/goth * Update dep github.com/blevesearch/bleve * Update dep golang.org/x/oauth2 * Fix github.com/blevesearch/bleve to c74e08f039e56cef576e4336382b2a2d12d9e026 * Update dep golang.org/x/oauth2 --- Gopkg.lock | 18 +- Gopkg.toml | 10 +- vendor/github.com/blevesearch/bleve/index.go | 3 +- .../bleve/index/scorch/introducer.go | 79 ++- .../blevesearch/bleve/index/scorch/merge.go | 199 ++++++-- .../index/scorch/mergeplan/merge_plan.go | 4 +- .../bleve/index/scorch/persister.go | 242 +++++++-- .../blevesearch/bleve/index/scorch/scorch.go | 46 +- .../bleve/index/scorch/segment/mem/build.go | 15 + .../bleve/index/scorch/segment/mem/dict.go | 9 +- .../bleve/index/scorch/segment/zap/build.go | 123 +++-- .../index/scorch/segment/zap/contentcoder.go | 12 +- .../bleve/index/scorch/segment/zap/dict.go | 49 +- .../index/scorch/segment/zap/docvalues.go | 18 +- .../index/scorch/segment/zap/enumerator.go | 124 +++++ .../index/scorch/segment/zap/intcoder.go | 37 +- .../bleve/index/scorch/segment/zap/merge.go | 463 +++++++++++------- .../bleve/index/scorch/segment/zap/posting.go | 14 +- .../bleve/index/scorch/segment/zap/read.go | 28 +- .../bleve/index/scorch/segment/zap/segment.go | 3 +- .../bleve/index/scorch/snapshot_rollback.go | 20 +- .../bleve/index/upsidedown/upsidedown.go | 11 +- .../blevesearch/bleve/index_alias_impl.go | 3 +- .../blevesearch/bleve/index_impl.go | 3 +- .../blevesearch/bleve/search/collector.go | 3 +- .../bleve/search/collector/topn.go | 2 +- vendor/github.com/markbates/goth/provider.go | 2 +- .../goth/providers/facebook/facebook.go | 53 +- .../x/net/context/ctxhttp/ctxhttp.go | 74 +++ .../x/net/context/ctxhttp/ctxhttp_pre17.go | 147 ++++++ vendor/golang.org/x/oauth2/LICENSE | 2 +- .../golang.org/x/oauth2/client_appengine.go | 25 - .../x/oauth2/internal/client_appengine.go | 13 + vendor/golang.org/x/oauth2/internal/doc.go | 6 + vendor/golang.org/x/oauth2/internal/oauth2.go | 41 +- vendor/golang.org/x/oauth2/internal/token.go | 75 ++- .../golang.org/x/oauth2/internal/transport.go | 50 +- vendor/golang.org/x/oauth2/oauth2.go | 65 ++- vendor/golang.org/x/oauth2/token.go | 23 +- vendor/golang.org/x/oauth2/transport.go | 16 +- 40 files changed, 1489 insertions(+), 641 deletions(-) create mode 100644 vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/enumerator.go create mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go create mode 100644 vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go delete mode 100644 vendor/golang.org/x/oauth2/client_appengine.go create mode 100644 vendor/golang.org/x/oauth2/internal/client_appengine.go create mode 100644 vendor/golang.org/x/oauth2/internal/doc.go diff --git a/Gopkg.lock b/Gopkg.lock index 1a2b4b5f5bc6..cbc089fead46 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -90,7 +90,7 @@ revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] - digest = "1:67351095005f164e748a5a21899d1403b03878cb2d40a7b0f742376e6eeda974" + digest = "1:c10f35be6200b09e26da267ca80f837315093ecaba27e7a223071380efb9dd32" name = "github.com/blevesearch/bleve" packages = [ ".", @@ -135,7 +135,7 @@ "search/searcher", ] pruneopts = "NUT" - revision = "ff210fbc6d348ad67aa5754eaea11a463fcddafd" + revision = "c74e08f039e56cef576e4336382b2a2d12d9e026" [[projects]] branch = "master" @@ -557,7 +557,7 @@ revision = "e3534c89ef969912856dfa39e56b09e58c5f5daf" [[projects]] - digest = "1:23f75ae90fcc38dac6fad6881006ea7d0f2c78db5f9f81f3df558dc91460e61f" + digest = "1:4b992ec853d0ea9bac3dcf09a64af61de1a392e6cb0eef2204c0c92f4ae6b911" name = "github.com/markbates/goth" packages = [ ".", @@ -572,8 +572,8 @@ "providers/twitter", ] pruneopts = "NUT" - revision = "f9c6649ab984d6ea71ef1e13b7b1cdffcf4592d3" - version = "v1.46.1" + revision = "bc6d8ddf751a745f37ca5567dbbfc4157bbf5da9" + version = "v1.47.2" [[projects]] digest = "1:c9724c929d27a14475a45b17a267dbc60671c0bc2c5c05ed21f011f7b5bc9fb5" @@ -809,10 +809,11 @@ [[projects]] branch = "master" - digest = "1:6d5ed712653ea5321fe3e3475ab2188cf362a4e0d31e9fd3acbd4dfbbca0d680" + digest = "1:d0a0bdd2b64d981aa4e6a1ade90431d042cd7fa31b584e33d45e62cbfec43380" name = "golang.org/x/net" packages = [ "context", + "context/ctxhttp", "html", "html/atom", "html/charset", @@ -821,14 +822,15 @@ revision = "9b4f9f5ad5197c79fd623a3638e70d8b26cef344" [[projects]] - digest = "1:8159a9cda4b8810aaaeb0d60e2fa68e2fd86d8af4ec8f5059830839e3c8d93d5" + branch = "master" + digest = "1:274a6321a5a9f185eeb3fab5d7d8397e0e9f57737490d749f562c7e205ffbc2e" name = "golang.org/x/oauth2" packages = [ ".", "internal", ] pruneopts = "NUT" - revision = "c10ba270aa0bf8b8c1c986e103859c67a9103061" + revision = "c453e0c757598fd055e170a3a359263c91e13153" [[projects]] digest = "1:9f303486d623f840492bfeb48eb906a94e9d3fe638a761639b72ce64bf7bfcc3" diff --git a/Gopkg.toml b/Gopkg.toml index 6338263bcc5a..2633d8b1dd1c 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -14,6 +14,12 @@ ignored = ["google.golang.org/appengine*"] branch = "master" name = "code.gitea.io/sdk" +[[constraint]] +# branch = "master" + revision = "c74e08f039e56cef576e4336382b2a2d12d9e026" + name = "github.com/blevesearch/bleve" +#Not targetting v0.7.0 since standard where use only just after this tag + [[constraint]] revision = "12dd70caea0268ac0d6c2707d0611ef601e7c64e" name = "golang.org/x/crypto" @@ -61,7 +67,7 @@ ignored = ["google.golang.org/appengine*"] [[constraint]] name = "github.com/markbates/goth" - version = "1.46.1" + version = "1.47.2" [[constraint]] branch = "master" @@ -105,7 +111,7 @@ ignored = ["google.golang.org/appengine*"] source = "github.com/go-gitea/bolt" [[override]] - revision = "c10ba270aa0bf8b8c1c986e103859c67a9103061" + branch = "master" name = "golang.org/x/oauth2" [[constraint]] diff --git a/vendor/github.com/blevesearch/bleve/index.go b/vendor/github.com/blevesearch/bleve/index.go index e85652d967e2..ea7b3832ac78 100644 --- a/vendor/github.com/blevesearch/bleve/index.go +++ b/vendor/github.com/blevesearch/bleve/index.go @@ -15,11 +15,12 @@ package bleve import ( + "context" + "github.com/blevesearch/bleve/document" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/index/store" "github.com/blevesearch/bleve/mapping" - "golang.org/x/net/context" ) // A Batch groups together multiple Index and Delete diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/introducer.go b/vendor/github.com/blevesearch/bleve/index/scorch/introducer.go index 4499fa41bd42..1a7d656ca7b2 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/introducer.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/introducer.go @@ -100,8 +100,8 @@ func (s *Scorch) introduceSegment(next *segmentIntroduction) error { // prepare new index snapshot newSnapshot := &IndexSnapshot{ parent: s, - segment: make([]*SegmentSnapshot, nsegs, nsegs+1), - offsets: make([]uint64, nsegs, nsegs+1), + segment: make([]*SegmentSnapshot, 0, nsegs+1), + offsets: make([]uint64, 0, nsegs+1), internal: make(map[string][]byte, len(s.root.internal)), epoch: s.nextSnapshotEpoch, refs: 1, @@ -124,24 +124,29 @@ func (s *Scorch) introduceSegment(next *segmentIntroduction) error { return err } } - newSnapshot.segment[i] = &SegmentSnapshot{ + + newss := &SegmentSnapshot{ id: s.root.segment[i].id, segment: s.root.segment[i].segment, cachedDocs: s.root.segment[i].cachedDocs, } - s.root.segment[i].segment.AddRef() // apply new obsoletions if s.root.segment[i].deleted == nil { - newSnapshot.segment[i].deleted = delta + newss.deleted = delta } else { - newSnapshot.segment[i].deleted = roaring.Or(s.root.segment[i].deleted, delta) + newss.deleted = roaring.Or(s.root.segment[i].deleted, delta) } - newSnapshot.offsets[i] = running - running += s.root.segment[i].Count() - + // check for live size before copying + if newss.LiveSize() > 0 { + newSnapshot.segment = append(newSnapshot.segment, newss) + s.root.segment[i].segment.AddRef() + newSnapshot.offsets = append(newSnapshot.offsets, running) + running += s.root.segment[i].Count() + } } + // append new segment, if any, to end of the new index snapshot if next.data != nil { newSegmentSnapshot := &SegmentSnapshot{ @@ -193,6 +198,12 @@ func (s *Scorch) introduceMerge(nextMerge *segmentMerge) { // prepare new index snapshot currSize := len(s.root.segment) newSize := currSize + 1 - len(nextMerge.old) + + // empty segments deletion + if nextMerge.new == nil { + newSize-- + } + newSnapshot := &IndexSnapshot{ parent: s, segment: make([]*SegmentSnapshot, 0, newSize), @@ -210,7 +221,7 @@ func (s *Scorch) introduceMerge(nextMerge *segmentMerge) { segmentID := s.root.segment[i].id if segSnapAtMerge, ok := nextMerge.old[segmentID]; ok { // this segment is going away, see if anything else was deleted since we started the merge - if s.root.segment[i].deleted != nil { + if segSnapAtMerge != nil && s.root.segment[i].deleted != nil { // assume all these deletes are new deletedSince := s.root.segment[i].deleted // if we already knew about some of them, remove @@ -224,7 +235,13 @@ func (s *Scorch) introduceMerge(nextMerge *segmentMerge) { newSegmentDeleted.Add(uint32(newDocNum)) } } - } else { + // clean up the old segment map to figure out the + // obsolete segments wrt root in meantime, whatever + // segments left behind in old map after processing + // the root segments would be the obsolete segment set + delete(nextMerge.old, segmentID) + + } else if s.root.segment[i].LiveSize() > 0 { // this segment is staying newSnapshot.segment = append(newSnapshot.segment, &SegmentSnapshot{ id: s.root.segment[i].id, @@ -238,14 +255,35 @@ func (s *Scorch) introduceMerge(nextMerge *segmentMerge) { } } - // put new segment at end - newSnapshot.segment = append(newSnapshot.segment, &SegmentSnapshot{ - id: nextMerge.id, - segment: nextMerge.new, // take ownership for nextMerge.new's ref-count - deleted: newSegmentDeleted, - cachedDocs: &cachedDocs{cache: nil}, - }) - newSnapshot.offsets = append(newSnapshot.offsets, running) + // before the newMerge introduction, need to clean the newly + // merged segment wrt the current root segments, hence + // applying the obsolete segment contents to newly merged segment + for segID, ss := range nextMerge.old { + obsoleted := ss.DocNumbersLive() + if obsoleted != nil { + obsoletedIter := obsoleted.Iterator() + for obsoletedIter.HasNext() { + oldDocNum := obsoletedIter.Next() + newDocNum := nextMerge.oldNewDocNums[segID][oldDocNum] + newSegmentDeleted.Add(uint32(newDocNum)) + } + } + } + // In case where all the docs in the newly merged segment getting + // deleted by the time we reach here, can skip the introduction. + if nextMerge.new != nil && + nextMerge.new.Count() > newSegmentDeleted.GetCardinality() { + // put new segment at end + newSnapshot.segment = append(newSnapshot.segment, &SegmentSnapshot{ + id: nextMerge.id, + segment: nextMerge.new, // take ownership for nextMerge.new's ref-count + deleted: newSegmentDeleted, + cachedDocs: &cachedDocs{cache: nil}, + }) + newSnapshot.offsets = append(newSnapshot.offsets, running) + } + + newSnapshot.AddRef() // 1 ref for the nextMerge.notify response // swap in new segment rootPrev := s.root @@ -257,7 +295,8 @@ func (s *Scorch) introduceMerge(nextMerge *segmentMerge) { _ = rootPrev.DecRef() } - // notify merger we incorporated this + // notify requester that we incorporated this + nextMerge.notify <- newSnapshot close(nextMerge.notify) } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/merge.go b/vendor/github.com/blevesearch/bleve/index/scorch/merge.go index 5ded29b5a367..ad756588a620 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/merge.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/merge.go @@ -15,6 +15,9 @@ package scorch import ( + "bytes" + "encoding/json" + "fmt" "os" "sync/atomic" @@ -28,6 +31,13 @@ import ( func (s *Scorch) mergerLoop() { var lastEpochMergePlanned uint64 + mergePlannerOptions, err := s.parseMergePlannerOptions() + if err != nil { + s.fireAsyncError(fmt.Errorf("mergePlannerOption json parsing err: %v", err)) + s.asyncTasks.Done() + return + } + OUTER: for { select { @@ -45,7 +55,7 @@ OUTER: startTime := time.Now() // lets get started - err := s.planMergeAtSnapshot(ourSnapshot) + err := s.planMergeAtSnapshot(ourSnapshot, mergePlannerOptions) if err != nil { s.fireAsyncError(fmt.Errorf("merging err: %v", err)) _ = ourSnapshot.DecRef() @@ -58,51 +68,49 @@ OUTER: _ = ourSnapshot.DecRef() // tell the persister we're waiting for changes - // first make a notification chan - notifyUs := make(notificationChan) + // first make a epochWatcher chan + ew := &epochWatcher{ + epoch: lastEpochMergePlanned, + notifyCh: make(notificationChan, 1), + } // give it to the persister select { case <-s.closeCh: break OUTER - case s.persisterNotifier <- notifyUs: - } - - // check again - s.rootLock.RLock() - ourSnapshot = s.root - ourSnapshot.AddRef() - s.rootLock.RUnlock() - - if ourSnapshot.epoch != lastEpochMergePlanned { - startTime := time.Now() - - // lets get started - err := s.planMergeAtSnapshot(ourSnapshot) - if err != nil { - s.fireAsyncError(fmt.Errorf("merging err: %v", err)) - _ = ourSnapshot.DecRef() - continue OUTER - } - lastEpochMergePlanned = ourSnapshot.epoch - - s.fireEvent(EventKindMergerProgress, time.Since(startTime)) + case s.persisterNotifier <- ew: } - _ = ourSnapshot.DecRef() - // now wait for it (but also detect close) + // now wait for persister (but also detect close) select { case <-s.closeCh: break OUTER - case <-notifyUs: - // woken up, next loop should pick up work + case <-ew.notifyCh: } } } s.asyncTasks.Done() } -func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot) error { +func (s *Scorch) parseMergePlannerOptions() (*mergeplan.MergePlanOptions, + error) { + mergePlannerOptions := mergeplan.DefaultMergePlanOptions + if v, ok := s.config["scorchMergePlanOptions"]; ok { + b, err := json.Marshal(v) + if err != nil { + return &mergePlannerOptions, err + } + + err = json.Unmarshal(b, &mergePlannerOptions) + if err != nil { + return &mergePlannerOptions, err + } + } + return &mergePlannerOptions, nil +} + +func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot, + options *mergeplan.MergePlanOptions) error { // build list of zap segments in this snapshot var onlyZapSnapshots []mergeplan.Segment for _, segmentSnapshot := range ourSnapshot.segment { @@ -112,7 +120,7 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot) error { } // give this list to the planner - resultMergePlan, err := mergeplan.Plan(onlyZapSnapshots, nil) + resultMergePlan, err := mergeplan.Plan(onlyZapSnapshots, options) if err != nil { return fmt.Errorf("merge planning err: %v", err) } @@ -122,8 +130,12 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot) error { } // process tasks in serial for now - var notifications []notificationChan + var notifications []chan *IndexSnapshot for _, task := range resultMergePlan.Tasks { + if len(task.Segments) == 0 { + continue + } + oldMap := make(map[uint64]*SegmentSnapshot) newSegmentID := atomic.AddUint64(&s.nextSegmentID, 1) segmentsToMerge := make([]*zap.Segment, 0, len(task.Segments)) @@ -132,40 +144,51 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot) error { if segSnapshot, ok := planSegment.(*SegmentSnapshot); ok { oldMap[segSnapshot.id] = segSnapshot if zapSeg, ok := segSnapshot.segment.(*zap.Segment); ok { - segmentsToMerge = append(segmentsToMerge, zapSeg) - docsToDrop = append(docsToDrop, segSnapshot.deleted) + if segSnapshot.LiveSize() == 0 { + oldMap[segSnapshot.id] = nil + } else { + segmentsToMerge = append(segmentsToMerge, zapSeg) + docsToDrop = append(docsToDrop, segSnapshot.deleted) + } } } } - filename := zapFileName(newSegmentID) - s.markIneligibleForRemoval(filename) - path := s.path + string(os.PathSeparator) + filename - newDocNums, err := zap.Merge(segmentsToMerge, docsToDrop, path, DefaultChunkFactor) - if err != nil { - s.unmarkIneligibleForRemoval(filename) - return fmt.Errorf("merging failed: %v", err) - } - segment, err := zap.Open(path) - if err != nil { - s.unmarkIneligibleForRemoval(filename) - return err + var oldNewDocNums map[uint64][]uint64 + var segment segment.Segment + if len(segmentsToMerge) > 0 { + filename := zapFileName(newSegmentID) + s.markIneligibleForRemoval(filename) + path := s.path + string(os.PathSeparator) + filename + newDocNums, err := zap.Merge(segmentsToMerge, docsToDrop, path, 1024) + if err != nil { + s.unmarkIneligibleForRemoval(filename) + return fmt.Errorf("merging failed: %v", err) + } + segment, err = zap.Open(path) + if err != nil { + s.unmarkIneligibleForRemoval(filename) + return err + } + oldNewDocNums = make(map[uint64][]uint64) + for i, segNewDocNums := range newDocNums { + oldNewDocNums[task.Segments[i].Id()] = segNewDocNums + } } + sm := &segmentMerge{ id: newSegmentID, old: oldMap, - oldNewDocNums: make(map[uint64][]uint64), + oldNewDocNums: oldNewDocNums, new: segment, - notify: make(notificationChan), + notify: make(chan *IndexSnapshot, 1), } notifications = append(notifications, sm.notify) - for i, segNewDocNums := range newDocNums { - sm.oldNewDocNums[task.Segments[i].Id()] = segNewDocNums - } // give it to the introducer select { case <-s.closeCh: + _ = segment.Close() return nil case s.merges <- sm: } @@ -174,7 +197,10 @@ func (s *Scorch) planMergeAtSnapshot(ourSnapshot *IndexSnapshot) error { select { case <-s.closeCh: return nil - case <-notification: + case newSnapshot := <-notification: + if newSnapshot != nil { + _ = newSnapshot.DecRef() + } } } return nil @@ -185,5 +211,72 @@ type segmentMerge struct { old map[uint64]*SegmentSnapshot oldNewDocNums map[uint64][]uint64 new segment.Segment - notify notificationChan + notify chan *IndexSnapshot +} + +// perform a merging of the given SegmentBase instances into a new, +// persisted segment, and synchronously introduce that new segment +// into the root +func (s *Scorch) mergeSegmentBases(snapshot *IndexSnapshot, + sbs []*zap.SegmentBase, sbsDrops []*roaring.Bitmap, sbsIndexes []int, + chunkFactor uint32) (uint64, *IndexSnapshot, uint64, error) { + var br bytes.Buffer + + cr := zap.NewCountHashWriter(&br) + + newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, + docValueOffset, dictLocs, fieldsInv, fieldsMap, err := + zap.MergeToWriter(sbs, sbsDrops, chunkFactor, cr) + if err != nil { + return 0, nil, 0, err + } + + sb, err := zap.InitSegmentBase(br.Bytes(), cr.Sum32(), chunkFactor, + fieldsMap, fieldsInv, numDocs, storedIndexOffset, fieldsIndexOffset, + docValueOffset, dictLocs) + if err != nil { + return 0, nil, 0, err + } + + newSegmentID := atomic.AddUint64(&s.nextSegmentID, 1) + + filename := zapFileName(newSegmentID) + path := s.path + string(os.PathSeparator) + filename + err = zap.PersistSegmentBase(sb, path) + if err != nil { + return 0, nil, 0, err + } + + segment, err := zap.Open(path) + if err != nil { + return 0, nil, 0, err + } + + sm := &segmentMerge{ + id: newSegmentID, + old: make(map[uint64]*SegmentSnapshot), + oldNewDocNums: make(map[uint64][]uint64), + new: segment, + notify: make(chan *IndexSnapshot, 1), + } + + for i, idx := range sbsIndexes { + ss := snapshot.segment[idx] + sm.old[ss.id] = ss + sm.oldNewDocNums[ss.id] = newDocNums[i] + } + + select { // send to introducer + case <-s.closeCh: + _ = segment.DecRef() + return 0, nil, 0, nil // TODO: return ErrInterruptedClosed? + case s.merges <- sm: + } + + select { // wait for introduction to complete + case <-s.closeCh: + return 0, nil, 0, nil // TODO: return ErrInterruptedClosed? + case newSnapshot := <-sm.notify: + return numDocs, newSnapshot, newSegmentID, nil + } } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/mergeplan/merge_plan.go b/vendor/github.com/blevesearch/bleve/index/scorch/mergeplan/merge_plan.go index 0afc3ce5c673..62f643f431f8 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/mergeplan/merge_plan.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/mergeplan/merge_plan.go @@ -186,13 +186,13 @@ func plan(segmentsIn []Segment, o *MergePlanOptions) (*MergePlan, error) { // While we’re over budget, keep looping, which might produce // another MergeTask. - for len(eligibles) > budgetNumSegments { + for len(eligibles) > 0 && (len(eligibles)+len(rv.Tasks)) > budgetNumSegments { // Track a current best roster as we examine and score // potential rosters of merges. var bestRoster []Segment var bestRosterScore float64 // Lower score is better. - for startIdx := 0; startIdx < len(eligibles)-o.SegmentsPerMergeTask; startIdx++ { + for startIdx := 0; startIdx < len(eligibles); startIdx++ { var roster []Segment var rosterLiveSize int64 diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/persister.go b/vendor/github.com/blevesearch/bleve/index/scorch/persister.go index cdcee37c2ef6..c21bb1439450 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/persister.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/persister.go @@ -34,22 +34,39 @@ import ( var DefaultChunkFactor uint32 = 1024 +// Arbitrary number, need to make it configurable. +// Lower values like 10/making persister really slow +// doesn't work well as it is creating more files to +// persist for in next persist iteration and spikes the # FDs. +// Ideal value should let persister also proceed at +// an optimum pace so that the merger can skip +// many intermediate snapshots. +// This needs to be based on empirical data. +// TODO - may need to revisit this approach/value. +var epochDistance = uint64(5) + type notificationChan chan struct{} func (s *Scorch) persisterLoop() { defer s.asyncTasks.Done() - var notifyChs []notificationChan - var lastPersistedEpoch uint64 + var persistWatchers []*epochWatcher + var lastPersistedEpoch, lastMergedEpoch uint64 + var ew *epochWatcher OUTER: for { select { case <-s.closeCh: break OUTER - case notifyCh := <-s.persisterNotifier: - notifyChs = append(notifyChs, notifyCh) + case ew = <-s.persisterNotifier: + persistWatchers = append(persistWatchers, ew) default: } + if ew != nil && ew.epoch > lastMergedEpoch { + lastMergedEpoch = ew.epoch + } + persistWatchers = s.pausePersisterForMergerCatchUp(lastPersistedEpoch, + &lastMergedEpoch, persistWatchers) var ourSnapshot *IndexSnapshot var ourPersisted []chan error @@ -81,10 +98,11 @@ OUTER: } lastPersistedEpoch = ourSnapshot.epoch - for _, notifyCh := range notifyChs { - close(notifyCh) + for _, ew := range persistWatchers { + close(ew.notifyCh) } - notifyChs = nil + + persistWatchers = nil _ = ourSnapshot.DecRef() changed := false @@ -120,27 +138,155 @@ OUTER: break OUTER case <-w.notifyCh: // woken up, next loop should pick up work + continue OUTER + case ew = <-s.persisterNotifier: + // if the watchers are already caught up then let them wait, + // else let them continue to do the catch up + persistWatchers = append(persistWatchers, ew) + } + } +} + +func notifyMergeWatchers(lastPersistedEpoch uint64, + persistWatchers []*epochWatcher) []*epochWatcher { + var watchersNext []*epochWatcher + for _, w := range persistWatchers { + if w.epoch < lastPersistedEpoch { + close(w.notifyCh) + } else { + watchersNext = append(watchersNext, w) } } + return watchersNext +} + +func (s *Scorch) pausePersisterForMergerCatchUp(lastPersistedEpoch uint64, lastMergedEpoch *uint64, + persistWatchers []*epochWatcher) []*epochWatcher { + + // first, let the watchers proceed if they lag behind + persistWatchers = notifyMergeWatchers(lastPersistedEpoch, persistWatchers) + +OUTER: + // check for slow merger and await until the merger catch up + for lastPersistedEpoch > *lastMergedEpoch+epochDistance { + + select { + case <-s.closeCh: + break OUTER + case ew := <-s.persisterNotifier: + persistWatchers = append(persistWatchers, ew) + *lastMergedEpoch = ew.epoch + } + + // let the watchers proceed if they lag behind + persistWatchers = notifyMergeWatchers(lastPersistedEpoch, persistWatchers) + } + + return persistWatchers } func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { - // start a write transaction - tx, err := s.rootBolt.Begin(true) + persisted, err := s.persistSnapshotMaybeMerge(snapshot) if err != nil { return err } - // defer fsync of the rootbolt - defer func() { - if err == nil { - err = s.rootBolt.Sync() + if persisted { + return nil + } + + return s.persistSnapshotDirect(snapshot) +} + +// DefaultMinSegmentsForInMemoryMerge represents the default number of +// in-memory zap segments that persistSnapshotMaybeMerge() needs to +// see in an IndexSnapshot before it decides to merge and persist +// those segments +var DefaultMinSegmentsForInMemoryMerge = 2 + +// persistSnapshotMaybeMerge examines the snapshot and might merge and +// persist the in-memory zap segments if there are enough of them +func (s *Scorch) persistSnapshotMaybeMerge(snapshot *IndexSnapshot) ( + bool, error) { + // collect the in-memory zap segments (SegmentBase instances) + var sbs []*zap.SegmentBase + var sbsDrops []*roaring.Bitmap + var sbsIndexes []int + + for i, segmentSnapshot := range snapshot.segment { + if sb, ok := segmentSnapshot.segment.(*zap.SegmentBase); ok { + sbs = append(sbs, sb) + sbsDrops = append(sbsDrops, segmentSnapshot.deleted) + sbsIndexes = append(sbsIndexes, i) } + } + + if len(sbs) < DefaultMinSegmentsForInMemoryMerge { + return false, nil + } + + _, newSnapshot, newSegmentID, err := s.mergeSegmentBases( + snapshot, sbs, sbsDrops, sbsIndexes, DefaultChunkFactor) + if err != nil { + return false, err + } + if newSnapshot == nil { + return false, nil + } + + defer func() { + _ = newSnapshot.DecRef() }() - // defer commit/rollback transaction + + mergedSegmentIDs := map[uint64]struct{}{} + for _, idx := range sbsIndexes { + mergedSegmentIDs[snapshot.segment[idx].id] = struct{}{} + } + + // construct a snapshot that's logically equivalent to the input + // snapshot, but with merged segments replaced by the new segment + equiv := &IndexSnapshot{ + parent: snapshot.parent, + segment: make([]*SegmentSnapshot, 0, len(snapshot.segment)), + internal: snapshot.internal, + epoch: snapshot.epoch, + } + + // copy to the equiv the segments that weren't replaced + for _, segment := range snapshot.segment { + if _, wasMerged := mergedSegmentIDs[segment.id]; !wasMerged { + equiv.segment = append(equiv.segment, segment) + } + } + + // append to the equiv the new segment + for _, segment := range newSnapshot.segment { + if segment.id == newSegmentID { + equiv.segment = append(equiv.segment, &SegmentSnapshot{ + id: newSegmentID, + segment: segment.segment, + deleted: nil, // nil since merging handled deletions + }) + break + } + } + + err = s.persistSnapshotDirect(equiv) + if err != nil { + return false, err + } + + return true, nil +} + +func (s *Scorch) persistSnapshotDirect(snapshot *IndexSnapshot) (err error) { + // start a write transaction + tx, err := s.rootBolt.Begin(true) + if err != nil { + return err + } + // defer rollback on error defer func() { - if err == nil { - err = tx.Commit() - } else { + if err != nil { _ = tx.Rollback() } }() @@ -172,20 +318,20 @@ func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { newSegmentPaths := make(map[uint64]string) // first ensure that each segment in this snapshot has been persisted - for i, segmentSnapshot := range snapshot.segment { - snapshotSegmentKey := segment.EncodeUvarintAscending(nil, uint64(i)) - snapshotSegmentBucket, err2 := snapshotBucket.CreateBucketIfNotExists(snapshotSegmentKey) - if err2 != nil { - return err2 + for _, segmentSnapshot := range snapshot.segment { + snapshotSegmentKey := segment.EncodeUvarintAscending(nil, segmentSnapshot.id) + snapshotSegmentBucket, err := snapshotBucket.CreateBucketIfNotExists(snapshotSegmentKey) + if err != nil { + return err } switch seg := segmentSnapshot.segment.(type) { case *zap.SegmentBase: // need to persist this to disk filename := zapFileName(segmentSnapshot.id) path := s.path + string(os.PathSeparator) + filename - err2 := zap.PersistSegmentBase(seg, path) - if err2 != nil { - return fmt.Errorf("error persisting segment: %v", err2) + err = zap.PersistSegmentBase(seg, path) + if err != nil { + return fmt.Errorf("error persisting segment: %v", err) } newSegmentPaths[segmentSnapshot.id] = path err = snapshotSegmentBucket.Put(boltPathKey, []byte(filename)) @@ -218,19 +364,28 @@ func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { } } - // only alter the root if we actually persisted a segment - // (sometimes its just a new snapshot, possibly with new internal values) + // we need to swap in a new root only when we've persisted 1 or + // more segments -- whereby the new root would have 1-for-1 + // replacements of in-memory segments with file-based segments + // + // other cases like updates to internal values only, and/or when + // there are only deletions, are already covered and persisted by + // the newly populated boltdb snapshotBucket above if len(newSegmentPaths) > 0 { // now try to open all the new snapshots newSegments := make(map[uint64]segment.Segment) + defer func() { + for _, s := range newSegments { + if s != nil { + // cleanup segments that were opened but not + // swapped into the new root + _ = s.Close() + } + } + }() for segmentID, path := range newSegmentPaths { newSegments[segmentID], err = zap.Open(path) if err != nil { - for _, s := range newSegments { - if s != nil { - _ = s.Close() // cleanup segments that were successfully opened - } - } return fmt.Errorf("error opening new segment at %s, %v", path, err) } } @@ -255,6 +410,7 @@ func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { cachedDocs: segmentSnapshot.cachedDocs, } newIndexSnapshot.segment[i] = newSegmentSnapshot + delete(newSegments, segmentSnapshot.id) // update items persisted incase of a new segment snapshot atomic.AddUint64(&s.stats.numItemsPersisted, newSegmentSnapshot.Count()) } else { @@ -266,9 +422,7 @@ func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { for k, v := range s.root.internal { newIndexSnapshot.internal[k] = v } - for _, filename := range filenames { - delete(s.ineligibleForRemoval, filename) - } + rootPrev := s.root s.root = newIndexSnapshot s.rootLock.Unlock() @@ -277,6 +431,24 @@ func (s *Scorch) persistSnapshot(snapshot *IndexSnapshot) error { } } + err = tx.Commit() + if err != nil { + return err + } + + err = s.rootBolt.Sync() + if err != nil { + return err + } + + // allow files to become eligible for removal after commit, such + // as file segments from snapshots that came from the merger + s.rootLock.Lock() + for _, filename := range filenames { + delete(s.ineligibleForRemoval, filename) + } + s.rootLock.Unlock() + return nil } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/scorch.go b/vendor/github.com/blevesearch/bleve/index/scorch/scorch.go index 311077653aa6..f539313d1c15 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/scorch.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/scorch.go @@ -61,7 +61,7 @@ type Scorch struct { merges chan *segmentMerge introducerNotifier chan *epochWatcher revertToSnapshots chan *snapshotReversion - persisterNotifier chan notificationChan + persisterNotifier chan *epochWatcher rootBolt *bolt.DB asyncTasks sync.WaitGroup @@ -114,6 +114,25 @@ func (s *Scorch) fireAsyncError(err error) { } func (s *Scorch) Open() error { + err := s.openBolt() + if err != nil { + return err + } + + s.asyncTasks.Add(1) + go s.mainLoop() + + if !s.readOnly && s.path != "" { + s.asyncTasks.Add(1) + go s.persisterLoop() + s.asyncTasks.Add(1) + go s.mergerLoop() + } + + return nil +} + +func (s *Scorch) openBolt() error { var ok bool s.path, ok = s.config["path"].(string) if !ok { @@ -136,6 +155,7 @@ func (s *Scorch) Open() error { } } } + rootBoltPath := s.path + string(os.PathSeparator) + "root.bolt" var err error if s.path != "" { @@ -156,7 +176,7 @@ func (s *Scorch) Open() error { s.merges = make(chan *segmentMerge) s.introducerNotifier = make(chan *epochWatcher, 1) s.revertToSnapshots = make(chan *snapshotReversion) - s.persisterNotifier = make(chan notificationChan) + s.persisterNotifier = make(chan *epochWatcher, 1) if !s.readOnly && s.path != "" { err := s.removeOldZapFiles() // Before persister or merger create any new files. @@ -166,16 +186,6 @@ func (s *Scorch) Open() error { } } - s.asyncTasks.Add(1) - go s.mainLoop() - - if !s.readOnly && s.path != "" { - s.asyncTasks.Add(1) - go s.persisterLoop() - s.asyncTasks.Add(1) - go s.mergerLoop() - } - return nil } @@ -310,17 +320,21 @@ func (s *Scorch) prepareSegment(newSegment segment.Segment, ids []string, introduction.persisted = make(chan error, 1) } - // get read lock, to optimistically prepare obsoleted info + // optimistically prepare obsoletes outside of rootLock s.rootLock.RLock() - for _, seg := range s.root.segment { + root := s.root + root.AddRef() + s.rootLock.RUnlock() + + for _, seg := range root.segment { delta, err := seg.segment.DocNumbers(ids) if err != nil { - s.rootLock.RUnlock() return err } introduction.obsoletes[seg.id] = delta } - s.rootLock.RUnlock() + + _ = root.DecRef() s.introductions <- introduction diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/build.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/build.go index d3344ce301f4..57d60dc8908f 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/build.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/build.go @@ -95,6 +95,21 @@ func (s *Segment) initializeDict(results []*index.AnalysisResult) { var numTokenFrequencies int var totLocs int + // initial scan for all fieldID's to sort them + for _, result := range results { + for _, field := range result.Document.CompositeFields { + s.getOrDefineField(field.Name()) + } + for _, field := range result.Document.Fields { + s.getOrDefineField(field.Name()) + } + } + sort.Strings(s.FieldsInv[1:]) // keep _id as first field + s.FieldsMap = make(map[string]uint16, len(s.FieldsInv)) + for fieldID, fieldName := range s.FieldsInv { + s.FieldsMap[fieldName] = uint16(fieldID + 1) + } + processField := func(fieldID uint16, tfs analysis.TokenFrequencies) { for term, tf := range tfs { pidPlus1, exists := s.Dicts[fieldID][term] diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/dict.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/dict.go index 939c287e9849..cf92ef71f6e9 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/dict.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/mem/dict.go @@ -76,6 +76,8 @@ type DictionaryIterator struct { prefix string end string offset int + + dictEntry index.DictEntry // reused across Next()'s } // Next returns the next entry in the dictionary @@ -95,8 +97,7 @@ func (d *DictionaryIterator) Next() (*index.DictEntry, error) { d.offset++ postingID := d.d.segment.Dicts[d.d.fieldID][next] - return &index.DictEntry{ - Term: next, - Count: d.d.segment.Postings[postingID-1].GetCardinality(), - }, nil + d.dictEntry.Term = next + d.dictEntry.Count = d.d.segment.Postings[postingID-1].GetCardinality() + return &d.dictEntry, nil } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/build.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/build.go index 58f9faeaf6b3..72357ae7d7e9 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/build.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/build.go @@ -28,7 +28,7 @@ import ( "github.com/golang/snappy" ) -const version uint32 = 2 +const version uint32 = 3 const fieldNotUninverted = math.MaxUint64 @@ -187,79 +187,42 @@ func persistBase(memSegment *mem.Segment, cr *CountHashWriter, chunkFactor uint3 } func persistStored(memSegment *mem.Segment, w *CountHashWriter) (uint64, error) { - var curr int var metaBuf bytes.Buffer var data, compressed []byte + metaEncoder := govarint.NewU64Base128Encoder(&metaBuf) + docNumOffsets := make(map[int]uint64, len(memSegment.Stored)) for docNum, storedValues := range memSegment.Stored { if docNum != 0 { // reset buffer if necessary + curr = 0 metaBuf.Reset() data = data[:0] compressed = compressed[:0] - curr = 0 } - metaEncoder := govarint.NewU64Base128Encoder(&metaBuf) - st := memSegment.StoredTypes[docNum] sp := memSegment.StoredPos[docNum] // encode fields in order for fieldID := range memSegment.FieldsInv { if storedFieldValues, ok := storedValues[uint16(fieldID)]; ok { - // has stored values for this field - num := len(storedFieldValues) - stf := st[uint16(fieldID)] spf := sp[uint16(fieldID)] - // process each value - for i := 0; i < num; i++ { - // encode field - _, err2 := metaEncoder.PutU64(uint64(fieldID)) - if err2 != nil { - return 0, err2 - } - // encode type - _, err2 = metaEncoder.PutU64(uint64(stf[i])) - if err2 != nil { - return 0, err2 - } - // encode start offset - _, err2 = metaEncoder.PutU64(uint64(curr)) - if err2 != nil { - return 0, err2 - } - // end len - _, err2 = metaEncoder.PutU64(uint64(len(storedFieldValues[i]))) - if err2 != nil { - return 0, err2 - } - // encode number of array pos - _, err2 = metaEncoder.PutU64(uint64(len(spf[i]))) - if err2 != nil { - return 0, err2 - } - // encode all array positions - for _, pos := range spf[i] { - _, err2 = metaEncoder.PutU64(pos) - if err2 != nil { - return 0, err2 - } - } - // append data - data = append(data, storedFieldValues[i]...) - // update curr - curr += len(storedFieldValues[i]) + var err2 error + curr, data, err2 = persistStoredFieldValues(fieldID, + storedFieldValues, stf, spf, curr, metaEncoder, data) + if err2 != nil { + return 0, err2 } } } - metaEncoder.Close() + metaEncoder.Close() metaBytes := metaBuf.Bytes() // compress the data @@ -299,6 +262,51 @@ func persistStored(memSegment *mem.Segment, w *CountHashWriter) (uint64, error) return rv, nil } +func persistStoredFieldValues(fieldID int, + storedFieldValues [][]byte, stf []byte, spf [][]uint64, + curr int, metaEncoder *govarint.Base128Encoder, data []byte) ( + int, []byte, error) { + for i := 0; i < len(storedFieldValues); i++ { + // encode field + _, err := metaEncoder.PutU64(uint64(fieldID)) + if err != nil { + return 0, nil, err + } + // encode type + _, err = metaEncoder.PutU64(uint64(stf[i])) + if err != nil { + return 0, nil, err + } + // encode start offset + _, err = metaEncoder.PutU64(uint64(curr)) + if err != nil { + return 0, nil, err + } + // end len + _, err = metaEncoder.PutU64(uint64(len(storedFieldValues[i]))) + if err != nil { + return 0, nil, err + } + // encode number of array pos + _, err = metaEncoder.PutU64(uint64(len(spf[i]))) + if err != nil { + return 0, nil, err + } + // encode all array positions + for _, pos := range spf[i] { + _, err = metaEncoder.PutU64(pos) + if err != nil { + return 0, nil, err + } + } + + data = append(data, storedFieldValues[i]...) + curr += len(storedFieldValues[i]) + } + + return curr, data, nil +} + func persistPostingDetails(memSegment *mem.Segment, w *CountHashWriter, chunkFactor uint32) ([]uint64, []uint64, error) { var freqOffsets, locOfffsets []uint64 tfEncoder := newChunkedIntCoder(uint64(chunkFactor), uint64(len(memSegment.Stored)-1)) @@ -580,7 +588,7 @@ func persistDocValues(memSegment *mem.Segment, w *CountHashWriter, if err != nil { return nil, err } - // resetting encoder for the next field + // reseting encoder for the next field fdvEncoder.Reset() } @@ -625,12 +633,21 @@ func NewSegmentBase(memSegment *mem.Segment, chunkFactor uint32) (*SegmentBase, return nil, err } + return InitSegmentBase(br.Bytes(), cr.Sum32(), chunkFactor, + memSegment.FieldsMap, memSegment.FieldsInv, numDocs, + storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs) +} + +func InitSegmentBase(mem []byte, memCRC uint32, chunkFactor uint32, + fieldsMap map[string]uint16, fieldsInv []string, numDocs uint64, + storedIndexOffset uint64, fieldsIndexOffset uint64, docValueOffset uint64, + dictLocs []uint64) (*SegmentBase, error) { sb := &SegmentBase{ - mem: br.Bytes(), - memCRC: cr.Sum32(), + mem: mem, + memCRC: memCRC, chunkFactor: chunkFactor, - fieldsMap: memSegment.FieldsMap, - fieldsInv: memSegment.FieldsInv, + fieldsMap: fieldsMap, + fieldsInv: fieldsInv, numDocs: numDocs, storedIndexOffset: storedIndexOffset, fieldsIndexOffset: fieldsIndexOffset, @@ -639,7 +656,7 @@ func NewSegmentBase(memSegment *mem.Segment, chunkFactor uint32) (*SegmentBase, fieldDvIterMap: make(map[uint16]*docValueIterator), } - err = sb.loadDvIterators() + err := sb.loadDvIterators() if err != nil { return nil, err } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/contentcoder.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/contentcoder.go index b03940497fbf..83457146ecae 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/contentcoder.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/contentcoder.go @@ -39,7 +39,7 @@ type chunkedContentCoder struct { // MetaData represents the data information inside a // chunk. type MetaData struct { - DocID uint64 // docid of the data inside the chunk + DocNum uint64 // docNum of the data inside the chunk DocDvLoc uint64 // starting offset for a given docid DocDvLen uint64 // length of data inside the chunk for the given docid } @@ -52,7 +52,7 @@ func newChunkedContentCoder(chunkSize uint64, rv := &chunkedContentCoder{ chunkSize: chunkSize, chunkLens: make([]uint64, total), - chunkMeta: []MetaData{}, + chunkMeta: make([]MetaData, 0, total), } return rv @@ -68,7 +68,7 @@ func (c *chunkedContentCoder) Reset() { for i := range c.chunkLens { c.chunkLens[i] = 0 } - c.chunkMeta = []MetaData{} + c.chunkMeta = c.chunkMeta[:0] } // Close indicates you are done calling Add() this allows @@ -88,7 +88,7 @@ func (c *chunkedContentCoder) flushContents() error { // write out the metaData slice for _, meta := range c.chunkMeta { - _, err := writeUvarints(&c.chunkMetaBuf, meta.DocID, meta.DocDvLoc, meta.DocDvLen) + _, err := writeUvarints(&c.chunkMetaBuf, meta.DocNum, meta.DocDvLoc, meta.DocDvLen) if err != nil { return err } @@ -118,7 +118,7 @@ func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { // clearing the chunk specific meta for next chunk c.chunkBuf.Reset() c.chunkMetaBuf.Reset() - c.chunkMeta = []MetaData{} + c.chunkMeta = c.chunkMeta[:0] c.currChunk = chunk } @@ -130,7 +130,7 @@ func (c *chunkedContentCoder) Add(docNum uint64, vals []byte) error { } c.chunkMeta = append(c.chunkMeta, MetaData{ - DocID: docNum, + DocNum: docNum, DocDvLoc: uint64(dvOffset), DocDvLen: uint64(dvSize), }) diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/dict.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/dict.go index 0f5145fba87c..e5d7126866db 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/dict.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/dict.go @@ -34,32 +34,47 @@ type Dictionary struct { // PostingsList returns the postings list for the specified term func (d *Dictionary) PostingsList(term string, except *roaring.Bitmap) (segment.PostingsList, error) { - return d.postingsList([]byte(term), except) + return d.postingsList([]byte(term), except, nil) } -func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap) (*PostingsList, error) { - rv := &PostingsList{ - sb: d.sb, - term: term, - except: except, +func (d *Dictionary) postingsList(term []byte, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { + if d.fst == nil { + return d.postingsListInit(rv, except), nil } - if d.fst != nil { - postingsOffset, exists, err := d.fst.Get(term) - if err != nil { - return nil, fmt.Errorf("vellum err: %v", err) - } - if exists { - err = rv.read(postingsOffset, d) - if err != nil { - return nil, err - } - } + postingsOffset, exists, err := d.fst.Get(term) + if err != nil { + return nil, fmt.Errorf("vellum err: %v", err) + } + if !exists { + return d.postingsListInit(rv, except), nil + } + + return d.postingsListFromOffset(postingsOffset, except, rv) +} + +func (d *Dictionary) postingsListFromOffset(postingsOffset uint64, except *roaring.Bitmap, rv *PostingsList) (*PostingsList, error) { + rv = d.postingsListInit(rv, except) + + err := rv.read(postingsOffset, d) + if err != nil { + return nil, err } return rv, nil } +func (d *Dictionary) postingsListInit(rv *PostingsList, except *roaring.Bitmap) *PostingsList { + if rv == nil { + rv = &PostingsList{} + } else { + *rv = PostingsList{} // clear the struct + } + rv.sb = d.sb + rv.except = except + return rv +} + // Iterator returns an iterator for this dictionary func (d *Dictionary) Iterator() segment.DictionaryIterator { rv := &DictionaryIterator{ diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/docvalues.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/docvalues.go index fb5b348a5b67..0514bd307c3b 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/docvalues.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/docvalues.go @@ -99,7 +99,7 @@ func (s *SegmentBase) loadFieldDocValueIterator(field string, func (di *docValueIterator) loadDvChunk(chunkNumber, localDocNum uint64, s *SegmentBase) error { // advance to the chunk where the docValues - // reside for the given docID + // reside for the given docNum destChunkDataLoc := di.dvDataLoc for i := 0; i < int(chunkNumber); i++ { destChunkDataLoc += di.chunkLens[i] @@ -116,7 +116,7 @@ func (di *docValueIterator) loadDvChunk(chunkNumber, offset := uint64(0) di.curChunkHeader = make([]MetaData, int(numDocs)) for i := 0; i < int(numDocs); i++ { - di.curChunkHeader[i].DocID, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) + di.curChunkHeader[i].DocNum, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) offset += uint64(read) di.curChunkHeader[i].DocDvLoc, read = binary.Uvarint(s.mem[chunkMetaLoc+offset : chunkMetaLoc+offset+binary.MaxVarintLen64]) offset += uint64(read) @@ -131,10 +131,10 @@ func (di *docValueIterator) loadDvChunk(chunkNumber, return nil } -func (di *docValueIterator) visitDocValues(docID uint64, +func (di *docValueIterator) visitDocValues(docNum uint64, visitor index.DocumentFieldTermVisitor) error { - // binary search the term locations for the docID - start, length := di.getDocValueLocs(docID) + // binary search the term locations for the docNum + start, length := di.getDocValueLocs(docNum) if start == math.MaxUint64 || length == math.MaxUint64 { return nil } @@ -144,7 +144,7 @@ func (di *docValueIterator) visitDocValues(docID uint64, return err } - // pick the terms for the given docID + // pick the terms for the given docNum uncompressed = uncompressed[start : start+length] for { i := bytes.Index(uncompressed, termSeparatorSplitSlice) @@ -159,11 +159,11 @@ func (di *docValueIterator) visitDocValues(docID uint64, return nil } -func (di *docValueIterator) getDocValueLocs(docID uint64) (uint64, uint64) { +func (di *docValueIterator) getDocValueLocs(docNum uint64) (uint64, uint64) { i := sort.Search(len(di.curChunkHeader), func(i int) bool { - return di.curChunkHeader[i].DocID >= docID + return di.curChunkHeader[i].DocNum >= docNum }) - if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocID == docID { + if i < len(di.curChunkHeader) && di.curChunkHeader[i].DocNum == docNum { return di.curChunkHeader[i].DocDvLoc, di.curChunkHeader[i].DocDvLen } return math.MaxUint64, math.MaxUint64 diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/enumerator.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/enumerator.go new file mode 100644 index 000000000000..3c708dd5779d --- /dev/null +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/enumerator.go @@ -0,0 +1,124 @@ +// Copyright (c) 2018 Couchbase, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package zap + +import ( + "bytes" + + "github.com/couchbase/vellum" +) + +// enumerator provides an ordered traversal of multiple vellum +// iterators. Like JOIN of iterators, the enumerator produces a +// sequence of (key, iteratorIndex, value) tuples, sorted by key ASC, +// then iteratorIndex ASC, where the same key might be seen or +// repeated across multiple child iterators. +type enumerator struct { + itrs []vellum.Iterator + currKs [][]byte + currVs []uint64 + + lowK []byte + lowIdxs []int + lowCurr int +} + +// newEnumerator returns a new enumerator over the vellum Iterators +func newEnumerator(itrs []vellum.Iterator) (*enumerator, error) { + rv := &enumerator{ + itrs: itrs, + currKs: make([][]byte, len(itrs)), + currVs: make([]uint64, len(itrs)), + lowIdxs: make([]int, 0, len(itrs)), + } + for i, itr := range rv.itrs { + rv.currKs[i], rv.currVs[i] = itr.Current() + } + rv.updateMatches() + if rv.lowK == nil { + return rv, vellum.ErrIteratorDone + } + return rv, nil +} + +// updateMatches maintains the low key matches based on the currKs +func (m *enumerator) updateMatches() { + m.lowK = nil + m.lowIdxs = m.lowIdxs[:0] + m.lowCurr = 0 + + for i, key := range m.currKs { + if key == nil { + continue + } + + cmp := bytes.Compare(key, m.lowK) + if cmp < 0 || m.lowK == nil { + // reached a new low + m.lowK = key + m.lowIdxs = m.lowIdxs[:0] + m.lowIdxs = append(m.lowIdxs, i) + } else if cmp == 0 { + m.lowIdxs = append(m.lowIdxs, i) + } + } +} + +// Current returns the enumerator's current key, iterator-index, and +// value. If the enumerator is not pointing at a valid value (because +// Next returned an error previously), Current will return nil,0,0. +func (m *enumerator) Current() ([]byte, int, uint64) { + var i int + var v uint64 + if m.lowCurr < len(m.lowIdxs) { + i = m.lowIdxs[m.lowCurr] + v = m.currVs[i] + } + return m.lowK, i, v +} + +// Next advances the enumerator to the next key/iterator/value result, +// else vellum.ErrIteratorDone is returned. +func (m *enumerator) Next() error { + m.lowCurr += 1 + if m.lowCurr >= len(m.lowIdxs) { + // move all the current low iterators forwards + for _, vi := range m.lowIdxs { + err := m.itrs[vi].Next() + if err != nil && err != vellum.ErrIteratorDone { + return err + } + m.currKs[vi], m.currVs[vi] = m.itrs[vi].Current() + } + m.updateMatches() + } + if m.lowK == nil { + return vellum.ErrIteratorDone + } + return nil +} + +// Close all the underlying Iterators. The first error, if any, will +// be returned. +func (m *enumerator) Close() error { + var rv error + for _, itr := range m.itrs { + err := itr.Close() + if rv == nil { + rv = err + } + } + return rv +} diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/intcoder.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/intcoder.go index e9f295023bc6..b505fec94e9b 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/intcoder.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/intcoder.go @@ -30,6 +30,8 @@ type chunkedIntCoder struct { encoder *govarint.Base128Encoder chunkLens []uint64 currChunk uint64 + + buf []byte } // newChunkedIntCoder returns a new chunk int coder which packs data into @@ -67,12 +69,8 @@ func (c *chunkedIntCoder) Add(docNum uint64, vals ...uint64) error { // starting a new chunk if c.encoder != nil { // close out last - c.encoder.Close() - encodingBytes := c.chunkBuf.Bytes() - c.chunkLens[c.currChunk] = uint64(len(encodingBytes)) - c.final = append(c.final, encodingBytes...) + c.Close() c.chunkBuf.Reset() - c.encoder = govarint.NewU64Base128Encoder(&c.chunkBuf) } c.currChunk = chunk } @@ -98,26 +96,25 @@ func (c *chunkedIntCoder) Close() { // Write commits all the encoded chunked integers to the provided writer. func (c *chunkedIntCoder) Write(w io.Writer) (int, error) { - var tw int - buf := make([]byte, binary.MaxVarintLen64) - // write out the number of chunks + bufNeeded := binary.MaxVarintLen64 * (1 + len(c.chunkLens)) + if len(c.buf) < bufNeeded { + c.buf = make([]byte, bufNeeded) + } + buf := c.buf + + // write out the number of chunks & each chunkLen n := binary.PutUvarint(buf, uint64(len(c.chunkLens))) - nw, err := w.Write(buf[:n]) - tw += nw + for _, chunkLen := range c.chunkLens { + n += binary.PutUvarint(buf[n:], uint64(chunkLen)) + } + + tw, err := w.Write(buf[:n]) if err != nil { return tw, err } - // write out the chunk lens - for _, chunkLen := range c.chunkLens { - n := binary.PutUvarint(buf, uint64(chunkLen)) - nw, err = w.Write(buf[:n]) - tw += nw - if err != nil { - return tw, err - } - } + // write out the data - nw, err = w.Write(c.final) + nw, err := w.Write(c.final) tw += nw if err != nil { return tw, err diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/merge.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/merge.go index cc348d72072d..ae8c5b197b0f 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/merge.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/merge.go @@ -21,6 +21,7 @@ import ( "fmt" "math" "os" + "sort" "github.com/RoaringBitmap/roaring" "github.com/Smerity/govarint" @@ -28,6 +29,8 @@ import ( "github.com/golang/snappy" ) +const docDropped = math.MaxUint64 // sentinel docNum to represent a deleted doc + // Merge takes a slice of zap segments and bit masks describing which // documents may be dropped, and creates a new segment containing the // remaining data. This new segment is built at the specified path, @@ -46,47 +49,26 @@ func Merge(segments []*Segment, drops []*roaring.Bitmap, path string, _ = os.Remove(path) } + segmentBases := make([]*SegmentBase, len(segments)) + for segmenti, segment := range segments { + segmentBases[segmenti] = &segment.SegmentBase + } + // buffer the output br := bufio.NewWriter(f) // wrap it for counting (tracking offsets) cr := NewCountHashWriter(br) - fieldsInv := mergeFields(segments) - fieldsMap := mapFields(fieldsInv) - - var newDocNums [][]uint64 - var storedIndexOffset uint64 - fieldDvLocsOffset := uint64(fieldNotUninverted) - var dictLocs []uint64 - - newSegDocCount := computeNewDocCount(segments, drops) - if newSegDocCount > 0 { - storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, - fieldsMap, fieldsInv, newSegDocCount, cr) - if err != nil { - cleanup() - return nil, err - } - - dictLocs, fieldDvLocsOffset, err = persistMergedRest(segments, drops, fieldsInv, fieldsMap, - newDocNums, newSegDocCount, chunkFactor, cr) - if err != nil { - cleanup() - return nil, err - } - } else { - dictLocs = make([]uint64, len(fieldsInv)) - } - - fieldsIndexOffset, err := persistFields(fieldsInv, cr, dictLocs) + newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, _, _, _, err := + MergeToWriter(segmentBases, drops, chunkFactor, cr) if err != nil { cleanup() return nil, err } - err = persistFooter(newSegDocCount, storedIndexOffset, - fieldsIndexOffset, fieldDvLocsOffset, chunkFactor, cr.Sum32(), cr) + err = persistFooter(numDocs, storedIndexOffset, fieldsIndexOffset, + docValueOffset, chunkFactor, cr.Sum32(), cr) if err != nil { cleanup() return nil, err @@ -113,21 +95,59 @@ func Merge(segments []*Segment, drops []*roaring.Bitmap, path string, return newDocNums, nil } -// mapFields takes the fieldsInv list and builds the map +func MergeToWriter(segments []*SegmentBase, drops []*roaring.Bitmap, + chunkFactor uint32, cr *CountHashWriter) ( + newDocNums [][]uint64, + numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset uint64, + dictLocs []uint64, fieldsInv []string, fieldsMap map[string]uint16, + err error) { + docValueOffset = uint64(fieldNotUninverted) + + var fieldsSame bool + fieldsSame, fieldsInv = mergeFields(segments) + fieldsMap = mapFields(fieldsInv) + + numDocs = computeNewDocCount(segments, drops) + if numDocs > 0 { + storedIndexOffset, newDocNums, err = mergeStoredAndRemap(segments, drops, + fieldsMap, fieldsInv, fieldsSame, numDocs, cr) + if err != nil { + return nil, 0, 0, 0, 0, nil, nil, nil, err + } + + dictLocs, docValueOffset, err = persistMergedRest(segments, drops, fieldsInv, fieldsMap, + newDocNums, numDocs, chunkFactor, cr) + if err != nil { + return nil, 0, 0, 0, 0, nil, nil, nil, err + } + } else { + dictLocs = make([]uint64, len(fieldsInv)) + } + + fieldsIndexOffset, err = persistFields(fieldsInv, cr, dictLocs) + if err != nil { + return nil, 0, 0, 0, 0, nil, nil, nil, err + } + + return newDocNums, numDocs, storedIndexOffset, fieldsIndexOffset, docValueOffset, dictLocs, fieldsInv, fieldsMap, nil +} + +// mapFields takes the fieldsInv list and returns a map of fieldName +// to fieldID+1 func mapFields(fields []string) map[string]uint16 { rv := make(map[string]uint16, len(fields)) for i, fieldName := range fields { - rv[fieldName] = uint16(i) + rv[fieldName] = uint16(i) + 1 } return rv } // computeNewDocCount determines how many documents will be in the newly // merged segment when obsoleted docs are dropped -func computeNewDocCount(segments []*Segment, drops []*roaring.Bitmap) uint64 { +func computeNewDocCount(segments []*SegmentBase, drops []*roaring.Bitmap) uint64 { var newDocCount uint64 for segI, segment := range segments { - newDocCount += segment.NumDocs() + newDocCount += segment.numDocs if drops[segI] != nil { newDocCount -= drops[segI].GetCardinality() } @@ -135,8 +155,8 @@ func computeNewDocCount(segments []*Segment, drops []*roaring.Bitmap) uint64 { return newDocCount } -func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, - fieldsInv []string, fieldsMap map[string]uint16, newDocNums [][]uint64, +func persistMergedRest(segments []*SegmentBase, dropsIn []*roaring.Bitmap, + fieldsInv []string, fieldsMap map[string]uint16, newDocNumsIn [][]uint64, newSegDocCount uint64, chunkFactor uint32, w *CountHashWriter) ([]uint64, uint64, error) { @@ -144,9 +164,14 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, var bufMaxVarintLen64 []byte = make([]byte, binary.MaxVarintLen64) var bufLoc []uint64 + var postings *PostingsList + var postItr *PostingsIterator + rv := make([]uint64, len(fieldsInv)) fieldDvLocs := make([]uint64, len(fieldsInv)) - fieldDvLocsOffset := uint64(fieldNotUninverted) + + tfEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) + locEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) // docTermMap is keyed by docNum, where the array impl provides // better memory usage behavior than a sparse-friendlier hashmap @@ -166,36 +191,31 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, return nil, 0, err } - // collect FST iterators from all segments for this field + // collect FST iterators from all active segments for this field + var newDocNums [][]uint64 + var drops []*roaring.Bitmap var dicts []*Dictionary var itrs []vellum.Iterator - for _, segment := range segments { + + for segmentI, segment := range segments { dict, err2 := segment.dictionary(fieldName) if err2 != nil { return nil, 0, err2 } - dicts = append(dicts, dict) - if dict != nil && dict.fst != nil { itr, err2 := dict.fst.Iterator(nil, nil) if err2 != nil && err2 != vellum.ErrIteratorDone { return nil, 0, err2 } if itr != nil { + newDocNums = append(newDocNums, newDocNumsIn[segmentI]) + drops = append(drops, dropsIn[segmentI]) + dicts = append(dicts, dict) itrs = append(itrs, itr) } } } - // create merging iterator - mergeItr, err := vellum.NewMergeIterator(itrs, func(postingOffsets []uint64) uint64 { - // we don't actually use the merged value - return 0 - }) - - tfEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) - locEncoder := newChunkedIntCoder(uint64(chunkFactor), newSegDocCount-1) - if uint64(cap(docTermMap)) < newSegDocCount { docTermMap = make([][]byte, newSegDocCount) } else { @@ -205,70 +225,14 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, } } - for err == nil { - term, _ := mergeItr.Current() - - newRoaring := roaring.NewBitmap() - newRoaringLocs := roaring.NewBitmap() - - tfEncoder.Reset() - locEncoder.Reset() - - // now go back and get posting list for this term - // but pass in the deleted docs for that segment - for dictI, dict := range dicts { - if dict == nil { - continue - } - postings, err2 := dict.postingsList(term, drops[dictI]) - if err2 != nil { - return nil, 0, err2 - } - - postItr := postings.Iterator() - next, err2 := postItr.Next() - for next != nil && err2 == nil { - hitNewDocNum := newDocNums[dictI][next.Number()] - if hitNewDocNum == docDropped { - return nil, 0, fmt.Errorf("see hit with dropped doc num") - } - newRoaring.Add(uint32(hitNewDocNum)) - // encode norm bits - norm := next.Norm() - normBits := math.Float32bits(float32(norm)) - err = tfEncoder.Add(hitNewDocNum, next.Frequency(), uint64(normBits)) - if err != nil { - return nil, 0, err - } - locs := next.Locations() - if len(locs) > 0 { - newRoaringLocs.Add(uint32(hitNewDocNum)) - for _, loc := range locs { - if cap(bufLoc) < 5+len(loc.ArrayPositions()) { - bufLoc = make([]uint64, 0, 5+len(loc.ArrayPositions())) - } - args := bufLoc[0:5] - args[0] = uint64(fieldsMap[loc.Field()]) - args[1] = loc.Pos() - args[2] = loc.Start() - args[3] = loc.End() - args[4] = uint64(len(loc.ArrayPositions())) - args = append(args, loc.ArrayPositions()...) - err = locEncoder.Add(hitNewDocNum, args...) - if err != nil { - return nil, 0, err - } - } - } + var prevTerm []byte - docTermMap[hitNewDocNum] = - append(append(docTermMap[hitNewDocNum], term...), termSeparator) + newRoaring := roaring.NewBitmap() + newRoaringLocs := roaring.NewBitmap() - next, err2 = postItr.Next() - } - if err2 != nil { - return nil, 0, err2 - } + finishTerm := func(term []byte) error { + if term == nil { + return nil } tfEncoder.Close() @@ -277,59 +241,142 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, if newRoaring.GetCardinality() > 0 { // this field/term actually has hits in the new segment, lets write it down freqOffset := uint64(w.Count()) - _, err = tfEncoder.Write(w) + _, err := tfEncoder.Write(w) if err != nil { - return nil, 0, err + return err } locOffset := uint64(w.Count()) _, err = locEncoder.Write(w) if err != nil { - return nil, 0, err + return err } postingLocOffset := uint64(w.Count()) _, err = writeRoaringWithLen(newRoaringLocs, w, &bufReuse, bufMaxVarintLen64) if err != nil { - return nil, 0, err + return err } postingOffset := uint64(w.Count()) + // write out the start of the term info - buf := bufMaxVarintLen64 - n := binary.PutUvarint(buf, freqOffset) - _, err = w.Write(buf[:n]) + n := binary.PutUvarint(bufMaxVarintLen64, freqOffset) + _, err = w.Write(bufMaxVarintLen64[:n]) if err != nil { - return nil, 0, err + return err } - // write out the start of the loc info - n = binary.PutUvarint(buf, locOffset) - _, err = w.Write(buf[:n]) + n = binary.PutUvarint(bufMaxVarintLen64, locOffset) + _, err = w.Write(bufMaxVarintLen64[:n]) if err != nil { - return nil, 0, err + return err } - - // write out the start of the loc posting list - n = binary.PutUvarint(buf, postingLocOffset) - _, err = w.Write(buf[:n]) + // write out the start of the posting locs + n = binary.PutUvarint(bufMaxVarintLen64, postingLocOffset) + _, err = w.Write(bufMaxVarintLen64[:n]) if err != nil { - return nil, 0, err + return err } _, err = writeRoaringWithLen(newRoaring, w, &bufReuse, bufMaxVarintLen64) if err != nil { - return nil, 0, err + return err } err = newVellum.Insert(term, postingOffset) + if err != nil { + return err + } + } + + newRoaring = roaring.NewBitmap() + newRoaringLocs = roaring.NewBitmap() + + tfEncoder.Reset() + locEncoder.Reset() + + return nil + } + + enumerator, err := newEnumerator(itrs) + + for err == nil { + term, itrI, postingsOffset := enumerator.Current() + + if !bytes.Equal(prevTerm, term) { + // if the term changed, write out the info collected + // for the previous term + err2 := finishTerm(prevTerm) + if err2 != nil { + return nil, 0, err2 + } + } + + var err2 error + postings, err2 = dicts[itrI].postingsListFromOffset( + postingsOffset, drops[itrI], postings) + if err2 != nil { + return nil, 0, err2 + } + + newDocNumsI := newDocNums[itrI] + + postItr = postings.iterator(postItr) + next, err2 := postItr.Next() + for next != nil && err2 == nil { + hitNewDocNum := newDocNumsI[next.Number()] + if hitNewDocNum == docDropped { + return nil, 0, fmt.Errorf("see hit with dropped doc num") + } + newRoaring.Add(uint32(hitNewDocNum)) + // encode norm bits + norm := next.Norm() + normBits := math.Float32bits(float32(norm)) + err = tfEncoder.Add(hitNewDocNum, next.Frequency(), uint64(normBits)) if err != nil { return nil, 0, err } + locs := next.Locations() + if len(locs) > 0 { + newRoaringLocs.Add(uint32(hitNewDocNum)) + for _, loc := range locs { + if cap(bufLoc) < 5+len(loc.ArrayPositions()) { + bufLoc = make([]uint64, 0, 5+len(loc.ArrayPositions())) + } + args := bufLoc[0:5] + args[0] = uint64(fieldsMap[loc.Field()] - 1) + args[1] = loc.Pos() + args[2] = loc.Start() + args[3] = loc.End() + args[4] = uint64(len(loc.ArrayPositions())) + args = append(args, loc.ArrayPositions()...) + err = locEncoder.Add(hitNewDocNum, args...) + if err != nil { + return nil, 0, err + } + } + } + + docTermMap[hitNewDocNum] = + append(append(docTermMap[hitNewDocNum], term...), termSeparator) + + next, err2 = postItr.Next() + } + if err2 != nil { + return nil, 0, err2 } - err = mergeItr.Next() + prevTerm = prevTerm[:0] // copy to prevTerm in case Next() reuses term mem + prevTerm = append(prevTerm, term...) + + err = enumerator.Next() } if err != nil && err != vellum.ErrIteratorDone { return nil, 0, err } + err = finishTerm(prevTerm) + if err != nil { + return nil, 0, err + } + dictOffset := uint64(w.Count()) err = newVellum.Close() @@ -378,7 +425,7 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, } } - fieldDvLocsOffset = uint64(w.Count()) + fieldDvLocsOffset := uint64(w.Count()) buf := bufMaxVarintLen64 for _, offset := range fieldDvLocs { @@ -392,10 +439,8 @@ func persistMergedRest(segments []*Segment, drops []*roaring.Bitmap, return rv, fieldDvLocsOffset, nil } -const docDropped = math.MaxUint64 - -func mergeStoredAndRemap(segments []*Segment, drops []*roaring.Bitmap, - fieldsMap map[string]uint16, fieldsInv []string, newSegDocCount uint64, +func mergeStoredAndRemap(segments []*SegmentBase, drops []*roaring.Bitmap, + fieldsMap map[string]uint16, fieldsInv []string, fieldsSame bool, newSegDocCount uint64, w *CountHashWriter) (uint64, [][]uint64, error) { var rv [][]uint64 // The remapped or newDocNums for each segment. @@ -417,10 +462,30 @@ func mergeStoredAndRemap(segments []*Segment, drops []*roaring.Bitmap, for segI, segment := range segments { segNewDocNums := make([]uint64, segment.numDocs) + dropsI := drops[segI] + + // optimize when the field mapping is the same across all + // segments and there are no deletions, via byte-copying + // of stored docs bytes directly to the writer + if fieldsSame && (dropsI == nil || dropsI.GetCardinality() == 0) { + err := segment.copyStoredDocs(newDocNum, docNumOffsets, w) + if err != nil { + return 0, nil, err + } + + for i := uint64(0); i < segment.numDocs; i++ { + segNewDocNums[i] = newDocNum + newDocNum++ + } + rv = append(rv, segNewDocNums) + + continue + } + // for each doc num for docNum := uint64(0); docNum < segment.numDocs; docNum++ { // TODO: roaring's API limits docNums to 32-bits? - if drops[segI] != nil && drops[segI].Contains(uint32(docNum)) { + if dropsI != nil && dropsI.Contains(uint32(docNum)) { segNewDocNums[docNum] = docDropped continue } @@ -439,7 +504,7 @@ func mergeStoredAndRemap(segments []*Segment, drops []*roaring.Bitmap, poss[i] = poss[i][:0] } err := segment.VisitDocument(docNum, func(field string, typ byte, value []byte, pos []uint64) bool { - fieldID := int(fieldsMap[field]) + fieldID := int(fieldsMap[field]) - 1 vals[fieldID] = append(vals[fieldID], value) typs[fieldID] = append(typs[fieldID], typ) poss[fieldID] = append(poss[fieldID], pos) @@ -453,47 +518,14 @@ func mergeStoredAndRemap(segments []*Segment, drops []*roaring.Bitmap, for fieldID := range fieldsInv { storedFieldValues := vals[int(fieldID)] - // has stored values for this field - num := len(storedFieldValues) + stf := typs[int(fieldID)] + spf := poss[int(fieldID)] - // process each value - for i := 0; i < num; i++ { - // encode field - _, err2 := metaEncoder.PutU64(uint64(fieldID)) - if err2 != nil { - return 0, nil, err2 - } - // encode type - _, err2 = metaEncoder.PutU64(uint64(typs[int(fieldID)][i])) - if err2 != nil { - return 0, nil, err2 - } - // encode start offset - _, err2 = metaEncoder.PutU64(uint64(curr)) - if err2 != nil { - return 0, nil, err2 - } - // end len - _, err2 = metaEncoder.PutU64(uint64(len(storedFieldValues[i]))) - if err2 != nil { - return 0, nil, err2 - } - // encode number of array pos - _, err2 = metaEncoder.PutU64(uint64(len(poss[int(fieldID)][i]))) - if err2 != nil { - return 0, nil, err2 - } - // encode all array positions - for j := 0; j < len(poss[int(fieldID)][i]); j++ { - _, err2 = metaEncoder.PutU64(poss[int(fieldID)][i][j]) - if err2 != nil { - return 0, nil, err2 - } - } - // append data - data = append(data, storedFieldValues[i]...) - // update curr - curr += len(storedFieldValues[i]) + var err2 error + curr, data, err2 = persistStoredFieldValues(fieldID, + storedFieldValues, stf, spf, curr, metaEncoder, data) + if err2 != nil { + return 0, nil, err2 } } @@ -528,36 +560,87 @@ func mergeStoredAndRemap(segments []*Segment, drops []*roaring.Bitmap, } // return value is the start of the stored index - offset := uint64(w.Count()) + storedIndexOffset := uint64(w.Count()) // now write out the stored doc index - for docNum := range docNumOffsets { - err := binary.Write(w, binary.BigEndian, docNumOffsets[docNum]) + for _, docNumOffset := range docNumOffsets { + err := binary.Write(w, binary.BigEndian, docNumOffset) if err != nil { return 0, nil, err } } - return offset, rv, nil + return storedIndexOffset, rv, nil } -// mergeFields builds a unified list of fields used across all the input segments -func mergeFields(segments []*Segment) []string { - fieldsMap := map[string]struct{}{} +// copyStoredDocs writes out a segment's stored doc info, optimized by +// using a single Write() call for the entire set of bytes. The +// newDocNumOffsets is filled with the new offsets for each doc. +func (s *SegmentBase) copyStoredDocs(newDocNum uint64, newDocNumOffsets []uint64, + w *CountHashWriter) error { + if s.numDocs <= 0 { + return nil + } + + indexOffset0, storedOffset0, _, _, _ := + s.getDocStoredOffsets(0) // the segment's first doc + + indexOffsetN, storedOffsetN, readN, metaLenN, dataLenN := + s.getDocStoredOffsets(s.numDocs - 1) // the segment's last doc + + storedOffset0New := uint64(w.Count()) + + storedBytes := s.mem[storedOffset0 : storedOffsetN+readN+metaLenN+dataLenN] + _, err := w.Write(storedBytes) + if err != nil { + return err + } + + // remap the storedOffset's for the docs into new offsets relative + // to storedOffset0New, filling the given docNumOffsetsOut array + for indexOffset := indexOffset0; indexOffset <= indexOffsetN; indexOffset += 8 { + storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) + storedOffsetNew := storedOffset - storedOffset0 + storedOffset0New + newDocNumOffsets[newDocNum] = storedOffsetNew + newDocNum += 1 + } + + return nil +} + +// mergeFields builds a unified list of fields used across all the +// input segments, and computes whether the fields are the same across +// segments (which depends on fields to be sorted in the same way +// across segments) +func mergeFields(segments []*SegmentBase) (bool, []string) { + fieldsSame := true + + var segment0Fields []string + if len(segments) > 0 { + segment0Fields = segments[0].Fields() + } + + fieldsExist := map[string]struct{}{} for _, segment := range segments { fields := segment.Fields() - for _, field := range fields { - fieldsMap[field] = struct{}{} + for fieldi, field := range fields { + fieldsExist[field] = struct{}{} + if len(segment0Fields) != len(fields) || segment0Fields[fieldi] != field { + fieldsSame = false + } } } - rv := make([]string, 0, len(fieldsMap)) + rv := make([]string, 0, len(fieldsExist)) // ensure _id stays first rv = append(rv, "_id") - for k := range fieldsMap { + for k := range fieldsExist { if k != "_id" { rv = append(rv, k) } } - return rv + + sort.Strings(rv[1:]) // leave _id as first + + return fieldsSame, rv } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/posting.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/posting.go index 67e08d1ae3ba..d504885d05c7 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/posting.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/posting.go @@ -28,21 +28,27 @@ import ( // PostingsList is an in-memory represenation of a postings list type PostingsList struct { sb *SegmentBase - term []byte postingsOffset uint64 freqOffset uint64 locOffset uint64 locBitmap *roaring.Bitmap postings *roaring.Bitmap except *roaring.Bitmap - postingKey []byte } // Iterator returns an iterator for this postings list func (p *PostingsList) Iterator() segment.PostingsIterator { - rv := &PostingsIterator{ - postings: p, + return p.iterator(nil) +} + +func (p *PostingsList) iterator(rv *PostingsIterator) *PostingsIterator { + if rv == nil { + rv = &PostingsIterator{} + } else { + *rv = PostingsIterator{} // clear the struct } + rv.postings = p + if p.postings != nil { // prepare the freq chunk details var n uint64 diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/read.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/read.go index 0c5b9e17fae0..e47d4c6abdcd 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/read.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/read.go @@ -17,15 +17,27 @@ package zap import "encoding/binary" func (s *SegmentBase) getDocStoredMetaAndCompressed(docNum uint64) ([]byte, []byte) { - docStoredStartAddr := s.storedIndexOffset + (8 * docNum) - docStoredStart := binary.BigEndian.Uint64(s.mem[docStoredStartAddr : docStoredStartAddr+8]) + _, storedOffset, n, metaLen, dataLen := s.getDocStoredOffsets(docNum) + + meta := s.mem[storedOffset+n : storedOffset+n+metaLen] + data := s.mem[storedOffset+n+metaLen : storedOffset+n+metaLen+dataLen] + + return meta, data +} + +func (s *SegmentBase) getDocStoredOffsets(docNum uint64) ( + uint64, uint64, uint64, uint64, uint64) { + indexOffset := s.storedIndexOffset + (8 * docNum) + + storedOffset := binary.BigEndian.Uint64(s.mem[indexOffset : indexOffset+8]) + var n uint64 - metaLen, read := binary.Uvarint(s.mem[docStoredStart : docStoredStart+binary.MaxVarintLen64]) + + metaLen, read := binary.Uvarint(s.mem[storedOffset : storedOffset+binary.MaxVarintLen64]) n += uint64(read) - var dataLen uint64 - dataLen, read = binary.Uvarint(s.mem[docStoredStart+n : docStoredStart+n+binary.MaxVarintLen64]) + + dataLen, read := binary.Uvarint(s.mem[storedOffset+n : storedOffset+n+binary.MaxVarintLen64]) n += uint64(read) - meta := s.mem[docStoredStart+n : docStoredStart+n+metaLen] - data := s.mem[docStoredStart+n+metaLen : docStoredStart+n+metaLen+dataLen] - return meta, data + + return indexOffset, storedOffset, n, metaLen, dataLen } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/segment.go b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/segment.go index 94268cacebaf..40c0af2741b3 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/segment.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/segment/zap/segment.go @@ -343,8 +343,9 @@ func (s *SegmentBase) DocNumbers(ids []string) (*roaring.Bitmap, error) { return nil, err } + var postings *PostingsList for _, id := range ids { - postings, err := idDict.postingsList([]byte(id), nil) + postings, err = idDict.postingsList([]byte(id), nil, postings) if err != nil { return nil, err } diff --git a/vendor/github.com/blevesearch/bleve/index/scorch/snapshot_rollback.go b/vendor/github.com/blevesearch/bleve/index/scorch/snapshot_rollback.go index 43c3ba9f1ebd..247003311e75 100644 --- a/vendor/github.com/blevesearch/bleve/index/scorch/snapshot_rollback.go +++ b/vendor/github.com/blevesearch/bleve/index/scorch/snapshot_rollback.go @@ -31,10 +31,9 @@ func (r *RollbackPoint) GetInternal(key []byte) []byte { return r.meta[string(key)] } -// RollbackPoints returns an array of rollback points available -// for the application to make a decision on where to rollback -// to. A nil return value indicates that there are no available -// rollback points. +// RollbackPoints returns an array of rollback points available for +// the application to rollback to, with more recent rollback points +// (higher epochs) coming first. func (s *Scorch) RollbackPoints() ([]*RollbackPoint, error) { if s.rootBolt == nil { return nil, fmt.Errorf("RollbackPoints: root is nil") @@ -54,7 +53,7 @@ func (s *Scorch) RollbackPoints() ([]*RollbackPoint, error) { snapshots := tx.Bucket(boltSnapshotsBucket) if snapshots == nil { - return nil, fmt.Errorf("RollbackPoints: no snapshots available") + return nil, nil } rollbackPoints := []*RollbackPoint{} @@ -150,10 +149,7 @@ func (s *Scorch) Rollback(to *RollbackPoint) error { revert.snapshot = indexSnapshot revert.applied = make(chan error) - - if !s.unsafeBatch { - revert.persisted = make(chan error) - } + revert.persisted = make(chan error) return nil }) @@ -173,9 +169,5 @@ func (s *Scorch) Rollback(to *RollbackPoint) error { return fmt.Errorf("Rollback: failed with err: %v", err) } - if revert.persisted != nil { - err = <-revert.persisted - } - - return err + return <-revert.persisted } diff --git a/vendor/github.com/blevesearch/bleve/index/upsidedown/upsidedown.go b/vendor/github.com/blevesearch/bleve/index/upsidedown/upsidedown.go index 1243375b769c..70e6e457f6df 100644 --- a/vendor/github.com/blevesearch/bleve/index/upsidedown/upsidedown.go +++ b/vendor/github.com/blevesearch/bleve/index/upsidedown/upsidedown.go @@ -837,6 +837,11 @@ func (udc *UpsideDownCouch) Batch(batch *index.Batch) (err error) { docBackIndexRowErr = err return } + defer func() { + if cerr := kvreader.Close(); err == nil && cerr != nil { + docBackIndexRowErr = cerr + } + }() for docID, doc := range batch.IndexOps { backIndexRow, err := backIndexRowForDoc(kvreader, index.IndexInternalID(docID)) @@ -847,12 +852,6 @@ func (udc *UpsideDownCouch) Batch(batch *index.Batch) (err error) { docBackIndexRowCh <- &docBackIndexRow{docID, doc, backIndexRow} } - - err = kvreader.Close() - if err != nil { - docBackIndexRowErr = err - return - } }() // wait for analysis result diff --git a/vendor/github.com/blevesearch/bleve/index_alias_impl.go b/vendor/github.com/blevesearch/bleve/index_alias_impl.go index 9e9a3594ff06..f678a059b7f7 100644 --- a/vendor/github.com/blevesearch/bleve/index_alias_impl.go +++ b/vendor/github.com/blevesearch/bleve/index_alias_impl.go @@ -15,12 +15,11 @@ package bleve import ( + "context" "sort" "sync" "time" - "golang.org/x/net/context" - "github.com/blevesearch/bleve/document" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/index/store" diff --git a/vendor/github.com/blevesearch/bleve/index_impl.go b/vendor/github.com/blevesearch/bleve/index_impl.go index 799b582a0600..caea1b8e04e2 100644 --- a/vendor/github.com/blevesearch/bleve/index_impl.go +++ b/vendor/github.com/blevesearch/bleve/index_impl.go @@ -15,6 +15,7 @@ package bleve import ( + "context" "encoding/json" "fmt" "os" @@ -22,8 +23,6 @@ import ( "sync/atomic" "time" - "golang.org/x/net/context" - "github.com/blevesearch/bleve/document" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/index/store" diff --git a/vendor/github.com/blevesearch/bleve/search/collector.go b/vendor/github.com/blevesearch/bleve/search/collector.go index cba4829d4642..0d163a9d9d5e 100644 --- a/vendor/github.com/blevesearch/bleve/search/collector.go +++ b/vendor/github.com/blevesearch/bleve/search/collector.go @@ -15,11 +15,10 @@ package search import ( + "context" "time" "github.com/blevesearch/bleve/index" - - "golang.org/x/net/context" ) type Collector interface { diff --git a/vendor/github.com/blevesearch/bleve/search/collector/topn.go b/vendor/github.com/blevesearch/bleve/search/collector/topn.go index 2c7c6752df51..388370e7e704 100644 --- a/vendor/github.com/blevesearch/bleve/search/collector/topn.go +++ b/vendor/github.com/blevesearch/bleve/search/collector/topn.go @@ -15,11 +15,11 @@ package collector import ( + "context" "time" "github.com/blevesearch/bleve/index" "github.com/blevesearch/bleve/search" - "golang.org/x/net/context" ) type collectorStore interface { diff --git a/vendor/github.com/markbates/goth/provider.go b/vendor/github.com/markbates/goth/provider.go index 58d0d60bbf7b..294679d2aabc 100644 --- a/vendor/github.com/markbates/goth/provider.go +++ b/vendor/github.com/markbates/goth/provider.go @@ -1,10 +1,10 @@ package goth import ( + "context" "fmt" "net/http" - "golang.org/x/net/context" "golang.org/x/oauth2" ) diff --git a/vendor/github.com/markbates/goth/providers/facebook/facebook.go b/vendor/github.com/markbates/goth/providers/facebook/facebook.go index 266bbe220816..5c80ca747b57 100644 --- a/vendor/github.com/markbates/goth/providers/facebook/facebook.go +++ b/vendor/github.com/markbates/goth/providers/facebook/facebook.go @@ -4,17 +4,18 @@ package facebook import ( "bytes" + "crypto/hmac" + "crypto/sha256" + "encoding/hex" "encoding/json" "errors" + "fmt" "io" "io/ioutil" "net/http" "net/url" + "strings" - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "fmt" "github.com/markbates/goth" "golang.org/x/oauth2" ) @@ -22,7 +23,7 @@ import ( const ( authURL string = "https://www.facebook.com/dialog/oauth" tokenURL string = "https://graph.facebook.com/oauth/access_token" - endpointProfile string = "https://graph.facebook.com/me?fields=email,first_name,last_name,link,about,id,name,picture,location" + endpointProfile string = "https://graph.facebook.com/me?fields=" ) // New creates a new Facebook provider, and sets up important connection details. @@ -68,9 +69,9 @@ func (p *Provider) Debug(debug bool) {} // BeginAuth asks Facebook for an authentication end-point. func (p *Provider) BeginAuth(state string) (goth.Session, error) { - url := p.config.AuthCodeURL(state) + authUrl := p.config.AuthCodeURL(state) session := &Session{ - AuthURL: url, + AuthURL: authUrl, } return session, nil } @@ -96,7 +97,15 @@ func (p *Provider) FetchUser(session goth.Session) (goth.User, error) { hash.Write([]byte(sess.AccessToken)) appsecretProof := hex.EncodeToString(hash.Sum(nil)) - response, err := p.Client().Get(endpointProfile + "&access_token=" + url.QueryEscape(sess.AccessToken) + "&appsecret_proof=" + appsecretProof) + reqUrl := fmt.Sprint( + endpointProfile, + strings.Join(p.config.Scopes, ","), + "&access_token=", + url.QueryEscape(sess.AccessToken), + "&appsecret_proof=", + appsecretProof, + ) + response, err := p.Client().Get(reqUrl) if err != nil { return user, err } @@ -168,17 +177,31 @@ func newConfig(provider *Provider, scopes []string) *oauth2.Config { }, Scopes: []string{ "email", + "first_name", + "last_name", + "link", + "about", + "id", + "name", + "picture", + "location", }, } - defaultScopes := map[string]struct{}{ - "email": {}, - } - - for _, scope := range scopes { - if _, exists := defaultScopes[scope]; !exists { - c.Scopes = append(c.Scopes, scope) + // creates possibility to invoke field method like 'picture.type(large)' + var found bool + for _, sc := range scopes { + sc := sc + for i, defScope := range c.Scopes { + if defScope == strings.Split(sc, ".")[0] { + c.Scopes[i] = sc + found = true + } + } + if !found { + c.Scopes = append(c.Scopes, sc) } + found = false } return c diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go new file mode 100644 index 000000000000..606cf1f97262 --- /dev/null +++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go @@ -0,0 +1,74 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7 + +// Package ctxhttp provides helper functions for performing context-aware HTTP requests. +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +// Do sends an HTTP request with the provided http.Client and returns +// an HTTP response. +// +// If the client is nil, http.DefaultClient is used. +// +// The provided ctx must be non-nil. If it is canceled or times out, +// ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + resp, err := client.Do(req.WithContext(ctx)) + // If we got an error, and the context has been canceled, + // the context's error is probably more useful. + if err != nil { + select { + case <-ctx.Done(): + err = ctx.Err() + default: + } + } + return resp, err +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} diff --git a/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go new file mode 100644 index 000000000000..926870cc23fd --- /dev/null +++ b/vendor/golang.org/x/net/context/ctxhttp/ctxhttp_pre17.go @@ -0,0 +1,147 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.7 + +package ctxhttp // import "golang.org/x/net/context/ctxhttp" + +import ( + "io" + "net/http" + "net/url" + "strings" + + "golang.org/x/net/context" +) + +func nop() {} + +var ( + testHookContextDoneBeforeHeaders = nop + testHookDoReturned = nop + testHookDidBodyClose = nop +) + +// Do sends an HTTP request with the provided http.Client and returns an HTTP response. +// If the client is nil, http.DefaultClient is used. +// If the context is canceled or times out, ctx.Err() will be returned. +func Do(ctx context.Context, client *http.Client, req *http.Request) (*http.Response, error) { + if client == nil { + client = http.DefaultClient + } + + // TODO(djd): Respect any existing value of req.Cancel. + cancel := make(chan struct{}) + req.Cancel = cancel + + type responseAndError struct { + resp *http.Response + err error + } + result := make(chan responseAndError, 1) + + // Make local copies of test hooks closed over by goroutines below. + // Prevents data races in tests. + testHookDoReturned := testHookDoReturned + testHookDidBodyClose := testHookDidBodyClose + + go func() { + resp, err := client.Do(req) + testHookDoReturned() + result <- responseAndError{resp, err} + }() + + var resp *http.Response + + select { + case <-ctx.Done(): + testHookContextDoneBeforeHeaders() + close(cancel) + // Clean up after the goroutine calling client.Do: + go func() { + if r := <-result; r.resp != nil { + testHookDidBodyClose() + r.resp.Body.Close() + } + }() + return nil, ctx.Err() + case r := <-result: + var err error + resp, err = r.resp, r.err + if err != nil { + return resp, err + } + } + + c := make(chan struct{}) + go func() { + select { + case <-ctx.Done(): + close(cancel) + case <-c: + // The response's Body is closed. + } + }() + resp.Body = ¬ifyingReader{resp.Body, c} + + return resp, nil +} + +// Get issues a GET request via the Do function. +func Get(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Head issues a HEAD request via the Do function. +func Head(ctx context.Context, client *http.Client, url string) (*http.Response, error) { + req, err := http.NewRequest("HEAD", url, nil) + if err != nil { + return nil, err + } + return Do(ctx, client, req) +} + +// Post issues a POST request via the Do function. +func Post(ctx context.Context, client *http.Client, url string, bodyType string, body io.Reader) (*http.Response, error) { + req, err := http.NewRequest("POST", url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", bodyType) + return Do(ctx, client, req) +} + +// PostForm issues a POST request via the Do function. +func PostForm(ctx context.Context, client *http.Client, url string, data url.Values) (*http.Response, error) { + return Post(ctx, client, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} + +// notifyingReader is an io.ReadCloser that closes the notify channel after +// Close is called or a Read fails on the underlying ReadCloser. +type notifyingReader struct { + io.ReadCloser + notify chan<- struct{} +} + +func (r *notifyingReader) Read(p []byte) (int, error) { + n, err := r.ReadCloser.Read(p) + if err != nil && r.notify != nil { + close(r.notify) + r.notify = nil + } + return n, err +} + +func (r *notifyingReader) Close() error { + err := r.ReadCloser.Close() + if r.notify != nil { + close(r.notify) + r.notify = nil + } + return err +} diff --git a/vendor/golang.org/x/oauth2/LICENSE b/vendor/golang.org/x/oauth2/LICENSE index d02f24fd5288..6a66aea5eafe 100644 --- a/vendor/golang.org/x/oauth2/LICENSE +++ b/vendor/golang.org/x/oauth2/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The oauth2 Authors. All rights reserved. +Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/golang.org/x/oauth2/client_appengine.go b/vendor/golang.org/x/oauth2/client_appengine.go deleted file mode 100644 index 8962c49d1deb..000000000000 --- a/vendor/golang.org/x/oauth2/client_appengine.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -// App Engine hooks. - -package oauth2 - -import ( - "net/http" - - "golang.org/x/net/context" - "golang.org/x/oauth2/internal" - "google.golang.org/appengine/urlfetch" -) - -func init() { - internal.RegisterContextClientFunc(contextClientAppEngine) -} - -func contextClientAppEngine(ctx context.Context) (*http.Client, error) { - return urlfetch.Client(ctx), nil -} diff --git a/vendor/golang.org/x/oauth2/internal/client_appengine.go b/vendor/golang.org/x/oauth2/internal/client_appengine.go new file mode 100644 index 000000000000..7434871880a7 --- /dev/null +++ b/vendor/golang.org/x/oauth2/internal/client_appengine.go @@ -0,0 +1,13 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import "google.golang.org/appengine/urlfetch" + +func init() { + appengineClientHook = urlfetch.Client +} diff --git a/vendor/golang.org/x/oauth2/internal/doc.go b/vendor/golang.org/x/oauth2/internal/doc.go new file mode 100644 index 000000000000..03265e888af4 --- /dev/null +++ b/vendor/golang.org/x/oauth2/internal/doc.go @@ -0,0 +1,6 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package internal contains support packages for oauth2 package. +package internal diff --git a/vendor/golang.org/x/oauth2/internal/oauth2.go b/vendor/golang.org/x/oauth2/internal/oauth2.go index fbe1028d64e5..c0ab196cf461 100644 --- a/vendor/golang.org/x/oauth2/internal/oauth2.go +++ b/vendor/golang.org/x/oauth2/internal/oauth2.go @@ -2,18 +2,14 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( - "bufio" "crypto/rsa" "crypto/x509" "encoding/pem" "errors" "fmt" - "io" - "strings" ) // ParseKey converts the binary contents of a private key file @@ -30,7 +26,7 @@ func ParseKey(key []byte) (*rsa.PrivateKey, error) { if err != nil { parsedKey, err = x509.ParsePKCS1PrivateKey(key) if err != nil { - return nil, fmt.Errorf("private key should be a PEM or plain PKSC1 or PKCS8; parse error: %v", err) + return nil, fmt.Errorf("private key should be a PEM or plain PKCS1 or PKCS8; parse error: %v", err) } } parsed, ok := parsedKey.(*rsa.PrivateKey) @@ -39,38 +35,3 @@ func ParseKey(key []byte) (*rsa.PrivateKey, error) { } return parsed, nil } - -func ParseINI(ini io.Reader) (map[string]map[string]string, error) { - result := map[string]map[string]string{ - "": map[string]string{}, // root section - } - scanner := bufio.NewScanner(ini) - currentSection := "" - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if strings.HasPrefix(line, ";") { - // comment. - continue - } - if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { - currentSection = strings.TrimSpace(line[1 : len(line)-1]) - result[currentSection] = map[string]string{} - continue - } - parts := strings.SplitN(line, "=", 2) - if len(parts) == 2 && parts[0] != "" { - result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) - } - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning ini: %v", err) - } - return result, nil -} - -func CondVal(v string) []string { - if v == "" { - return nil - } - return []string{v} -} diff --git a/vendor/golang.org/x/oauth2/internal/token.go b/vendor/golang.org/x/oauth2/internal/token.go index 18328a0dcf2e..5ab17b9a5f74 100644 --- a/vendor/golang.org/x/oauth2/internal/token.go +++ b/vendor/golang.org/x/oauth2/internal/token.go @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( + "context" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -17,10 +18,10 @@ import ( "strings" "time" - "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" ) -// Token represents the crendentials used to authorize +// Token represents the credentials used to authorize // the requests to access protected resources on the OAuth 2.0 // provider's backend. // @@ -91,6 +92,7 @@ func (e *expirationTime) UnmarshalJSON(b []byte) error { var brokenAuthHeaderProviders = []string{ "https://accounts.google.com/", + "https://api.codeswholesale.com/oauth/token", "https://api.dropbox.com/", "https://api.dropboxapi.com/", "https://api.instagram.com/", @@ -99,10 +101,16 @@ var brokenAuthHeaderProviders = []string{ "https://api.pushbullet.com/", "https://api.soundcloud.com/", "https://api.twitch.tv/", + "https://id.twitch.tv/", "https://app.box.com/", + "https://api.box.com/", "https://connect.stripe.com/", + "https://login.mailchimp.com/", "https://login.microsoftonline.com/", "https://login.salesforce.com/", + "https://login.windows.net", + "https://login.live.com/", + "https://login.live-int.com/", "https://oauth.sandbox.trainingpeaks.com/", "https://oauth.trainingpeaks.com/", "https://oauth.vk.com/", @@ -117,6 +125,24 @@ var brokenAuthHeaderProviders = []string{ "https://www.strava.com/oauth/", "https://www.wunderlist.com/oauth/", "https://api.patreon.com/", + "https://sandbox.codeswholesale.com/oauth/token", + "https://api.sipgate.com/v1/authorization/oauth", + "https://api.medium.com/v1/tokens", + "https://log.finalsurge.com/oauth/token", + "https://multisport.todaysplan.com.au/rest/oauth/access_token", + "https://whats.todaysplan.com.au/rest/oauth/access_token", + "https://stackoverflow.com/oauth/access_token", + "https://account.health.nokia.com", + "https://accounts.zoho.com", +} + +// brokenAuthHeaderDomains lists broken providers that issue dynamic endpoints. +var brokenAuthHeaderDomains = []string{ + ".auth0.com", + ".force.com", + ".myshopify.com", + ".okta.com", + ".oktapreview.com", } func RegisterBrokenAuthHeaderProvider(tokenURL string) { @@ -139,6 +165,14 @@ func providerAuthHeaderWorks(tokenURL string) bool { } } + if u, err := url.Parse(tokenURL); err == nil { + for _, s := range brokenAuthHeaderDomains { + if strings.HasSuffix(u.Host, s) { + return false + } + } + } + // Assume the provider implements the spec properly // otherwise. We can add more exceptions as they're // discovered. We will _not_ be adding configurable hooks @@ -147,14 +181,14 @@ func providerAuthHeaderWorks(tokenURL string) bool { } func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values) (*Token, error) { - hc, err := ContextClient(ctx) - if err != nil { - return nil, err - } - v.Set("client_id", clientID) bustedAuth := !providerAuthHeaderWorks(tokenURL) - if bustedAuth && clientSecret != "" { - v.Set("client_secret", clientSecret) + if bustedAuth { + if clientID != "" { + v.Set("client_id", clientID) + } + if clientSecret != "" { + v.Set("client_secret", clientSecret) + } } req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode())) if err != nil { @@ -162,9 +196,9 @@ func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") if !bustedAuth { - req.SetBasicAuth(clientID, clientSecret) + req.SetBasicAuth(url.QueryEscape(clientID), url.QueryEscape(clientSecret)) } - r, err := hc.Do(req) + r, err := ctxhttp.Do(ctx, ContextClient(ctx), req) if err != nil { return nil, err } @@ -174,7 +208,10 @@ func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } if code := r.StatusCode; code < 200 || code > 299 { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v\nResponse: %s", r.Status, body) + return nil, &RetrieveError{ + Response: r, + Body: body, + } } var token *Token @@ -221,5 +258,17 @@ func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, if token.RefreshToken == "" { token.RefreshToken = v.Get("refresh_token") } + if token.AccessToken == "" { + return token, errors.New("oauth2: server response missing access_token") + } return token, nil } + +type RetrieveError struct { + Response *http.Response + Body []byte +} + +func (r *RetrieveError) Error() string { + return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) +} diff --git a/vendor/golang.org/x/oauth2/internal/transport.go b/vendor/golang.org/x/oauth2/internal/transport.go index f1f173e345db..572074a637dd 100644 --- a/vendor/golang.org/x/oauth2/internal/transport.go +++ b/vendor/golang.org/x/oauth2/internal/transport.go @@ -2,13 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( + "context" "net/http" - - "golang.org/x/net/context" ) // HTTPClient is the context key to use with golang.org/x/net/context's @@ -20,50 +18,16 @@ var HTTPClient ContextKey // because nobody else can create a ContextKey, being unexported. type ContextKey struct{} -// ContextClientFunc is a func which tries to return an *http.Client -// given a Context value. If it returns an error, the search stops -// with that error. If it returns (nil, nil), the search continues -// down the list of registered funcs. -type ContextClientFunc func(context.Context) (*http.Client, error) - -var contextClientFuncs []ContextClientFunc - -func RegisterContextClientFunc(fn ContextClientFunc) { - contextClientFuncs = append(contextClientFuncs, fn) -} +var appengineClientHook func(context.Context) *http.Client -func ContextClient(ctx context.Context) (*http.Client, error) { +func ContextClient(ctx context.Context) *http.Client { if ctx != nil { if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { - return hc, nil - } - } - for _, fn := range contextClientFuncs { - c, err := fn(ctx) - if err != nil { - return nil, err - } - if c != nil { - return c, nil + return hc } } - return http.DefaultClient, nil -} - -func ContextTransport(ctx context.Context) http.RoundTripper { - hc, err := ContextClient(ctx) - // This is a rare error case (somebody using nil on App Engine). - if err != nil { - return ErrorTransport{err} + if appengineClientHook != nil { + return appengineClientHook(ctx) } - return hc.Transport -} - -// ErrorTransport returns the specified error on RoundTrip. -// This RoundTripper should be used in rare error cases where -// error handling can be postponed to response handling time. -type ErrorTransport struct{ Err error } - -func (t ErrorTransport) RoundTrip(*http.Request) (*http.Response, error) { - return nil, t.Err + return http.DefaultClient } diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index 7b06bfe1ef14..0a3c1e163252 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -3,19 +3,20 @@ // license that can be found in the LICENSE file. // Package oauth2 provides support for making -// OAuth2 authorized and authenticated HTTP requests. +// OAuth2 authorized and authenticated HTTP requests, +// as specified in RFC 6749. // It can additionally grant authorization with Bearer JWT. package oauth2 // import "golang.org/x/oauth2" import ( "bytes" + "context" "errors" "net/http" "net/url" "strings" "sync" - "golang.org/x/net/context" "golang.org/x/oauth2/internal" ) @@ -117,21 +118,30 @@ func SetAuthURLParam(key, value string) AuthCodeOption { // that asks for permissions for the required scopes explicitly. // // State is a token to protect the user from CSRF attacks. You must -// always provide a non-zero string and validate that it matches the +// always provide a non-empty string and validate that it matches the // the state query parameter on your redirect callback. // See http://tools.ietf.org/html/rfc6749#section-10.12 for more info. // // Opts may include AccessTypeOnline or AccessTypeOffline, as well // as ApprovalForce. +// It can also be used to pass the PKCE challange. +// See https://www.oauth.com/oauth2-servers/pkce/ for more info. func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { var buf bytes.Buffer buf.WriteString(c.Endpoint.AuthURL) v := url.Values{ "response_type": {"code"}, "client_id": {c.ClientID}, - "redirect_uri": internal.CondVal(c.RedirectURL), - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - "state": internal.CondVal(state), + } + if c.RedirectURL != "" { + v.Set("redirect_uri", c.RedirectURL) + } + if len(c.Scopes) > 0 { + v.Set("scope", strings.Join(c.Scopes, " ")) + } + if state != "" { + // TODO(light): Docs say never to omit state; don't allow empty. + v.Set("state", state) } for _, opt := range opts { opt.setValue(v) @@ -157,12 +167,15 @@ func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { // The HTTP client to use is derived from the context. // If nil, http.DefaultClient is used. func (c *Config) PasswordCredentialsToken(ctx context.Context, username, password string) (*Token, error) { - return retrieveToken(ctx, c, url.Values{ + v := url.Values{ "grant_type": {"password"}, "username": {username}, "password": {password}, - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) + } + if len(c.Scopes) > 0 { + v.Set("scope", strings.Join(c.Scopes, " ")) + } + return retrieveToken(ctx, c, v) } // Exchange converts an authorization code into a token. @@ -175,13 +188,21 @@ func (c *Config) PasswordCredentialsToken(ctx context.Context, username, passwor // // The code will be in the *http.Request.FormValue("code"). Before // calling Exchange, be sure to validate FormValue("state"). -func (c *Config) Exchange(ctx context.Context, code string) (*Token, error) { - return retrieveToken(ctx, c, url.Values{ - "grant_type": {"authorization_code"}, - "code": {code}, - "redirect_uri": internal.CondVal(c.RedirectURL), - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) +// +// Opts may include the PKCE verifier code if previously used in AuthCodeURL. +// See https://www.oauth.com/oauth2-servers/pkce/ for more info. +func (c *Config) Exchange(ctx context.Context, code string, opts ...AuthCodeOption) (*Token, error) { + v := url.Values{ + "grant_type": {"authorization_code"}, + "code": {code}, + } + if c.RedirectURL != "" { + v.Set("redirect_uri", c.RedirectURL) + } + for _, opt := range opts { + opt.setValue(v) + } + return retrieveToken(ctx, c, v) } // Client returns an HTTP client using the provided token. @@ -292,20 +313,20 @@ var HTTPClient internal.ContextKey // NewClient creates an *http.Client from a Context and TokenSource. // The returned client is not valid beyond the lifetime of the context. // +// Note that if a custom *http.Client is provided via the Context it +// is used only for token acquisition and is not used to configure the +// *http.Client returned from NewClient. +// // As a special case, if src is nil, a non-OAuth2 client is returned // using the provided context. This exists to support related OAuth2 // packages. func NewClient(ctx context.Context, src TokenSource) *http.Client { if src == nil { - c, err := internal.ContextClient(ctx) - if err != nil { - return &http.Client{Transport: internal.ErrorTransport{Err: err}} - } - return c + return internal.ContextClient(ctx) } return &http.Client{ Transport: &Transport{ - Base: internal.ContextTransport(ctx), + Base: internal.ContextClient(ctx).Transport, Source: ReuseTokenSource(nil, src), }, } diff --git a/vendor/golang.org/x/oauth2/token.go b/vendor/golang.org/x/oauth2/token.go index 7a3167f15b04..9be1ae537376 100644 --- a/vendor/golang.org/x/oauth2/token.go +++ b/vendor/golang.org/x/oauth2/token.go @@ -5,13 +5,14 @@ package oauth2 import ( + "context" + "fmt" "net/http" "net/url" "strconv" "strings" "time" - "golang.org/x/net/context" "golang.org/x/oauth2/internal" ) @@ -20,7 +21,7 @@ import ( // expirations due to client-server time mismatches. const expiryDelta = 10 * time.Second -// Token represents the crendentials used to authorize +// Token represents the credentials used to authorize // the requests to access protected resources on the OAuth 2.0 // provider's backend. // @@ -123,7 +124,7 @@ func (t *Token) expired() bool { if t.Expiry.IsZero() { return false } - return t.Expiry.Add(-expiryDelta).Before(time.Now()) + return t.Expiry.Round(0).Add(-expiryDelta).Before(time.Now()) } // Valid reports whether t is non-nil, has an AccessToken, and is not expired. @@ -152,7 +153,23 @@ func tokenFromInternal(t *internal.Token) *Token { func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) { tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v) if err != nil { + if rErr, ok := err.(*internal.RetrieveError); ok { + return nil, (*RetrieveError)(rErr) + } return nil, err } return tokenFromInternal(tk), nil } + +// RetrieveError is the error returned when the token endpoint returns a +// non-2XX HTTP status code. +type RetrieveError struct { + Response *http.Response + // Body is the body that was consumed by reading Response.Body. + // It may be truncated. + Body []byte +} + +func (r *RetrieveError) Error() string { + return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) +} diff --git a/vendor/golang.org/x/oauth2/transport.go b/vendor/golang.org/x/oauth2/transport.go index 92ac7e2531f4..aa0d34f1e0ea 100644 --- a/vendor/golang.org/x/oauth2/transport.go +++ b/vendor/golang.org/x/oauth2/transport.go @@ -31,9 +31,17 @@ type Transport struct { } // RoundTrip authorizes and authenticates the request with an -// access token. If no token exists or token is expired, -// tries to refresh/fetch a new token. +// access token from Transport's Source. func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { + reqBodyClosed := false + if req.Body != nil { + defer func() { + if !reqBodyClosed { + req.Body.Close() + } + }() + } + if t.Source == nil { return nil, errors.New("oauth2: Transport's Source is nil") } @@ -46,6 +54,10 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { token.SetAuthHeader(req2) t.setModReq(req, req2) res, err := t.base().RoundTrip(req2) + + // req.Body is assumed to have been closed by the base RoundTripper. + reqBodyClosed = true + if err != nil { t.setModReq(req, nil) return nil, err From dd76689090b4808912cd9c95c459dff1301b5e8d Mon Sep 17 00:00:00 2001 From: Lanre Adelowo Date: Thu, 15 Nov 2018 02:00:04 +0100 Subject: [PATCH 425/447] Block registration based on email domain (#5157) * implement email domain whitelist --- custom/conf/app.ini.sample | 3 + .../doc/advanced/config-cheat-sheet.en-us.md | 2 + modules/auth/user_form.go | 29 +++++++++ modules/auth/user_form_test.go | 64 +++++++++++++++++++ modules/setting/setting.go | 2 + options/locale/locale_en-US.ini | 1 + routers/user/auth.go | 5 ++ 7 files changed, 106 insertions(+) create mode 100644 modules/auth/user_form_test.go diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index f42fa122b817..92d72e8c9bbe 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -311,6 +311,9 @@ ACTIVE_CODE_LIVE_MINUTES = 180 RESET_PASSWD_CODE_LIVE_MINUTES = 180 ; Whether a new user needs to confirm their email when registering. REGISTER_EMAIL_CONFIRM = false +; List of domain names that are allowed to be used to register on a Gitea instance +; gitea.io,example.com +EMAIL_DOMAIN_WHITELIST= ; Disallow registration, only allow admins to create accounts. DISABLE_REGISTRATION = false ; Allow registration only using third part services, it works only when DISABLE_REGISTRATION is false diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md index b0ab78d2f14a..a3bded679df1 100644 --- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md +++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md @@ -194,6 +194,8 @@ Values containing `#` or `;` must be quoted using `` ` `` or `"""`. - `RECAPTCHA_SITEKEY`: **""**: Go to https://www.google.com/recaptcha/admin to get a sitekey for recaptcha. - `DEFAULT_ENABLE_DEPENDENCIES`: **true** Enable this to have dependencies enabled by default. - `ENABLE_USER_HEATMAP`: **true** Enable this to display the heatmap on users profiles. +- `EMAIL_DOMAIN_WHITELIST`: **\**: If non-empty, list of domain names that can only be used to register + on this instance. ## Webhook (`webhook`) diff --git a/modules/auth/user_form.go b/modules/auth/user_form.go index 43ddb29c76e6..c281672fe121 100644 --- a/modules/auth/user_form.go +++ b/modules/auth/user_form.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -6,6 +7,9 @@ package auth import ( "mime/multipart" + "strings" + + "code.gitea.io/gitea/modules/setting" "github.com/go-macaron/binding" "gopkg.in/macaron.v1" @@ -84,6 +88,31 @@ func (f *RegisterForm) Validate(ctx *macaron.Context, errs binding.Errors) bindi return validate(errs, ctx.Data, f, ctx.Locale) } +// IsEmailDomainWhitelisted validates that the email address +// provided by the user matches what has been configured . +// If the domain whitelist from the config is empty, it marks the +// email as whitelisted +func (f RegisterForm) IsEmailDomainWhitelisted() bool { + if len(setting.Service.EmailDomainWhitelist) == 0 { + return true + } + + n := strings.LastIndex(f.Email, "@") + if n <= 0 { + return false + } + + domain := strings.ToLower(f.Email[n+1:]) + + for _, v := range setting.Service.EmailDomainWhitelist { + if strings.ToLower(v) == domain { + return true + } + } + + return false +} + // MustChangePasswordForm form for updating your password after account creation // by an admin type MustChangePasswordForm struct { diff --git a/modules/auth/user_form_test.go b/modules/auth/user_form_test.go new file mode 100644 index 000000000000..084174622e15 --- /dev/null +++ b/modules/auth/user_form_test.go @@ -0,0 +1,64 @@ +// Copyright 2018 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package auth + +import ( + "testing" + + "code.gitea.io/gitea/modules/setting" + + "github.com/stretchr/testify/assert" +) + +func TestRegisterForm_IsDomainWhiteList_Empty(t *testing.T) { + _ = setting.Service + + setting.Service.EmailDomainWhitelist = []string{} + + form := RegisterForm{} + + assert.True(t, form.IsEmailDomainWhitelisted()) +} + +func TestRegisterForm_IsDomainWhiteList_InvalidEmail(t *testing.T) { + _ = setting.Service + + setting.Service.EmailDomainWhitelist = []string{"gitea.io"} + + tt := []struct { + email string + }{ + {"securitygieqqq"}, + {"hdudhdd"}, + } + + for _, v := range tt { + form := RegisterForm{Email: v.email} + + assert.False(t, form.IsEmailDomainWhitelisted()) + } +} + +func TestRegisterForm_IsDomainWhiteList_ValidEmail(t *testing.T) { + _ = setting.Service + + setting.Service.EmailDomainWhitelist = []string{"gitea.io"} + + tt := []struct { + email string + valid bool + }{ + {"security@gitea.io", true}, + {"security@gITea.io", true}, + {"hdudhdd", false}, + {"seee@example.com", false}, + } + + for _, v := range tt { + form := RegisterForm{Email: v.email} + + assert.Equal(t, v.valid, form.IsEmailDomainWhitelisted()) + } +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index b31162c140bf..b0bcd2ead854 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1215,6 +1215,7 @@ var Service struct { ActiveCodeLives int ResetPwdCodeLives int RegisterEmailConfirm bool + EmailDomainWhitelist []string DisableRegistration bool AllowOnlyExternalRegistration bool ShowRegistrationButton bool @@ -1248,6 +1249,7 @@ func newService() { Service.ResetPwdCodeLives = sec.Key("RESET_PASSWD_CODE_LIVE_MINUTES").MustInt(180) Service.DisableRegistration = sec.Key("DISABLE_REGISTRATION").MustBool() Service.AllowOnlyExternalRegistration = sec.Key("ALLOW_ONLY_EXTERNAL_REGISTRATION").MustBool() + Service.EmailDomainWhitelist = sec.Key("EMAIL_DOMAIN_WHITELIST").Strings(",") Service.ShowRegistrationButton = sec.Key("SHOW_REGISTRATION_BUTTON").MustBool(!(Service.DisableRegistration || Service.AllowOnlyExternalRegistration)) Service.RequireSignInView = sec.Key("REQUIRE_SIGNIN_VIEW").MustBool() Service.EnableReverseProxyAuth = sec.Key("ENABLE_REVERSE_PROXY_AUTHENTICATION").MustBool() diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index a82acc3dd10f..f806d631ea87 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -242,6 +242,7 @@ openid_register_title = Create new account openid_register_desc = The chosen OpenID URI is unknown. Associate it with a new account here. openid_signin_desc = Enter your OpenID URI. For example: https://anne.me, bob.openid.org.cn or gnusocial.net/carry. disable_forgot_password_mail = Password reset is disabled. Please contact your site administrator. +email_domain_blacklisted = You cannot register with your email address. [mail] activate_account = Please activate your account diff --git a/routers/user/auth.go b/routers/user/auth.go index 25aa437efdbb..24b35e6f6227 100644 --- a/routers/user/auth.go +++ b/routers/user/auth.go @@ -948,6 +948,11 @@ func SignUpPost(ctx *context.Context, cpt *captcha.Captcha, form auth.RegisterFo } } + if !form.IsEmailDomainWhitelisted() { + ctx.RenderWithErr(ctx.Tr("auth.email_domain_blacklisted"), tplSignUp, &form) + return + } + if form.Password != form.Retype { ctx.Data["Err_Password"] = true ctx.RenderWithErr(ctx.Tr("form.password_not_match"), tplSignUp, &form) From dc076dfc7403a1d44cbc0f892ef910a0b3f2f9fa Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Thu, 15 Nov 2018 01:01:52 +0000 Subject: [PATCH 426/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ja-JP.ini | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index 97c8fac1a259..c0d874f370ab 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -524,7 +524,8 @@ create_repo=リポジトリを作成 default_branch=デフォルトブランチ mirror_prune=Prune mirror_prune_desc=不要になった古いリモートトラッキング参照を削除 -mirror_interval_invalid=ミラーの間隔が不正です。 +mirror_interval=ミラー間隔 (有効な時間の単位は'h'、'm'、's')。 自動的な同期を無効にする場合は0。 +mirror_interval_invalid=ミラー間隔が不正です。 mirror_address=クローンするURL mirror_address_desc=必要な認証情報はURLに含めてください。 mirror_last_synced=前回の同期 From 790697630366604420214b05f88649f2527973a9 Mon Sep 17 00:00:00 2001 From: Lauris BH Date: Thu, 15 Nov 2018 03:20:13 +0200 Subject: [PATCH 427/447] Implement pasting image from clipboard for browsers that supports that (#5317) --- public/js/index.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/public/js/index.js b/public/js/index.js index c6531cb2255e..9e33ac7de393 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -171,6 +171,87 @@ function initReactionSelector(parent) { }); } +function insertAtCursor(field, value) { + if (field.selectionStart || field.selectionStart === 0) { + var startPos = field.selectionStart; + var endPos = field.selectionEnd; + field.value = field.value.substring(0, startPos) + + value + + field.value.substring(endPos, field.value.length); + field.selectionStart = startPos + value.length; + field.selectionEnd = startPos + value.length; + } else { + field.value += value; + } +} + +function replaceAndKeepCursor(field, oldval, newval) { + if (field.selectionStart || field.selectionStart === 0) { + var startPos = field.selectionStart; + var endPos = field.selectionEnd; + field.value = field.value.replace(oldval, newval); + field.selectionStart = startPos + newval.length - oldval.length; + field.selectionEnd = endPos + newval.length - oldval.length; + } else { + field.value = field.value.replace(oldval, newval); + } +} + +function retrieveImageFromClipboardAsBlob(pasteEvent, callback){ + if (!pasteEvent.clipboardData) { + return; + } + + var items = pasteEvent.clipboardData.items; + if (typeof(items) === "undefined") { + return; + } + + for (var i = 0; i < items.length; i++) { + if (items[i].type.indexOf("image") === -1) continue; + var blob = items[i].getAsFile(); + + if (typeof(callback) === "function") { + pasteEvent.preventDefault(); + pasteEvent.stopPropagation(); + callback(blob); + } + } +} + +function uploadFile(file, callback) { + var xhr = new XMLHttpRequest(); + + xhr.onload = function() { + if (xhr.status == 200) { + callback(xhr.responseText); + } + }; + + xhr.open("post", suburl + "/attachments", true); + xhr.setRequestHeader("X-Csrf-Token", csrf); + var formData = new FormData(); + formData.append('file', file, file.name); + xhr.send(formData); +} + +function initImagePaste(target) { + target.each(function(i, field) { + field.addEventListener('paste', function(event){ + retrieveImageFromClipboardAsBlob(event, function(img) { + var name = img.name.substr(0, img.name.lastIndexOf('.')); + insertAtCursor(field, '![' + name + ']()'); + uploadFile(img, function(res) { + var data = JSON.parse(res); + replaceAndKeepCursor(field, '![' + name + ']()', '![' + name + '](' + suburl + '/attachments/' + data.uuid + ')'); + var input = $('').val(data.uuid); + $('.files').append(input); + }); + }); + }, false); + }); +} + function initCommentForm() { if ($('.comment.form').length == 0) { return @@ -178,6 +259,7 @@ function initCommentForm() { initBranchSelector(); initCommentPreviewTab($('.comment.form')); + initImagePaste($('.comment.form textarea')); // Listsubmit function initListSubmits(selector, outerSelector) { From 74f03d379c4118b838bef8da61d9986263c89612 Mon Sep 17 00:00:00 2001 From: Lucien Kerl Date: Fri, 16 Nov 2018 12:12:44 +0100 Subject: [PATCH 428/447] added the ability to set labels on the "edit pull request" api (#5347) Signed-off-by: Lucien Kerl --- routers/api/v1/repo/pull.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/routers/api/v1/repo/pull.go b/routers/api/v1/repo/pull.go index 5ce6f868bcd0..83ef886d7d31 100644 --- a/routers/api/v1/repo/pull.go +++ b/routers/api/v1/repo/pull.go @@ -405,6 +405,18 @@ func EditPullRequest(ctx *context.APIContext, form api.EditPullRequestOption) { } } + if ctx.Repo.IsWriter() && (form.Labels != nil && len(form.Labels) > 0) { + labels, err := models.GetLabelsInRepoByIDs(ctx.Repo.Repository.ID, form.Labels) + if err != nil { + ctx.Error(500, "GetLabelsInRepoByIDsError", err) + return + } + if err = issue.ReplaceLabels(labels, ctx.User); err != nil { + ctx.Error(500, "ReplaceLabelsError", err) + return + } + } + if err = models.UpdateIssue(issue); err != nil { ctx.Error(500, "UpdateIssue", err) return From 89a1eb292500fffd46fb9fc6fc161778663fc053 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Fri, 16 Nov 2018 11:14:34 +0000 Subject: [PATCH 429/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_pt-BR.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini index 7b5ef59b1f3c..93e954bcd410 100644 --- a/options/locale/locale_pt-BR.ini +++ b/options/locale/locale_pt-BR.ini @@ -242,6 +242,7 @@ openid_register_title=Criar uma nova conta openid_register_desc=O URI do OpenID escolhido é desconhecido. Associe-o com uma nova conta aqui. openid_signin_desc=Digite a URI do seu OpenID. Por exemplo: https://anne.me, bob.openid.org.cn ou gnusocial.net/carry. disable_forgot_password_mail=Redefinição de senha está desabilitada. Entre em contato com o administrador do site. +email_domain_blacklisted=Você não pode se cadastrar com seu endereço de e-mail. [mail] activate_account=Por favor, ative sua conta From cb37bc112203c4169c26a56aa1002b29b1981684 Mon Sep 17 00:00:00 2001 From: techknowlogick Date: Fri, 16 Nov 2018 11:44:13 -0500 Subject: [PATCH 430/447] Set ACL on uploads (#5344) To support https://github.com/go-gitea/infrastructure/pull/39 --- .drone.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.drone.yml b/.drone.yml index 1a770ef4b659..60f9cdf6a245 100644 --- a/.drone.yml +++ b/.drone.yml @@ -262,6 +262,7 @@ pipeline: pull: true secrets: [ aws_access_key_id, aws_secret_access_key ] bucket: releases + acl: public-read endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ @@ -275,6 +276,7 @@ pipeline: pull: true secrets: [ aws_access_key_id, aws_secret_access_key ] bucket: releases + acl: public-read endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ @@ -289,6 +291,7 @@ pipeline: pull: true secrets: [ aws_access_key_id, aws_secret_access_key ] bucket: releases + acl: public-read endpoint: https://storage.gitea.io path_style: true strip_prefix: dist/release/ From 5de13488f666c1b625cb4f510fbbf17aa3db3313 Mon Sep 17 00:00:00 2001 From: Florian Eitel Date: Sun, 18 Nov 2018 19:25:32 +0100 Subject: [PATCH 431/447] Migration fixes for gogs (0.11.66) to gitea (1.6.0) #5318 (#5341) * Remove field from migration to support upgrades from older version That will ensure the field does not get queried in the Select if it does not exist yet: ``` [I] [SQL] SELECT "id", "repo_id", "index", "poster_id", "name", "content", "milestone_id", "priority", "assignee_id", "is_closed", "is_pull", "num_comments", "ref", "deadline_unix", "created_unix", "updated_unix [...itea/routers/init.go:60 GlobalInit()] [E] Failed to initialize ORM engine: migrate: do migrate: pq: column "ref" does not exist ``` see #5318 * Skip remove stale watcher migration if not required Otherwise the migration will fail if executed from a older database version without multiple IssueWatch feature. ``` 2018/11/11 23:51:14 [I] [SQL] SELECT DISTINCT "issue_watch"."user_id", "issue"."repo_id" FROM "issue_watch" INNER JOIN issue ON issue_watch.issue_id = issue.id WHERE (issue_watch.is_watching = $1) LIMIT 50 []int [...itea/routers/init.go:60 GlobalInit()] [E] Failed to initialize ORM engine: migrate: do migrate: pq: relation "issue_watch" does not exist ``` see #5318 --- models/migrations/v64.go | 1 - models/migrations/v67.go | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/models/migrations/v64.go b/models/migrations/v64.go index 5958cd8f8259..5bc7e36b516e 100644 --- a/models/migrations/v64.go +++ b/models/migrations/v64.go @@ -26,7 +26,6 @@ func addMultipleAssignees(x *xorm.Engine) error { IsClosed bool `xorm:"INDEX"` IsPull bool `xorm:"INDEX"` // Indicates whether is a pull request or not. NumComments int - Ref string DeadlineUnix util.TimeStamp `xorm:"INDEX"` CreatedUnix util.TimeStamp `xorm:"INDEX created"` diff --git a/models/migrations/v67.go b/models/migrations/v67.go index 27822191911e..d4a7497ec91b 100644 --- a/models/migrations/v67.go +++ b/models/migrations/v67.go @@ -5,6 +5,8 @@ package migrations import ( + "fmt" + "code.gitea.io/gitea/modules/setting" "github.com/go-xorm/xorm" @@ -70,6 +72,13 @@ func removeStaleWatches(x *xorm.Engine) error { return err } + var issueWatch IssueWatch + if exist, err := sess.IsTableExist(&issueWatch); err != nil { + return fmt.Errorf("IsExist IssueWatch: %v", err) + } else if !exist { + return nil + } + repoCache := make(map[int64]*Repository) err := x.BufferSize(setting.IterateBufferSize).Iterate(new(Watch), func(idx int, bean interface{}) error { From fd9ea48245e7d5c813eee9d0ee719c8704083746 Mon Sep 17 00:00:00 2001 From: GiteaBot Date: Sun, 18 Nov 2018 18:27:47 +0000 Subject: [PATCH 432/447] [skip ci] Updated translations via Crowdin --- options/locale/locale_ja-JP.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini index c0d874f370ab..303ba29feece 100644 --- a/options/locale/locale_ja-JP.ini +++ b/options/locale/locale_ja-JP.ini @@ -242,6 +242,7 @@ openid_register_title=アカウント新規作成 openid_register_desc=選択したOpenID URIは未登録です。 ここで新しいアカウントと関連付けます。 openid_signin_desc=あなたのOpenID URIを入力してください。 例: https://anne.me、bob.openid.org.cn、nusocial.net/carry disable_forgot_password_mail=パスワードリセット機能は無効になっています。 サイト管理者にお問い合わせください。 +email_domain_blacklisted=あなたのメールアドレスでは登録することはできません。 [mail] activate_account=あなたのアカウントをアクティベートしてください。 From 154faf766b29166444bceb4c7a7b5c1147751568 Mon Sep 17 00:00:00 2001 From: Peter Hoffmann Date: Sun, 18 Nov 2018 19:45:40 +0100 Subject: [PATCH 433/447] Add raw blob endpoint to get objects by SHA ID (#5334) * Add raw blob endpoint This should make it possible to download raw blobs directly from /:repo/:username/raw/blob/:sha1 URLs. * fix: Make it work * As an SHA-ID is no path getRefNameFromPath can't be used to verify file specifying parameter * added relevant change in go-gitea/git #132 Signed-off-by: Berengar W. Lehr * Update Gopkg.lock Can't update all vendors due to errors Signed-off-by: Berengar W. Lehr * style: Add Gitea copyright header * feat: Added integration test for /repo/u/r/raw/blob * fix: correct year in copyright header --- Gopkg.lock | 4 ++-- integrations/download_test.go | 24 +++++++++++++++++++++ modules/context/repo.go | 11 ++++++++++ routers/repo/download.go | 17 +++++++++++++++ routers/routes/routes.go | 1 + vendor/code.gitea.io/git/repo_blob.go | 30 +++++++++++++++++++++++++++ 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 integrations/download_test.go create mode 100644 vendor/code.gitea.io/git/repo_blob.go diff --git a/Gopkg.lock b/Gopkg.lock index cbc089fead46..a4efca060f78 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -3,11 +3,11 @@ [[projects]] branch = "master" - digest = "1:835585f8450b4ec12252d032b0f13e6571ecf846e49076f69067f2503a7c1e07" + digest = "1:296fd9dfbae66f6feeb09c7163ec39c262de425289154430a55d0a248c520486" name = "code.gitea.io/git" packages = ["."] pruneopts = "NUT" - revision = "6ef79e80b3b06ca13a1f3a7b940903ebc73b44cb" + revision = "d945eda535aa7d6b3c1f486279df2a3f7d05f78b" [[projects]] branch = "master" diff --git a/integrations/download_test.go b/integrations/download_test.go new file mode 100644 index 000000000000..0d5fef6bab2d --- /dev/null +++ b/integrations/download_test.go @@ -0,0 +1,24 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDownloadByID(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user2") + + // Request raw blob + req := NewRequest(t, "GET", "/user2/repo1/raw/blob/4b4851ad51df6a7d9f25c979345979eaeb5b349f") + resp := session.MakeRequest(t, req, http.StatusOK) + + assert.Equal(t, "# repo1\n\nDescription for repo1", resp.Body.String()) +} diff --git a/modules/context/repo.go b/modules/context/repo.go index 7221ad7c8a1d..be08bc4c77f9 100644 --- a/modules/context/repo.go +++ b/modules/context/repo.go @@ -484,6 +484,8 @@ const ( RepoRefTag // RepoRefCommit commit RepoRefCommit + // RepoRefBlob blob + RepoRefBlob ) // RepoRef handles repository reference names when the ref name is not @@ -519,6 +521,9 @@ func getRefName(ctx *Context, pathType RepoRefType) string { if refName := getRefName(ctx, RepoRefCommit); len(refName) > 0 { return refName } + if refName := getRefName(ctx, RepoRefBlob); len(refName) > 0 { + return refName + } ctx.Repo.TreePath = path return ctx.Repo.Repository.DefaultBranch case RepoRefBranch: @@ -531,6 +536,12 @@ func getRefName(ctx *Context, pathType RepoRefType) string { ctx.Repo.TreePath = strings.Join(parts[1:], "/") return parts[0] } + case RepoRefBlob: + _, err := ctx.Repo.GitRepo.GetBlob(path) + if err != nil { + return "" + } + return path default: log.Error(4, "Unrecognized path type: %v", path) } diff --git a/routers/repo/download.go b/routers/repo/download.go index 820a98c0dc7f..a863236d6ea5 100644 --- a/routers/repo/download.go +++ b/routers/repo/download.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -69,3 +70,19 @@ func SingleDownload(ctx *context.Context) { ctx.ServerError("ServeBlob", err) } } + +// DownloadByID download a file by sha1 ID +func DownloadByID(ctx *context.Context) { + blob, err := ctx.Repo.GitRepo.GetBlob(ctx.Params("sha")) + if err != nil { + if git.IsErrNotExist(err) { + ctx.NotFound("GetBlob", nil) + } else { + ctx.ServerError("GetBlob", err) + } + return + } + if err = ServeBlob(ctx, blob); err != nil { + ctx.ServerError("ServeBlob", err) + } +} diff --git a/routers/routes/routes.go b/routers/routes/routes.go index af216866bbfc..06292557b3f3 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -693,6 +693,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("/branch/*", context.RepoRefByType(context.RepoRefBranch), repo.SingleDownload) m.Get("/tag/*", context.RepoRefByType(context.RepoRefTag), repo.SingleDownload) m.Get("/commit/*", context.RepoRefByType(context.RepoRefCommit), repo.SingleDownload) + m.Get("/blob/:sha", context.RepoRefByType(context.RepoRefBlob), repo.DownloadByID) // "/*" route is deprecated, and kept for backward compatibility m.Get("/*", context.RepoRefByType(context.RepoRefLegacy), repo.SingleDownload) }, repo.MustBeNotBare, context.CheckUnit(models.UnitTypeCode)) diff --git a/vendor/code.gitea.io/git/repo_blob.go b/vendor/code.gitea.io/git/repo_blob.go new file mode 100644 index 000000000000..a9445a1f7ab7 --- /dev/null +++ b/vendor/code.gitea.io/git/repo_blob.go @@ -0,0 +1,30 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package git + +func (repo *Repository) getBlob(id SHA1) (*Blob, error) { + if _, err := NewCommand("cat-file", "-p", id.String()).RunInDir(repo.Path); err != nil { + return nil, ErrNotExist{id.String(), ""} + } + + return &Blob{ + repo: repo, + TreeEntry: &TreeEntry{ + ID: id, + ptree: &Tree{ + repo: repo, + }, + }, + }, nil +} + +// GetBlob finds the blob object in the repository. +func (repo *Repository) GetBlob(idStr string) (*Blob, error) { + id, err := NewIDFromString(idStr) + if err != nil { + return nil, err + } + return repo.getBlob(id) +} From a74bb765290ff6422d21ad60e121816f83178e64 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Tue, 20 Nov 2018 10:54:09 +0100 Subject: [PATCH 434/447] app.ini.sample: add ENABLE_USER_HEATMAP default config (#5362) Doc: https://github.com/go-gitea/gitea/blob/b97af15de67b04fd259bd70a4abbc873f12e9491/docs/content/doc/advanced/config-cheat-sheet.en-us.md#service-service --- custom/conf/app.ini.sample | 2 ++ 1 file changed, 2 insertions(+) diff --git a/custom/conf/app.ini.sample b/custom/conf/app.ini.sample index 92d72e8c9bbe..68207840e47d 100644 --- a/custom/conf/app.ini.sample +++ b/custom/conf/app.ini.sample @@ -342,6 +342,8 @@ DEFAULT_ALLOW_CREATE_ORGANIZATION = true ; Default value for EnableDependencies ; Repositories will use depencies by default depending on this setting DEFAULT_ENABLE_DEPENDENCIES = true +; Enable heatmap on users profiles. +ENABLE_USER_HEATMAP = true ; Enable Timetracking ENABLE_TIMETRACKING = true ; Default value for EnableTimetracking From 15e42cf961dbb0d59a7188ab4f2d349d0023450b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Nov 2018 01:10:18 +0800 Subject: [PATCH 435/447] dont' send assign webhooks when creating issue (#5365) --- models/issue_assignees.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/models/issue_assignees.go b/models/issue_assignees.go index b4f346974b31..09d4d310dc6b 100644 --- a/models/issue_assignees.go +++ b/models/issue_assignees.go @@ -159,12 +159,13 @@ func (issue *Issue) changeAssignee(sess *xorm.Session, doer *User, assigneeID in return fmt.Errorf("createAssigneeComment: %v", err) } + // if issue/pull is in the middle of creation - don't call webhook + if isCreate { + return nil + } + mode, _ := accessLevel(sess, doer.ID, issue.Repo) if issue.IsPull { - // if pull request is in the middle of creation - don't call webhook - if isCreate { - return nil - } if err = issue.loadPullRequest(sess); err != nil { return fmt.Errorf("loadPullRequest: %v", err) } From 55631336782c1c5b98195b2456d26f04895c3dd4 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Nov 2018 01:31:30 +0800 Subject: [PATCH 436/447] add api for user to create org (#5268) * add api for user to create org * remove unused blank line on the swagger file end * fix create and add test * fix tests * fix routes of create org API * fix bug * add copyright heads --- integrations/api_org_test.go | 48 ++++++++++++++++++++++++++++++++ routers/api/v1/api.go | 2 ++ routers/api/v1/org/org.go | 51 ++++++++++++++++++++++++++++++++++ templates/swagger/v1_json.tmpl | 36 ++++++++++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 integrations/api_org_test.go diff --git a/integrations/api_org_test.go b/integrations/api_org_test.go new file mode 100644 index 000000000000..d30b746738a9 --- /dev/null +++ b/integrations/api_org_test.go @@ -0,0 +1,48 @@ +// Copyright 2018 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package integrations + +import ( + "net/http" + "strings" + "testing" + + "code.gitea.io/gitea/models" + api "code.gitea.io/sdk/gitea" + + "github.com/stretchr/testify/assert" +) + +func TestAPIOrg(t *testing.T) { + prepareTestEnv(t) + + session := loginUser(t, "user1") + + token := getTokenForLoggedInUser(t, session) + var org = api.CreateOrgOption{ + UserName: "user1_org", + FullName: "User1's organization", + Description: "This organization created by user1", + Website: "https://try.gitea.io", + Location: "Shanghai", + } + req := NewRequestWithJSON(t, "POST", "/api/v1/orgs?token="+token, &org) + resp := session.MakeRequest(t, req, http.StatusCreated) + + var apiOrg api.Organization + DecodeJSON(t, resp, &apiOrg) + + assert.Equal(t, org.UserName, apiOrg.UserName) + assert.Equal(t, org.FullName, apiOrg.FullName) + assert.Equal(t, org.Description, apiOrg.Description) + assert.Equal(t, org.Website, apiOrg.Website) + assert.Equal(t, org.Location, apiOrg.Location) + + models.AssertExistsAndLoadBean(t, &models.User{ + Name: org.UserName, + LowerName: strings.ToLower(org.UserName), + FullName: org.FullName, + }) +} diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 6ee9ad6e0c65..c853ee1c8239 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1,4 +1,5 @@ // Copyright 2015 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -577,6 +578,7 @@ func RegisterRoutes(m *macaron.Macaron) { // Organizations m.Get("/user/orgs", reqToken(), org.ListMyOrgs) m.Get("/users/:username/orgs", org.ListUserOrgs) + m.Post("/orgs", reqToken(), bind(api.CreateOrgOption{}), org.Create) m.Group("/orgs/:orgname", func() { m.Get("/repos", user.ListOrgRepos) m.Combo("").Get(org.Get). diff --git a/routers/api/v1/org/org.go b/routers/api/v1/org/org.go index 29d45d2f2ed6..93c2ed7a8895 100644 --- a/routers/api/v1/org/org.go +++ b/routers/api/v1/org/org.go @@ -1,4 +1,5 @@ // Copyright 2015 The Gogs Authors. All rights reserved. +// Copyright 2018 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -62,6 +63,56 @@ func ListUserOrgs(ctx *context.APIContext) { listUserOrgs(ctx, u, false) } +// Create api for create organization +func Create(ctx *context.APIContext, form api.CreateOrgOption) { + // swagger:operation POST /orgs organization orgCreate + // --- + // summary: Create an organization + // consumes: + // - application/json + // produces: + // - application/json + // parameters: + // - name: organization + // in: body + // required: true + // schema: { "$ref": "#/definitions/CreateOrgOption" } + // responses: + // "201": + // "$ref": "#/responses/Organization" + // "403": + // "$ref": "#/responses/forbidden" + // "422": + // "$ref": "#/responses/validationError" + + if !ctx.User.AllowCreateOrganization { + ctx.Error(403, "Create organization not allowed", nil) + return + } + + org := &models.User{ + Name: form.UserName, + FullName: form.FullName, + Description: form.Description, + Website: form.Website, + Location: form.Location, + IsActive: true, + Type: models.UserTypeOrganization, + } + if err := models.CreateOrganization(org, ctx.User); err != nil { + if models.IsErrUserAlreadyExist(err) || + models.IsErrNameReserved(err) || + models.IsErrNamePatternNotAllowed(err) { + ctx.Error(422, "", err) + } else { + ctx.Error(500, "CreateOrganization", err) + } + return + } + + ctx.JSON(201, convert.ToOrganization(org)) +} + // Get get an organization func Get(ctx *context.APIContext) { // swagger:operation GET /orgs/{org} organization orgGet diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 5c8c666041f5..dada2c98e390 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -406,6 +406,42 @@ } } }, + "/orgs": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "organization" + ], + "summary": "Create an organization", + "operationId": "orgCreate", + "parameters": [ + { + "name": "organization", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateOrgOption" + } + } + ], + "responses": { + "201": { + "$ref": "#/responses/Organization" + }, + "403": { + "$ref": "#/responses/forbidden" + }, + "422": { + "$ref": "#/responses/validationError" + } + } + } + }, "/orgs/{org}": { "get": { "produces": [ From d8057451cd7cdc65ab5cfd7a5ca80ffaa6389138 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 21 Nov 2018 06:11:21 +0800 Subject: [PATCH 437/447] support envs on external render commands (#5278) --- modules/markup/external/external.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/markup/external/external.go b/modules/markup/external/external.go index 73bf7a327e7a..5963a06d30a9 100644 --- a/modules/markup/external/external.go +++ b/modules/markup/external/external.go @@ -10,6 +10,7 @@ import ( "io/ioutil" "os" "os/exec" + "runtime" "strings" "code.gitea.io/gitea/modules/log" @@ -41,13 +42,24 @@ func (p *Parser) Extensions() []string { return p.FileExtensions } +func envMark(envName string) string { + if runtime.GOOS == "windows" { + return "%" + envName + "%" + } + return "$" + envName +} + // Render renders the data of the document to HTML via the external tool. func (p *Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]string, isWiki bool) []byte { var ( - bs []byte - buf = bytes.NewBuffer(bs) - rd = bytes.NewReader(rawBytes) - commands = strings.Fields(p.Command) + bs []byte + buf = bytes.NewBuffer(bs) + rd = bytes.NewReader(rawBytes) + urlRawPrefix = strings.Replace(urlPrefix, "/src/", "/raw/", 1) + + command = strings.NewReplacer(envMark("GITEA_PREFIX_SRC"), urlPrefix, + envMark("GITEA_PREFIX_RAW"), urlRawPrefix).Replace(p.Command) + commands = strings.Fields(command) args = commands[1:] ) @@ -79,7 +91,7 @@ func (p *Parser) Render(rawBytes []byte, urlPrefix string, metas map[string]stri cmd.Env = append( os.Environ(), "GITEA_PREFIX_SRC="+urlPrefix, - "GITEA_PREFIX_RAW="+strings.Replace(urlPrefix, "/src/", "/raw/", 1), + "GITEA_PREFIX_RAW="+urlRawPrefix, ) if !p.IsInputFile { cmd.Stdin = rd From 3af4c56e5e5c725bfd7c365f3ed4705d9bbab6d3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 22 Nov 2018 14:17:36 +0100 Subject: [PATCH 438/447] Show review summary in pull requests (#5132) --- models/fixtures/review.yml | 40 +++++++++++++++++++++ models/review.go | 33 +++++++++++++++++ models/review_test.go | 32 ++++++++++++++++- options/locale/locale_en-US.ini | 1 + public/css/index.css | 2 +- public/less/_repository.less | 32 +++++++++++++++++ routers/repo/issue.go | 6 ++++ templates/repo/issue/view_content/pull.tmpl | 35 ++++++++++++++++++ 8 files changed, 179 insertions(+), 2 deletions(-) diff --git a/models/fixtures/review.yml b/models/fixtures/review.yml index 17defd1b3a92..515f0d77f853 100644 --- a/models/fixtures/review.yml +++ b/models/fixtures/review.yml @@ -30,3 +30,43 @@ content: "Pending Review" updated_unix: 946684810 created_unix: 946684810 +- + id: 5 + type: 2 + reviewer_id: 1 + issue_id: 3 + content: "New review 1" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 6 + type: 0 + reviewer_id: 2 + issue_id: 3 + content: "New review 3" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 7 + type: 3 + reviewer_id: 3 + issue_id: 3 + content: "New review 4" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 8 + type: 1 + reviewer_id: 4 + issue_id: 3 + content: "New review 5" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 9 + type: 3 + reviewer_id: 2 + issue_id: 3 + content: "New review 3 rejected" + updated_unix: 946684810 + created_unix: 946684810 diff --git a/models/review.go b/models/review.go index f58d3f90cb07..7eabb93746f3 100644 --- a/models/review.go +++ b/models/review.go @@ -255,3 +255,36 @@ func UpdateReview(r *Review) error { } return nil } + +// PullReviewersWithType represents the type used to display a review overview +type PullReviewersWithType struct { + User `xorm:"extends"` + Type ReviewType + ReviewUpdatedUnix util.TimeStamp `xorm:"review_updated_unix"` +} + +// GetReviewersByPullID gets all reviewers for a pull request with the statuses +func GetReviewersByPullID(pullID int64) (issueReviewers []*PullReviewersWithType, err error) { + irs := []*PullReviewersWithType{} + err = x.Select("`user`.*, review.type, max(review.updated_unix) as review_updated_unix"). + Table("review"). + Join("INNER", "`user`", "review.reviewer_id = `user`.id"). + Where("review.issue_id = ? AND (review.type = ? OR review.type = ?)", pullID, ReviewTypeApprove, ReviewTypeReject). + GroupBy("`user`.id, review.type"). + OrderBy("review_updated_unix DESC"). + Find(&irs) + + // We need to group our results by user id _and_ review type, otherwise the query fails when using postgresql. + // But becaus we're doing this, we need to manually filter out multiple reviews of different types by the + // same person because we only want to show the newest review grouped by user. Thats why we're using a map here. + issueReviewers = []*PullReviewersWithType{} + usersInArray := make(map[int64]bool) + for _, ir := range irs { + if !usersInArray[ir.ID] { + issueReviewers = append(issueReviewers, ir) + usersInArray[ir.ID] = true + } + } + + return +} diff --git a/models/review_test.go b/models/review_test.go index 3c0444e7a30d..f8e8086dca9b 100644 --- a/models/review_test.go +++ b/models/review_test.go @@ -74,7 +74,7 @@ func TestGetCurrentReview(t *testing.T) { assert.Equal(t, ReviewTypePending, review.Type) assert.Equal(t, "Pending Review", review.Content) - user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user2 := AssertExistsAndLoadBean(t, &User{ID: 7}).(*User) review2, err := GetCurrentReview(user2, issue) assert.Error(t, err) assert.True(t, IsErrReviewNotExist(err)) @@ -105,3 +105,33 @@ func TestUpdateReview(t *testing.T) { assert.NoError(t, UpdateReview(review)) AssertExistsAndLoadBean(t, &Review{ID: 1, Content: "Updated Review"}) } + +func TestGetReviewersByPullID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + issue := AssertExistsAndLoadBean(t, &Issue{ID: 3}).(*Issue) + user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user3 := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User) + user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + + expectedReviews := []*PullReviewersWithType{} + expectedReviews = append(expectedReviews, &PullReviewersWithType{ + User: *user2, + Type: ReviewTypeReject, + ReviewUpdatedUnix: 946684810, + }, + &PullReviewersWithType{ + User: *user3, + Type: ReviewTypeReject, + ReviewUpdatedUnix: 946684810, + }, + &PullReviewersWithType{ + User: *user4, + Type: ReviewTypeApprove, + ReviewUpdatedUnix: 946684810, + }) + + allReviews, err := GetReviewersByPullID(issue.ID) + assert.NoError(t, err) + assert.Equal(t, expectedReviews, allReviews) +} diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index f806d631ea87..7f92be8147ce 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -832,6 +832,7 @@ issues.review.content.empty = You need to leave a comment indicating the request issues.review.reject = "rejected these changes %s" issues.review.pending = Pending issues.review.review = Review +issues.review.reviewers = Reviewers issues.review.show_outdated = Show outdated issues.review.hide_outdated = Hide outdated diff --git a/public/css/index.css b/public/css/index.css index d5f8007b0bd4..839ad5cf1e18 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -1 +1 @@ -.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}table{border-collapse:collapse}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.transparent.label{background-color:transparent}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.file-comment{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.87)}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.user-menu>.item{width:100%;border-radius:0!important}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.hide.show-outdated{display:none!important}.hide.hide-outdated{display:none!important}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}#user-heatmap{width:107%;text-align:center;margin:40px 0 30px}#user-heatmap svg:not(:root){overflow:inherit;padding:0!important}@media only screen and (max-width:1200px){#user-heatmap{display:none}}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}@media only screen and (max-width:880px){footer{text-align:center}}@media only screen and (max-width:880px){footer .ui.container .left,footer .ui.container .right{display:inline;float:none}}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}@media only screen and (min-width:768px){.g-recaptcha{margin:0 auto!important;width:304px;padding-left:30px}}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.77);-webkit-transform:scale(.77);transform-origin:0 0;-webkit-transform-origin:0 0}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px}@media only screen and (max-width:768px){.user.activate form .inline.field>label,.user.activate form input,.user.forgot.password form .inline.field>label,.user.forgot.password form input,.user.reset.password form .inline.field>label,.user.reset.password form input,.user.signin form .inline.field>label,.user.signin form input,.user.signup form .inline.field>label,.user.signup form input{width:100%!important}}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}@media only screen and (max-width:768px){.repository.new.fork form .selection.dropdown,.repository.new.fork form input,.repository.new.fork form label,.repository.new.migrate form .selection.dropdown,.repository.new.migrate form input,.repository.new.migrate form label,.repository.new.repo form .selection.dropdown,.repository.new.repo form input,.repository.new.repo form label{width:100%!important}.repository.new.fork form .field a,.repository.new.fork form .field button,.repository.new.migrate form .field a,.repository.new.migrate form .field button,.repository.new.repo form .field a,.repository.new.repo form .field button{margin-bottom:1em;width:100%}}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (max-width:768px){.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:100%!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}@media only screen and (max-width:768px){.new.org .ui.form .field a,.new.org .ui.form .field button{margin-bottom:1em;width:100%}.new.org .ui.form .field input{width:100%!important}}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .metas #deadlineForm input{width:12.8rem;border-radius:4px 0 0 4px;border-right:0;white-space:nowrap}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}@media only screen and (max-width:768px){.repository #clone-panel{width:100%}}.repository #clone-panel input{border-radius:0;padding:5px 10px;width:50%}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}@media only screen and (max-width:768px){.repository.file.list #file-buttons .ui.tiny.blue.buttons{width:100%}}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .octicon.octicon-comment{margin-top:4px;margin-left:-35px;font-size:24px}.repository.view.issue .comment-list .event .octicon.octicon-eye{margin-top:3px;margin-left:-35px;margin-right:0;font-size:22px}.repository.view.issue .comment-list .event .octicon.octicon-x{margin-left:-33px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository.view.issue .ui.depending .item.is-closed .title{text-decoration:line-through}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:rgba(33,186,69,.1)}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid rgba(33,186,69,.5)}.repository .diff-detail-box{padding:7px 0;background:#fff;line-height:30px}.repository .diff-detail-box>div:after{clear:both;content:"";display:block}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .detail-files{background:#fff;margin:0}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}@media only screen and (max-width:438px){.repository.new.release .field button,.repository.new.release .field input{width:100%}}@media only screen and (max-width:768px){.repository.new.release .field button{margin-bottom:1em}}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px}#repo-topic{margin-top:5px}@media only screen and (max-width:768px){.new-dependency-drop-list{width:100%}}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}@media only screen and (max-width:768px){.user.profile .ui.card #profile-avatar{height:250px;overflow:hidden}.user.profile .ui.card #profile-avatar img{max-height:768px;max-width:768px}}@media only screen and (max-width:768px){.user.profile .ui.card{width:100%}}.user.profile .ui.repository.list{margin-top:25px}.user.profile #loading-heatmap{margin-bottom:1em}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:10px;left:auto;width:auto;right:13px}}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu,.dashboard.issues .filter.menu{width:100%}}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline}.ui.button.add-code-comment{font-size:14px;height:16px;padding:2px 0 0;position:relative;width:16px;z-index:5;float:left;margin:-2px -10px -2px -20px;opacity:0;transition:transform .1s ease-in-out;transform:scale(1,1)}.ui.button.add-code-comment:hover{transform:scale(1.2,1.2)}.focus-lines-new .ui.button.add-code-comment.add-code-comment-right,.focus-lines-old .ui.button.add-code-comment.add-code-comment-left{opacity:1}.comment-code-cloud{padding:4px;margin:0 auto;position:relative;border:1px solid #f1f1f1;margin-top:13px;margin-right:10px;margin-bottom:5px}.comment-code-cloud:before{content:" ";width:0;height:0;border-left:13px solid transparent;border-right:13px solid transparent;border-bottom:13px solid #f1f1f1;left:20px;position:absolute;top:-13px}.comment-code-cloud .attached.tab{border:none;padding:0;margin:0}.comment-code-cloud .attached.tab.markdown{padding:1em;min-height:168px}.comment-code-cloud .attached.header{padding:.1rem 1rem}.comment-code-cloud .right.menu.options .item{padding:.85714286em .442857em;cursor:pointer}.comment-code-cloud .ui.form textarea{border:0}.comment-code-cloud .ui.attached.tabular.menu{background:#f7f7f7;border:1px solid #d4d4d5;padding-top:5px;padding-left:5px;margin-top:0}.comment-code-cloud .footer{border-top:1px solid #f1f1f1;margin-top:10px}.comment-code-cloud .footer .markdown-info{display:inline-block;margin:5px 0;font-size:12px;color:rgba(0,0,0,.6)}.comment-code-cloud .footer .ui.right.floated{padding-top:6px}.comment-code-cloud .footer:after{clear:both;content:"";display:block}.comment-code-cloud button.comment-form-reply{margin:.5em .5em .5em 4.5em}.comment-code-cloud form.comment-form-reply{margin:0 0 0 4em}.file-comment{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.87)} \ No newline at end of file +.tribute-container{box-shadow:0 1px 3px 1px #c7c7c7}.tribute-container ul{background:#fff}.tribute-container li{padding:8px 12px;border-bottom:1px solid #dcdcdc}.tribute-container li img{display:inline-block;vertical-align:middle;width:28px;height:28px;margin-right:5px}.tribute-container li span.fullname{font-weight:400;font-size:.8rem;margin-left:3px}.tribute-container li.highlight,.tribute-container li:hover{background:#2185D0;color:#fff}.emoji{width:1.5em;height:1.5em;display:inline-block;background-size:contain}body{font-family:Lato,"Segoe UI","Microsoft YaHei",Arial,Helvetica,sans-serif!important;background-color:#fff;overflow-y:scroll;-webkit-font-smoothing:antialiased}img{border-radius:3px}table{border-collapse:collapse}.rounded{border-radius:.28571429rem!important}code,pre{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace}code.raw,pre.raw{padding:7px 12px;margin:10px 0;background-color:#f8f8f8;border:1px solid #ddd;border-radius:3px;font-size:13px;line-height:1.5;overflow:auto}code.wrap,pre.wrap{white-space:pre-wrap;-ms-word-break:break-all;word-break:break-all;overflow-wrap:break-word;word-wrap:break-word}.dont-break-out{overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.full.height{padding:0;margin:0 0 -40px 0;min-height:100%}.following.bar{z-index:900;left:0;width:100%;margin:0}.following.bar.light{background-color:#fff;border-bottom:1px solid #DDD;box-shadow:0 2px 3px rgba(0,0,0,.04)}.following.bar .column .menu{margin-top:0}.following.bar .top.menu a.item.brand{padding-left:0}.following.bar .brand .ui.mini.image{width:30px}.following.bar .top.menu .dropdown.item.active,.following.bar .top.menu .dropdown.item:hover,.following.bar .top.menu a.item:hover{background-color:transparent}.following.bar .top.menu a.item:hover{color:rgba(0,0,0,.45)}.following.bar .top.menu .menu{z-index:900}.following.bar .octicon{margin-right:.75em}.following.bar .octicon.fitted{margin-right:0}.following.bar .searchbox{background-color:#f4f4f4!important}.following.bar .searchbox:focus{background-color:#e9e9e9!important}.following.bar .text .octicon{width:16px;text-align:center}@media only screen and (max-width:767px){.following.bar #navbar:not(.shown)>:not(:first-child){display:none}}.right.stackable.menu{margin-left:auto;display:flex;display:-ms-flexbox;-ms-flex-align:inherit;align-items:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.left{float:left}.ui.right{float:right}.ui.button,.ui.menu .item{-moz-user-select:auto;-ms-user-select:auto;-webkit-user-select:auto;user-select:auto}.ui.container.fluid.padded{padding:0 10px 0 10px}.ui.form .ui.button{font-weight:400}.ui.floating.label{z-index:10}.ui.transparent.label{background-color:transparent}.ui.menu,.ui.segment,.ui.vertical.menu{box-shadow:none}.ui .menu:not(.vertical) .item>.button.compact{padding:.58928571em 1.125em}.ui .menu:not(.vertical) .item>.button.small{font-size:.92857143rem}.ui.dropdown .menu>.item>.floating.label{z-index:11}.ui.dropdown .menu .menu>.item>.floating.label{z-index:21}.ui .text.red{color:#d95c5c!important}.ui .text.red a{color:#d95c5c!important}.ui .text.red a:hover{color:#E67777!important}.ui .text.blue{color:#428bca!important}.ui .text.blue a{color:#15c!important}.ui .text.blue a:hover{color:#428bca!important}.ui .text.black{color:#444}.ui .text.black:hover{color:#000}.ui .text.grey{color:#767676!important}.ui .text.grey a{color:#444!important}.ui .text.grey a:hover{color:#000!important}.ui .text.light.grey{color:#888!important}.ui .text.green{color:#6cc644!important}.ui .text.purple{color:#6e5494!important}.ui .text.yellow{color:#FBBD08!important}.ui .text.gold{color:#a1882b!important}.ui .text.left{text-align:left!important}.ui .text.right{text-align:right!important}.ui .text.small{font-size:.75em}.ui .text.normal{font-weight:400}.ui .text.bold{font-weight:700}.ui .text.italic{font-style:italic}.ui .text.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}.ui .text.thin{font-weight:400}.ui .text.middle{vertical-align:middle}.ui .message{text-align:center}.ui .header>i+.content{padding-left:.75rem;vertical-align:middle}.ui .warning.header{background-color:#F9EDBE!important;border-color:#F0C36D}.ui .warning.segment{border-color:#F0C36D}.ui .info.segment{border:1px solid #c5d5dd}.ui .info.segment.top{background-color:#e6f1f6!important}.ui .info.segment.top h3,.ui .info.segment.top h4{margin-top:0}.ui .info.segment.top h3:last-child{margin-top:4px}.ui .info.segment.top>:last-child{margin-bottom:0}.ui .normal.header{font-weight:400}.ui .avatar.image{border-radius:3px}.ui .form .fake{display:none!important}.ui .form .sub.field{margin-left:25px}.ui .sha.label{font-family:Consolas,Menlo,Monaco,"Lucida Console",monospace;font-size:13px;padding:6px 10px 4px 10px;font-weight:400;margin:0 6px}.ui.status.buttons .octicon{margin-right:4px}.ui.inline.delete-button{padding:8px 15px;font-weight:400}.ui .background.red{background-color:#d95c5c!important}.ui .background.blue{background-color:#428bca!important}.ui .background.black{background-color:#444}.ui .background.grey{background-color:#767676!important}.ui .background.light.grey{background-color:#888!important}.ui .background.green{background-color:#6cc644!important}.ui .background.purple{background-color:#6e5494!important}.ui .background.yellow{background-color:#FBBD08!important}.ui .background.gold{background-color:#a1882b!important}.ui .branch-tag-choice{line-height:20px}.file-comment{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.87)}.overflow.menu .items{max-height:300px;overflow-y:auto}.overflow.menu .items .item{position:relative;cursor:pointer;display:block;border:none;height:auto;border-top:none;line-height:1em;color:rgba(0,0,0,.8);padding:.71428571em 1.14285714em!important;font-size:1rem;text-transform:none;font-weight:400;box-shadow:none;-webkit-touch-callout:none}.overflow.menu .items .item.active{font-weight:700}.overflow.menu .items .item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8);z-index:13}.user-menu>.item{width:100%;border-radius:0!important}.scrolling.menu .item.selected{font-weight:700!important}footer{height:40px;background-color:#fff;border-top:1px solid #d6d6d6;clear:both;width:100%;color:#888}footer .container{padding-top:10px}footer .container .fa{width:16px;text-align:center;color:#428bca}footer .container .links>*{border-left:1px solid #d6d6d6;padding-left:8px;margin-left:5px}footer .container .links>:first-child{border-left:none}footer .ui.language .menu{max-height:500px;overflow-y:auto;margin-bottom:7px}.hide{display:none}.hide.show-outdated{display:none!important}.hide.hide-outdated{display:none!important}.center{text-align:center}.img-1{width:2px!important;height:2px!important}.img-2{width:4px!important;height:4px!important}.img-3{width:6px!important;height:6px!important}.img-4{width:8px!important;height:8px!important}.img-5{width:10px!important;height:10px!important}.img-6{width:12px!important;height:12px!important}.img-7{width:14px!important;height:14px!important}.img-8{width:16px!important;height:16px!important}.img-9{width:18px!important;height:18px!important}.img-10{width:20px!important;height:20px!important}.img-11{width:22px!important;height:22px!important}.img-12{width:24px!important;height:24px!important}.img-13{width:26px!important;height:26px!important}.img-14{width:28px!important;height:28px!important}.img-15{width:30px!important;height:30px!important}.img-16{width:32px!important;height:32px!important}@media only screen and (min-width:768px){.mobile-only,.ui.button.mobile-only{display:none}.sr-mobile-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}}@media only screen and (max-width:767px){.not-mobile{display:none}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@media only screen and (max-width:991px) and (min-width:768px){.ui.container{width:95%}}.hljs{background:inherit!important;padding:0!important}.ui.menu.new-menu{justify-content:center!important;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}@media only screen and (max-width:1200px){.ui.menu.new-menu{overflow-x:auto!important;justify-content:left!important;padding-bottom:5px}.ui.menu.new-menu::-webkit-scrollbar{height:8px;display:none}.ui.menu.new-menu:hover::-webkit-scrollbar{display:block}.ui.menu.new-menu::-webkit-scrollbar-track{background:rgba(0,0,0,.01)}.ui.menu.new-menu::-webkit-scrollbar-thumb{background:rgba(0,0,0,.2)}.ui.menu.new-menu:after{position:absolute;margin-top:-15px;display:block;background-image:linear-gradient(to right,rgba(255,255,255,0),#fff 100%);content:' ';right:0;height:53px;z-index:1000;width:60px;clear:none;visibility:visible}.ui.menu.new-menu a.item:last-child{padding-right:30px!important}}[v-cloak]{display:none!important}.repos-search{padding-bottom:0!important}.repos-filter{margin-top:0!important;border-bottom-width:0!important;margin-bottom:2px!important}#user-heatmap{width:107%;text-align:center;margin:40px 0 30px}#user-heatmap svg:not(:root){overflow:inherit;padding:0!important}@media only screen and (max-width:1200px){#user-heatmap{display:none}}.markdown:not(code){overflow:hidden;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif;font-size:16px;line-height:1.6!important;word-wrap:break-word}.markdown:not(code).ui.segment{padding:3em}.markdown:not(code).file-view{padding:2em 2em 2em!important}.markdown:not(code)>:first-child{margin-top:0!important}.markdown:not(code)>:last-child{margin-bottom:0!important}.markdown:not(code) a:not([href]){color:inherit;text-decoration:none}.markdown:not(code) .absent{color:#c00}.markdown:not(code) .anchor{position:absolute;top:0;left:0;display:block;padding-right:6px;padding-left:30px;margin-left:-30px}.markdown:not(code) .anchor:focus{outline:0}.markdown:not(code) h1,.markdown:not(code) h2,.markdown:not(code) h3,.markdown:not(code) h4,.markdown:not(code) h5,.markdown:not(code) h6{position:relative;margin-top:1em;margin-bottom:16px;font-weight:700;line-height:1.4}.markdown:not(code) h1:first-of-type,.markdown:not(code) h2:first-of-type,.markdown:not(code) h3:first-of-type,.markdown:not(code) h4:first-of-type,.markdown:not(code) h5:first-of-type,.markdown:not(code) h6:first-of-type{margin-top:0!important}.markdown:not(code) h1 .octicon-link,.markdown:not(code) h2 .octicon-link,.markdown:not(code) h3 .octicon-link,.markdown:not(code) h4 .octicon-link,.markdown:not(code) h5 .octicon-link,.markdown:not(code) h6 .octicon-link{display:none;color:#000;vertical-align:middle}.markdown:not(code) h1:hover .anchor,.markdown:not(code) h2:hover .anchor,.markdown:not(code) h3:hover .anchor,.markdown:not(code) h4:hover .anchor,.markdown:not(code) h5:hover .anchor,.markdown:not(code) h6:hover .anchor{padding-left:8px;margin-left:-30px;text-decoration:none}.markdown:not(code) h1:hover .anchor .octicon-link,.markdown:not(code) h2:hover .anchor .octicon-link,.markdown:not(code) h3:hover .anchor .octicon-link,.markdown:not(code) h4:hover .anchor .octicon-link,.markdown:not(code) h5:hover .anchor .octicon-link,.markdown:not(code) h6:hover .anchor .octicon-link{display:inline-block}.markdown:not(code) h1 code,.markdown:not(code) h1 tt,.markdown:not(code) h2 code,.markdown:not(code) h2 tt,.markdown:not(code) h3 code,.markdown:not(code) h3 tt,.markdown:not(code) h4 code,.markdown:not(code) h4 tt,.markdown:not(code) h5 code,.markdown:not(code) h5 tt,.markdown:not(code) h6 code,.markdown:not(code) h6 tt{font-size:inherit}.markdown:not(code) h1{padding-bottom:.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee}.markdown:not(code) h1 .anchor{line-height:1}.markdown:not(code) h2{padding-bottom:.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee}.markdown:not(code) h2 .anchor{line-height:1}.markdown:not(code) h3{font-size:1.5em;line-height:1.43}.markdown:not(code) h3 .anchor{line-height:1.2}.markdown:not(code) h4{font-size:1.25em}.markdown:not(code) h4 .anchor{line-height:1.2}.markdown:not(code) h5{font-size:1em}.markdown:not(code) h5 .anchor{line-height:1.1}.markdown:not(code) h6{font-size:1em;color:#777}.markdown:not(code) h6 .anchor{line-height:1.1}.markdown:not(code) blockquote,.markdown:not(code) dl,.markdown:not(code) ol,.markdown:not(code) p,.markdown:not(code) pre,.markdown:not(code) table,.markdown:not(code) ul{margin-top:0;margin-bottom:16px}.markdown:not(code) blockquote{margin-left:0}.markdown:not(code) hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none}.markdown:not(code) ol,.markdown:not(code) ul{padding-left:2em}.markdown:not(code) ol.no-list,.markdown:not(code) ul.no-list{padding:0;list-style-type:none}.markdown:not(code) ol ol,.markdown:not(code) ol ul,.markdown:not(code) ul ol,.markdown:not(code) ul ul{margin-top:0;margin-bottom:0}.markdown:not(code) ol ol,.markdown:not(code) ul ol{list-style-type:lower-roman}.markdown:not(code) li>p{margin-top:0}.markdown:not(code) dl{padding:0}.markdown:not(code) dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown:not(code) dl dd{padding:0 16px;margin-bottom:16px}.markdown:not(code) blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd}.markdown:not(code) blockquote>:first-child{margin-top:0}.markdown:not(code) blockquote>:last-child{margin-bottom:0}.markdown:not(code) table{width:auto;overflow:auto;word-break:normal;word-break:keep-all}.markdown:not(code) table th{font-weight:700}.markdown:not(code) table td,.markdown:not(code) table th{padding:6px 13px!important;border:1px solid #ddd!important}.markdown:not(code) table tr{background-color:#fff;border-top:1px solid #ccc}.markdown:not(code) table tr:nth-child(2n){background-color:#f8f8f8}.markdown:not(code) img{max-width:100%;box-sizing:border-box}.markdown:not(code) .emoji{max-width:none}.markdown:not(code) span.frame{display:block;overflow:hidden}.markdown:not(code) span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown:not(code) span.frame span img{display:block;float:left}.markdown:not(code) span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown:not(code) span.align-center{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown:not(code) span.align-center span img{margin:0 auto;text-align:center}.markdown:not(code) span.align-right{display:block;overflow:hidden;clear:both}.markdown:not(code) span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown:not(code) span.align-right span img{margin:0;text-align:right}.markdown:not(code) span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown:not(code) span.float-left span{margin:13px 0 0}.markdown:not(code) span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown:not(code) span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown:not(code) code,.markdown:not(code) tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown:not(code) code:after,.markdown:not(code) code:before,.markdown:not(code) tt:after,.markdown:not(code) tt:before{letter-spacing:-.2em;content:"\00a0"}.markdown:not(code) code br,.markdown:not(code) tt br{display:none}.markdown:not(code) del code{text-decoration:inherit}.markdown:not(code) pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:0 0;border:0}.markdown:not(code) .highlight{margin-bottom:16px}.markdown:not(code) .highlight pre,.markdown:not(code) pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown:not(code) .highlight pre{margin-bottom:0;word-break:normal}.markdown:not(code) pre{word-wrap:normal}.markdown:not(code) pre code,.markdown:not(code) pre tt{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown:not(code) pre code:after,.markdown:not(code) pre code:before,.markdown:not(code) pre tt:after,.markdown:not(code) pre tt:before{content:normal}.markdown:not(code) kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.markdown:not(code) input[type=checkbox]{vertical-align:middle!important}.markdown:not(code) .csv-data td,.markdown:not(code) .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown:not(code) .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown:not(code) .csv-data tr{border-top:0}.markdown:not(code) .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown:not(code) .ui.list .list,.markdown:not(code) ol.ui.list ol,.markdown:not(code) ul.ui.list ul{padding-left:2em}.home{padding-bottom:80px}.home .logo{max-width:220px}.home .hero h1,.home .hero h2{font-family:'PT Sans Narrow',sans-serif,'Microsoft YaHei'}@media only screen and (max-width:767px){.home .hero h1{font-size:3.5em}.home .hero h2{font-size:2em}}@media only screen and (min-width:768px){.home .hero h1{font-size:5.5em}.home .hero h2{font-size:3em}}.home .hero .octicon{color:#5aa509;font-size:40px;width:50px}.home .hero.header{font-size:20px}.home p.large{font-size:16px}.home .stackable{padding-top:30px}.home a{color:#5aa509}.signup{padding-top:15px;padding-bottom:80px}@media only screen and (max-width:880px){footer{text-align:center}}@media only screen and (max-width:880px){footer .ui.container .left,footer .ui.container .right{display:inline;float:none}}.install{padding-top:45px;padding-bottom:80px}.install form label{text-align:right;width:320px!important}.install form input{width:35%!important}.install form .field{text-align:left}.install form .field .help{margin-left:335px!important}.install form .field.optional .title{margin-left:38%}.install .ui .checkbox{margin-left:40%!important}.install .ui .checkbox label{width:auto!important}.form .help{color:#999;padding-top:.6em;padding-bottom:.6em;display:inline-block}.ui.attached.header{background:#f0f0f0}.ui.attached.header .right{margin-top:-5px}.ui.attached.header .right .button{padding:8px 10px;font-weight:400}#create-page-form form{margin:auto}#create-page-form form .ui.message{text-align:center}@media only screen and (min-width:768px){#create-page-form form{width:800px!important}#create-page-form form .header{padding-left:280px!important}#create-page-form form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}#create-page-form form .help{margin-left:265px!important}#create-page-form form .optional .title{margin-left:250px!important}#create-page-form form input,#create-page-form form textarea{width:50%!important}}@media only screen and (max-width:767px){#create-page-form form .optional .title{margin-left:15px}#create-page-form form .inline.field>label{display:block}}.signin .oauth2 div{display:inline-block}.signin .oauth2 div p{margin:10px 5px 0 0;float:left}.signin .oauth2 a{margin-right:3px}.signin .oauth2 a:last-child{margin-right:0}.signin .oauth2 img{width:32px;height:32px}.signin .oauth2 img.openidConnect{width:auto}@media only screen and (min-width:768px){.g-recaptcha{margin:0 auto!important;width:304px;padding-left:30px}}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.77);-webkit-transform:scale(.77);transform-origin:0 0;-webkit-transform-origin:0 0}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{margin:auto}.user.activate form .ui.message,.user.forgot.password form .ui.message,.user.reset.password form .ui.message,.user.signin form .ui.message,.user.signup form .ui.message{text-align:center}@media only screen and (min-width:768px){.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:800px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:280px!important}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.user.activate form .help,.user.forgot.password form .help,.user.reset.password form .help,.user.signin form .help,.user.signup form .help{margin-left:265px!important}.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:250px!important}.user.activate form input,.user.activate form textarea,.user.forgot.password form input,.user.forgot.password form textarea,.user.reset.password form input,.user.reset.password form textarea,.user.signin form input,.user.signin form textarea,.user.signup form input,.user.signup form textarea{width:50%!important}}@media only screen and (max-width:767px){.user.activate form .optional .title,.user.forgot.password form .optional .title,.user.reset.password form .optional .title,.user.signin form .optional .title,.user.signup form .optional .title{margin-left:15px}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{display:block}}.user.activate form,.user.forgot.password form,.user.reset.password form,.user.signin form,.user.signup form{width:700px!important}.user.activate form .header,.user.forgot.password form .header,.user.reset.password form .header,.user.signin form .header,.user.signup form .header{padding-left:0!important;text-align:center}.user.activate form .inline.field>label,.user.forgot.password form .inline.field>label,.user.reset.password form .inline.field>label,.user.signin form .inline.field>label,.user.signup form .inline.field>label{width:200px}@media only screen and (max-width:768px){.user.activate form .inline.field>label,.user.activate form input,.user.forgot.password form .inline.field>label,.user.forgot.password form input,.user.reset.password form .inline.field>label,.user.reset.password form input,.user.signin form .inline.field>label,.user.signin form input,.user.signup form .inline.field>label,.user.signup form input{width:100%!important}}.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{margin:auto}.repository.new.fork form .ui.message,.repository.new.migrate form .ui.message,.repository.new.repo form .ui.message{text-align:center}@media only screen and (min-width:768px){.repository.new.fork form,.repository.new.migrate form,.repository.new.repo form{width:800px!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:280px!important}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.repository.new.fork form .help,.repository.new.migrate form .help,.repository.new.repo form .help{margin-left:265px!important}.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:250px!important}.repository.new.fork form input,.repository.new.fork form textarea,.repository.new.migrate form input,.repository.new.migrate form textarea,.repository.new.repo form input,.repository.new.repo form textarea{width:50%!important}}@media only screen and (max-width:767px){.repository.new.fork form .optional .title,.repository.new.migrate form .optional .title,.repository.new.repo form .optional .title{margin-left:15px}.repository.new.fork form .inline.field>label,.repository.new.migrate form .inline.field>label,.repository.new.repo form .inline.field>label{display:block}}.repository.new.fork form .dropdown .dropdown.icon,.repository.new.migrate form .dropdown .dropdown.icon,.repository.new.repo form .dropdown .dropdown.icon{margin-top:-7px!important}.repository.new.fork form .dropdown .text,.repository.new.migrate form .dropdown .text,.repository.new.repo form .dropdown .text{margin-right:0!important}.repository.new.fork form .dropdown .text i,.repository.new.migrate form .dropdown .text i,.repository.new.repo form .dropdown .text i{margin-right:0!important}.repository.new.fork form .header,.repository.new.migrate form .header,.repository.new.repo form .header{padding-left:0!important;text-align:center}@media only screen and (max-width:768px){.repository.new.fork form .selection.dropdown,.repository.new.fork form input,.repository.new.fork form label,.repository.new.migrate form .selection.dropdown,.repository.new.migrate form input,.repository.new.migrate form label,.repository.new.repo form .selection.dropdown,.repository.new.repo form input,.repository.new.repo form label{width:100%!important}.repository.new.fork form .field a,.repository.new.fork form .field button,.repository.new.migrate form .field a,.repository.new.migrate form .field button,.repository.new.repo form .field a,.repository.new.repo form .field button{margin-bottom:1em;width:100%}}@media only screen and (min-width:768px){.repository.new.repo .ui.form #auto-init{margin-left:265px!important}}.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:50%!important}@media only screen and (max-width:768px){.repository.new.repo .ui.form .selection.dropdown:not(.owner){width:100%!important}}.new.webhook form .help{margin-left:25px}.new.webhook .events.fields .column{padding-left:40px}.githook textarea{font-family:monospace}@media only screen and (max-width:768px){.new.org .ui.form .field a,.new.org .ui.form .field button{margin-bottom:1em;width:100%}.new.org .ui.form .field input{width:100%!important}}.repository{padding-top:15px;padding-bottom:80px}.repository .header-grid{padding-top:5px;padding-bottom:5px}.repository .header-grid .ui.compact.menu{margin-left:1rem}.repository .header-grid .ui.header{margin-top:0}.repository .header-grid .mega-octicon{width:30px;font-size:30px}.repository .header-grid .ui.huge.breadcrumb{font-weight:400;font-size:1.7rem}.repository .header-grid .fork-flag{margin-left:38px;margin-top:3px;display:block;font-size:12px;white-space:nowrap}.repository .header-grid .octicon.octicon-repo-forked{margin-top:-1px;font-size:15px}.repository .header-grid .button{margin-top:2px;margin-bottom:2px}.repository .tabs .navbar{justify-content:initial}.repository .navbar{display:flex;justify-content:space-between}.repository .navbar .ui.label{margin-top:-2px;margin-left:7px;padding:3px 5px}.repository .owner.dropdown{min-width:40%!important}.repository #file-buttons{margin-left:auto!important;font-weight:400}.repository #file-buttons .ui.button{padding:8px 10px;font-weight:400}.repository .metas .menu{max-height:300px;overflow-x:auto}.repository .metas .ui.list .hide{display:none!important}.repository .metas .ui.list .item{padding:0}.repository .metas .ui.list .label.color{padding:0 8px;margin-right:5px}.repository .metas .ui.list a{margin:2px 0}.repository .metas .ui.list a .text{color:#444}.repository .metas .ui.list a .text:hover{color:#000}.repository .metas #deadlineForm input{width:12.8rem;border-radius:4px 0 0 4px;border-right:0;white-space:nowrap}.repository .header-wrapper{background-color:#FAFAFA;margin-top:-15px;padding-top:15px}.repository .header-wrapper .ui.tabs.divider{border-bottom:none}.repository .header-wrapper .ui.tabular .octicon{margin-right:5px}.repository .filter.menu .label.color{border-radius:3px;margin-left:15px;padding:0 8px}.repository .filter.menu .octicon{float:left;margin:5px -7px 0 -5px;width:16px}.repository .filter.menu .text{margin-left:.9em}.repository .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}.repository .filter.menu .dropdown.item{margin:1px;padding-right:0}.repository .select-label .item{max-width:250px;overflow:hidden;text-overflow:ellipsis}.repository .select-label .desc{padding-left:16px}.repository .ui.tabs.container{margin-top:14px;margin-bottom:0}.repository .ui.tabs.container .ui.menu{border-bottom:none}.repository .ui.tabs.divider{margin-top:0;margin-bottom:20px}.repository #clone-panel{width:350px}@media only screen and (max-width:768px){.repository #clone-panel{width:100%}}.repository #clone-panel input{border-radius:0;padding:5px 10px;width:50%}.repository #clone-panel .clone.button{font-size:13px;padding:0 5px}.repository #clone-panel .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository #clone-panel .icon.button{padding:0 10px}.repository #clone-panel .dropdown .menu{right:0!important;left:auto!important}.repository.file.list .repo-description{display:flex;justify-content:space-between;align-items:center}.repository.file.list #repo-desc{font-size:1.2em}.repository.file.list .choose.reference .header .icon{font-size:1.4em}.repository.file.list .repo-path .divider,.repository.file.list .repo-path .section{display:inline}.repository.file.list #file-buttons{font-weight:400}.repository.file.list #file-buttons .ui.button{padding:8px 10px;font-weight:400}@media only screen and (max-width:768px){.repository.file.list #file-buttons .ui.tiny.blue.buttons{width:100%}}.repository.file.list #repo-files-table thead th{padding-top:8px;padding-bottom:5px;font-weight:400}.repository.file.list #repo-files-table thead th:first-child{display:block;position:relative;width:325%}.repository.file.list #repo-files-table thead .ui.avatar{margin-bottom:5px}.repository.file.list #repo-files-table tbody .octicon{margin-left:3px;margin-right:5px;color:#777}.repository.file.list #repo-files-table tbody .octicon.octicon-mail-reply{margin-right:10px}.repository.file.list #repo-files-table tbody .octicon.octicon-file-directory,.repository.file.list #repo-files-table tbody .octicon.octicon-file-submodule,.repository.file.list #repo-files-table tbody .octicon.octicon-file-symlink-directory{color:#1e70bf}.repository.file.list #repo-files-table td{padding-top:8px;padding-bottom:8px}.repository.file.list #repo-files-table td.message .isSigned{cursor:default}.repository.file.list #repo-files-table tr:hover{background-color:#ffE}.repository.file.list #repo-files-table .jumpable-path{color:#888}.repository.file.list .non-diff-file-content .header .icon{font-size:1em}.repository.file.list .non-diff-file-content .header .file-actions{margin-top:0;margin-bottom:-5px;padding-left:20px}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#767676;vertical-align:middle;background:0 0;border:0;outline:0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon:hover{color:#4078c0}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon-danger:hover{color:#bd2c00}.repository.file.list .non-diff-file-content .header .file-actions .btn-octicon.disabled{color:#bbb;cursor:default}.repository.file.list .non-diff-file-content .header .file-actions #delete-file-form{display:inline-block}.repository.file.list .non-diff-file-content .view-raw{padding:5px}.repository.file.list .non-diff-file-content .view-raw *{max-width:100%}.repository.file.list .non-diff-file-content .view-raw img{padding:5px 5px 0 5px}.repository.file.list .non-diff-file-content .plain-text{padding:1em 2em 1em 2em}.repository.file.list .non-diff-file-content .code-view *{font-size:12px;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:20px}.repository.file.list .non-diff-file-content .code-view table{width:100%}.repository.file.list .non-diff-file-content .code-view .lines-num{vertical-align:top;text-align:right;color:#999;background:#f5f5f5;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.repository.file.list .non-diff-file-content .code-view .lines-num span{line-height:20px;padding:0 10px;cursor:pointer;display:block}.repository.file.list .non-diff-file-content .code-view .lines-code,.repository.file.list .non-diff-file-content .code-view .lines-num{padding:0}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs,.repository.file.list .non-diff-file-content .code-view .lines-code ol,.repository.file.list .non-diff-file-content .code-view .lines-code pre,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs,.repository.file.list .non-diff-file-content .code-view .lines-num ol,.repository.file.list .non-diff-file-content .code-view .lines-num pre{background-color:#fff;margin:0;padding:0!important}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-code ol li,.repository.file.list .non-diff-file-content .code-view .lines-code pre li,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li,.repository.file.list .non-diff-file-content .code-view .lines-num ol li,.repository.file.list .non-diff-file-content .code-view .lines-num pre li{display:block;width:100%}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-code ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-code pre li.active,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li.active,.repository.file.list .non-diff-file-content .code-view .lines-num ol li.active,.repository.file.list .non-diff-file-content .code-view .lines-num pre li.active{background:#ffd}.repository.file.list .non-diff-file-content .code-view .lines-code .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-code ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-code pre li:before,.repository.file.list .non-diff-file-content .code-view .lines-num .hljs li:before,.repository.file.list .non-diff-file-content .code-view .lines-num ol li:before,.repository.file.list .non-diff-file-content .code-view .lines-num pre li:before{content:' '}.repository.file.list .non-diff-file-content .code-view .active{background:#ffd}.repository.file.list .sidebar{padding-left:0}.repository.file.list .sidebar .octicon{width:16px}.repository.file.editor .treepath{width:100%}.repository.file.editor .treepath input{vertical-align:middle;box-shadow:rgba(0,0,0,.0745098) 0 1px 2px inset;width:inherit;padding:7px 8px;margin-right:5px}.repository.file.editor .tabular.menu .octicon{margin-right:5px}.repository.file.editor .commit-form-wrapper{padding-left:64px}.repository.file.editor .commit-form-wrapper .commit-avatar{float:left;margin-left:-64px;width:3em;height:auto}.repository.file.editor .commit-form-wrapper .commit-form{position:relative;padding:15px;margin-bottom:10px;border:1px solid #ddd;border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form:after,.repository.file.editor .commit-form-wrapper .commit-form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.file.editor .commit-form-wrapper .commit-form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.file.editor .commit-form-wrapper .commit-form:after{border-right-color:#fff}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .branch-name{display:inline-block;padding:3px 6px;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.65);background-color:rgba(209,227,237,.45);border-radius:3px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input{position:relative;margin-left:25px}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .new-branch-name-input input{width:240px!important;padding-left:26px!important}.repository.file.editor .commit-form-wrapper .commit-form .quick-pull-choice .octicon-git-branch{position:absolute;top:9px;left:10px;color:#b0c4ce}.repository.options #interval{width:100px!important;min-width:100px}.repository.options .danger .item{padding:20px 15px}.repository.options .danger .ui.divider{margin:0}.repository.new.issue .comment.form .comment .avatar{width:3em}.repository.new.issue .comment.form .content{margin-left:4em}.repository.new.issue .comment.form .content:after,.repository.new.issue .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.new.issue .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.new.issue .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.new.issue .comment.form .content:after{border-right-color:#fff}.repository.new.issue .comment.form .content .markdown{font-size:14px}.repository.new.issue .comment.form .metas{min-width:220px}.repository.new.issue .comment.form .metas .filter.menu{max-height:300px;overflow-x:auto}.repository.view.issue .title{padding-bottom:0!important}.repository.view.issue .title h1{font-weight:300;font-size:2.3rem;margin-bottom:5px}.repository.view.issue .title h1 .ui.input{font-size:.5em;vertical-align:top;width:50%;min-width:600px}.repository.view.issue .title h1 .ui.input input{font-size:1.5em;padding:6px 10px}.repository.view.issue .title .index{font-weight:300;color:#aaa;letter-spacing:-1px}.repository.view.issue .title .label{margin-right:10px}.repository.view.issue .title .edit-zone{margin-top:10px}.repository.view.issue .pull-desc code{color:#0166E6}.repository.view.issue .pull.tabular.menu{margin-bottom:10px}.repository.view.issue .pull.tabular.menu .octicon{margin-right:5px}.repository.view.issue .pull.tab.segment{border:none;padding:0;padding-top:10px;box-shadow:none;background-color:inherit}.repository.view.issue .pull .merge.box .avatar{margin-left:10px;margin-top:10px}.repository.view.issue .pull .review-item .avatar,.repository.view.issue .pull .review-item .type-icon{float:none;display:inline-block;text-align:center;vertical-align:middle}.repository.view.issue .pull .review-item .avatar .octicon,.repository.view.issue .pull .review-item .type-icon .octicon{width:23px;font-size:23px;margin-top:.45em}.repository.view.issue .pull .review-item .text{margin:.3em 0 .5em .5em}.repository.view.issue .pull .review-item .type-icon{float:right;margin-right:1em}.repository.view.issue .pull .review-item .divider{margin:.5rem 0}.repository.view.issue .pull .review-item .review-content{padding:1em 0 1em 3.8em}.repository.view.issue .comment-list:before{display:block;content:"";position:absolute;margin-top:12px;margin-bottom:14px;top:0;bottom:0;left:96px;width:2px;background-color:#f3f3f3;z-index:-1}.repository.view.issue .comment-list .comment .avatar{width:3em}.repository.view.issue .comment-list .comment .tag{color:#767676;margin-top:3px;padding:2px 5px;font-size:12px;border:1px solid rgba(0,0,0,.1);border-radius:3px}.repository.view.issue .comment-list .comment .actions .item{float:left}.repository.view.issue .comment-list .comment .actions .item.tag{margin-right:5px}.repository.view.issue .comment-list .comment .actions .item.action{margin-top:6px;margin-left:10px}.repository.view.issue .comment-list .comment .content{margin-left:4em}.repository.view.issue .comment-list .comment .content>.header{font-weight:400;padding:auto 15px;position:relative;color:#767676;background-color:#f7f7f7;border-bottom:1px solid #eee;border-top-left-radius:3px;border-top-right-radius:3px}.repository.view.issue .comment-list .comment .content>.header:after,.repository.view.issue .comment-list .comment .content>.header:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.view.issue .comment-list .comment .content>.header:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.view.issue .comment-list .comment .content>.header:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.view.issue .comment-list .comment .content>.header .text{max-width:78%;padding-top:10px;padding-bottom:10px}.repository.view.issue .comment-list .comment .content .markdown{font-size:14px}.repository.view.issue .comment-list .comment .content .no-content{color:#767676;font-style:italic}.repository.view.issue .comment-list .comment .content>.bottom.segment{background:#f3f4f5}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.images::after{clear:both;content:' ';display:block}.repository.view.issue .comment-list .comment .content>.bottom.segment a{display:block;float:left;margin:5px;padding:5px;height:150px;border:solid 1px #eee;border-radius:3px;max-width:150px;background-color:#fff}.repository.view.issue .comment-list .comment .content>.bottom.segment a:before{content:' ';display:inline-block;height:100%;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment .ui.image{max-height:100%;width:auto;margin:0;vertical-align:middle}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image{font-size:128px;color:#000}.repository.view.issue .comment-list .comment .content>.bottom.segment span.ui.image:hover{color:#000}.repository.view.issue .comment-list .comment .ui.form .field:first-child{clear:none}.repository.view.issue .comment-list .comment .ui.form .tab.segment{border:none;padding:0;padding-top:10px}.repository.view.issue .comment-list .comment .ui.form textarea{height:200px;font-family:Consolas,monospace}.repository.view.issue .comment-list .comment .edit.buttons{margin-top:10px}.repository.view.issue .comment-list .event{position:relative;margin:15px 0 15px 79px;padding-left:25px}.repository.view.issue .comment-list .event .octicon{width:30px;float:left;text-align:center}.repository.view.issue .comment-list .event .octicon.octicon-circle-slash{margin-top:5px;margin-left:-34.5px;font-size:20px;color:#bd2c00}.repository.view.issue .comment-list .event .octicon.octicon-primitive-dot{margin-left:-28.5px;margin-right:-1px;font-size:30px;color:#6cc644}.repository.view.issue .comment-list .event .octicon.octicon-bookmark{margin-top:3px;margin-left:-31px;margin-right:-1px;font-size:25px}.repository.view.issue .comment-list .event .octicon.octicon-comment{margin-top:4px;margin-left:-35px;font-size:24px}.repository.view.issue .comment-list .event .octicon.octicon-eye{margin-top:3px;margin-left:-35px;margin-right:0;font-size:22px}.repository.view.issue .comment-list .event .octicon.octicon-x{margin-left:-33px;font-size:25px}.repository.view.issue .comment-list .event .detail{font-size:.9rem;margin-top:5px;margin-left:35px}.repository.view.issue .comment-list .event .detail .octicon.octicon-git-commit{margin-top:2px}.repository.view.issue .ui.segment.metas{margin-top:-3px}.repository.view.issue .ui.participants img{margin-top:5px;margin-right:5px}.repository.view.issue .ui.depending .item.is-closed .title{text-decoration:line-through}.repository .comment.form .ui.comments{margin-top:-12px;max-width:100%}.repository .comment.form .content .field:first-child{clear:none}.repository .comment.form .content .form:after,.repository .comment.form .content .form:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository .comment.form .content .form:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository .comment.form .content .form:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository .comment.form .content .form:after{border-right-color:#fff}.repository .comment.form .content .tab.segment{border:none;padding:0;padding-top:10px}.repository .comment.form .content textarea{height:200px;font-family:Consolas,monospace}.repository .label.list{list-style:none;padding-top:15px}.repository .label.list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .label.list .item a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .label.list .item a:hover{color:#000}.repository .label.list .item a.open-issues{margin-right:30px}.repository .label.list .item .ui.label{font-size:1em}.repository .milestone.list{list-style:none;padding-top:15px}.repository .milestone.list>.item{padding-top:10px;padding-bottom:10px;border-bottom:1px dashed #AAA}.repository .milestone.list>.item>a{padding-top:5px;padding-right:10px;color:#000}.repository .milestone.list>.item>a:hover{color:#4078c0}.repository .milestone.list>.item .ui.progress{width:40%;padding:0;border:0;margin:0}.repository .milestone.list>.item .ui.progress .bar{height:20px}.repository .milestone.list>.item .meta{color:#999;padding-top:5px}.repository .milestone.list>.item .meta .issue-stats .octicon{padding-left:5px}.repository .milestone.list>.item .meta .overdue{color:red}.repository .milestone.list>.item .operate{margin-top:-15px}.repository .milestone.list>.item .operate>a{font-size:15px;padding-top:5px;padding-right:10px;color:#666}.repository .milestone.list>.item .operate>a:hover{color:#000}.repository .milestone.list>.item .content{padding-top:10px}.repository.new.milestone textarea{height:200px}.repository.new.milestone #deadline{width:150px}.repository.compare.pull .choose.branch .octicon{padding-right:10px}.repository.compare.pull .comment.form .content:after,.repository.compare.pull .comment.form .content:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.repository.compare.pull .comment.form .content:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}.repository.compare.pull .comment.form .content:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}.repository.compare.pull .comment.form .content:after{border-right-color:#fff}.repository .filter.dropdown .menu{margin-top:1px!important}.repository.commits .header .search input{font-weight:400;padding:5px 10px}.repository #commits-table thead th:first-of-type{padding-left:15px}.repository #commits-table thead .sha{width:140px}.repository #commits-table thead .shatd{text-align:center}.repository #commits-table td.sha .sha.label{margin:0}.repository #commits-table.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.02)!important}.repository #commits-table td.sha .sha.label.isSigned,.repository #repo-files-table .sha.label.isSigned{border:1px solid #BBB}.repository #commits-table td.sha .sha.label.isSigned .detail.icon,.repository #repo-files-table .sha.label.isSigned .detail.icon{background:#FAFAFA;margin:-6px -10px -4px 0;padding:5px 3px 5px 6px;border-left:1px solid #BBB;border-top-left-radius:0;border-bottom-left-radius:0}.repository #commits-table td.sha .sha.label.isSigned.isVerified,.repository #repo-files-table .sha.label.isSigned.isVerified{border:1px solid #21BA45;background:rgba(33,186,69,.1)}.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon{border-left:1px solid rgba(33,186,69,.5)}.repository .diff-detail-box{padding:7px 0;background:#fff;line-height:30px}.repository .diff-detail-box>div:after{clear:both;content:"";display:block}.repository .diff-detail-box ol{clear:both;padding-left:0;margin-top:5px;margin-bottom:28px}.repository .diff-detail-box ol li{list-style:none;padding-bottom:4px;margin-bottom:4px;border-bottom:1px dashed #DDD;padding-left:6px}.repository .diff-detail-box span.status{display:inline-block;width:12px;height:12px;margin-right:8px;vertical-align:middle}.repository .diff-detail-box span.status.modify{background-color:#f0db88}.repository .diff-detail-box span.status.add{background-color:#b4e2b4}.repository .diff-detail-box span.status.del{background-color:#e9aeae}.repository .diff-detail-box span.status.rename{background-color:#dad8ff}.repository .diff-detail-box .detail-files{background:#fff;margin:0}.repository .diff-box .header{display:flex;align-items:center}.repository .diff-box .header .count{margin-right:12px;font-size:13px;flex:0 0 auto}.repository .diff-box .header .count .bar{background-color:#bd2c00;height:12px;width:40px;display:inline-block;margin:2px 4px 0 4px;vertical-align:text-top}.repository .diff-box .header .count .bar .add{background-color:#55a532;height:12px}.repository .diff-box .header .file{flex:1;color:#888;word-break:break-all}.repository .diff-box .header .button{margin:-5px 0 -5px 12px;padding:8px 10px;flex:0 0 auto}.repository .diff-file-box .header{background-color:#f7f7f7}.repository .diff-file-box .file-body.file-code .lines-num{text-align:right;color:#A7A7A7;background:#fafafa;width:1%;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;user-select:none;vertical-align:top}.repository .diff-file-box .file-body.file-code .lines-num span.fold{display:block;text-align:center}.repository .diff-file-box .file-body.file-code .lines-num-old{border-right:1px solid #DDD}.repository .diff-file-box .code-diff{font-size:12px}.repository .diff-file-box .code-diff td{padding:0;padding-left:10px;border-top:none}.repository .diff-file-box .code-diff pre{margin:0}.repository .diff-file-box .code-diff .lines-num{border-color:#d4d4d5;border-right-width:1px;border-right-style:solid;padding:0 5px}.repository .diff-file-box .code-diff tbody tr td.halfwidth{width:49%}.repository .diff-file-box .code-diff tbody tr td.tag-code,.repository .diff-file-box .code-diff tbody tr.tag-code td{background-color:#F0F0F0!important;border-color:#D2CECE!important;padding-top:8px;padding-bottom:8px}.repository .diff-file-box .code-diff tbody tr .removed-code{background-color:#f99}.repository .diff-file-box .code-diff tbody tr .added-code{background-color:#9f9}.repository .diff-file-box .code-diff-unified tbody tr.del-code td{background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-unified tbody tr.add-code td{background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split table,.repository .diff-file-box .code-diff-split tbody{width:100%}.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(2),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(4){background-color:#fafafa}.repository .diff-file-box .code-diff-split tbody tr td.del-code,.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(1),.repository .diff-file-box .code-diff-split tbody tr.del-code td:nth-child(2){background-color:#ffe0e0!important;border-color:#f1c0c0!important}.repository .diff-file-box .code-diff-split tbody tr td.add-code,.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(3),.repository .diff-file-box .code-diff-split tbody tr.add-code td:nth-child(4){background-color:#d6fcd6!important;border-color:#c1e9c1!important}.repository .diff-file-box .code-diff-split tbody tr td:nth-child(3){border-left-width:1px;border-left-style:solid}.repository .diff-file-box.file-content{clear:right}.repository .diff-file-box.file-content img{max-width:100%;padding:5px 5px 0 5px}.repository .code-view{overflow:auto;overflow-x:auto;overflow-y:hidden}.repository .repo-search-result{padding-top:10px;padding-bottom:10px}.repository .repo-search-result .lines-num a{color:inherit}.repository.quickstart .guide .item{padding:1em}.repository.quickstart .guide .item small{font-weight:400}.repository.quickstart .guide .clone.button:first-child{border-radius:.28571429rem 0 0 .28571429rem}.repository.quickstart .guide .ui.action.small.input{width:100%}.repository.quickstart .guide #repo-clone-url{border-radius:0;padding:5px 10px;font-size:1.2em}.repository.release #release-list{border-top:1px solid #DDD;margin-top:20px;padding-top:15px}.repository.release #release-list>li{list-style:none}.repository.release #release-list>li .detail,.repository.release #release-list>li .meta{padding-top:30px;padding-bottom:40px}.repository.release #release-list>li .meta{text-align:right;position:relative}.repository.release #release-list>li .meta .tag:not(.icon){display:block;margin-top:15px}.repository.release #release-list>li .meta .commit{display:block;margin-top:10px}.repository.release #release-list>li .detail{border-left:1px solid #DDD}.repository.release #release-list>li .detail .author img{margin-bottom:-3px}.repository.release #release-list>li .detail .download{margin-top:20px}.repository.release #release-list>li .detail .download>a .octicon{margin-left:5px;margin-right:5px}.repository.release #release-list>li .detail .download .list{padding-left:0;border-top:1px solid #eee}.repository.release #release-list>li .detail .download .list li{list-style:none;display:block;padding-top:8px;padding-bottom:8px;border-bottom:1px solid #eee}.repository.release #release-list>li .detail .dot{width:9px;height:9px;background-color:#ccc;z-index:999;position:absolute;display:block;left:-5px;top:40px;border-radius:6px;border:1px solid #FFF}.repository.new.release .target{min-width:500px}.repository.new.release .target #tag-name{margin-top:-4px}.repository.new.release .target .at{margin-left:-5px;margin-right:5px}.repository.new.release .target .dropdown.icon{margin:0;padding-top:3px}.repository.new.release .target .selection.dropdown{padding-top:10px;padding-bottom:10px}.repository.new.release .prerelease.field{margin-bottom:0}@media only screen and (max-width:438px){.repository.new.release .field button,.repository.new.release .field input{width:100%}}@media only screen and (max-width:768px){.repository.new.release .field button{margin-bottom:1em}}.repository.forks .list{margin-top:0}.repository.forks .list .item{padding-top:10px;padding-bottom:10px;border-bottom:1px solid #DDD}.repository.forks .list .item .ui.avatar{float:left;margin-right:5px}.repository.forks .list .item .link{padding-top:5px}.repository.wiki.start .ui.segment{padding-top:70px;padding-bottom:100px}.repository.wiki.start .ui.segment .mega-octicon{font-size:48px}.repository.wiki.new .CodeMirror .CodeMirror-code{font-family:Consolas,monospace}.repository.wiki.new .CodeMirror .CodeMirror-code .cm-comment{background:inherit}.repository.wiki.new .editor-preview{background-color:#fff}.repository.wiki.view .choose.page{margin-top:-5px}.repository.wiki.view .ui.sub.header{text-transform:none}.repository.wiki.view>.markdown{padding:15px 30px}.repository.wiki.view>.markdown h1:first-of-type,.repository.wiki.view>.markdown h2:first-of-type,.repository.wiki.view>.markdown h3:first-of-type,.repository.wiki.view>.markdown h4:first-of-type,.repository.wiki.view>.markdown h5:first-of-type,.repository.wiki.view>.markdown h6:first-of-type{margin-top:0}@media only screen and (max-width:767px){.repository.wiki .dividing.header .stackable.grid .button{margin-top:2px;margin-bottom:2px}}.repository.settings.collaboration .collaborator.list{padding:0}.repository.settings.collaboration .collaborator.list>.item{margin:0;line-height:2em}.repository.settings.collaboration .collaborator.list>.item:not(:last-child){border-bottom:1px solid #DDD}.repository.settings.collaboration #repo-collab-form #search-user-box .results{left:7px}.repository.settings.collaboration #repo-collab-form .ui.button{margin-left:5px;margin-top:-3px}.repository.settings.branches .protected-branches .selection.dropdown{width:300px}.repository.settings.branches .protected-branches .item{border:1px solid #eaeaea;padding:10px 15px}.repository.settings.branches .protected-branches .item:not(:last-child){border-bottom:0}.repository.settings.branches .branch-protection .help{margin-left:26px;padding-top:0}.repository.settings.branches .branch-protection .fields{margin-left:20px;display:block}.repository.settings.branches .branch-protection .whitelist{margin-left:26px}.repository.settings.branches .branch-protection .whitelist .dropdown img{display:inline-block}.repository.settings.webhook .events .column{padding-bottom:0}.repository.settings.webhook .events .help{font-size:13px;margin-left:26px;padding-top:0}.repository .ui.attached.isSigned.isVerified:not(.positive){border-left:1px solid #A3C293;border-right:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified.top:not(.positive){border-top:1px solid #A3C293}.repository .ui.attached.isSigned.isVerified:not(.positive):last-child{border-bottom:1px solid #A3C293}.repository .ui.segment.sub-menu{padding:7px;line-height:0}.repository .ui.segment.sub-menu .list{width:100%;display:flex}.repository .ui.segment.sub-menu .list .item{width:100%;border-radius:3px}.repository .ui.segment.sub-menu .list .item a{color:#000}.repository .ui.segment.sub-menu .list .item a:hover{color:#666}.repository .ui.segment.sub-menu .list .item.active{background:rgba(0,0,0,.05)}.repository .segment.reactions.dropdown .menu,.repository .select-reaction.dropdown .menu{right:0!important;left:auto!important}.repository .segment.reactions.dropdown .menu>.header,.repository .select-reaction.dropdown .menu>.header{margin:.75rem 0 .5rem}.repository .segment.reactions.dropdown .menu>.item,.repository .select-reaction.dropdown .menu>.item{float:left;padding:.5rem .5rem!important}.repository .segment.reactions.dropdown .menu>.item img.emoji,.repository .select-reaction.dropdown .menu>.item img.emoji{margin-right:0}.repository .segment.reactions{padding:.3em 1em}.repository .segment.reactions .ui.label{padding:.4em}.repository .segment.reactions .ui.label.disabled{cursor:default}.repository .segment.reactions .ui.label>img{height:1.5em!important}.repository .segment.reactions .select-reaction{float:none}.repository .segment.reactions .select-reaction:not(.active) a{display:none}.repository .segment.reactions:hover .select-reaction a{display:block}.user-cards .list{padding:0}.user-cards .list .item{list-style:none;width:32%;margin:10px 10px 10px 0;padding-bottom:14px;float:left}.user-cards .list .item .avatar{width:48px;height:48px;float:left;display:block;margin-right:10px}.user-cards .list .item .name{margin-top:0;margin-bottom:0;font-weight:400}.user-cards .list .item .meta{margin-top:5px}#search-repo-box .results .result .image,#search-user-box .results .result .image{float:left;margin-right:8px;width:2em;height:2em}#search-repo-box .results .result .content,#search-user-box .results .result .content{margin:6px 0}#issue-actions{display:none}.issue.list{list-style:none;padding-top:15px}.issue.list>.item{padding-top:15px;padding-bottom:10px;border-bottom:1px dashed #AAA}.issue.list>.item .title{color:#444;font-size:15px;font-weight:700;margin:0 6px}.issue.list>.item .title:hover{color:#000}.issue.list>.item .comment{padding-right:10px;color:#666}.issue.list>.item .desc{padding-top:5px;color:#999}.issue.list>.item .desc .checklist{padding-left:5px}.issue.list>.item .desc .checklist .progress-bar{margin-left:2px;width:80px;height:6px;display:inline-block;background-color:#eee;overflow:hidden;border-radius:3px;vertical-align:2px!important}.issue.list>.item .desc .checklist .progress-bar .progress{background-color:#ccc;display:block;height:100%}.issue.list>.item .desc a.milestone{padding-left:5px;color:#999!important}.issue.list>.item .desc a.milestone:hover{color:#000!important}.issue.list>.item .desc .assignee{margin-top:-5px;margin-right:5px}.issue.list>.item .desc .overdue{color:red}.page.buttons{padding-top:15px}.ui.form .dropzone{width:100%;margin-bottom:10px;border:2px dashed #0087F7;box-shadow:none!important}.ui.form .dropzone .dz-error-message{top:140px}.settings .content{margin-top:2px}.settings .content .segment,.settings .content>.header{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.settings .list>.item .green{color:#21BA45}.settings .list>.item:not(:first-child){border-top:1px solid #eaeaea;padding:1rem;margin:15px -1rem -1rem -1rem}.settings .list>.item>.mega-octicon{display:table-cell}.settings .list>.item>.mega-octicon+.content{display:table-cell;padding:0 0 0 .5em;vertical-align:top}.settings .list>.item .info{margin-top:10px}.settings .list>.item .info .tab.segment{border:none;padding:10px 0 0}.settings .list.key .meta{padding-top:5px;color:#666}.settings .list.email>.item:not(:first-child){min-height:60px}.settings .list.collaborator>.item{padding:0}.ui.vertical.menu .header.item{font-size:1.1em;background:#f0f0f0}.edit-label.modal .form .column,.new-label.segment .form .column{padding-right:0}.edit-label.modal .form .buttons,.new-label.segment .form .buttons{margin-left:auto;padding-top:15px}.edit-label.modal .form .color.picker.column,.new-label.segment .form .color.picker.column{width:auto}.edit-label.modal .form .color.picker.column .color-picker,.new-label.segment .form .color.picker.column .color-picker{height:35px;width:auto;padding-left:30px}.edit-label.modal .form .minicolors-swatch.minicolors-sprite,.new-label.segment .form .minicolors-swatch.minicolors-sprite{top:10px;left:10px;width:15px;height:15px}.edit-label.modal .form .precolors,.new-label.segment .form .precolors{padding-left:0;padding-right:0;margin:3px 10px auto 10px;width:120px}.edit-label.modal .form .precolors .color,.new-label.segment .form .precolors .color{float:left;width:15px;height:15px}#avatar-arrow:after,#avatar-arrow:before{right:100%;top:20px;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}#avatar-arrow:before{border-right-color:#D4D4D5;border-width:9px;margin-top:-9px}#avatar-arrow:after{border-right-color:#f7f7f7;border-width:8px;margin-top:-8px}#delete-repo-modal .ui.message,#transfer-repo-modal .ui.message{width:100%!important}.tab-size-1{tab-size:1!important;-moz-tab-size:1!important}.tab-size-2{tab-size:2!important;-moz-tab-size:2!important}.tab-size-3{tab-size:3!important;-moz-tab-size:3!important}.tab-size-4{tab-size:4!important;-moz-tab-size:4!important}.tab-size-5{tab-size:5!important;-moz-tab-size:5!important}.tab-size-6{tab-size:6!important;-moz-tab-size:6!important}.tab-size-7{tab-size:7!important;-moz-tab-size:7!important}.tab-size-8{tab-size:8!important;-moz-tab-size:8!important}.tab-size-9{tab-size:9!important;-moz-tab-size:9!important}.tab-size-10{tab-size:10!important;-moz-tab-size:10!important}.tab-size-11{tab-size:11!important;-moz-tab-size:11!important}.tab-size-12{tab-size:12!important;-moz-tab-size:12!important}.tab-size-13{tab-size:13!important;-moz-tab-size:13!important}.tab-size-14{tab-size:14!important;-moz-tab-size:14!important}.tab-size-15{tab-size:15!important;-moz-tab-size:15!important}.tab-size-16{tab-size:16!important;-moz-tab-size:16!important}.stats-table{display:table;width:100%}.stats-table .table-cell{display:table-cell}.stats-table .table-cell.tiny{height:.5em}tbody.commit-list{vertical-align:baseline}.commit-body{white-space:pre-wrap}@media only screen and (max-width:767px){.ui.stackable.menu.mobile--margin-between-items>.item{margin-top:5px;margin-bottom:5px}.ui.stackable.menu.mobile--no-negative-margins{margin-left:0;margin-right:0}}#topic_edit{margin-top:5px}#repo-topic{margin-top:5px}@media only screen and (max-width:768px){.new-dependency-drop-list{width:100%}}.CodeMirror{font:14px Consolas,"Liberation Mono",Menlo,Courier,monospace}.CodeMirror.cm-s-default{border-radius:3px;padding:0!important}.CodeMirror .cm-comment{background:inherit!important}.repository.file.editor .tab[data-tab=write]{padding:0!important}.repository.file.editor .tab[data-tab=write] .editor-toolbar{border:none!important}.repository.file.editor .tab[data-tab=write] .CodeMirror{border-left:none;border-right:none;border-bottom:none}.organization{padding-top:15px;padding-bottom:80px}.organization .head .ui.header .text{vertical-align:middle;font-size:1.6rem;margin-left:15px}.organization .head .ui.header .ui.right{margin-top:5px}.organization.new.org form{margin:auto}.organization.new.org form .ui.message{text-align:center}@media only screen and (min-width:768px){.organization.new.org form{width:800px!important}.organization.new.org form .header{padding-left:280px!important}.organization.new.org form .inline.field>label{text-align:right;width:250px!important;word-wrap:break-word}.organization.new.org form .help{margin-left:265px!important}.organization.new.org form .optional .title{margin-left:250px!important}.organization.new.org form input,.organization.new.org form textarea{width:50%!important}}@media only screen and (max-width:767px){.organization.new.org form .optional .title{margin-left:15px}.organization.new.org form .inline.field>label{display:block}}.organization.new.org form .header{padding-left:0!important;text-align:center}.organization.options input{min-width:300px}.organization.profile #org-avatar{width:100px;height:100px;margin-right:15px}.organization.profile #org-info .ui.header{font-size:36px;margin-bottom:0}.organization.profile #org-info .desc{font-size:16px;margin-bottom:10px}.organization.profile #org-info .meta .item{display:inline-block;margin-right:10px}.organization.profile #org-info .meta .item .icon{margin-right:5px}.organization.profile .ui.top.header .ui.right{margin-top:0}.organization.profile .teams .item{padding:10px 15px}.organization.profile .members .ui.avatar,.organization.teams .members .ui.avatar{width:48px;height:48px;margin-right:5px}.organization.invite #invite-box{margin:auto;margin-top:50px;width:500px!important}.organization.invite #invite-box #search-user-box input{margin-left:0;width:300px}.organization.invite #invite-box .ui.button{margin-left:5px;margin-top:-3px}.organization.members .list .item{margin-left:0;margin-right:0;border-bottom:1px solid #eee}.organization.members .list .item .ui.avatar{width:48px;height:48px}.organization.members .list .item .meta{line-height:24px}.organization.teams .detail .item{padding:10px 15px}.organization.teams .detail .item:not(:last-child){border-bottom:1px solid #eee}.organization.teams .members .item,.organization.teams .repositories .item{padding:10px 20px;line-height:32px}.organization.teams .members .item:not(:last-child),.organization.teams .repositories .item:not(:last-child){border-bottom:1px solid #DDD}.organization.teams .members .item .button,.organization.teams .repositories .item .button{padding:9px 10px}.organization.teams #add-member-form input,.organization.teams #add-repo-form input{margin-left:0}.organization.teams #add-member-form .ui.button,.organization.teams #add-repo-form .ui.button{margin-left:5px;margin-top:-3px}.user:not(.icon){padding-top:15px;padding-bottom:80px}.user.profile .ui.card .username{display:block}.user.profile .ui.card .extra.content{padding:0}.user.profile .ui.card .extra.content ul{margin:0;padding:0}.user.profile .ui.card .extra.content ul li{padding:10px;list-style:none}.user.profile .ui.card .extra.content ul li:not(:last-child){border-bottom:1px solid #eaeaea}.user.profile .ui.card .extra.content ul li .octicon{margin-left:1px;margin-right:5px}.user.profile .ui.card .extra.content ul li.follow .ui.button{width:100%}@media only screen and (max-width:768px){.user.profile .ui.card #profile-avatar{height:250px;overflow:hidden}.user.profile .ui.card #profile-avatar img{max-height:768px;max-width:768px}}@media only screen and (max-width:768px){.user.profile .ui.card{width:100%}}.user.profile .ui.repository.list{margin-top:25px}.user.profile #loading-heatmap{margin-bottom:1em}.user.followers .header.name{font-size:20px;line-height:24px;vertical-align:middle}.user.followers .follow .ui.button{padding:8px 15px}.user.notification .octicon{float:left;font-size:2em}.user.notification .content{float:left;margin-left:7px}.user.notification table form{display:inline-block}.user.notification table button{padding:3px 3px 3px 5px}.user.notification table tr{cursor:pointer}.user.notification .octicon.green{color:#21ba45}.user.notification .octicon.red{color:#d01919}.user.notification .octicon.purple{color:#a333c8}.user.notification .octicon.blue{color:#2185d0}.user.link-account:not(.icon){padding-top:15px;padding-bottom:5px}.user.settings .iconFloat{float:left}.dashboard{padding-top:15px;padding-bottom:80px}.dashboard.feeds .context.user.menu,.dashboard.issues .context.user.menu{z-index:101;min-width:200px}.dashboard.feeds .context.user.menu .ui.header,.dashboard.issues .context.user.menu .ui.header{font-size:1rem;text-transform:none}.dashboard.feeds .filter.menu .item,.dashboard.issues .filter.menu .item{text-align:left}.dashboard.feeds .filter.menu .item .text,.dashboard.issues .filter.menu .item .text{height:16px;vertical-align:middle}.dashboard.feeds .filter.menu .item .text.truncate,.dashboard.issues .filter.menu .item .text.truncate{width:85%}.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:7px;left:90%;width:15%}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu .item .floating.label,.dashboard.issues .filter.menu .item .floating.label{top:10px;left:auto;width:auto;right:13px}}.dashboard.feeds .filter.menu .jump.item,.dashboard.issues .filter.menu .jump.item{margin:1px;padding-right:0}.dashboard.feeds .filter.menu .menu,.dashboard.issues .filter.menu .menu{max-height:300px;overflow-x:auto;right:0!important;left:auto!important}@media only screen and (max-width:768px){.dashboard.feeds .filter.menu,.dashboard.issues .filter.menu{width:100%}}.dashboard.feeds .right.stackable.menu>.item.active,.dashboard.issues .right.stackable.menu>.item.active{color:#d9453d}.dashboard .dashboard-repos{margin:0 1px}.feeds .news>.ui.grid{margin-left:auto;margin-right:auto}.feeds .news .ui.avatar{margin-top:13px}.feeds .news p{line-height:1em}.feeds .news .time-since{font-size:13px}.feeds .news .issue.title{width:80%}.feeds .news .push.news .content ul{font-size:13px;list-style:none;padding-left:10px}.feeds .news .push.news .content ul img{margin-bottom:-2px}.feeds .news .push.news .content ul .text.truncate{width:80%;margin-bottom:-5px}.feeds .news .commit-id{font-family:Consolas,monospace}.feeds .news code{padding:1px;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px;word-break:break-all}.feeds .list .header .ui.label{margin-top:-4px;padding:4px 5px;font-weight:400}.feeds .list .header .plus.icon{margin-top:5px}.feeds .list ul{list-style:none;margin:0;padding-left:0}.feeds .list ul li:not(:last-child){border-bottom:1px solid #EAEAEA}.feeds .list ul li.private{background-color:#fcf8e9}.feeds .list ul li a{padding:6px 1.2em;display:block}.feeds .list ul li a .octicon{color:#888}.feeds .list ul li a .octicon.rear{font-size:15px}.feeds .list ul li a .star-num{font-size:12px}.feeds .list .repo-owner-name-list .item-name{max-width:70%;margin-bottom:-4px}.feeds .list #collaborative-repo-list .owner-and-repo{max-width:80%;margin-bottom:-5px}.feeds .list #collaborative-repo-list .owner-name{max-width:120px;margin-bottom:-5px}.admin{padding-top:15px;padding-bottom:80px}.admin .table.segment{padding:0;font-size:13px}.admin .table.segment:not(.striped){padding-top:5px}.admin .table.segment:not(.striped) thead th:last-child{padding-right:5px!important}.admin .table.segment th{padding-top:5px;padding-bottom:5px}.admin .table.segment:not(.select) td:first-of-type,.admin .table.segment:not(.select) th:first-of-type{padding-left:15px!important}.admin .ui.header,.admin .ui.segment{box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.admin.user .email{max-width:200px}.admin dl.admin-dl-horizontal{padding:20px;margin:0}.admin dl.admin-dl-horizontal dd{margin-left:275px}.admin dl.admin-dl-horizontal dt{font-weight:bolder;float:left;width:285px;clear:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.admin.config #test-mail-btn{margin-left:5px}.explore{padding-top:15px;padding-bottom:80px}.explore .navbar{justify-content:center;padding-top:15px!important;margin-top:-15px!important;margin-bottom:15px!important;background-color:#FAFAFA!important;border-width:1px!important}.explore .navbar .octicon{width:16px;text-align:center;margin-right:5px}.ui.repository.list .item{padding-bottom:25px}.ui.repository.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.repository.list .item .ui.header{font-size:1.5rem;padding-bottom:10px}.ui.repository.list .item .ui.header .name{word-break:break-all}.ui.repository.list .item .ui.header .metas{color:#888;font-size:14px;font-weight:400}.ui.repository.list .item .ui.header .metas span:not(:last-child){margin-right:5px}.ui.repository.list .item .time{font-size:12px;color:grey}.ui.repository.branches .time{font-size:12px;color:grey}.ui.user.list .item{padding-bottom:25px}.ui.user.list .item:not(:first-child){border-top:1px solid #eee;padding-top:25px}.ui.user.list .item .ui.avatar.image{width:40px;height:40px}.ui.user.list .item .description{margin-top:5px}.ui.user.list .item .description .octicon:not(:first-child){margin-left:5px}.ui.user.list .item .description a{color:#333}.ui.user.list .item .description a:hover{text-decoration:underline}.ui.button.add-code-comment{font-size:14px;height:16px;padding:2px 0 0;position:relative;width:16px;z-index:5;float:left;margin:-2px -10px -2px -20px;opacity:0;transition:transform .1s ease-in-out;transform:scale(1,1)}.ui.button.add-code-comment:hover{transform:scale(1.2,1.2)}.focus-lines-new .ui.button.add-code-comment.add-code-comment-right,.focus-lines-old .ui.button.add-code-comment.add-code-comment-left{opacity:1}.comment-code-cloud{padding:4px;margin:0 auto;position:relative;border:1px solid #f1f1f1;margin-top:13px;margin-right:10px;margin-bottom:5px}.comment-code-cloud:before{content:" ";width:0;height:0;border-left:13px solid transparent;border-right:13px solid transparent;border-bottom:13px solid #f1f1f1;left:20px;position:absolute;top:-13px}.comment-code-cloud .attached.tab{border:none;padding:0;margin:0}.comment-code-cloud .attached.tab.markdown{padding:1em;min-height:168px}.comment-code-cloud .attached.header{padding:.1rem 1rem}.comment-code-cloud .right.menu.options .item{padding:.85714286em .442857em;cursor:pointer}.comment-code-cloud .ui.form textarea{border:0}.comment-code-cloud .ui.attached.tabular.menu{background:#f7f7f7;border:1px solid #d4d4d5;padding-top:5px;padding-left:5px;margin-top:0}.comment-code-cloud .footer{border-top:1px solid #f1f1f1;margin-top:10px}.comment-code-cloud .footer .markdown-info{display:inline-block;margin:5px 0;font-size:12px;color:rgba(0,0,0,.6)}.comment-code-cloud .footer .ui.right.floated{padding-top:6px}.comment-code-cloud .footer:after{clear:both;content:"";display:block}.comment-code-cloud button.comment-form-reply{margin:.5em .5em .5em 4.5em}.comment-code-cloud form.comment-form-reply{margin:0 0 0 4em}.file-comment{font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;color:rgba(0,0,0,.87)} \ No newline at end of file diff --git a/public/less/_repository.less b/public/less/_repository.less index c10babd8fc3b..00816296dfc7 100644 --- a/public/less/_repository.less +++ b/public/less/_repository.less @@ -556,6 +556,38 @@ margin-top: 10px; } } + .review-item { + + .avatar, .type-icon{ + float: none; + display: inline-block; + text-align: center; + vertical-align: middle; + + .octicon { + width: 23px; + font-size: 23px; + margin-top: 0.45em; + } + } + + .text { + margin: .3em 0 .5em .5em + } + + .type-icon{ + float: right; + margin-right: 1em; + } + + .divider{ + margin: .5rem 0; + } + + .review-content { + padding: 1em 0 1em 3.8em; + } + } } .comment-list { &:before { diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 3bcfdf1b04be..08bdf311f912 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -802,6 +802,12 @@ func ViewIssue(ctx *context.Context) { } } ctx.Data["IsPullBranchDeletable"] = canDelete && pull.HeadRepo != nil && git.IsBranchExist(pull.HeadRepo.RepoPath(), pull.HeadBranch) + + ctx.Data["PullReviewersWithType"], err = models.GetReviewersByPullID(issue.ID) + if err != nil { + ctx.ServerError("GetReviewersByPullID", err) + return + } } // Get Dependencies diff --git a/templates/repo/issue/view_content/pull.tmpl b/templates/repo/issue/view_content/pull.tmpl index 92bfc86cb4fa..174937f90285 100644 --- a/templates/repo/issue/view_content/pull.tmpl +++ b/templates/repo/issue/view_content/pull.tmpl @@ -1,3 +1,38 @@ +{{if gt (len .PullReviewersWithType) 0}} +
+
+
+

{{$.i18n.Tr "repo.issues.review.reviewers"}}

+ {{range .PullReviewersWithType}} + {{ $createdStr:= TimeSinceUnix .ReviewUpdatedUnix $.Lang }} +
+
+ + + + + + + {{.Name}} + {{if eq .Type 1}} + {{$.i18n.Tr "repo.issues.review.approve" $createdStr | Safe}} + {{else if eq .Type 2}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{else if eq .Type 3}} + {{$.i18n.Tr "repo.issues.review.reject" $createdStr | Safe}} + {{else}} + {{$.i18n.Tr "repo.issues.review.comment" $createdStr | Safe}} + {{end}} + +
+ {{end}} +
+
+
+{{end}}